[
  {
    "path": ".gitignore",
    "content": "# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n## Build generated\nbuild/\nDerivedData\n\n## Various settings\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata\n\n## Other\n*.xccheckout\n*.moved-aside\n*.xcuserstate\n*.xcscmblueprint\n\n## Obj-C/Swift specific\n*.hmap\n*.ipa\n\n## Playgrounds\ntimeline.xctimeline\nplayground.xcworkspace\n\n# Swift Package Manager\n#\n# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.\n# Packages/\n.build/\n\n# CocoaPods\n#\n# We recommend against adding the Pods directory to your .gitignore. However\n# you should judge for yourself, the pros and cons are mentioned at:\n# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control\n#\n# Pods/\n\n# Carthage\n#\n# Add this line if you want to avoid checking in source code from Carthage dependencies.\n# Carthage/Checkouts\n\nCarthage/Build\n\n# fastlane\n#\n# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the \n# screenshots whenever they are needed.\n# For more information about the recommended setup visit:\n# https://github.com/fastlane/fastlane/blob/master/docs/Gitignore.md\n\nfastlane/report.xml\nfastlane/screenshots\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    {project}  Copyright (C) {year}  {fullname}\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": "README.md",
    "content": "# SublimeCode [![star this repo](http://github-svg-buttons.herokuapp.com/star.svg?user=Urinx&repo=SublimeCode&style=flat&background=1081C1)](http://github.com/Urinx/SublimeCode) [![fork this repo](http://github-svg-buttons.herokuapp.com/fork.svg?user=Urinx&repo=SublimeCode&style=flat&background=1081C1)](http://github.com/Urinx/SublimeCode/fork) [![license](https://img.shields.io/github/license/Urinx/SublimeCode.svg)](https://github.com/Urinx/SublimeCode/blob/master/LICENSE) ![platform](https://img.shields.io/badge/platform-iOS 9-lightgrey.svg) [![download](https://img.shields.io/github/downloads/Urinx/SublimeCode/total.svg)](https://github.com/Urinx/SublimeCode/releases)\n一个代码阅读应用 - iOS\n\n### 屏幕截图\n![main](Screenshot/main.png)\n\n## 功能说明\n\n### 代码阅读\n支持多种编程语言的语法高亮，全屏阅读模式，以及支持生成图片的形式分享代码到朋友圈等。\n![Code Reading](Screenshot/code_reading.png)\n\n### 多种文件支持\n支持查看多种格式的文件类型，包括图片，视频，音频，PDF等。\n![Multi File Support](Screenshot/multi_file_support.png)\n\n### Github支持\n现在你可以在本应用里浏览Github里自己的项目和Star的项目了，也能够下载到本地离线阅读代码哟！是不是很方便呢。\n![Github](Screenshot/github.png)\n\n### 本地HTTP服务器\n还可以是一个本地HTTP服务器哦，支持Log纪录，在手机上方便的与朋友分享自己的网页。\n![HTTP Server](Screenshot/http_server.png)\n\n### Cycript支持\nCycript是混合了objective-c与javascript语法的一个工具,让开发者在命令行下和应用交互，在运行时查看和修改应用。而我们的应用也集成了Cycript，是不是很酷炫呢！小伙伴们赶快来体验吧。\n![Cycript](Screenshot/cycript.png)\n\n### 乱七八糟的功能\n是的，你还可以像朋友圈一样的浏览Gist，还能SSH到自己的服务器，以及RSS订阅，与Github好友聊天，二维码扫描等等。没有做不到，只有想不到。\n![Other](Screenshot/other.png)\n\n### 以及更多\n其实里面还有超级多的功能等待着你去探索和发现，在关于页面里摇一摇还有彩蛋哟！如果你有好的想法和建议也可以告诉我们，说不定下次就加进去了呢。\n\n### 如何安装\n鉴于该应用没有上架App Store，同时也没有用企业证书签名，所以目前你只能通过以下两种方式安装，注意的是两者均需要在Mac环境下，以及安装了Xcode。推荐采取方案一的方式。\n\n\n> 方案一：\n> \n> 1. 下载已经build好的[ipa文件](https://github.com/Urinx/SublimeCode/releases)。\n> 2. 使用Xcode新建一个项目，bundle id可以为`com.xxx.Sublime`，生成相应的证书。\n> 3. 使用[iOS App Signer](https://github.com/DanTheMan827/ios-app-signer)重签名本应用，注意选择上一步生成的对应的证书。\n> 4. 然后就可以使用iTunes，Xcode等各种软件将重签名后的ipa文件安装到设备上。\n\n> 方案二：\n> \n> 1. 下载本项目[源码](https://github.com/Urinx/SublimeCode/archive/v1.0.zip)。\n> 2. 注意修改bundle id，再编译到设备上。\n"
  },
  {
    "path": "Sublime/Cycript.framework/Headers/Cycript.h",
    "content": "/* Cycript - Optimizing JavaScript Compiler/Runtime\n * Copyright (C) 2009-2013  Jay Freeman (saurik)\n*/\n\n/* GNU General Public License, Version 3 {{{ */\n/*\n * Cycript is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published\n * by the Free Software Foundation, either version 3 of the License,\n * or (at your option) any later version.\n *\n * Cycript is distributed in the hope that it will be useful, but\n * 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 Cycript.  If not, see <http://www.gnu.org/licenses/>.\n**/\n/* }}} */\n\n#ifndef CYCRIPT_CYCRIPT_H\n#define CYCRIPT_CYCRIPT_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid CYListenServer(short port);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif/*CYCRIPT_CYCRIPT_H*/\n"
  },
  {
    "path": "Sublime/Podfile",
    "content": "source 'https://github.com/CocoaPods/Specs.git'\nplatform :ios, '8.0'\nuse_frameworks!\n\npod 'Alamofire', '~> 3.0'\npod 'CYRTextView'\npod 'ZLMusicFlowWaveView'\npod 'SJCSimplePDFView'\npod 'Swifter'\npod 'SwiftyJSON'\npod 'AASquaresLoading'\npod 'DGElasticPullToRefresh'\npod 'SSZipArchive'\npod 'Gifu'\npod 'RongCloudIMKit'\npod 'NMSSH'\npod 'AlamofireRSSParser'\npod 'Charts'"
  },
  {
    "path": "Sublime/Pods/AASquaresLoading/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Anas AIT ALI\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "Sublime/Pods/AASquaresLoading/README.md",
    "content": "# AASquaresLoading\nSimple loading animation using squares\n\n![Screenshot](screenshot.gif)\n\n## Example\n```swift\nlet loadingSquare = AASquaresLoading(target: self.view, size: 40)\n// Customize background\nloadingSquare.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.4)\n// Customize color\nloadingSquare.color = UIColor.whiteColor()\n// Start loading\nloadingSquare.start()\n....\n// Stop loading\nloadingSquare.stop()\n```\n\nMore examples in the demo project.\n\n## Installation\n\n### CocoaPods\n\n1. Add to your podfile : `pod 'AASquaresLoading'`\n2. In your terminal : `pod install`\n\n### Manual\n\n1. Add `AASquaresLoading.swift` to your project\n2. That's all you can use it!\n\n## Usage\n\n### Basic\n\n1. As a UIView method\n\n\t```swift\n\tself.view.squareLoading.start(0.0)\n\t...\n\tself.view.squareLoading.stop(0.0)\n\t```\n2. As a standalone class\n\n\t```swift\n\tlet loadingSquare = AASquaresLoading(target: self.view, size: 40)\n    loadingSquare.start()\n    ....\n    loadingSquare.stop()\n\t```\n3. As a custom class interface builder by setting AASquareLoading as a custom class for a UIView\n\n### Customization\n\n##### Change background color\n```swift\nself.view.squareLoading.backgroundColor = UIColor.redColor()\n```\n##### Change squares color\n```swift\nself.view.squareLoading.color = UIColor.whiteColor()\n```\n##### Change the square size\n```swift\nself.view.squareLoading.setSquareSize(120)\n```\n\n## License\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Anas AIT-ALI\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "Sublime/Pods/AASquaresLoading/Source/AASquaresLoading.swift",
    "content": "//\n//  AASquaresLoading.swift\n//  Etix Mobile\n//\n//  Created by Anas Ait Ali on 18/02/15.\n//  Copyright (c) 2015 Etix. All rights reserved.\n//\n\nimport UIKit\n\n//MARK: AASquareLoadingInterface\n/**\n Interface for the AASquareLoading class\n*/\npublic protocol AASquareLoadingInterface: class {\n  var color : UIColor { get set }\n  var backgroundColor : UIColor? { get set }\n  \n  func start(delay : NSTimeInterval)\n  func stop(delay : NSTimeInterval)\n  func setSquareSize(size: Float)\n}\n\nprivate var AASLAssociationKey: UInt8 = 0\n\n//MARK: UIView extension\npublic extension UIView {\n\n  /**\n   Variable to allow access to the class AASquareLoading\n   */\n  public var squareLoading: AASquareLoadingInterface {\n    get {\n      if let value = objc_getAssociatedObject(self, &AASLAssociationKey) as? AASquareLoadingInterface {\n        return value\n      } else {\n        let squareLoading = AASquaresLoading(target: self)\n        \n        objc_setAssociatedObject(self, &AASLAssociationKey, squareLoading,\n          objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)\n        \n        return squareLoading\n      }\n    }\n    \n    set {\n      objc_setAssociatedObject(self, &AASLAssociationKey, newValue,\n        objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)\n    }\n  }\n}\n\n//MARK: AASquareLoading class\n\n/**\n Main class AASquareLoading\n*/\npublic class AASquaresLoading : UIView, AASquareLoadingInterface {\n  public var view : UIView = UIView()\n  private(set) public var size : Float = 0\n  public var color : UIColor = UIColor(red: 0, green: 0.48, blue: 1, alpha: 1) {\n    didSet {\n      for layer in squares {\n        layer.backgroundColor = color.CGColor\n      }\n    }\n  }\n  public var parentView : UIView?\n\n  private var squareSize: Float?\n  private var gapSize: Float?\n  private var moveTime: Float?\n  private var squareStartX: Float?\n  private var squareStartY: Float?\n  private var squareStartOpacity: Float?\n  private var squareEndX: Float?\n  private var squareEndY: Float?\n  private var squareEndOpacity: Float?\n  private var squareOffsetX: [Float] = [Float](count: 9, repeatedValue: 0)\n  private var squareOffsetY: [Float] = [Float](count: 9, repeatedValue: 0)\n  private var squareOpacity: [Float] = [Float](count: 9, repeatedValue: 0)\n  private var squares : [CALayer] = [CALayer]()\n  private var frameHeightOffset: CGFloat = 0\n\n  public init(target: UIView) {\n    super.init(frame: target.frame)\n    parentView = target\n    setup(self.size)\n  }\n\n  public init(target: UIView, size: Float) {\n    super.init(frame: target.frame)\n\n    parentView = target\n    setup(size)\n  }\n  \n    public init(target: UIView, size: Float, hasNavigation: Bool, hasTabbar: Bool) {\n    super.init(frame: target.frame)\n    \n    if hasNavigation {\n        self.frameHeightOffset += 64\n    }\n    if hasTabbar {\n        self.frameHeightOffset += 49\n    }\n    \n    parentView = target\n    setup(size)\n  }\n\n  override init(frame: CGRect) {\n    super.init(frame: frame)\n    \n    setup(0)\n  }\n\n  required public init?(coder aDecoder: NSCoder) {\n    super.init(coder: aDecoder)\n\n    setup(0)\n  }\n  \n  public override func layoutSubviews() {\n    updateFrame()\n    super.layoutSubviews()\n  }\n  \n  private func setup(size: Float) {\n    self.size = size\n    updateFrame()\n    self.initialize()\n  }\n  \n  private func updateFrame() {\n    if parentView != nil {\n      self.frame = CGRectMake(0, 0, CGRectGetWidth(parentView!.frame), CGRectGetHeight(parentView!.frame) - self.frameHeightOffset)\n    }\n    if size == 0 {\n      let width = frame.size.width\n      let height = frame.size.height\n      size = width > height ? Float(height/8) : Float(width/8)\n    }\n    self.view.frame = CGRectMake(frame.width / 2 - CGFloat(size) / 2,\n      frame.height / 2 - CGFloat(size) / 2, CGFloat(size), CGFloat(size))\n  }\n  \n  /**\n   Function to start the loading animation\n   \n   - Parameter delay : The delay before the loading start\n   */\n  public func start(delay : NSTimeInterval = 0.0) {\n    if (parentView != nil) {\n      self.layer.opacity = 0\n      self.parentView!.addSubview(self)\n      UIView.animateWithDuration(0.6, delay: delay, options: UIViewAnimationOptions.CurveEaseInOut,\n        animations: { () -> Void in\n          self.layer.opacity = 1\n        }, completion: nil)\n    }\n  }\n\n  /**\n   Function to start the loading animation\n   \n   - Parameter delay : The delay before the loading start\n   */\n  public func stop(delay : NSTimeInterval = 0.0) {\n    if (parentView != nil) {\n      self.layer.opacity = 1\n      UIView.animateWithDuration(0.6, delay: delay, options: UIViewAnimationOptions.CurveEaseInOut,\n        animations: { () -> Void in\n          self.layer.opacity = 0\n        }, completion: { (success: Bool) -> Void in\n          self.removeFromSuperview()\n      })\n    }\n  }\n\n  public func setSquareSize(size: Float) {\n    self.view.layer.sublayers = nil\n    setup(size)\n  }\n  \n  private func initialize() {\n    let gap : Float = 0.04\n    gapSize = size * gap\n    squareSize = size * (1.0 - 2 * gap) / 3\n    moveTime = 0.15\n    squares = [CALayer]()\n\n    self.addSubview(view)\n    if (self.backgroundColor == nil) {\n      self.backgroundColor = UIColor.whiteColor().colorWithAlphaComponent(0.9)\n    }\n    for var i : Int = 0; i < 3; i++ {\n      for var j : Int = 0; j < 3; j++ {\n        var offsetX, offsetY : Float\n        let idx : Int = 3 * i + j\n        if i == 1 {\n          offsetX = squareSize! * (2 - Float(j)) + gapSize! * (2 - Float(j))\n          offsetY = squareSize! * Float(i) + gapSize! * Float(i)\n        } else {\n          offsetX = squareSize! * Float(j) + gapSize! * Float(j)\n          offsetY = squareSize! * Float(i) + gapSize! * Float(i)\n        }\n        squareOffsetX[idx] = offsetX\n        squareOffsetY[idx] = offsetY\n        squareOpacity[idx] = 0.1 * (Float(idx) + 1)\n      }\n    }\n    squareStartX = squareOffsetX[0]\n    squareStartY = squareOffsetY[0] - 2 * squareSize! - 2 * gapSize!\n    squareStartOpacity = 0.0\n    squareEndX = squareOffsetX[8]\n    squareEndY = squareOffsetY[8] + 2 * squareSize! + 2 * gapSize!\n    squareEndOpacity = 0.0\n\n    for var i = -1; i < 9; i++ {\n      self.addSquareAnimation(i)\n    }\n  }\n\n  private func addSquareAnimation(position: Int) {\n    let square : CALayer = CALayer()\n    if position == -1 {\n      square.frame = CGRectMake(CGFloat(squareStartX!), CGFloat(squareStartY!),\n        CGFloat(squareSize!), CGFloat(squareSize!))\n      square.opacity = squareStartOpacity!\n    } else {\n      square.frame = CGRectMake(CGFloat(squareOffsetX[position]),\n        CGFloat(squareOffsetY[position]), CGFloat(squareSize!), CGFloat(squareSize!))\n      square.opacity = squareOpacity[position]\n    }\n    square.backgroundColor = self.color.CGColor\n    squares.append(square)\n    self.view.layer.addSublayer(square)\n\n    var keyTimes = [Float]()\n    var alphas = [Float]()\n    keyTimes.append(0.0)\n    if position == -1 {\n      alphas.append(0.0)\n    } else {\n      alphas.append(squareOpacity[position])\n    }\n    if position == 0 {\n      square.opacity = 0.0\n    }\n\n    let sp : CGPoint = square.position\n    let path : CGMutablePathRef = CGPathCreateMutable()\n\n    CGPathMoveToPoint(path, nil, sp.x, sp.y)\n\n    var x, y, a : Float\n    if position == -1 {\n      x = squareOffsetX[0] - squareStartX!\n      y = squareOffsetY[0] - squareStartY!\n      a = squareOpacity[0]\n    } else if position == 8 {\n      x = squareEndX! - squareOffsetX[position]\n      y = squareEndY! - squareOffsetY[position]\n      a = squareEndOpacity!\n    } else {\n      x = squareOffsetX[position + 1] - squareOffsetX[position]\n      y = squareOffsetY[position + 1] - squareOffsetY[position]\n      a = squareOpacity[position + 1]\n    }\n    CGPathAddLineToPoint(path, nil, sp.x + CGFloat(x), sp.y + CGFloat(y))\n    keyTimes.append(1.0 / 8.0)\n    alphas.append(a)\n\n    CGPathAddLineToPoint(path, nil, sp.x + CGFloat(x), sp.y + CGFloat(y))\n    keyTimes.append(1.0)\n    alphas.append(a)\n\n    let posAnim : CAKeyframeAnimation = CAKeyframeAnimation(keyPath: \"position\")\n    posAnim.removedOnCompletion = false\n    posAnim.duration = Double(moveTime! * 8)\n    posAnim.path = path\n    posAnim.keyTimes = keyTimes\n\n    let alphaAnim : CAKeyframeAnimation = CAKeyframeAnimation(keyPath: \"opacity\")\n    alphaAnim.removedOnCompletion = false\n    alphaAnim.duration = Double(moveTime! * 8)\n    alphaAnim.values = alphas\n    alphaAnim.keyTimes = keyTimes\n\n    let blankAnim : CAKeyframeAnimation = CAKeyframeAnimation(keyPath: \"opacity\")\n    blankAnim.removedOnCompletion = false\n    blankAnim.beginTime = Double(moveTime! * 8)\n    blankAnim.duration = Double(moveTime!)\n    blankAnim.values = [0.0, 0.0]\n    blankAnim.keyTimes = [0.0, 1.0]\n\n    var beginTime : Float\n    if position == -1 {\n      beginTime = 0\n    } else {\n      beginTime = moveTime! * Float(8 - position)\n    }\n    let group : CAAnimationGroup = CAAnimationGroup()\n    group.animations = [posAnim, alphaAnim, blankAnim]\n    group.beginTime = CACurrentMediaTime() + Double(beginTime)\n    group.repeatCount = HUGE\n    group.removedOnCompletion = false\n    group.delegate = self\n    group.duration = Double(9 * moveTime!)\n\n    square.addAnimation(group, forKey: \"square-\\(position)\")\n  }\n}"
  },
  {
    "path": "Sublime/Pods/Alamofire/LICENSE",
    "content": "Copyright (c) 2014–2016 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": "Sublime/Pods/Alamofire/README.md",
    "content": "![Alamofire: Elegant Networking in Swift](https://raw.githubusercontent.com/Alamofire/Alamofire/assets/alamofire.png)\n\n[![Build Status](https://travis-ci.org/Alamofire/Alamofire.svg)](https://travis-ci.org/Alamofire/Alamofire)\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)](http://cocoadocs.org/docsets/Alamofire)\n[![Twitter](https://img.shields.io/badge/twitter-@AlamofireSF-blue.svg?style=flat)](http://twitter.com/AlamofireSF)\n\nAlamofire is an HTTP networking library written in Swift.\n\n## Features\n\n- [x] Chainable Request / Response methods\n- [x] URL / JSON / plist Parameter Encoding\n- [x] Upload File / Data / Stream / MultipartFormData\n- [x] Download using Request or Resume data\n- [x] Authentication with NSURLCredential\n- [x] HTTP Response Validation\n- [x] TLS Certificate and Public Key Pinning\n- [x] Progress Closure & NSProgress\n- [x] cURL Debug Output\n- [x] Comprehensive Unit Test Coverage\n- [x] [Complete Documentation](http://cocoadocs.org/docsets/Alamofire)\n\n## Requirements\n\n- iOS 8.0+ / Mac OS X 10.9+ / tvOS 9.0+ / watchOS 2.0+\n- Xcode 7.2+\n\n## Migration Guides\n\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\n- If you **need help**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/alamofire). (Tag 'alamofire')\n- If you'd like to **ask a general question**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/alamofire).\n- If you **found a bug**, open an issue.\n- If you **have a feature request**, open an issue.\n- If you **want to contribute**, submit a pull request.\n\n## Installation\n\n> **Embedded frameworks require a minimum deployment target of iOS 8 or OS X Mavericks (10.9).**\n>\n> Alamofire is no longer supported on iOS 7 due to the lack of support for frameworks. Without frameworks, running Travis-CI against iOS 7 would require a second duplicated test target. The separate test suite would need to import all the Swift files and the tests would need to be duplicated and re-written. This split would be too difficult to maintain to ensure the highest possible quality of the Alamofire ecosystem.\n\n### CocoaPods\n\n[CocoaPods](http://cocoapods.org) is a dependency manager for Cocoa projects. You can install it with the following command:\n\n```bash\n$ gem install cocoapods\n```\n\n> CocoaPods 0.39.0+ is required to build Alamofire 3.0.0+.\n\nTo integrate Alamofire into your Xcode project using CocoaPods, specify it in your `Podfile`:\n\n```ruby\nsource 'https://github.com/CocoaPods/Specs.git'\nplatform :ios, '8.0'\nuse_frameworks!\n\npod 'Alamofire', '~> 3.0'\n```\n\nThen, run the following command:\n\n```bash\n$ pod install\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.\n\nYou can install Carthage with [Homebrew](http://brew.sh/) using the following command:\n\n```bash\n$ brew update\n$ brew install carthage\n```\n\nTo integrate Alamofire into your Xcode project using Carthage, specify it in your `Cartfile`:\n\n```ogdl\ngithub \"Alamofire/Alamofire\" ~> 3.0\n```\n\nRun `carthage update` to build the framework and drag the built `Alamofire.framework` into your Xcode project.\n\n### Manually\n\nIf you prefer not to use either 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](http://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 OS X.\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 either `Alamofire iOS` or `Alamofire OSX`.\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---\n\n## Usage\n\n### Making a Request\n\n```swift\nimport Alamofire\n\nAlamofire.request(.GET, \"https://httpbin.org/get\")\n```\n\n### Response Handling\n\n```swift\nAlamofire.request(.GET, \"https://httpbin.org/get\", parameters: [\"foo\": \"bar\"])\n         .responseJSON { response in\n             print(response.request)  // original URL request\n             print(response.response) // URL response\n             print(response.data)     // server data\n             print(response.result)   // result of response serialization\n\n             if let JSON = response.result.value {\n                 print(\"JSON: \\(JSON)\")\n             }\n         }\n```\n\n> Networking in Alamofire is done _asynchronously_. Asynchronous programming may be a source of frustration to programmers unfamiliar with the concept, but there are [very good reasons](https://developer.apple.com/library/ios/qa/qa1693/_index.html) for doing it this way.\n\n> Rather than blocking execution to wait for a response from the server, a [callback](http://en.wikipedia.org/wiki/Callback_%28computer_programming%29) is specified to handle the response once it's received. The result of a request is only available inside the scope of a response handler. Any execution contingent on the response or data received from the server must be done within a handler.\n\n### Response Serialization\n\n**Built-in Response Methods**\n\n- `response()`\n- `responseData()`\n- `responseString(encoding: NSStringEncoding)`\n- `responseJSON(options: NSJSONReadingOptions)`\n- `responsePropertyList(options: NSPropertyListReadOptions)`\n\n#### Response Handler\n\n```swift\nAlamofire.request(.GET, \"https://httpbin.org/get\", parameters: [\"foo\": \"bar\"])\n         .response { request, response, data, error in\n             print(request)\n             print(response)\n             print(data)\n             print(error)\n          }\n```\n\n> The `response` serializer does NOT evaluate any of the response data. It merely forwards on all the information directly from the URL session delegate. We strongly encourage you to leverage the other response serializers taking advantage of `Response` and `Result` types.\n\n#### Response Data Handler\n\n```swift\nAlamofire.request(.GET, \"https://httpbin.org/get\", parameters: [\"foo\": \"bar\"])\n         .responseData { response in\n             print(response.request)\n             print(response.response)\n             print(response.result)\n          }\n```\n\n#### Response String Handler\n\n```swift\nAlamofire.request(.GET, \"https://httpbin.org/get\")\n         .responseString { response in\n             print(\"Success: \\(response.result.isSuccess)\")\n             print(\"Response String: \\(response.result.value)\")\n         }\n```\n\n#### Response JSON Handler\n\n```swift\nAlamofire.request(.GET, \"https://httpbin.org/get\")\n         .responseJSON { response in\n             debugPrint(response)\n         }\n```\n\n#### Chained Response Handlers\n\nResponse handlers can even be chained:\n\n```swift\nAlamofire.request(.GET, \"https://httpbin.org/get\")\n         .responseString { response in\n             print(\"Response String: \\(response.result.value)\")\n         }\n         .responseJSON { response in\n             print(\"Response JSON: \\(response.result.value)\")\n         }\n```\n\n### HTTP Methods\n\n`Alamofire.Method` lists the HTTP methods defined in [RFC 7231 §4.3](http://tools.ietf.org/html/rfc7231#section-4.3):\n\n```swift\npublic enum Method: String {\n    case OPTIONS, GET, HEAD, POST, PUT, PATCH, DELETE, TRACE, CONNECT\n}\n```\n\nThese values can be passed as the first argument of the `Alamofire.request` method:\n\n```swift\nAlamofire.request(.POST, \"https://httpbin.org/post\")\n\nAlamofire.request(.PUT, \"https://httpbin.org/put\")\n\nAlamofire.request(.DELETE, \"https://httpbin.org/delete\")\n```\n\n### Parameters\n\n#### GET Request With URL-Encoded Parameters\n\n```swift\nAlamofire.request(.GET, \"https://httpbin.org/get\", parameters: [\"foo\": \"bar\"])\n// https://httpbin.org/get?foo=bar\n```\n\n#### POST Request With URL-Encoded Parameters\n\n```swift\nlet parameters = [\n    \"foo\": \"bar\",\n    \"baz\": [\"a\", 1],\n    \"qux\": [\n        \"x\": 1,\n        \"y\": 2,\n        \"z\": 3\n    ]\n]\n\nAlamofire.request(.POST, \"https://httpbin.org/post\", parameters: parameters)\n// HTTP body: foo=bar&baz[]=a&baz[]=1&qux[x]=1&qux[y]=2&qux[z]=3\n```\n\n### Parameter Encoding\n\nParameters can also be encoded as JSON, Property List, or any custom format, using the `ParameterEncoding` enum:\n\n```swift\nenum ParameterEncoding {\n    case URL\n    case URLEncodedInURL\n    case JSON\n    case PropertyList(format: NSPropertyListFormat, options: NSPropertyListWriteOptions)\n    case Custom((URLRequestConvertible, [String: AnyObject]?) -> (NSMutableURLRequest, NSError?))\n\n    func encode(request: NSURLRequest, parameters: [String: AnyObject]?) -> (NSURLRequest, NSError?)\n    { ... }\n}\n```\n\n- `URL`: A query string to be set as or appended to any existing URL query for `GET`, `HEAD`, and `DELETE` requests, or set as the body for requests with any other HTTP method. The `Content-Type` HTTP header field of an encoded request with HTTP body is set to `application/x-www-form-urlencoded`. _Since there is no published specification for how to encode collection types, Alamofire follows the convention of appending `[]` to the key for array values (`foo[]=1&foo[]=2`), and appending the key surrounded by square brackets for nested dictionary values (`foo[bar]=baz`)._\n- `URLEncodedInURL`: Creates query string to be set as or appended to any existing URL query. Uses the same implementation as the `.URL` case, but always applies the encoded result to the URL.\n- `JSON`: Uses `NSJSONSerialization` to create a JSON representation of the parameters object, which is set as the body of the request. The `Content-Type` HTTP header field of an encoded request is set to `application/json`.\n- `PropertyList`: Uses `NSPropertyListSerialization` to create a plist representation of the parameters object, according to the associated format and write options values, which is set as the body of the request. The `Content-Type` HTTP header field of an encoded request is set to `application/x-plist`.\n- `Custom`: Uses the associated closure value to construct a new request given an existing request and parameters.\n\n#### Manual Parameter Encoding of an NSURLRequest\n\n```swift\nlet URL = NSURL(string: \"https://httpbin.org/get\")!\nvar request = NSMutableURLRequest(URL: URL)\n\nlet parameters = [\"foo\": \"bar\"]\nlet encoding = Alamofire.ParameterEncoding.URL\n(request, _) = encoding.encode(request, parameters: parameters)\n```\n\n#### POST Request with JSON-encoded Parameters\n\n```swift\nlet parameters = [\n    \"foo\": [1,2,3],\n    \"bar\": [\n        \"baz\": \"qux\"\n    ]\n]\n\nAlamofire.request(.POST, \"https://httpbin.org/post\", parameters: parameters, encoding: .JSON)\n// HTTP body: {\"foo\": [1, 2, 3], \"bar\": {\"baz\": \"qux\"}}\n```\n\n### HTTP Headers\n\nAdding a custom HTTP header to a `Request` is supported directly in the global `request` method. This makes it easy to attach HTTP headers to a `Request` that can be constantly changing.\n\n> For HTTP headers that do not change, it is recommended to set them on the `NSURLSessionConfiguration` so they are automatically applied to any `NSURLSessionTask` created by the underlying `NSURLSession`.\n\n```swift\nlet headers = [\n    \"Authorization\": \"Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==\",\n    \"Content-Type\": \"application/x-www-form-urlencoded\"\n]\n\nAlamofire.request(.GET, \"https://httpbin.org/get\", headers: headers)\n         .responseJSON { response in\n             debugPrint(response)\n         }\n```\n\n### Caching\n\nCaching is handled on the system framework level by [`NSURLCache`](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURLCache_Class/Reference/Reference.html#//apple_ref/occ/cl/NSURLCache).\n\n### Uploading\n\n**Supported Upload Types**\n\n- File\n- Data\n- Stream\n- MultipartFormData\n\n#### Uploading a File\n\n```swift\nlet fileURL = NSBundle.mainBundle().URLForResource(\"Default\", withExtension: \"png\")\nAlamofire.upload(.POST, \"https://httpbin.org/post\", file: fileURL)\n```\n\n#### Uploading with Progress\n\n```swift\nAlamofire.upload(.POST, \"https://httpbin.org/post\", file: fileURL)\n         .progress { bytesWritten, totalBytesWritten, totalBytesExpectedToWrite in\n             print(totalBytesWritten)\n\n             // This closure is NOT called on the main queue for performance\n             // reasons. To update your ui, dispatch to the main queue.\n             dispatch_async(dispatch_get_main_queue()) {\n                 print(\"Total bytes written on main queue: \\(totalBytesWritten)\")\n             }\n         }\n         .responseJSON { response in\n             debugPrint(response)\n         }\n```\n\n#### Uploading MultipartFormData\n\n```swift\nAlamofire.upload(\n    .POST,\n    \"https://httpbin.org/post\",\n    multipartFormData: { multipartFormData in\n        multipartFormData.appendBodyPart(fileURL: unicornImageURL, name: \"unicorn\")\n        multipartFormData.appendBodyPart(fileURL: rainbowImageURL, name: \"rainbow\")\n    },\n    encodingCompletion: { encodingResult in\n    \tswitch encodingResult {\n    \tcase .Success(let upload, _, _):\n            upload.responseJSON { response in\n                debugPrint(response)\n            }\n    \tcase .Failure(let encodingError):\n    \t    print(encodingError)\n    \t}\n    }\n)\n```\n\n### Downloading\n\n**Supported Download Types**\n\n- Request\n- Resume Data\n\n#### Downloading a File\n\n```swift\nAlamofire.download(.GET, \"https://httpbin.org/stream/100\") { temporaryURL, response in\n    let fileManager = NSFileManager.defaultManager()\n    let directoryURL = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]\n    let pathComponent = response.suggestedFilename\n\n    return directoryURL.URLByAppendingPathComponent(pathComponent!)\n}\n```\n\n#### Using the Default Download Destination\n\n```swift\nlet destination = Alamofire.Request.suggestedDownloadDestination(directory: .DocumentDirectory, domain: .UserDomainMask)\nAlamofire.download(.GET, \"https://httpbin.org/stream/100\", destination: destination)\n```\n\n#### Downloading a File w/Progress\n\n```swift\nAlamofire.download(.GET, \"https://httpbin.org/stream/100\", destination: destination)\n         .progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in\n             print(totalBytesRead)\n\n             // This closure is NOT called on the main queue for performance\n             // reasons. To update your ui, dispatch to the main queue.\n             dispatch_async(dispatch_get_main_queue()) {\n                 print(\"Total bytes read on main queue: \\(totalBytesRead)\")\n             }\n         }\n         .response { _, _, _, error in\n             if let error = error {\n                 print(\"Failed with error: \\(error)\")\n             } else {\n                 print(\"Downloaded file successfully\")\n             }\n         }\n```\n\n#### Accessing Resume Data for Failed Downloads\n\n```swift\nAlamofire.download(.GET, \"https://httpbin.org/stream/100\", destination: destination)\n         .response { _, _, data, _ in\n             if let\n                 data = data,\n                 resumeDataString = NSString(data: data, encoding: NSUTF8StringEncoding)\n             {\n                 print(\"Resume Data: \\(resumeDataString)\")\n             } else {\n                 print(\"Resume Data was empty\")\n             }\n         }\n```\n\n> The `data` parameter is automatically populated with the `resumeData` if available.\n\n```swift\nlet download = Alamofire.download(.GET, \"https://httpbin.org/stream/100\", destination: destination)\ndownload.response { _, _, _, _ in\n    if let\n        resumeData = download.resumeData,\n        resumeDataString = NSString(data: resumeData, encoding: NSUTF8StringEncoding)\n    {\n        print(\"Resume Data: \\(resumeDataString)\")\n    } else {\n        print(\"Resume Data was empty\")\n    }\n}\n```\n\n### Authentication\n\nAuthentication is handled on the system framework level by [`NSURLCredential` and `NSURLAuthenticationChallenge`](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURLAuthenticationChallenge_Class/Reference/Reference.html).\n\n**Supported Authentication Schemes**\n\n- [HTTP Basic](http://en.wikipedia.org/wiki/Basic_access_authentication)\n- [HTTP Digest](http://en.wikipedia.org/wiki/Digest_access_authentication)\n- [Kerberos](http://en.wikipedia.org/wiki/Kerberos_%28protocol%29)\n- [NTLM](http://en.wikipedia.org/wiki/NT_LAN_Manager)\n\n#### HTTP Basic Authentication\n\nThe `authenticate` method on a `Request` will automatically provide an `NSURLCredential` to an `NSURLAuthenticationChallenge` when appropriate:\n\n```swift\nlet user = \"user\"\nlet password = \"password\"\n\nAlamofire.request(.GET, \"https://httpbin.org/basic-auth/\\(user)/\\(password)\")\n         .authenticate(user: user, password: password)\n         .responseJSON { response in\n             debugPrint(response)\n         }\n```\n\nDepending upon your server implementation, an `Authorization` header may also be appropriate:\n\n```swift\nlet user = \"user\"\nlet password = \"password\"\n\nlet credentialData = \"\\(user):\\(password)\".dataUsingEncoding(NSUTF8StringEncoding)!\nlet base64Credentials = credentialData.base64EncodedStringWithOptions([])\n\nlet headers = [\"Authorization\": \"Basic \\(base64Credentials)\"]\n\nAlamofire.request(.GET, \"https://httpbin.org/basic-auth/user/password\", headers: headers)\n         .responseJSON { response in\n             debugPrint(response)\n         }\n```\n\n#### Authentication with NSURLCredential\n\n```swift\nlet user = \"user\"\nlet password = \"password\"\n\nlet credential = NSURLCredential(user: user, password: password, persistence: .ForSession)\n\nAlamofire.request(.GET, \"https://httpbin.org/basic-auth/\\(user)/\\(password)\")\n         .authenticate(usingCredential: credential)\n         .responseJSON { response in\n             debugPrint(response)\n         }\n```\n\n### Validation\n\nBy default, Alamofire treats any completed request to be successful, regardless of the content of the response. Calling `validate` before a response handler causes an error to be generated if the response had an unacceptable status code or MIME type.\n\n#### Manual Validation\n\n```swift\nAlamofire.request(.GET, \"https://httpbin.org/get\", parameters: [\"foo\": \"bar\"])\n         .validate(statusCode: 200..<300)\n         .validate(contentType: [\"application/json\"])\n         .response { response in\n             print(response)\n         }\n```\n\n#### Automatic Validation\n\nAutomatically validates status code within `200...299` range, and that the `Content-Type` header of the response matches the `Accept` header of the request, if one is provided.\n\n```swift\nAlamofire.request(.GET, \"https://httpbin.org/get\", parameters: [\"foo\": \"bar\"])\n         .validate()\n         .responseJSON { response in\n             switch response.result {\n             case .Success:\n                 print(\"Validation Successful\")\n             case .Failure(let error):\n                 print(error)\n             }\n         }\n```\n\n### Timeline\n\nAlamofire collects timings throughout the lifecycle of a `Request` and creates a `Timeline` object exposed as a property on a `Response`.\n\n```swift\nAlamofire.request(.GET, \"https://httpbin.org/get\", parameters: [\"foo\": \"bar\"])\n         .validate()\n         .responseJSON { response in\n             print(response.timeline)\n         }\n```\n\nThe above reports the following `Timeline` info:\n\n- `Latency`: 0.428 seconds\n- `Request Duration`: 0.428 seconds\n- `Serialization Duration`: 0.001 seconds\n- `Total Duration`: 0.429 seconds\n\n### Printable\n\n```swift\nlet request = Alamofire.request(.GET, \"https://httpbin.org/ip\")\n\nprint(request)\n// GET https://httpbin.org/ip (200)\n```\n\n### DebugPrintable\n\n```swift\nlet request = Alamofire.request(.GET, \"https://httpbin.org/get\", parameters: [\"foo\": \"bar\"])\n\ndebugPrint(request)\n```\n\n#### Output (cURL)\n\n```bash\n$ curl -i \\\n\t-H \"User-Agent: Alamofire\" \\\n\t-H \"Accept-Encoding: Accept-Encoding: gzip;q=1.0,compress;q=0.5\" \\\n\t-H \"Accept-Language: en;q=1.0,fr;q=0.9,de;q=0.8,zh-Hans;q=0.7,zh-Hant;q=0.6,ja;q=0.5\" \\\n\t\"https://httpbin.org/get?foo=bar\"\n```\n\n---\n\n## Advanced Usage\n\n> Alamofire is built on `NSURLSession` and the Foundation URL Loading System. To make the most of\nthis framework, it is recommended that you be familiar with the concepts and capabilities of the underlying networking stack.\n\n**Recommended Reading**\n\n- [URL Loading System Programming Guide](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html)\n- [NSURLSession Class Reference](https://developer.apple.com/library/mac/documentation/Foundation/Reference/NSURLSession_class/Introduction/Introduction.html#//apple_ref/occ/cl/NSURLSession)\n- [NSURLCache Class Reference](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURLCache_Class/Reference/Reference.html#//apple_ref/occ/cl/NSURLCache)\n- [NSURLAuthenticationChallenge Class Reference](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURLAuthenticationChallenge_Class/Reference/Reference.html)\n\n### Manager\n\nTop-level convenience methods like `Alamofire.request` use a shared instance of `Alamofire.Manager`, which is configured with the default `NSURLSessionConfiguration`.\n\nAs such, the following two statements are equivalent:\n\n```swift\nAlamofire.request(.GET, \"https://httpbin.org/get\")\n```\n\n```swift\nlet manager = Alamofire.Manager.sharedInstance\nmanager.request(NSURLRequest(URL: NSURL(string: \"https://httpbin.org/get\")!))\n```\n\nApplications can create managers for background and ephemeral sessions, as well as new managers that customize the default session configuration, such as for default headers (`HTTPAdditionalHeaders`) or timeout interval (`timeoutIntervalForRequest`).\n\n#### Creating a Manager with Default Configuration\n\n```swift\nlet configuration = NSURLSessionConfiguration.defaultSessionConfiguration()\nlet manager = Alamofire.Manager(configuration: configuration)\n```\n\n#### Creating a Manager with Background Configuration\n\n```swift\nlet configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(\"com.example.app.background\")\nlet manager = Alamofire.Manager(configuration: configuration)\n```\n\n#### Creating a Manager with Ephemeral Configuration\n\n```swift\nlet configuration = NSURLSessionConfiguration.ephemeralSessionConfiguration()\nlet manager = Alamofire.Manager(configuration: configuration)\n```\n\n#### Modifying Session Configuration\n\n```swift\nvar defaultHeaders = Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders ?? [:]\ndefaultHeaders[\"DNT\"] = \"1 (Do Not Track Enabled)\"\n\nlet configuration = NSURLSessionConfiguration.defaultSessionConfiguration()\nconfiguration.HTTPAdditionalHeaders = defaultHeaders\n\nlet manager = Alamofire.Manager(configuration: configuration)\n```\n\n> This is **not** recommended for `Authorization` or `Content-Type` headers. Instead, use `URLRequestConvertible` and `ParameterEncoding`, respectively.\n\n### Request\n\nThe result of a `request`, `upload`, or `download` method is an instance of `Alamofire.Request`. A request is always created using a constructor method from an owning manager, and never initialized directly.\n\nMethods like `authenticate`, `validate` and `responseData` return the caller in order to facilitate chaining.\n\nRequests can be suspended, resumed, and cancelled:\n\n- `suspend()`: Suspends the underlying task and dispatch queue\n- `resume()`: Resumes the underlying task and dispatch queue. If the owning manager does not have `startRequestsImmediately` set to `true`, the request must call `resume()` in order to start.\n- `cancel()`: Cancels the underlying task, producing an error that is passed to any registered response handlers.\n\n### Response Serialization\n\n#### Creating a Custom Response Serializer\n\nAlamofire provides built-in response serialization for strings, JSON, and property lists, but others can be added in extensions on `Alamofire.Request`.\n\nFor example, here's how a response handler using [Ono](https://github.com/mattt/Ono) might be implemented:\n\n```swift\nextension Request {\n    public static func XMLResponseSerializer() -> ResponseSerializer<ONOXMLDocument, NSError> {\n        return ResponseSerializer { request, response, data, error in\n            guard error == nil else { return .Failure(error!) }\n\n            guard let validData = data else {\n                let failureReason = \"Data could not be serialized. Input data was nil.\"\n                let error = Error.errorWithCode(.DataSerializationFailed, failureReason: failureReason)\n                return .Failure(error)\n            }\n\n            do {\n                let XML = try ONOXMLDocument(data: validData)\n                return .Success(XML)\n            } catch {\n                return .Failure(error as NSError)\n            }\n        }\n    }\n\n    public func responseXMLDocument(completionHandler: Response<ONOXMLDocument, NSError> -> Void) -> Self {\n        return response(responseSerializer: Request.XMLResponseSerializer(), completionHandler: completionHandler)\n    }\n}\n```\n\n#### Generic Response Object Serialization\n\nGenerics can be used to provide automatic, type-safe response object serialization.\n\n```swift\npublic protocol ResponseObjectSerializable {\n    init?(response: NSHTTPURLResponse, representation: AnyObject)\n}\n\nextension Request {\n    public func responseObject<T: ResponseObjectSerializable>(completionHandler: Response<T, NSError> -> Void) -> Self {\n        let responseSerializer = ResponseSerializer<T, NSError> { request, response, data, error in\n            guard error == nil else { return .Failure(error!) }\n\n            let JSONResponseSerializer = Request.JSONResponseSerializer(options: .AllowFragments)\n            let result = JSONResponseSerializer.serializeResponse(request, response, data, error)\n\n            switch result {\n            case .Success(let value):\n                if let\n                    response = response,\n                    responseObject = T(response: response, representation: value)\n                {\n                    return .Success(responseObject)\n                } else {\n                    let failureReason = \"JSON could not be serialized into response object: \\(value)\"\n                    let error = Error.errorWithCode(.JSONSerializationFailed, failureReason: failureReason)\n                    return .Failure(error)\n                }\n            case .Failure(let error):\n                return .Failure(error)\n            }\n        }\n\n        return response(responseSerializer: responseSerializer, completionHandler: completionHandler)\n    }\n}\n```\n\n```swift\nfinal class User: ResponseObjectSerializable {\n    let username: String\n    let name: String\n\n    init?(response: NSHTTPURLResponse, representation: AnyObject) {\n        self.username = response.URL!.lastPathComponent!\n        self.name = representation.valueForKeyPath(\"name\") as! String\n    }\n}\n```\n\n```swift\nAlamofire.request(.GET, \"https://example.com/users/mattt\")\n         .responseObject { (response: Response<User, NSError>) in\n             debugPrint(response)\n         }\n```\n\nThe same approach can also be used to handle endpoints that return a representation of a collection of objects:\n\n```swift\npublic protocol ResponseCollectionSerializable {\n    static func collection(response response: NSHTTPURLResponse, representation: AnyObject) -> [Self]\n}\n\nextension Alamofire.Request {\n    public func responseCollection<T: ResponseCollectionSerializable>(completionHandler: Response<[T], NSError> -> Void) -> Self {\n        let responseSerializer = ResponseSerializer<[T], NSError> { request, response, data, error in\n            guard error == nil else { return .Failure(error!) }\n\n            let JSONSerializer = Request.JSONResponseSerializer(options: .AllowFragments)\n            let result = JSONSerializer.serializeResponse(request, response, data, error)\n\n            switch result {\n            case .Success(let value):\n                if let response = response {\n                    return .Success(T.collection(response: response, representation: value))\n                } else {\n                    let failureReason = \"Response collection could not be serialized due to nil response\"\n                    let error = Error.errorWithCode(.JSONSerializationFailed, failureReason: failureReason)\n                    return .Failure(error)\n                }\n            case .Failure(let error):\n                return .Failure(error)\n            }\n        }\n\n        return response(responseSerializer: responseSerializer, completionHandler: completionHandler)\n    }\n}\n```\n\n```swift\nfinal class User: ResponseObjectSerializable, ResponseCollectionSerializable {\n    let username: String\n    let name: String\n\n    init?(response: NSHTTPURLResponse, representation: AnyObject) {\n        self.username = response.URL!.lastPathComponent!\n        self.name = representation.valueForKeyPath(\"name\") as! String\n    }\n\n    static func collection(response response: NSHTTPURLResponse, representation: AnyObject) -> [User] {\n        var users: [User] = []\n\n        if let representation = representation as? [[String: AnyObject]] {\n            for userRepresentation in representation {\n                if let user = User(response: response, representation: userRepresentation) {\n                    users.append(user)\n                }\n            }\n        }\n\n        return users\n    }\n}\n```\n\n```swift\nAlamofire.request(.GET, \"http://example.com/users\")\n         .responseCollection { (response: Response<[User], NSError>) in\n             debugPrint(response)\n         }\n```\n\n### URLStringConvertible\n\nTypes adopting the `URLStringConvertible` protocol can be used to construct URL strings, which are then used to construct URL requests. `NSString`, `NSURL`, `NSURLComponents`, and `NSURLRequest` conform to `URLStringConvertible` by default, allowing any of them to be passed as `URLString` parameters to the `request`, `upload`, and `download` methods:\n\n```swift\nlet string = NSString(string: \"https://httpbin.org/post\")\nAlamofire.request(.POST, string)\n\nlet URL = NSURL(string: string)!\nAlamofire.request(.POST, URL)\n\nlet URLRequest = NSURLRequest(URL: URL)\nAlamofire.request(.POST, URLRequest) // overrides `HTTPMethod` of `URLRequest`\n\nlet URLComponents = NSURLComponents(URL: URL, resolvingAgainstBaseURL: true)\nAlamofire.request(.POST, URLComponents)\n```\n\nApplications interacting with web applications in a significant manner are encouraged to have custom types conform to `URLStringConvertible` as a convenient way to map domain-specific models to server resources.\n\n#### Type-Safe Routing\n\n```swift\nextension User: URLStringConvertible {\n    static let baseURLString = \"http://example.com\"\n\n    var URLString: String {\n        return User.baseURLString + \"/users/\\(username)/\"\n    }\n}\n```\n\n```swift\nlet user = User(username: \"mattt\")\nAlamofire.request(.GET, user) // http://example.com/users/mattt\n```\n\n### URLRequestConvertible\n\nTypes adopting the `URLRequestConvertible` protocol can be used to construct URL requests. `NSURLRequest` conforms to `URLRequestConvertible` by default, allowing it to be passed into `request`, `upload`, and `download` methods directly (this is the recommended way to specify custom HTTP body for individual requests):\n\n```swift\nlet URL = NSURL(string: \"https://httpbin.org/post\")!\nlet mutableURLRequest = NSMutableURLRequest(URL: URL)\nmutableURLRequest.HTTPMethod = \"POST\"\n\nlet parameters = [\"foo\": \"bar\"]\n\ndo {\n    mutableURLRequest.HTTPBody = try NSJSONSerialization.dataWithJSONObject(parameters, options: NSJSONWritingOptions())\n} catch {\n    // No-op\n}\n\nmutableURLRequest.setValue(\"application/json\", forHTTPHeaderField: \"Content-Type\")\n\nAlamofire.request(mutableURLRequest)\n```\n\nApplications interacting with web applications in a significant manner are encouraged to have custom types conform to `URLRequestConvertible` as a way to ensure consistency of requested endpoints. Such an approach can be used to abstract away server-side inconsistencies and provide type-safe routing, as well as manage authentication credentials and other state.\n\n#### API Parameter Abstraction\n\n```swift\nenum Router: URLRequestConvertible {\n    static let baseURLString = \"http://example.com\"\n    static let perPage = 50\n\n    case Search(query: String, page: Int)\n\n    // MARK: URLRequestConvertible\n\n    var URLRequest: NSMutableURLRequest {\n        let result: (path: String, parameters: [String: AnyObject]) = {\n            switch self {\n            case .Search(let query, let page) where page > 1:\n                return (\"/search\", [\"q\": query, \"offset\": Router.perPage * page])\n            case .Search(let query, _):\n                return (\"/search\", [\"q\": query])\n            }\n        }()\n\n        let URL = NSURL(string: Router.baseURLString)!\n        let URLRequest = NSURLRequest(URL: URL.URLByAppendingPathComponent(result.path))\n        let encoding = Alamofire.ParameterEncoding.URL\n\n        return encoding.encode(URLRequest, parameters: result.parameters).0\n    }\n}\n```\n\n```swift\nAlamofire.request(Router.Search(query: \"foo bar\", page: 1)) // ?q=foo%20bar&offset=50\n```\n\n#### CRUD & Authorization\n\n```swift\nenum Router: URLRequestConvertible {\n    static let baseURLString = \"http://example.com\"\n    static var OAuthToken: String?\n\n    case CreateUser([String: AnyObject])\n    case ReadUser(String)\n    case UpdateUser(String, [String: AnyObject])\n    case DestroyUser(String)\n\n    var method: Alamofire.Method {\n        switch self {\n        case .CreateUser:\n            return .POST\n        case .ReadUser:\n            return .GET\n        case .UpdateUser:\n            return .PUT\n        case .DestroyUser:\n            return .DELETE\n        }\n    }\n\n    var path: String {\n        switch self {\n        case .CreateUser:\n            return \"/users\"\n        case .ReadUser(let username):\n            return \"/users/\\(username)\"\n        case .UpdateUser(let username, _):\n            return \"/users/\\(username)\"\n        case .DestroyUser(let username):\n            return \"/users/\\(username)\"\n        }\n    }\n\n    // MARK: URLRequestConvertible\n\n    var URLRequest: NSMutableURLRequest {\n        let URL = NSURL(string: Router.baseURLString)!\n        let mutableURLRequest = NSMutableURLRequest(URL: URL.URLByAppendingPathComponent(path))\n        mutableURLRequest.HTTPMethod = method.rawValue\n\n        if let token = Router.OAuthToken {\n            mutableURLRequest.setValue(\"Bearer \\(token)\", forHTTPHeaderField: \"Authorization\")\n        }\n\n        switch self {\n        case .CreateUser(let parameters):\n            return Alamofire.ParameterEncoding.JSON.encode(mutableURLRequest, parameters: parameters).0\n        case .UpdateUser(_, let parameters):\n            return Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: parameters).0\n        default:\n            return mutableURLRequest\n        }\n    }\n}\n```\n\n```swift\nAlamofire.request(Router.ReadUser(\"mattt\")) // GET /users/mattt\n```\n\n### Security\n\nUsing a secure HTTPS connection when communicating with servers and web services is an important step in securing sensitive data. By default, Alamofire will evaluate the certificate chain provided by the server using Apple's built in validation provided by the Security framework. While this guarantees the certificate chain is valid, it does not prevent man-in-the-middle (MITM) attacks or other potential vulnerabilities. In order to mitigate MITM attacks, applications dealing with sensitive customer data or financial information should use certificate or public key pinning provided by the `ServerTrustPolicy`.\n\n#### ServerTrustPolicy\n\nThe `ServerTrustPolicy` enumeration evaluates the server trust generally provided by an `NSURLAuthenticationChallenge` when connecting to a server over a secure HTTPS connection.\n\n```swift\nlet serverTrustPolicy = ServerTrustPolicy.PinCertificates(\n    certificates: ServerTrustPolicy.certificatesInBundle(),\n    validateCertificateChain: true,\n    validateHost: true\n)\n```\n\nThere are many different cases of server trust evaluation giving you complete control over the validation process:\n\n* `PerformDefaultEvaluation`: Uses the default server trust evaluation while allowing you to control whether to validate the host provided by the challenge. \n* `PinCertificates`: Uses the pinned certificates to validate the server trust. The server trust is considered valid if one of the pinned certificates match one of the server certificates.\n* `PinPublicKeys`: Uses the pinned public keys to validate the server trust. The server trust is considered valid if one of the pinned public keys match one of the server certificate public keys.\n* `DisableEvaluation`: Disables all evaluation which in turn will always consider any server trust as valid.\n* `CustomEvaluation`: Uses the associated closure to evaluate the validity of the server trust thus giving you complete control over the validation process. Use with caution.\n\n#### Server Trust Policy Manager\n\nThe `ServerTrustPolicyManager` is responsible for storing an internal mapping of server trust policies to a particular host. This allows Alamofire to evaluate each host against a different server trust policy. \n\n```swift\nlet serverTrustPolicies: [String: ServerTrustPolicy] = [\n    \"test.example.com\": .PinCertificates(\n        certificates: ServerTrustPolicy.certificatesInBundle(),\n        validateCertificateChain: true,\n        validateHost: true\n    ),\n    \"insecure.expired-apis.com\": .DisableEvaluation\n]\n\nlet manager = Manager(\n    serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)\n)\n```\n\n> Make sure to keep a reference to the new `Manager` instance, otherwise your requests will all get cancelled when your `manager` is deallocated.\n\nThese server trust policies will result in the following behavior:\n\n* `test.example.com` will always use certificate pinning with certificate chain and host validation enabled thus requiring the following criteria to be met to allow the TLS handshake to succeed:\n  * Certificate chain MUST be valid.\n  * Certificate chain MUST include one of the pinned certificates.\n  * Challenge host MUST match the host in the certificate chain's leaf certificate.\n* `insecure.expired-apis.com` will never evaluate the certificate chain and will always allow the TLS handshake to succeed.\n* All other hosts will use the default evaluation provided by Apple.\n\n##### Subclassing Server Trust Policy Manager\n\nIf you find yourself needing more flexible server trust policy matching behavior (i.e. wildcarded domains), then subclass the `ServerTrustPolicyManager` and override the `serverTrustPolicyForHost` method with your own custom implementation.\n\n```swift\nclass CustomServerTrustPolicyManager: ServerTrustPolicyManager {\n    override func serverTrustPolicyForHost(host: String) -> ServerTrustPolicy? {\n        var policy: ServerTrustPolicy?\n\n        // Implement your custom domain matching behavior...\n\n        return policy\n    }\n}\n```\n\n#### Validating the Host\n\nThe `.PerformDefaultEvaluation`, `.PinCertificates` and `.PinPublicKeys` server trust policies all take a `validateHost` parameter. Setting the value to `true` will cause the server trust evaluation to verify that hostname in the certificate matches the hostname of the challenge. If they do not match, evaluation will fail. A `validateHost` value of `false` will still evaluate the full certificate chain, but will not validate the hostname of the leaf certificate.\n\n> It is recommended that `validateHost` always be set to `true` in production environments.\n\n#### Validating the Certificate Chain\n\nPinning certificates and public keys both have the option of validating the certificate chain using the `validateCertificateChain` parameter. By setting this value to `true`, the full certificate chain will be evaluated in addition to performing a byte equality check against the pinned certficates or public keys. A value of `false` will skip the certificate chain validation, but will still perform the byte equality check.\n\nThere are several cases where it may make sense to disable certificate chain validation. The most common use cases for disabling validation are self-signed and expired certificates. The evaluation would always fail in both of these cases, but the byte equality check will still ensure you are receiving the certificate you expect from the server.\n\n> It is recommended that `validateCertificateChain` always be set to `true` in production environments.\n\n#### App Transport Security\n\nWith the addition of App Transport Security (ATS) in iOS 9, it is possible that using a custom `ServerTrustPolicyManager` with several `ServerTrustPolicy` objects will have no effect. If you continuously see `CFNetwork SSLHandshake failed (-9806)` errors, you have probably run into this problem. Apple's ATS system overrides the entire challenge system unless you configure the ATS settings in your app's plist to disable enough of it to allow your app to evaluate the server trust.\n\nIf you run into this problem (high probability with self-signed certificates), you can work around this issue by adding the following to your `Info.plist`.\n\n```xml\n<dict>\n\t<key>NSAppTransportSecurity</key>\n\t<dict>\n\t\t<key>NSExceptionDomains</key>\n\t\t<dict>\n\t\t\t<key>example.com</key>\n\t\t\t<dict>\n\t\t\t\t<key>NSExceptionAllowsInsecureHTTPLoads</key>\n\t\t\t\t<true/>\n\t\t\t\t<key>NSExceptionRequiresForwardSecrecy</key>\n\t\t\t\t<false/>\n\t\t\t\t<key>NSIncludesSubdomains</key>\n\t\t\t\t<true/>\n\t\t\t\t<!-- Optional: Specify minimum TLS version -->\n\t\t\t\t<key>NSTemporaryExceptionMinimumTLSVersion</key>\n\t\t\t\t<string>TLSv1.2</string>\n\t\t\t</dict>\n\t\t</dict>\n\t</dict>\n</dict>\n```\n\nWhether you need to set the `NSExceptionRequiresForwardSecrecy` to `NO` depends on whether your TLS connection is using an allowed cipher suite. In certain cases, it will need to be set to `NO`. The `NSExceptionAllowsInsecureHTTPLoads` MUST be set to `YES` in order to allow the `SessionDelegate` to receive challenge callbacks. Once the challenge callbacks are being called, the `ServerTrustPolicyManager` will take over the server trust evaluation. You may also need to specify the `NSTemporaryExceptionMinimumTLSVersion` if you're trying to connect to a host that only supports TLS versions less than `1.2`.\n\n> It is recommended to always use valid certificates in production environments.\n\n### Network Reachability\n\nThe `NetworkReachabilityManager` listens for reachability changes of hosts and addresses for both WWAN and WiFi network interfaces.\n\n```swift\nlet manager = NetworkReachabilityManager(host: \"www.apple.com\")\n\nmanager?.listener = { status in\n    print(\"Network Status Changed: \\(status)\")\n}\n\nmanager?.startListening()\n```\n\n> Make sure to remember to retain the `manager` in the above example, or no status changes will be reported.\n\nThere are some important things to remember when using network reachability to determine what to do next.\n\n* **Do NOT** use Reachability to determine if a network request should be sent.\n  * You should **ALWAYS** send it.\n* When Reachability is restored, use the event to retry failed network requests.\n  * Even though the network requests may still fail, this is a good moment to retry them.\n* The network reachability status can be useful for determining why a network request may have failed.\n  * If a network request fails, it is more useful to tell the user that the network request failed due to being offline rather than a more technical errror, such as \"request timed out.\"\n\n> It is recommended to check out [WWDC 2012 Session 706, \"Networking Best Practices\"](https://developer.apple.com/videos/play/wwdc2012-706/) for more info.\n\n---\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\n## Open Rdars\n\nThe following rdars have some affect 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 test case\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---\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## License\n\nAlamofire is released under the MIT license. See LICENSE for details.\n"
  },
  {
    "path": "Sublime/Pods/Alamofire/Source/Alamofire.swift",
    "content": "// Alamofire.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\nimport Foundation\n\n// MARK: - URLStringConvertible\n\n/**\n    Types adopting the `URLStringConvertible` protocol can be used to construct URL strings, which are then used to \n    construct URL requests.\n*/\npublic protocol URLStringConvertible {\n    /**\n        A URL that conforms to RFC 2396.\n\n        Methods accepting a `URLStringConvertible` type parameter parse it according to RFCs 1738 and 1808.\n\n        See https://tools.ietf.org/html/rfc2396\n        See https://tools.ietf.org/html/rfc1738\n        See https://tools.ietf.org/html/rfc1808\n    */\n    var URLString: String { get }\n}\n\nextension String: URLStringConvertible {\n    public var URLString: String {\n        return self\n    }\n}\n\nextension NSURL: URLStringConvertible {\n    public var URLString: String {\n        return absoluteString\n    }\n}\n\nextension NSURLComponents: URLStringConvertible {\n    public var URLString: String {\n        return URL!.URLString\n    }\n}\n\nextension NSURLRequest: URLStringConvertible {\n    public var URLString: String {\n        return URL!.URLString\n    }\n}\n\n// MARK: - URLRequestConvertible\n\n/**\n    Types adopting the `URLRequestConvertible` protocol can be used to construct URL requests.\n*/\npublic protocol URLRequestConvertible {\n    /// The URL request.\n    var URLRequest: NSMutableURLRequest { get }\n}\n\nextension NSURLRequest: URLRequestConvertible {\n    public var URLRequest: NSMutableURLRequest {\n        return self.mutableCopy() as! NSMutableURLRequest\n    }\n}\n\n// MARK: - Convenience\n\nfunc URLRequest(\n    method: Method,\n    _ URLString: URLStringConvertible,\n    headers: [String: String]? = nil)\n    -> NSMutableURLRequest\n{\n    let mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: URLString.URLString)!)\n    mutableURLRequest.HTTPMethod = method.rawValue\n\n    if let headers = headers {\n        for (headerField, headerValue) in headers {\n            mutableURLRequest.setValue(headerValue, forHTTPHeaderField: headerField)\n        }\n    }\n\n    return mutableURLRequest\n}\n\n// MARK: - Request Methods\n\n/**\n    Creates a request using the shared manager instance for the specified method, URL string, parameters, and\n    parameter encoding.\n\n    - parameter method:     The HTTP method.\n    - parameter URLString:  The URL string.\n    - parameter parameters: The parameters. `nil` by default.\n    - parameter encoding:   The parameter encoding. `.URL` by default.\n    - parameter headers:    The HTTP headers. `nil` by default.\n\n    - returns: The created request.\n*/\npublic func request(\n    method: Method,\n    _ URLString: URLStringConvertible,\n    parameters: [String: AnyObject]? = nil,\n    encoding: ParameterEncoding = .URL,\n    headers: [String: String]? = nil)\n    -> Request\n{\n    return Manager.sharedInstance.request(\n        method,\n        URLString,\n        parameters: parameters,\n        encoding: encoding,\n        headers: headers\n    )\n}\n\n/**\n    Creates a request using the shared manager instance for the specified URL request.\n\n    If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n\n    - parameter URLRequest: The URL request\n\n    - returns: The created request.\n*/\npublic func request(URLRequest: URLRequestConvertible) -> Request {\n    return Manager.sharedInstance.request(URLRequest.URLRequest)\n}\n\n// MARK: - Upload Methods\n\n// MARK: File\n\n/**\n    Creates an upload request using the shared manager instance for the specified method, URL string, and file.\n\n    - parameter method:    The HTTP method.\n    - parameter URLString: The URL string.\n    - parameter headers:   The HTTP headers. `nil` by default.\n    - parameter file:      The file to upload.\n\n    - returns: The created upload request.\n*/\npublic func upload(\n    method: Method,\n    _ URLString: URLStringConvertible,\n    headers: [String: String]? = nil,\n    file: NSURL)\n    -> Request\n{\n    return Manager.sharedInstance.upload(method, URLString, headers: headers, file: file)\n}\n\n/**\n    Creates an upload request using the shared manager instance for the specified URL request and file.\n\n    - parameter URLRequest: The URL request.\n    - parameter file:       The file to upload.\n\n    - returns: The created upload request.\n*/\npublic func upload(URLRequest: URLRequestConvertible, file: NSURL) -> Request {\n    return Manager.sharedInstance.upload(URLRequest, file: file)\n}\n\n// MARK: Data\n\n/**\n    Creates an upload request using the shared manager instance for the specified method, URL string, and data.\n\n    - parameter method:    The HTTP method.\n    - parameter URLString: The URL string.\n    - parameter headers:   The HTTP headers. `nil` by default.\n    - parameter data:      The data to upload.\n\n    - returns: The created upload request.\n*/\npublic func upload(\n    method: Method,\n    _ URLString: URLStringConvertible,\n    headers: [String: String]? = nil,\n    data: NSData)\n    -> Request\n{\n    return Manager.sharedInstance.upload(method, URLString, headers: headers, data: data)\n}\n\n/**\n    Creates an upload request using the shared manager instance for the specified URL request and data.\n\n    - parameter URLRequest: The URL request.\n    - parameter data:       The data to upload.\n\n    - returns: The created upload request.\n*/\npublic func upload(URLRequest: URLRequestConvertible, data: NSData) -> Request {\n    return Manager.sharedInstance.upload(URLRequest, data: data)\n}\n\n// MARK: Stream\n\n/**\n    Creates an upload request using the shared manager instance for the specified method, URL string, and stream.\n\n    - parameter method:    The HTTP method.\n    - parameter URLString: The URL string.\n    - parameter headers:   The HTTP headers. `nil` by default.\n    - parameter stream:    The stream to upload.\n\n    - returns: The created upload request.\n*/\npublic func upload(\n    method: Method,\n    _ URLString: URLStringConvertible,\n    headers: [String: String]? = nil,\n    stream: NSInputStream)\n    -> Request\n{\n    return Manager.sharedInstance.upload(method, URLString, headers: headers, stream: stream)\n}\n\n/**\n    Creates an upload request using the shared manager instance for the specified URL request and stream.\n\n    - parameter URLRequest: The URL request.\n    - parameter stream:     The stream to upload.\n\n    - returns: The created upload request.\n*/\npublic func upload(URLRequest: URLRequestConvertible, stream: NSInputStream) -> Request {\n    return Manager.sharedInstance.upload(URLRequest, stream: stream)\n}\n\n// MARK: MultipartFormData\n\n/**\n    Creates an upload request using the shared manager instance for the specified method and URL string.\n\n    - parameter method:                  The HTTP method.\n    - parameter URLString:               The URL string.\n    - parameter headers:                 The HTTP headers. `nil` by default.\n    - parameter multipartFormData:       The closure used to append body parts to the `MultipartFormData`.\n    - parameter encodingMemoryThreshold: The encoding memory threshold in bytes.\n                                         `MultipartFormDataEncodingMemoryThreshold` by default.\n    - parameter encodingCompletion:      The closure called when the `MultipartFormData` encoding is complete.\n*/\npublic func upload(\n    method: Method,\n    _ URLString: URLStringConvertible,\n    headers: [String: String]? = nil,\n    multipartFormData: MultipartFormData -> Void,\n    encodingMemoryThreshold: UInt64 = Manager.MultipartFormDataEncodingMemoryThreshold,\n    encodingCompletion: (Manager.MultipartFormDataEncodingResult -> Void)?)\n{\n    return Manager.sharedInstance.upload(\n        method,\n        URLString,\n        headers: headers,\n        multipartFormData: multipartFormData,\n        encodingMemoryThreshold: encodingMemoryThreshold,\n        encodingCompletion: encodingCompletion\n    )\n}\n\n/**\n    Creates an upload request using the shared manager instance for the specified method and URL string.\n\n    - parameter URLRequest:              The URL request.\n    - parameter multipartFormData:       The closure used to append body parts to the `MultipartFormData`.\n    - parameter encodingMemoryThreshold: The encoding memory threshold in bytes.\n                                         `MultipartFormDataEncodingMemoryThreshold` by default.\n    - parameter encodingCompletion:      The closure called when the `MultipartFormData` encoding is complete.\n*/\npublic func upload(\n    URLRequest: URLRequestConvertible,\n    multipartFormData: MultipartFormData -> Void,\n    encodingMemoryThreshold: UInt64 = Manager.MultipartFormDataEncodingMemoryThreshold,\n    encodingCompletion: (Manager.MultipartFormDataEncodingResult -> Void)?)\n{\n    return Manager.sharedInstance.upload(\n        URLRequest,\n        multipartFormData: multipartFormData,\n        encodingMemoryThreshold: encodingMemoryThreshold,\n        encodingCompletion: encodingCompletion\n    )\n}\n\n// MARK: - Download Methods\n\n// MARK: URL Request\n\n/**\n    Creates a download request using the shared manager instance for the specified method and URL string.\n\n    - parameter method:      The HTTP method.\n    - parameter URLString:   The URL string.\n    - parameter parameters:  The parameters. `nil` by default.\n    - parameter encoding:    The parameter encoding. `.URL` by default.\n    - parameter headers:     The HTTP headers. `nil` by default.\n    - parameter destination: The closure used to determine the destination of the downloaded file.\n\n    - returns: The created download request.\n*/\npublic func download(\n    method: Method,\n    _ URLString: URLStringConvertible,\n    parameters: [String: AnyObject]? = nil,\n    encoding: ParameterEncoding = .URL,\n    headers: [String: String]? = nil,\n    destination: Request.DownloadFileDestination)\n    -> Request\n{\n    return Manager.sharedInstance.download(\n        method,\n        URLString,\n        parameters: parameters,\n        encoding: encoding,\n        headers: headers,\n        destination: destination\n    )\n}\n\n/**\n    Creates a download request using the shared manager instance for the specified URL request.\n\n    - parameter URLRequest:  The URL request.\n    - parameter destination: The closure used to determine the destination of the downloaded file.\n\n    - returns: The created download request.\n*/\npublic func download(URLRequest: URLRequestConvertible, destination: Request.DownloadFileDestination) -> Request {\n    return Manager.sharedInstance.download(URLRequest, destination: destination)\n}\n\n// MARK: Resume Data\n\n/**\n    Creates a request using the shared manager instance for downloading from the resume data produced from a \n    previous request cancellation.\n\n    - parameter resumeData:  The resume data. This is an opaque data blob produced by `NSURLSessionDownloadTask`\n                             when a task is cancelled. See `NSURLSession -downloadTaskWithResumeData:` for additional \n                             information.\n    - parameter destination: The closure used to determine the destination of the downloaded file.\n\n    - returns: The created download request.\n*/\npublic func download(resumeData data: NSData, destination: Request.DownloadFileDestination) -> Request {\n    return Manager.sharedInstance.download(data, destination: destination)\n}\n"
  },
  {
    "path": "Sublime/Pods/Alamofire/Source/Download.swift",
    "content": "// Download.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\nimport Foundation\n\nextension Manager {\n    private enum Downloadable {\n        case Request(NSURLRequest)\n        case ResumeData(NSData)\n    }\n\n    private func download(downloadable: Downloadable, destination: Request.DownloadFileDestination) -> Request {\n        var downloadTask: NSURLSessionDownloadTask!\n\n        switch downloadable {\n        case .Request(let request):\n            dispatch_sync(queue) {\n                downloadTask = self.session.downloadTaskWithRequest(request)\n            }\n        case .ResumeData(let resumeData):\n            dispatch_sync(queue) {\n                downloadTask = self.session.downloadTaskWithResumeData(resumeData)\n            }\n        }\n\n        let request = Request(session: session, task: downloadTask)\n\n        if let downloadDelegate = request.delegate as? Request.DownloadTaskDelegate {\n            downloadDelegate.downloadTaskDidFinishDownloadingToURL = { session, downloadTask, URL in\n                return destination(URL, downloadTask.response as! NSHTTPURLResponse)\n            }\n        }\n\n        delegate[request.delegate.task] = request.delegate\n\n        if startRequestsImmediately {\n            request.resume()\n        }\n\n        return request\n    }\n\n    // MARK: Request\n\n    /**\n        Creates a download request for the specified method, URL string, parameters, parameter encoding, headers\n        and destination.\n\n        If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n\n        - parameter method:      The HTTP method.\n        - parameter URLString:   The URL string.\n        - parameter parameters:  The parameters. `nil` by default.\n        - parameter encoding:    The parameter encoding. `.URL` by default.\n        - parameter headers:     The HTTP headers. `nil` by default.\n        - parameter destination: The closure used to determine the destination of the downloaded file.\n\n        - returns: The created download request.\n    */\n    public func download(\n        method: Method,\n        _ URLString: URLStringConvertible,\n        parameters: [String: AnyObject]? = nil,\n        encoding: ParameterEncoding = .URL,\n        headers: [String: String]? = nil,\n        destination: Request.DownloadFileDestination)\n        -> Request\n    {\n        let mutableURLRequest = URLRequest(method, URLString, headers: headers)\n        let encodedURLRequest = encoding.encode(mutableURLRequest, parameters: parameters).0\n\n        return download(encodedURLRequest, destination: destination)\n    }\n\n    /**\n        Creates a request for downloading from the specified URL request.\n\n        If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n\n        - parameter URLRequest:  The URL request\n        - parameter destination: The closure used to determine the destination of the downloaded file.\n\n        - returns: The created download request.\n    */\n    public func download(URLRequest: URLRequestConvertible, destination: Request.DownloadFileDestination) -> Request {\n        return download(.Request(URLRequest.URLRequest), destination: destination)\n    }\n\n    // MARK: Resume Data\n\n    /**\n        Creates a request for downloading from the resume data produced from a previous request cancellation.\n\n        If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n\n        - parameter resumeData:  The resume data. This is an opaque data blob produced by `NSURLSessionDownloadTask` \n                                 when a task is cancelled. See `NSURLSession -downloadTaskWithResumeData:` for \n                                 additional information.\n        - parameter destination: The closure used to determine the destination of the downloaded file.\n\n        - returns: The created download request.\n    */\n    public func download(resumeData: NSData, destination: Request.DownloadFileDestination) -> Request {\n        return download(.ResumeData(resumeData), destination: destination)\n    }\n}\n\n// MARK: -\n\nextension Request {\n    /**\n        A closure executed once a request has successfully completed in order to determine where to move the temporary \n        file written to during the download process. The closure takes two arguments: the temporary file URL and the URL \n        response, and returns a single argument: the file URL where the temporary file should be moved.\n    */\n    public typealias DownloadFileDestination = (NSURL, NSHTTPURLResponse) -> NSURL\n\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        - parameter directory: The search path directory. `.DocumentDirectory` by default.\n        - parameter domain:    The search path domain mask. `.UserDomainMask` by default.\n\n        - returns: A download file destination closure.\n    */\n    public class func suggestedDownloadDestination(\n        directory directory: NSSearchPathDirectory = .DocumentDirectory,\n        domain: NSSearchPathDomainMask = .UserDomainMask)\n        -> DownloadFileDestination\n    {\n        return { temporaryURL, response -> NSURL in\n            let directoryURLs = NSFileManager.defaultManager().URLsForDirectory(directory, inDomains: domain)\n\n            if !directoryURLs.isEmpty {\n                return directoryURLs[0].URLByAppendingPathComponent(response.suggestedFilename!)\n            }\n\n            return temporaryURL\n        }\n    }\n\n    /// The resume data of the underlying download task if available after a failure.\n    public var resumeData: NSData? {\n        var data: NSData?\n\n        if let delegate = delegate as? DownloadTaskDelegate {\n            data = delegate.resumeData\n        }\n\n        return data\n    }\n\n    // MARK: - DownloadTaskDelegate\n\n    class DownloadTaskDelegate: TaskDelegate, NSURLSessionDownloadDelegate {\n        var downloadTask: NSURLSessionDownloadTask? { return task as? NSURLSessionDownloadTask }\n        var downloadProgress: ((Int64, Int64, Int64) -> Void)?\n\n        var resumeData: NSData?\n        override var data: NSData? { return resumeData }\n\n        // MARK: - NSURLSessionDownloadDelegate\n\n        // MARK: Override Closures\n\n        var downloadTaskDidFinishDownloadingToURL: ((NSURLSession, NSURLSessionDownloadTask, NSURL) -> NSURL)?\n        var downloadTaskDidWriteData: ((NSURLSession, NSURLSessionDownloadTask, Int64, Int64, Int64) -> Void)?\n        var downloadTaskDidResumeAtOffset: ((NSURLSession, NSURLSessionDownloadTask, Int64, Int64) -> Void)?\n\n        // MARK: Delegate Methods\n\n        func URLSession(\n            session: NSURLSession,\n            downloadTask: NSURLSessionDownloadTask,\n            didFinishDownloadingToURL location: NSURL)\n        {\n            if let downloadTaskDidFinishDownloadingToURL = downloadTaskDidFinishDownloadingToURL {\n                do {\n                    let destination = downloadTaskDidFinishDownloadingToURL(session, downloadTask, location)\n                    try NSFileManager.defaultManager().moveItemAtURL(location, toURL: destination)\n                } catch {\n                    self.error = error as NSError\n                }\n            }\n        }\n\n        func URLSession(\n            session: NSURLSession,\n            downloadTask: NSURLSessionDownloadTask,\n            didWriteData bytesWritten: Int64,\n            totalBytesWritten: Int64,\n            totalBytesExpectedToWrite: Int64)\n        {\n            if initialResponseTime == nil { initialResponseTime = CFAbsoluteTimeGetCurrent() }\n\n            if let downloadTaskDidWriteData = downloadTaskDidWriteData {\n                downloadTaskDidWriteData(\n                    session,\n                    downloadTask,\n                    bytesWritten,\n                    totalBytesWritten, \n                    totalBytesExpectedToWrite\n                )\n            } else {\n                progress.totalUnitCount = totalBytesExpectedToWrite\n                progress.completedUnitCount = totalBytesWritten\n\n                downloadProgress?(bytesWritten, totalBytesWritten, totalBytesExpectedToWrite)\n            }\n        }\n\n        func URLSession(\n            session: NSURLSession,\n            downloadTask: NSURLSessionDownloadTask,\n            didResumeAtOffset fileOffset: Int64,\n            expectedTotalBytes: Int64)\n        {\n            if let downloadTaskDidResumeAtOffset = downloadTaskDidResumeAtOffset {\n                downloadTaskDidResumeAtOffset(session, downloadTask, fileOffset, expectedTotalBytes)\n            } else {\n                progress.totalUnitCount = expectedTotalBytes\n                progress.completedUnitCount = fileOffset\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Alamofire/Source/Error.swift",
    "content": "// Error.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\nimport Foundation\n\n/// The `Error` struct provides a convenience for creating custom Alamofire NSErrors.\npublic struct Error {\n    /// The domain used for creating all Alamofire errors.\n    public static let Domain = \"com.alamofire.error\"\n\n    /// The custom error codes generated by Alamofire.\n    public enum Code: Int {\n        case InputStreamReadFailed           = -6000\n        case OutputStreamWriteFailed         = -6001\n        case ContentTypeValidationFailed     = -6002\n        case StatusCodeValidationFailed      = -6003\n        case DataSerializationFailed         = -6004\n        case StringSerializationFailed       = -6005\n        case JSONSerializationFailed         = -6006\n        case PropertyListSerializationFailed = -6007\n    }\n\n    /**\n        Creates an `NSError` with the given error code and failure reason.\n\n        - parameter code:          The error code.\n        - parameter failureReason: The failure reason.\n\n        - returns: An `NSError` with the given error code and failure reason.\n    */\n    public static func errorWithCode(code: Code, failureReason: String) -> NSError {\n        return errorWithCode(code.rawValue, failureReason: failureReason)\n    }\n\n    /**\n        Creates an `NSError` with the given error code and failure reason.\n\n        - parameter code:          The error code.\n        - parameter failureReason: The failure reason.\n\n        - returns: An `NSError` with the given error code and failure reason.\n    */\n    public static func errorWithCode(code: Int, failureReason: String) -> NSError {\n        let userInfo = [NSLocalizedFailureReasonErrorKey: failureReason]\n        return NSError(domain: Domain, code: code, userInfo: userInfo)\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Alamofire/Source/Manager.swift",
    "content": "// Manager.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\nimport Foundation\n\n/**\n    Responsible for creating and managing `Request` objects, as well as their underlying `NSURLSession`.\n*/\npublic class Manager {\n\n    // MARK: - Properties\n\n    /**\n        A shared instance of `Manager`, used by top-level Alamofire request methods, and suitable for use directly \n        for any ad hoc requests.\n    */\n    public static let sharedInstance: Manager = {\n        let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()\n        configuration.HTTPAdditionalHeaders = Manager.defaultHTTPHeaders\n\n        return Manager(configuration: configuration)\n    }()\n\n    /**\n        Creates default values for the \"Accept-Encoding\", \"Accept-Language\" and \"User-Agent\" headers.\n    */\n    public static let defaultHTTPHeaders: [String: String] = {\n        // Accept-Encoding HTTP Header; see https://tools.ietf.org/html/rfc7230#section-4.2.3\n        let acceptEncoding: String = \"gzip;q=1.0, compress;q=0.5\"\n\n        // Accept-Language HTTP Header; see https://tools.ietf.org/html/rfc7231#section-5.3.5\n        let acceptLanguage = NSLocale.preferredLanguages().prefix(6).enumerate().map { index, languageCode in\n            let quality = 1.0 - (Double(index) * 0.1)\n            return \"\\(languageCode);q=\\(quality)\"\n        }.joinWithSeparator(\", \")\n\n        // User-Agent Header; see https://tools.ietf.org/html/rfc7231#section-5.5.3\n        let userAgent: String = {\n            if let info = NSBundle.mainBundle().infoDictionary {\n                let executable: AnyObject = info[kCFBundleExecutableKey as String] ?? \"Unknown\"\n                let bundle: AnyObject = info[kCFBundleIdentifierKey as String] ?? \"Unknown\"\n                let version: AnyObject = info[kCFBundleVersionKey as String] ?? \"Unknown\"\n                let os: AnyObject = NSProcessInfo.processInfo().operatingSystemVersionString ?? \"Unknown\"\n\n                var mutableUserAgent = NSMutableString(string: \"\\(executable)/\\(bundle) (\\(version); OS \\(os))\") as CFMutableString\n                let transform = NSString(string: \"Any-Latin; Latin-ASCII; [:^ASCII:] Remove\") as CFString\n\n                if CFStringTransform(mutableUserAgent, UnsafeMutablePointer<CFRange>(nil), transform, false) {\n                    return mutableUserAgent as String\n                }\n            }\n\n            return \"Alamofire\"\n        }()\n\n        return [\n            \"Accept-Encoding\": acceptEncoding,\n            \"Accept-Language\": acceptLanguage,\n            \"User-Agent\": userAgent\n        ]\n    }()\n\n    let queue = dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL)\n\n    /// The underlying session.\n    public let session: NSURLSession\n\n    /// The session delegate handling all the task and session delegate callbacks.\n    public let delegate: SessionDelegate\n\n    /// Whether to start requests immediately after being constructed. `true` by default.\n    public var startRequestsImmediately: Bool = true\n\n    /**\n        The background completion handler closure provided by the UIApplicationDelegate \n        `application:handleEventsForBackgroundURLSession:completionHandler:` method. By setting the background \n        completion handler, the SessionDelegate `sessionDidFinishEventsForBackgroundURLSession` closure implementation \n        will automatically call the handler.\n    \n        If you need to handle your own events before the handler is called, then you need to override the \n        SessionDelegate `sessionDidFinishEventsForBackgroundURLSession` and manually call the handler when finished.\n    \n        `nil` by default.\n    */\n    public var backgroundCompletionHandler: (() -> Void)?\n\n    // MARK: - Lifecycle\n\n    /**\n        Initializes the `Manager` instance with the specified configuration, delegate and server trust policy.\n\n        - parameter configuration:            The configuration used to construct the managed session. \n                                              `NSURLSessionConfiguration.defaultSessionConfiguration()` by default.\n        - parameter delegate:                 The delegate used when initializing the session. `SessionDelegate()` by\n                                              default.\n        - parameter serverTrustPolicyManager: The server trust policy manager to use for evaluating all server trust \n                                              challenges. `nil` by default.\n\n        - returns: The new `Manager` instance.\n    */\n    public init(\n        configuration: NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration(),\n        delegate: SessionDelegate = SessionDelegate(),\n        serverTrustPolicyManager: ServerTrustPolicyManager? = nil)\n    {\n        self.delegate = delegate\n        self.session = NSURLSession(configuration: configuration, delegate: delegate, delegateQueue: nil)\n\n        commonInit(serverTrustPolicyManager: serverTrustPolicyManager)\n    }\n\n    /**\n        Initializes the `Manager` instance with the specified session, delegate and server trust policy.\n\n        - parameter session:                  The URL session.\n        - parameter delegate:                 The delegate of the URL session. Must equal the URL session's delegate.\n        - parameter serverTrustPolicyManager: The server trust policy manager to use for evaluating all server trust\n                                              challenges. `nil` by default.\n\n        - returns: The new `Manager` instance if the URL session's delegate matches the delegate parameter.\n    */\n    public init?(\n        session: NSURLSession,\n        delegate: SessionDelegate,\n        serverTrustPolicyManager: ServerTrustPolicyManager? = nil)\n    {\n        self.delegate = delegate\n        self.session = session\n\n        guard delegate === session.delegate else { return nil }\n\n        commonInit(serverTrustPolicyManager: serverTrustPolicyManager)\n    }\n\n    private func commonInit(serverTrustPolicyManager serverTrustPolicyManager: ServerTrustPolicyManager?) {\n        session.serverTrustPolicyManager = serverTrustPolicyManager\n\n        delegate.sessionDidFinishEventsForBackgroundURLSession = { [weak self] session in\n            guard let strongSelf = self else { return }\n            dispatch_async(dispatch_get_main_queue()) { strongSelf.backgroundCompletionHandler?() }\n        }\n    }\n\n    deinit {\n        session.invalidateAndCancel()\n    }\n\n    // MARK: - Request\n\n    /**\n        Creates a request for the specified method, URL string, parameters, parameter encoding and headers.\n\n        - parameter method:     The HTTP method.\n        - parameter URLString:  The URL string.\n        - parameter parameters: The parameters. `nil` by default.\n        - parameter encoding:   The parameter encoding. `.URL` by default.\n        - parameter headers:    The HTTP headers. `nil` by default.\n\n        - returns: The created request.\n    */\n    public func request(\n        method: Method,\n        _ URLString: URLStringConvertible,\n        parameters: [String: AnyObject]? = nil,\n        encoding: ParameterEncoding = .URL,\n        headers: [String: String]? = nil)\n        -> Request\n    {\n        let mutableURLRequest = URLRequest(method, URLString, headers: headers)\n        let encodedURLRequest = encoding.encode(mutableURLRequest, parameters: parameters).0\n        return request(encodedURLRequest)\n    }\n\n    /**\n        Creates a request for the specified URL request.\n\n        If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n\n        - parameter URLRequest: The URL request\n\n        - returns: The created request.\n    */\n    public func request(URLRequest: URLRequestConvertible) -> Request {\n        var dataTask: NSURLSessionDataTask!\n        dispatch_sync(queue) { dataTask = self.session.dataTaskWithRequest(URLRequest.URLRequest) }\n\n        let request = Request(session: session, task: dataTask)\n        delegate[request.delegate.task] = request.delegate\n\n        if startRequestsImmediately {\n            request.resume()\n        }\n\n        return request\n    }\n\n    // MARK: - SessionDelegate\n\n    /**\n        Responsible for handling all delegate callbacks for the underlying session.\n    */\n    public final class SessionDelegate: NSObject, NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate {\n        private var subdelegates: [Int: Request.TaskDelegate] = [:]\n        private let subdelegateQueue = dispatch_queue_create(nil, DISPATCH_QUEUE_CONCURRENT)\n\n        subscript(task: NSURLSessionTask) -> Request.TaskDelegate? {\n            get {\n                var subdelegate: Request.TaskDelegate?\n                dispatch_sync(subdelegateQueue) { subdelegate = self.subdelegates[task.taskIdentifier] }\n\n                return subdelegate\n            }\n\n            set {\n                dispatch_barrier_async(subdelegateQueue) { self.subdelegates[task.taskIdentifier] = newValue }\n            }\n        }\n\n        /**\n            Initializes the `SessionDelegate` instance.\n\n            - returns: The new `SessionDelegate` instance.\n        */\n        public override init() {\n            super.init()\n        }\n\n        // MARK: - NSURLSessionDelegate\n\n        // MARK: Override Closures\n\n        /// Overrides default behavior for NSURLSessionDelegate method `URLSession:didBecomeInvalidWithError:`.\n        public var sessionDidBecomeInvalidWithError: ((NSURLSession, NSError?) -> Void)?\n\n        /// Overrides default behavior for NSURLSessionDelegate method `URLSession:didReceiveChallenge:completionHandler:`.\n        public var sessionDidReceiveChallenge: ((NSURLSession, NSURLAuthenticationChallenge) -> (NSURLSessionAuthChallengeDisposition, NSURLCredential?))?\n\n        /// Overrides default behavior for NSURLSessionDelegate method `URLSessionDidFinishEventsForBackgroundURLSession:`.\n        public var sessionDidFinishEventsForBackgroundURLSession: ((NSURLSession) -> Void)?\n\n        // MARK: Delegate Methods\n\n        /**\n            Tells the delegate that the session has been invalidated.\n\n            - parameter session: The session object that was invalidated.\n            - parameter error:   The error that caused invalidation, or nil if the invalidation was explicit.\n        */\n        public func URLSession(session: NSURLSession, didBecomeInvalidWithError error: NSError?) {\n            sessionDidBecomeInvalidWithError?(session, error)\n        }\n\n        /**\n            Requests credentials from the delegate in response to a session-level authentication request from the remote server.\n\n            - parameter session:           The session containing the task that requested authentication.\n            - parameter challenge:         An object that contains the request for authentication.\n            - parameter completionHandler: A handler that your delegate method must call providing the disposition and credential.\n        */\n        public func URLSession(\n            session: NSURLSession,\n            didReceiveChallenge challenge: NSURLAuthenticationChallenge,\n            completionHandler: ((NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void))\n        {\n            var disposition: NSURLSessionAuthChallengeDisposition = .PerformDefaultHandling\n            var credential: NSURLCredential?\n\n            if let sessionDidReceiveChallenge = sessionDidReceiveChallenge {\n                (disposition, credential) = sessionDidReceiveChallenge(session, challenge)\n            } else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {\n                let host = challenge.protectionSpace.host\n\n                if let\n                    serverTrustPolicy = session.serverTrustPolicyManager?.serverTrustPolicyForHost(host),\n                    serverTrust = challenge.protectionSpace.serverTrust\n                {\n                    if serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host) {\n                        disposition = .UseCredential\n                        credential = NSURLCredential(forTrust: serverTrust)\n                    } else {\n                        disposition = .CancelAuthenticationChallenge\n                    }\n                }\n            }\n\n            completionHandler(disposition, credential)\n        }\n\n        /**\n            Tells the delegate that all messages enqueued for a session have been delivered.\n\n            - parameter session: The session that no longer has any outstanding requests.\n        */\n        public func URLSessionDidFinishEventsForBackgroundURLSession(session: NSURLSession) {\n            sessionDidFinishEventsForBackgroundURLSession?(session)\n        }\n\n        // MARK: - NSURLSessionTaskDelegate\n\n        // MARK: Override Closures\n\n        /// Overrides default behavior for NSURLSessionTaskDelegate method `URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:`.\n        public var taskWillPerformHTTPRedirection: ((NSURLSession, NSURLSessionTask, NSHTTPURLResponse, NSURLRequest) -> NSURLRequest?)?\n\n        /// Overrides default behavior for NSURLSessionTaskDelegate method `URLSession:task:didReceiveChallenge:completionHandler:`.\n        public var taskDidReceiveChallenge: ((NSURLSession, NSURLSessionTask, NSURLAuthenticationChallenge) -> (NSURLSessionAuthChallengeDisposition, NSURLCredential?))?\n\n        /// Overrides default behavior for NSURLSessionTaskDelegate method `URLSession:session:task:needNewBodyStream:`.\n        public var taskNeedNewBodyStream: ((NSURLSession, NSURLSessionTask) -> NSInputStream!)?\n\n        /// Overrides default behavior for NSURLSessionTaskDelegate method `URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:`.\n        public var taskDidSendBodyData: ((NSURLSession, NSURLSessionTask, Int64, Int64, Int64) -> Void)?\n\n        /// Overrides default behavior for NSURLSessionTaskDelegate method `URLSession:task:didCompleteWithError:`.\n        public var taskDidComplete: ((NSURLSession, NSURLSessionTask, NSError?) -> Void)?\n\n        // MARK: Delegate Methods\n\n        /**\n            Tells the delegate that the remote server requested an HTTP redirect.\n\n            - parameter session:           The session containing the task whose request resulted in a redirect.\n            - parameter task:              The task whose request resulted in a redirect.\n            - parameter response:          An object containing the server’s response to the original request.\n            - parameter request:           A URL request object filled out with the new location.\n            - parameter completionHandler: A closure that your handler should call with either the value of the request \n                                           parameter, a modified URL request object, or NULL to refuse the redirect and \n                                           return the body of the redirect response.\n        */\n        public func URLSession(\n            session: NSURLSession,\n            task: NSURLSessionTask,\n            willPerformHTTPRedirection response: NSHTTPURLResponse,\n            newRequest request: NSURLRequest,\n            completionHandler: ((NSURLRequest?) -> Void))\n        {\n            var redirectRequest: NSURLRequest? = request\n\n            if let taskWillPerformHTTPRedirection = taskWillPerformHTTPRedirection {\n                redirectRequest = taskWillPerformHTTPRedirection(session, task, response, request)\n            }\n\n            completionHandler(redirectRequest)\n        }\n\n        /**\n            Requests credentials from the delegate in response to an authentication request from the remote server.\n\n            - parameter session:           The session containing the task whose request requires authentication.\n            - parameter task:              The task whose request requires authentication.\n            - parameter challenge:         An object that contains the request for authentication.\n            - parameter completionHandler: A handler that your delegate method must call providing the disposition and credential.\n        */\n        public func URLSession(\n            session: NSURLSession,\n            task: NSURLSessionTask,\n            didReceiveChallenge challenge: NSURLAuthenticationChallenge,\n            completionHandler: ((NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void))\n        {\n            if let taskDidReceiveChallenge = taskDidReceiveChallenge {\n                completionHandler(taskDidReceiveChallenge(session, task, challenge))\n            } else if let delegate = self[task] {\n                delegate.URLSession(\n                    session,\n                    task: task,\n                    didReceiveChallenge: challenge,\n                    completionHandler: completionHandler\n                )\n            } else {\n                URLSession(session, didReceiveChallenge: challenge, completionHandler: completionHandler)\n            }\n        }\n\n        /**\n            Tells the delegate when a task requires a new request body stream to send to the remote server.\n\n            - parameter session:           The session containing the task that needs a new body stream.\n            - parameter task:              The task that needs a new body stream.\n            - parameter completionHandler: A completion handler that your delegate method should call with the new body stream.\n        */\n        public func URLSession(\n            session: NSURLSession,\n            task: NSURLSessionTask,\n            needNewBodyStream completionHandler: ((NSInputStream?) -> Void))\n        {\n            if let taskNeedNewBodyStream = taskNeedNewBodyStream {\n                completionHandler(taskNeedNewBodyStream(session, task))\n            } else if let delegate = self[task] {\n                delegate.URLSession(session, task: task, needNewBodyStream: completionHandler)\n            }\n        }\n\n        /**\n            Periodically informs the delegate of the progress of sending body content to the server.\n\n            - parameter session:                  The session containing the data task.\n            - parameter task:                     The data task.\n            - parameter bytesSent:                The number of bytes sent since the last time this delegate method was called.\n            - parameter totalBytesSent:           The total number of bytes sent so far.\n            - parameter totalBytesExpectedToSend: The expected length of the body data.\n        */\n        public func URLSession(\n            session: NSURLSession,\n            task: NSURLSessionTask,\n            didSendBodyData bytesSent: Int64,\n            totalBytesSent: Int64,\n            totalBytesExpectedToSend: Int64)\n        {\n            if let taskDidSendBodyData = taskDidSendBodyData {\n                taskDidSendBodyData(session, task, bytesSent, totalBytesSent, totalBytesExpectedToSend)\n            } else if let delegate = self[task] as? Request.UploadTaskDelegate {\n                delegate.URLSession(\n                    session,\n                    task: task,\n                    didSendBodyData: bytesSent,\n                    totalBytesSent: totalBytesSent,\n                    totalBytesExpectedToSend: totalBytesExpectedToSend\n                )\n            }\n        }\n\n        /**\n            Tells the delegate that the task finished transferring data.\n\n            - parameter session: The session containing the task whose request finished transferring data.\n            - parameter task:    The task whose request finished transferring data.\n            - parameter error:   If an error occurred, an error object indicating how the transfer failed, otherwise nil.\n        */\n        public func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {\n            if let taskDidComplete = taskDidComplete {\n                taskDidComplete(session, task, error)\n            } else if let delegate = self[task] {\n                delegate.URLSession(session, task: task, didCompleteWithError: error)\n            }\n\n            NSNotificationCenter.defaultCenter().postNotificationName(Notifications.Task.DidComplete, object: task)\n\n            self[task] = nil\n        }\n\n        // MARK: - NSURLSessionDataDelegate\n\n        // MARK: Override Closures\n\n        /// Overrides default behavior for NSURLSessionDataDelegate method `URLSession:dataTask:didReceiveResponse:completionHandler:`.\n        public var dataTaskDidReceiveResponse: ((NSURLSession, NSURLSessionDataTask, NSURLResponse) -> NSURLSessionResponseDisposition)?\n\n        /// Overrides default behavior for NSURLSessionDataDelegate method `URLSession:dataTask:didBecomeDownloadTask:`.\n        public var dataTaskDidBecomeDownloadTask: ((NSURLSession, NSURLSessionDataTask, NSURLSessionDownloadTask) -> Void)?\n\n        /// Overrides default behavior for NSURLSessionDataDelegate method `URLSession:dataTask:didReceiveData:`.\n        public var dataTaskDidReceiveData: ((NSURLSession, NSURLSessionDataTask, NSData) -> Void)?\n\n        /// Overrides default behavior for NSURLSessionDataDelegate method `URLSession:dataTask:willCacheResponse:completionHandler:`.\n        public var dataTaskWillCacheResponse: ((NSURLSession, NSURLSessionDataTask, NSCachedURLResponse) -> NSCachedURLResponse!)?\n\n        // MARK: Delegate Methods\n\n        /**\n            Tells the delegate that the data task received the initial reply (headers) from the server.\n\n            - parameter session:           The session containing the data task that received an initial reply.\n            - parameter dataTask:          The data task that received an initial reply.\n            - parameter response:          A URL response object populated with headers.\n            - parameter completionHandler: A completion handler that your code calls to continue the transfer, passing a \n                                           constant to indicate whether the transfer should continue as a data task or \n                                           should become a download task.\n        */\n        public func URLSession(\n            session: NSURLSession,\n            dataTask: NSURLSessionDataTask,\n            didReceiveResponse response: NSURLResponse,\n            completionHandler: ((NSURLSessionResponseDisposition) -> Void))\n        {\n            var disposition: NSURLSessionResponseDisposition = .Allow\n\n            if let dataTaskDidReceiveResponse = dataTaskDidReceiveResponse {\n                disposition = dataTaskDidReceiveResponse(session, dataTask, response)\n            }\n\n            completionHandler(disposition)\n        }\n\n        /**\n            Tells the delegate that the data task was changed to a download task.\n\n            - parameter session:      The session containing the task that was replaced by a download task.\n            - parameter dataTask:     The data task that was replaced by a download task.\n            - parameter downloadTask: The new download task that replaced the data task.\n        */\n        public func URLSession(\n            session: NSURLSession,\n            dataTask: NSURLSessionDataTask,\n            didBecomeDownloadTask downloadTask: NSURLSessionDownloadTask)\n        {\n            if let dataTaskDidBecomeDownloadTask = dataTaskDidBecomeDownloadTask {\n                dataTaskDidBecomeDownloadTask(session, dataTask, downloadTask)\n            } else {\n                let downloadDelegate = Request.DownloadTaskDelegate(task: downloadTask)\n                self[downloadTask] = downloadDelegate\n            }\n        }\n\n        /**\n            Tells the delegate that the data task has received some of the expected data.\n\n            - parameter session:  The session containing the data task that provided data.\n            - parameter dataTask: The data task that provided data.\n            - parameter data:     A data object containing the transferred data.\n        */\n        public func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {\n            if let dataTaskDidReceiveData = dataTaskDidReceiveData {\n                dataTaskDidReceiveData(session, dataTask, data)\n            } else if let delegate = self[dataTask] as? Request.DataTaskDelegate {\n                delegate.URLSession(session, dataTask: dataTask, didReceiveData: data)\n            }\n        }\n\n        /**\n            Asks the delegate whether the data (or upload) task should store the response in the cache.\n\n            - parameter session:           The session containing the data (or upload) task.\n            - parameter dataTask:          The data (or upload) task.\n            - parameter proposedResponse:  The default caching behavior. This behavior is determined based on the current \n                                           caching policy and the values of certain received headers, such as the Pragma \n                                           and Cache-Control headers.\n            - parameter completionHandler: A block that your handler must call, providing either the original proposed \n                                           response, a modified version of that response, or NULL to prevent caching the \n                                           response. If your delegate implements this method, it must call this completion \n                                           handler; otherwise, your app leaks memory.\n        */\n        public func URLSession(\n            session: NSURLSession,\n            dataTask: NSURLSessionDataTask,\n            willCacheResponse proposedResponse: NSCachedURLResponse,\n            completionHandler: ((NSCachedURLResponse?) -> Void))\n        {\n            if let dataTaskWillCacheResponse = dataTaskWillCacheResponse {\n                completionHandler(dataTaskWillCacheResponse(session, dataTask, proposedResponse))\n            } else if let delegate = self[dataTask] as? Request.DataTaskDelegate {\n                delegate.URLSession(\n                    session,\n                    dataTask: dataTask,\n                    willCacheResponse: proposedResponse,\n                    completionHandler: completionHandler\n                )\n            } else {\n                completionHandler(proposedResponse)\n            }\n        }\n\n        // MARK: - NSURLSessionDownloadDelegate\n\n        // MARK: Override Closures\n\n        /// Overrides default behavior for NSURLSessionDownloadDelegate method `URLSession:downloadTask:didFinishDownloadingToURL:`.\n        public var downloadTaskDidFinishDownloadingToURL: ((NSURLSession, NSURLSessionDownloadTask, NSURL) -> Void)?\n\n        /// Overrides default behavior for NSURLSessionDownloadDelegate method `URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:`.\n        public var downloadTaskDidWriteData: ((NSURLSession, NSURLSessionDownloadTask, Int64, Int64, Int64) -> Void)?\n\n        /// Overrides default behavior for NSURLSessionDownloadDelegate method `URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:`.\n        public var downloadTaskDidResumeAtOffset: ((NSURLSession, NSURLSessionDownloadTask, Int64, Int64) -> Void)?\n\n        // MARK: Delegate Methods\n\n        /**\n            Tells the delegate that a download task has finished downloading.\n\n            - parameter session:      The session containing the download task that finished.\n            - parameter downloadTask: The download task that finished.\n            - parameter location:     A file URL for the temporary file. Because the file is temporary, you must either \n                                      open the file for reading or move it to a permanent location in your app’s sandbox \n                                      container directory before returning from this delegate method.\n        */\n        public func URLSession(\n            session: NSURLSession,\n            downloadTask: NSURLSessionDownloadTask,\n            didFinishDownloadingToURL location: NSURL)\n        {\n            if let downloadTaskDidFinishDownloadingToURL = downloadTaskDidFinishDownloadingToURL {\n                downloadTaskDidFinishDownloadingToURL(session, downloadTask, location)\n            } else if let delegate = self[downloadTask] as? Request.DownloadTaskDelegate {\n                delegate.URLSession(session, downloadTask: downloadTask, didFinishDownloadingToURL: location)\n            }\n        }\n\n        /**\n            Periodically informs the delegate about the download’s progress.\n\n            - parameter session:                   The session containing the download task.\n            - parameter downloadTask:              The download task.\n            - parameter bytesWritten:              The number of bytes transferred since the last time this delegate \n                                                   method was called.\n            - parameter totalBytesWritten:         The total number of bytes transferred so far.\n            - parameter totalBytesExpectedToWrite: The expected length of the file, as provided by the Content-Length \n                                                   header. If this header was not provided, the value is \n                                                   `NSURLSessionTransferSizeUnknown`.\n        */\n        public func URLSession(\n            session: NSURLSession,\n            downloadTask: NSURLSessionDownloadTask,\n            didWriteData bytesWritten: Int64,\n            totalBytesWritten: Int64,\n            totalBytesExpectedToWrite: Int64)\n        {\n            if let downloadTaskDidWriteData = downloadTaskDidWriteData {\n                downloadTaskDidWriteData(session, downloadTask, bytesWritten, totalBytesWritten, totalBytesExpectedToWrite)\n            } else if let delegate = self[downloadTask] as? Request.DownloadTaskDelegate {\n                delegate.URLSession(\n                    session,\n                    downloadTask: downloadTask,\n                    didWriteData: bytesWritten,\n                    totalBytesWritten: totalBytesWritten,\n                    totalBytesExpectedToWrite: totalBytesExpectedToWrite\n                )\n            }\n        }\n\n        /**\n            Tells the delegate that the download task has resumed downloading.\n\n            - parameter session:            The session containing the download task that finished.\n            - parameter downloadTask:       The download task that resumed. See explanation in the discussion.\n            - parameter fileOffset:         If the file's cache policy or last modified date prevents reuse of the \n                                            existing content, then this value is zero. Otherwise, this value is an \n                                            integer representing the number of bytes on disk that do not need to be \n                                            retrieved again.\n            - parameter expectedTotalBytes: The expected length of the file, as provided by the Content-Length header. \n                                            If this header was not provided, the value is NSURLSessionTransferSizeUnknown.\n        */\n        public func URLSession(\n            session: NSURLSession,\n            downloadTask: NSURLSessionDownloadTask,\n            didResumeAtOffset fileOffset: Int64,\n            expectedTotalBytes: Int64)\n        {\n            if let downloadTaskDidResumeAtOffset = downloadTaskDidResumeAtOffset {\n                downloadTaskDidResumeAtOffset(session, downloadTask, fileOffset, expectedTotalBytes)\n            } else if let delegate = self[downloadTask] as? Request.DownloadTaskDelegate {\n                delegate.URLSession(\n                    session,\n                    downloadTask: downloadTask,\n                    didResumeAtOffset: fileOffset,\n                    expectedTotalBytes: expectedTotalBytes\n                )\n            }\n        }\n\n        // MARK: - NSURLSessionStreamDelegate\n\n        var _streamTaskReadClosed: Any?\n        var _streamTaskWriteClosed: Any?\n        var _streamTaskBetterRouteDiscovered: Any?\n        var _streamTaskDidBecomeInputStream: Any?\n\n        // MARK: - NSObject\n\n        public override func respondsToSelector(selector: Selector) -> Bool {\n            switch selector {\n            case \"URLSession:didBecomeInvalidWithError:\":\n                return sessionDidBecomeInvalidWithError != nil\n            case \"URLSession:didReceiveChallenge:completionHandler:\":\n                return sessionDidReceiveChallenge != nil\n            case \"URLSessionDidFinishEventsForBackgroundURLSession:\":\n                return sessionDidFinishEventsForBackgroundURLSession != nil\n            case \"URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:\":\n                return taskWillPerformHTTPRedirection != nil\n            case \"URLSession:dataTask:didReceiveResponse:completionHandler:\":\n                return dataTaskDidReceiveResponse != nil\n            default:\n                return self.dynamicType.instancesRespondToSelector(selector)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Alamofire/Source/MultipartFormData.swift",
    "content": "// MultipartFormData.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\nimport Foundation\n\n#if os(iOS) || os(watchOS) || os(tvOS)\nimport MobileCoreServices\n#elseif os(OSX)\nimport CoreServices\n#endif\n\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\n*/\npublic class MultipartFormData {\n\n    // MARK: - Helper Types\n\n    struct EncodingCharacters {\n        static let CRLF = \"\\r\\n\"\n    }\n\n    struct BoundaryGenerator {\n        enum BoundaryType {\n            case Initial, Encapsulated, Final\n        }\n\n        static func randomBoundary() -> String {\n            return String(format: \"alamofire.boundary.%08x%08x\", arc4random(), arc4random())\n        }\n\n        static func boundaryData(boundaryType boundaryType: BoundaryType, boundary: String) -> NSData {\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 boundaryText.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!\n        }\n    }\n\n    class BodyPart {\n        let headers: [String: String]\n        let bodyStream: NSInputStream\n        let bodyContentLength: UInt64\n        var hasInitialBoundary = false\n        var hasFinalBoundary = false\n\n        init(headers: [String: String], bodyStream: NSInputStream, bodyContentLength: UInt64) {\n            self.headers = headers\n            self.bodyStream = bodyStream\n            self.bodyContentLength = bodyContentLength\n        }\n    }\n\n    // MARK: - Properties\n\n    /// The `Content-Type` header value containing the boundary used to generate the `multipart/form-data`.\n    public var contentType: String { return \"multipart/form-data; boundary=\\(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 { return 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    private var bodyParts: [BodyPart]\n    private var bodyPartError: NSError?\n    private let streamBufferSize: Int\n\n    // MARK: - Lifecycle\n\n    /**\n        Creates a multipart form data object.\n\n        - returns: The multipart form data object.\n    */\n    public init() {\n        self.boundary = BoundaryGenerator.randomBoundary()\n        self.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\n        self.streamBufferSize = 1024\n    }\n\n    // MARK: - Body Parts\n\n    /**\n        Creates a body part from the data and appends it to the multipart form data object.\n\n        The body part data will be encoded using the following format:\n\n        - `Content-Disposition: form-data; name=#{name}` (HTTP Header)\n        - Encoded data\n        - Multipart form boundary\n\n        - parameter data: The data to encode into the multipart form data.\n        - parameter name: The name to associate with the data in the `Content-Disposition` HTTP header.\n    */\n    public func appendBodyPart(data data: NSData, name: String) {\n        let headers = contentHeaders(name: name)\n        let stream = NSInputStream(data: data)\n        let length = UInt64(data.length)\n\n        appendBodyPart(stream: stream, length: length, headers: headers)\n    }\n\n    /**\n        Creates a body part from the data and appends it to the multipart form data object.\n\n        The body part data will be encoded using the following format:\n\n        - `Content-Disposition: form-data; name=#{name}` (HTTP Header)\n        - `Content-Type: #{generated mimeType}` (HTTP Header)\n        - Encoded data\n        - Multipart form boundary\n\n        - parameter data:     The data to encode into the multipart form data.\n        - parameter name:     The name to associate with the data in the `Content-Disposition` HTTP header.\n        - parameter mimeType: The MIME type to associate with the data content type in the `Content-Type` HTTP header.\n    */\n    public func appendBodyPart(data data: NSData, name: String, mimeType: String) {\n        let headers = contentHeaders(name: name, mimeType: mimeType)\n        let stream = NSInputStream(data: data)\n        let length = UInt64(data.length)\n\n        appendBodyPart(stream: stream, length: length, headers: headers)\n    }\n\n    /**\n        Creates a body part from the data and appends it to the multipart form data object.\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        - parameter data:     The data to encode into the multipart form data.\n        - parameter name:     The name to associate with the data in the `Content-Disposition` HTTP header.\n        - parameter fileName: The filename to associate with the data in the `Content-Disposition` HTTP header.\n        - parameter mimeType: The MIME type to associate with the data in the `Content-Type` HTTP header.\n    */\n    public func appendBodyPart(data data: NSData, name: String, fileName: String, mimeType: String) {\n        let headers = contentHeaders(name: name, fileName: fileName, mimeType: mimeType)\n        let stream = NSInputStream(data: data)\n        let length = UInt64(data.length)\n\n        appendBodyPart(stream: stream, length: length, headers: headers)\n    }\n\n    /**\n        Creates a body part from the file and appends it to the multipart form data object.\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        - parameter fileURL: The URL of the file whose content will be encoded into the multipart form data.\n        - parameter name:    The name to associate with the file content in the `Content-Disposition` HTTP header.\n    */\n    public func appendBodyPart(fileURL fileURL: NSURL, name: String) {\n        if let\n            fileName = fileURL.lastPathComponent,\n            pathExtension = fileURL.pathExtension\n        {\n            let mimeType = mimeTypeForPathExtension(pathExtension)\n            appendBodyPart(fileURL: fileURL, name: name, fileName: fileName, mimeType: mimeType)\n        } else {\n            let failureReason = \"Failed to extract the fileName of the provided URL: \\(fileURL)\"\n            setBodyPartError(Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason))\n        }\n    }\n\n    /**\n        Creates a body part from the file and appends it to the multipart form data object.\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        - parameter fileURL:  The URL of the file whose content will be encoded into the multipart form data.\n        - parameter name:     The name to associate with the file content in the `Content-Disposition` HTTP header.\n        - parameter fileName: The filename to associate with the file content in the `Content-Disposition` HTTP header.\n        - parameter mimeType: The MIME type to associate with the file content in the `Content-Type` HTTP header.\n    */\n    public func appendBodyPart(fileURL fileURL: NSURL, name: String, fileName: String, mimeType: String) {\n        let headers = contentHeaders(name: name, fileName: fileName, mimeType: mimeType)\n\n        //============================================================\n        //                 Check 1 - is file URL?\n        //============================================================\n\n        guard fileURL.fileURL else {\n            let failureReason = \"The file URL does not point to a file URL: \\(fileURL)\"\n            let error = Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason)\n            setBodyPartError(error)\n            return\n        }\n\n        //============================================================\n        //              Check 2 - is file URL reachable?\n        //============================================================\n\n        var isReachable = true\n\n        if #available(OSX 10.10, *) {\n            isReachable = fileURL.checkPromisedItemIsReachableAndReturnError(nil)\n        }\n\n        guard isReachable else {\n            let error = Error.errorWithCode(NSURLErrorBadURL, failureReason: \"The file URL is not reachable: \\(fileURL)\")\n            setBodyPartError(error)\n            return\n        }\n\n        //============================================================\n        //            Check 3 - is file URL a directory?\n        //============================================================\n\n        var isDirectory: ObjCBool = false\n\n        guard let\n            path = fileURL.path\n            where NSFileManager.defaultManager().fileExistsAtPath(path, isDirectory: &isDirectory) && !isDirectory else\n        {\n            let failureReason = \"The file URL is a directory, not a file: \\(fileURL)\"\n            let error = Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason)\n            setBodyPartError(error)\n            return\n        }\n\n        //============================================================\n        //          Check 4 - can the file size be extracted?\n        //============================================================\n\n        var bodyContentLength: UInt64?\n\n        do {\n            if let\n                path = fileURL.path,\n                fileSize = try NSFileManager.defaultManager().attributesOfItemAtPath(path)[NSFileSize] as? NSNumber\n            {\n                bodyContentLength = fileSize.unsignedLongLongValue\n            }\n        } catch {\n            // No-op\n        }\n\n        guard let length = bodyContentLength else {\n            let failureReason = \"Could not fetch attributes from the file URL: \\(fileURL)\"\n            let error = Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason)\n            setBodyPartError(error)\n            return\n        }\n\n        //============================================================\n        //       Check 5 - can a stream be created from file URL?\n        //============================================================\n\n        guard let stream = NSInputStream(URL: fileURL) else {\n            let failureReason = \"Failed to create an input stream from the file URL: \\(fileURL)\"\n            let error = Error.errorWithCode(NSURLErrorCannotOpenFile, failureReason: failureReason)\n            setBodyPartError(error)\n            return\n        }\n\n        appendBodyPart(stream: stream, length: length, headers: headers)\n    }\n\n    /**\n        Creates a body part from the stream and appends it to the multipart form data object.\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        - parameter stream:   The input stream to encode in the multipart form data.\n        - parameter length:   The content length of the stream.\n        - parameter name:     The name to associate with the stream content in the `Content-Disposition` HTTP header.\n        - parameter fileName: The filename to associate with the stream content in the `Content-Disposition` HTTP header.\n        - parameter mimeType: The MIME type to associate with the stream content in the `Content-Type` HTTP header.\n    */\n    public func appendBodyPart(\n        stream stream: NSInputStream,\n        length: UInt64,\n        name: String,\n        fileName: String,\n        mimeType: String)\n    {\n        let headers = contentHeaders(name: name, fileName: fileName, mimeType: mimeType)\n        appendBodyPart(stream: stream, length: length, headers: headers)\n    }\n\n    /**\n        Creates a body part with the headers, stream and length and appends it to the multipart form data object.\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        - parameter stream:  The input stream to encode in the multipart form data.\n        - parameter length:  The content length of the stream.\n        - parameter headers: The HTTP headers for the body part.\n    */\n    public func appendBodyPart(stream stream: NSInputStream, length: UInt64, headers: [String: String]) {\n        let bodyPart = BodyPart(headers: headers, bodyStream: stream, bodyContentLength: length)\n        bodyParts.append(bodyPart)\n    }\n\n    // MARK: - Data Encoding\n\n    /**\n        Encodes all the appended body parts into a single `NSData` object.\n\n        It is important to note that this method will load all the appended body parts into memory all at the same \n        time. This method should only be used when the encoded data will have a small memory footprint. For large data \n        cases, please use the `writeEncodedDataToDisk(fileURL:completionHandler:)` method.\n\n        - throws: An `NSError` if encoding encounters an error.\n\n        - returns: The encoded `NSData` if encoding is successful.\n    */\n    public func encode() throws -> NSData {\n        if let bodyPartError = bodyPartError {\n            throw bodyPartError\n        }\n\n        let encoded = NSMutableData()\n\n        bodyParts.first?.hasInitialBoundary = true\n        bodyParts.last?.hasFinalBoundary = true\n\n        for bodyPart in bodyParts {\n            let encodedData = try encodeBodyPart(bodyPart)\n            encoded.appendData(encodedData)\n        }\n\n        return encoded\n    }\n\n    /**\n        Writes the appended body parts into 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: The file URL to write the multipart form data into.\n\n        - throws: An `NSError` if encoding encounters an error.\n    */\n    public func writeEncodedDataToDisk(fileURL: NSURL) throws {\n        if let bodyPartError = bodyPartError {\n            throw bodyPartError\n        }\n\n        if let path = fileURL.path where NSFileManager.defaultManager().fileExistsAtPath(path) {\n            let failureReason = \"A file already exists at the given file URL: \\(fileURL)\"\n            throw Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason)\n        } else if !fileURL.fileURL {\n            let failureReason = \"The URL does not point to a valid file: \\(fileURL)\"\n            throw Error.errorWithCode(NSURLErrorBadURL, failureReason: failureReason)\n        }\n\n        let outputStream: NSOutputStream\n\n        if let possibleOutputStream = NSOutputStream(URL: fileURL, append: false) {\n            outputStream = possibleOutputStream\n        } else {\n            let failureReason = \"Failed to create an output stream with the given URL: \\(fileURL)\"\n            throw Error.errorWithCode(NSURLErrorCannotOpenFile, failureReason: failureReason)\n        }\n\n        outputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)\n        outputStream.open()\n\n        self.bodyParts.first?.hasInitialBoundary = true\n        self.bodyParts.last?.hasFinalBoundary = true\n\n        for bodyPart in self.bodyParts {\n            try writeBodyPart(bodyPart, toOutputStream: outputStream)\n        }\n\n        outputStream.close()\n        outputStream.removeFromRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)\n    }\n\n    // MARK: - Private - Body Part Encoding\n\n    private func encodeBodyPart(bodyPart: BodyPart) throws -> NSData {\n        let encoded = NSMutableData()\n\n        let initialData = bodyPart.hasInitialBoundary ? initialBoundaryData() : encapsulatedBoundaryData()\n        encoded.appendData(initialData)\n\n        let headerData = encodeHeaderDataForBodyPart(bodyPart)\n        encoded.appendData(headerData)\n\n        let bodyStreamData = try encodeBodyStreamDataForBodyPart(bodyPart)\n        encoded.appendData(bodyStreamData)\n\n        if bodyPart.hasFinalBoundary {\n            encoded.appendData(finalBoundaryData())\n        }\n\n        return encoded\n    }\n\n    private func encodeHeaderDataForBodyPart(bodyPart: BodyPart) -> NSData {\n        var headerText = \"\"\n\n        for (key, value) in bodyPart.headers {\n            headerText += \"\\(key): \\(value)\\(EncodingCharacters.CRLF)\"\n        }\n        headerText += EncodingCharacters.CRLF\n\n        return headerText.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!\n    }\n\n    private func encodeBodyStreamDataForBodyPart(bodyPart: BodyPart) throws -> NSData {\n        let inputStream = bodyPart.bodyStream\n        inputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)\n        inputStream.open()\n\n        var error: NSError?\n        let encoded = NSMutableData()\n\n        while inputStream.hasBytesAvailable {\n            var buffer = [UInt8](count: streamBufferSize, repeatedValue: 0)\n            let bytesRead = inputStream.read(&buffer, maxLength: streamBufferSize)\n\n            if inputStream.streamError != nil {\n                error = inputStream.streamError\n                break\n            }\n\n            if bytesRead > 0 {\n                encoded.appendBytes(buffer, length: bytesRead)\n            } else if bytesRead < 0 {\n                let failureReason = \"Failed to read from input stream: \\(inputStream)\"\n                error = Error.errorWithCode(.InputStreamReadFailed, failureReason: failureReason)\n                break\n            } else {\n                break\n            }\n        }\n\n        inputStream.close()\n        inputStream.removeFromRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)\n\n        if let error = error {\n            throw error\n        }\n\n        return encoded\n    }\n\n    // MARK: - Private - Writing Body Part to Output Stream\n\n    private func writeBodyPart(bodyPart: BodyPart, toOutputStream outputStream: NSOutputStream) throws {\n        try writeInitialBoundaryDataForBodyPart(bodyPart, toOutputStream: outputStream)\n        try writeHeaderDataForBodyPart(bodyPart, toOutputStream: outputStream)\n        try writeBodyStreamForBodyPart(bodyPart, toOutputStream: outputStream)\n        try writeFinalBoundaryDataForBodyPart(bodyPart, toOutputStream: outputStream)\n    }\n\n    private func writeInitialBoundaryDataForBodyPart(\n        bodyPart: BodyPart,\n        toOutputStream outputStream: NSOutputStream)\n        throws\n    {\n        let initialData = bodyPart.hasInitialBoundary ? initialBoundaryData() : encapsulatedBoundaryData()\n        return try writeData(initialData, toOutputStream: outputStream)\n    }\n\n    private func writeHeaderDataForBodyPart(bodyPart: BodyPart, toOutputStream outputStream: NSOutputStream) throws {\n        let headerData = encodeHeaderDataForBodyPart(bodyPart)\n        return try writeData(headerData, toOutputStream: outputStream)\n    }\n\n    private func writeBodyStreamForBodyPart(bodyPart: BodyPart, toOutputStream outputStream: NSOutputStream) throws {\n        let inputStream = bodyPart.bodyStream\n        inputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)\n        inputStream.open()\n\n        while inputStream.hasBytesAvailable {\n            var buffer = [UInt8](count: streamBufferSize, repeatedValue: 0)\n            let bytesRead = inputStream.read(&buffer, maxLength: streamBufferSize)\n\n            if let streamError = inputStream.streamError {\n                throw streamError\n            }\n\n            if bytesRead > 0 {\n                if buffer.count != bytesRead {\n                    buffer = Array(buffer[0..<bytesRead])\n                }\n\n                try writeBuffer(&buffer, toOutputStream: outputStream)\n            } else if bytesRead < 0 {\n                let failureReason = \"Failed to read from input stream: \\(inputStream)\"\n                throw Error.errorWithCode(.InputStreamReadFailed, failureReason: failureReason)\n            } else {\n                break\n            }\n        }\n\n        inputStream.close()\n        inputStream.removeFromRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)\n    }\n\n    private func writeFinalBoundaryDataForBodyPart(\n        bodyPart: BodyPart,\n        toOutputStream outputStream: NSOutputStream)\n        throws\n    {\n        if bodyPart.hasFinalBoundary {\n            return try writeData(finalBoundaryData(), toOutputStream: outputStream)\n        }\n    }\n\n    // MARK: - Private - Writing Buffered Data to Output Stream\n\n    private func writeData(data: NSData, toOutputStream outputStream: NSOutputStream) throws {\n        var buffer = [UInt8](count: data.length, repeatedValue: 0)\n        data.getBytes(&buffer, length: data.length)\n\n        return try writeBuffer(&buffer, toOutputStream: outputStream)\n    }\n\n    private func writeBuffer(inout buffer: [UInt8], toOutputStream outputStream: NSOutputStream) throws {\n        var bytesToWrite = buffer.count\n\n        while bytesToWrite > 0 {\n            if outputStream.hasSpaceAvailable {\n                let bytesWritten = outputStream.write(buffer, maxLength: bytesToWrite)\n\n                if let streamError = outputStream.streamError {\n                    throw streamError\n                }\n\n                if bytesWritten < 0 {\n                    let failureReason = \"Failed to write to output stream: \\(outputStream)\"\n                    throw Error.errorWithCode(.OutputStreamWriteFailed, failureReason: failureReason)\n                }\n\n                bytesToWrite -= bytesWritten\n\n                if bytesToWrite > 0 {\n                    buffer = Array(buffer[bytesWritten..<buffer.count])\n                }\n            } else if let streamError = outputStream.streamError {\n                throw streamError\n            }\n        }\n    }\n\n    // MARK: - Private - Mime Type\n\n    private func mimeTypeForPathExtension(pathExtension: String) -> String {\n        if let\n            id = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension, nil)?.takeRetainedValue(),\n            contentType = UTTypeCopyPreferredTagWithClass(id, kUTTagClassMIMEType)?.takeRetainedValue()\n        {\n            return contentType as String\n        }\n\n        return \"application/octet-stream\"\n    }\n\n    // MARK: - Private - Content Headers\n\n    private func contentHeaders(name name: String) -> [String: String] {\n        return [\"Content-Disposition\": \"form-data; name=\\\"\\(name)\\\"\"]\n    }\n\n    private func contentHeaders(name name: String, mimeType: String) -> [String: String] {\n        return [\n            \"Content-Disposition\": \"form-data; name=\\\"\\(name)\\\"\",\n            \"Content-Type\": \"\\(mimeType)\"\n        ]\n    }\n\n    private func contentHeaders(name name: String, fileName: String, mimeType: String) -> [String: String] {\n        return [\n            \"Content-Disposition\": \"form-data; name=\\\"\\(name)\\\"; filename=\\\"\\(fileName)\\\"\",\n            \"Content-Type\": \"\\(mimeType)\"\n        ]\n    }\n\n    // MARK: - Private - Boundary Encoding\n\n    private func initialBoundaryData() -> NSData {\n        return BoundaryGenerator.boundaryData(boundaryType: .Initial, boundary: boundary)\n    }\n\n    private func encapsulatedBoundaryData() -> NSData {\n        return BoundaryGenerator.boundaryData(boundaryType: .Encapsulated, boundary: boundary)\n    }\n\n    private func finalBoundaryData() -> NSData {\n        return BoundaryGenerator.boundaryData(boundaryType: .Final, boundary: boundary)\n    }\n\n    // MARK: - Private - Errors\n\n    private func setBodyPartError(error: NSError) {\n        if bodyPartError == nil {\n            bodyPartError = error\n        }\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Alamofire/Source/NetworkReachabilityManager.swift",
    "content": "// NetworkReachabilityManager.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#if !os(watchOS)\n\nimport Foundation\nimport SystemConfiguration\n\n/**\n    The `NetworkReachabilityManager` class listens for reachability changes of hosts and addresses for both WWAN 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.\n*/\npublic class NetworkReachabilityManager {\n    /**\n        Defines the various states of network reachability.\n\n        - Unknown:         It is unknown whether the network is reachable.\n        - NotReachable:    The network is not reachable.\n        - ReachableOnWWAN: The network is reachable over the WWAN connection.\n        - ReachableOnWiFi: The network is reachable over the WiFi connection.\n    */\n    public enum NetworkReachabilityStatus {\n        case Unknown\n        case NotReachable\n        case Reachable(ConnectionType)\n    }\n\n    /**\n        Defines the various connection types detected by reachability flags.\n\n        - EthernetOrWiFi: The connection type is either over Ethernet or WiFi.\n        - WWAN:           The connection type is a WWAN connection.\n    */\n    public enum ConnectionType {\n        case EthernetOrWiFi\n        case WWAN\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    // MARK: - Properties\n\n    /// Whether the network is currently reachable.\n    public var isReachable: Bool { return isReachableOnWWAN || isReachableOnEthernetOrWiFi }\n\n    /// Whether the network is currently reachable over the WWAN interface.\n    public var isReachableOnWWAN: Bool { return networkReachabilityStatus == .Reachable(.WWAN) }\n\n    /// Whether the network is currently reachable over Ethernet or WiFi interface.\n    public var isReachableOnEthernetOrWiFi: Bool { return networkReachabilityStatus == .Reachable(.EthernetOrWiFi) }\n\n    /// The current network reachability status.\n    public var networkReachabilityStatus: NetworkReachabilityStatus {\n        guard let flags = self.flags else { return .Unknown }\n        return networkReachabilityStatusForFlags(flags)\n    }\n\n    /// The dispatch queue to execute the `listener` closure on.\n    public var listenerQueue: dispatch_queue_t = dispatch_get_main_queue()\n\n    /// A closure executed when the network reachability status changes.\n    public var listener: Listener?\n\n    private var flags: SCNetworkReachabilityFlags? {\n        var flags = SCNetworkReachabilityFlags()\n\n        if SCNetworkReachabilityGetFlags(reachability, &flags) {\n            return flags\n        }\n\n        return nil\n    }\n\n    private let reachability: SCNetworkReachability\n    private var previousFlags: SCNetworkReachabilityFlags\n\n    // MARK: - Initialization\n\n    /**\n        Creates a `NetworkReachabilityManager` instance with the specified host.\n\n        - parameter host: The host used to evaluate network reachability.\n\n        - returns: The new `NetworkReachabilityManager` instance.\n    */\n    public convenience init?(host: String) {\n        guard let reachability = SCNetworkReachabilityCreateWithName(nil, host) else { return nil }\n        self.init(reachability: reachability)\n    }\n\n    /**\n        Creates a `NetworkReachabilityManager` instance with the default socket address (`sockaddr_in6`).\n\n        - returns: The new `NetworkReachabilityManager` instance.\n     */\n    public convenience init?() {\n        var address = sockaddr_in6()\n        address.sin6_len = UInt8(sizeofValue(address))\n        address.sin6_family = sa_family_t(AF_INET6)\n\n        guard let reachability = withUnsafePointer(&address, {\n            SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))\n        }) else { return nil }\n\n        self.init(reachability: reachability)\n    }\n\n    private init(reachability: SCNetworkReachability) {\n        self.reachability = reachability\n        self.previousFlags = SCNetworkReachabilityFlags()\n    }\n\n    deinit {\n        stopListening()\n    }\n\n    // MARK: - Listening\n\n    /**\n        Starts listening for changes in network reachability status.\n\n        - returns: `true` if listening was started successfully, `false` otherwise.\n    */\n    public func startListening() -> Bool {\n        var context = SCNetworkReachabilityContext(version: 0, info: nil, retain: nil, release: nil, copyDescription: nil)\n        context.info = UnsafeMutablePointer(Unmanaged.passUnretained(self).toOpaque())\n\n        let callbackEnabled = SCNetworkReachabilitySetCallback(\n            reachability,\n            { (_, flags, info) in\n                let reachability = Unmanaged<NetworkReachabilityManager>.fromOpaque(COpaquePointer(info)).takeUnretainedValue()\n                reachability.notifyListener(flags)\n            },\n            &context\n        )\n\n        let queueEnabled = SCNetworkReachabilitySetDispatchQueue(reachability, listenerQueue)\n\n        dispatch_async(listenerQueue) {\n            self.previousFlags = SCNetworkReachabilityFlags()\n            self.notifyListener(self.flags ?? SCNetworkReachabilityFlags())\n        }\n\n        return callbackEnabled && queueEnabled\n    }\n\n    /**\n        Stops listening for changes in network reachability status.\n    */\n    public func stopListening() {\n        SCNetworkReachabilitySetCallback(reachability, nil, nil)\n        SCNetworkReachabilitySetDispatchQueue(reachability, nil)\n    }\n\n    // MARK: - Internal - Listener Notification\n\n    func notifyListener(flags: SCNetworkReachabilityFlags) {\n        guard previousFlags != flags else { return }\n        previousFlags = flags\n\n        listener?(networkReachabilityStatusForFlags(flags))\n    }\n\n    // MARK: - Internal - Network Reachability Status\n\n    func networkReachabilityStatusForFlags(flags: SCNetworkReachabilityFlags) -> NetworkReachabilityStatus {\n        guard flags.contains(.Reachable) else { return .NotReachable }\n\n        var networkStatus: NetworkReachabilityStatus = .NotReachable\n\n        if !flags.contains(.ConnectionRequired) { networkStatus = .Reachable(.EthernetOrWiFi) }\n\n        if flags.contains(.ConnectionOnDemand) || flags.contains(.ConnectionOnTraffic) {\n            if !flags.contains(.InterventionRequired) { networkStatus = .Reachable(.EthernetOrWiFi) }\n        }\n\n        #if os(iOS)\n            if flags.contains(.IsWWAN) { networkStatus = .Reachable(.WWAN) }\n        #endif\n\n        return networkStatus\n    }\n}\n\n// MARK: -\n\nextension NetworkReachabilityManager.NetworkReachabilityStatus: Equatable {}\n\n/**\n    Returns whether the two network reachability status values are equal.\n\n    - parameter lhs: The left-hand side value to compare.\n    - parameter rhs: The right-hand side value to compare.\n\n    - returns: `true` if the two values are equal, `false` otherwise.\n*/\npublic func ==(\n    lhs: NetworkReachabilityManager.NetworkReachabilityStatus,\n    rhs: NetworkReachabilityManager.NetworkReachabilityStatus)\n    -> Bool\n{\n    switch (lhs, rhs) {\n    case (.Unknown, .Unknown):\n        return true\n    case (.NotReachable, .NotReachable):\n        return true\n    case let (.Reachable(lhsConnectionType), .Reachable(rhsConnectionType)):\n        return lhsConnectionType == rhsConnectionType\n    default:\n        return false\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Sublime/Pods/Alamofire/Source/Notifications.swift",
    "content": "// Notifications.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\nimport Foundation\n\n/// Contains all the `NSNotification` names posted by Alamofire with descriptions of each notification's payload.\npublic struct Notifications {\n    /// Used as a namespace for all `NSURLSessionTask` related notifications.\n    public struct Task {\n        /// Notification posted when an `NSURLSessionTask` is resumed. The notification `object` contains the resumed\n        /// `NSURLSessionTask`.\n        public static let DidResume = \"com.alamofire.notifications.task.didResume\"\n\n        /// Notification posted when an `NSURLSessionTask` is suspended. The notification `object` contains the \n        /// suspended `NSURLSessionTask`.\n        public static let DidSuspend = \"com.alamofire.notifications.task.didSuspend\"\n\n        /// Notification posted when an `NSURLSessionTask` is cancelled. The notification `object` contains the\n        /// cancelled `NSURLSessionTask`.\n        public static let DidCancel = \"com.alamofire.notifications.task.didCancel\"\n\n        /// Notification posted when an `NSURLSessionTask` is completed. The notification `object` contains the\n        /// completed `NSURLSessionTask`.\n        public static let DidComplete = \"com.alamofire.notifications.task.didComplete\"\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Alamofire/Source/ParameterEncoding.swift",
    "content": "// ParameterEncoding.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\nimport Foundation\n\n/**\n    HTTP method definitions.\n\n    See https://tools.ietf.org/html/rfc7231#section-4.3\n*/\npublic enum Method: String {\n    case OPTIONS, GET, HEAD, POST, PUT, PATCH, DELETE, TRACE, CONNECT\n}\n\n// MARK: ParameterEncoding\n\n/**\n    Used to specify the way in which a set of parameters are applied to a URL request.\n\n    - `URL`:             Creates a query string to be set as or appended to any existing URL query for `GET`, `HEAD`, \n                         and `DELETE` requests, or set as the body for requests with any other HTTP method. The \n                         `Content-Type` HTTP header field of an encoded request with HTTP body is set to\n                         `application/x-www-form-urlencoded; charset=utf-8`. Since there is no published specification\n                         for how to encode collection types, the convention of appending `[]` to the key for array\n                         values (`foo[]=1&foo[]=2`), and appending the key surrounded by square brackets for nested\n                         dictionary values (`foo[bar]=baz`).\n\n    - `URLEncodedInURL`: Creates query string to be set as or appended to any existing URL query. Uses the same\n                         implementation as the `.URL` case, but always applies the encoded result to the URL.\n\n    - `JSON`:            Uses `NSJSONSerialization` to create a JSON representation of the parameters object, which is \n                         set as the body of the request. The `Content-Type` HTTP header field of an encoded request is \n                         set to `application/json`.\n\n    - `PropertyList`:    Uses `NSPropertyListSerialization` to create a plist representation of the parameters object,\n                         according to the associated format and write options values, which is set as the body of the\n                         request. The `Content-Type` HTTP header field of an encoded request is set to\n                         `application/x-plist`.\n\n    - `Custom`:          Uses the associated closure value to construct a new request given an existing request and\n                         parameters.\n*/\npublic enum ParameterEncoding {\n    case URL\n    case URLEncodedInURL\n    case JSON\n    case PropertyList(NSPropertyListFormat, NSPropertyListWriteOptions)\n    case Custom((URLRequestConvertible, [String: AnyObject]?) -> (NSMutableURLRequest, NSError?))\n\n    /**\n        Creates a URL request by encoding parameters and applying them onto an existing request.\n\n        - parameter URLRequest: The request to have parameters applied\n        - parameter parameters: The parameters to apply\n\n        - returns: A tuple containing the constructed request and the error that occurred during parameter encoding, \n                   if any.\n    */\n    public func encode(\n        URLRequest: URLRequestConvertible,\n        parameters: [String: AnyObject]?)\n        -> (NSMutableURLRequest, NSError?)\n    {\n        var mutableURLRequest = URLRequest.URLRequest\n\n        guard let parameters = parameters else { return (mutableURLRequest, nil) }\n\n        var encodingError: NSError? = nil\n\n        switch self {\n        case .URL, .URLEncodedInURL:\n            func query(parameters: [String: AnyObject]) -> String {\n                var components: [(String, String)] = []\n\n                for key in parameters.keys.sort(<) {\n                    let value = parameters[key]!\n                    components += queryComponents(key, value)\n                }\n\n                return (components.map { \"\\($0)=\\($1)\" } as [String]).joinWithSeparator(\"&\")\n            }\n\n            func encodesParametersInURL(method: Method) -> Bool {\n                switch self {\n                case .URLEncodedInURL:\n                    return true\n                default:\n                    break\n                }\n\n                switch method {\n                case .GET, .HEAD, .DELETE:\n                    return true\n                default:\n                    return false\n                }\n            }\n\n            if let method = Method(rawValue: mutableURLRequest.HTTPMethod) where encodesParametersInURL(method) {\n                if let\n                    URLComponents = NSURLComponents(URL: mutableURLRequest.URL!, resolvingAgainstBaseURL: false)\n                    where !parameters.isEmpty\n                {\n                    let percentEncodedQuery = (URLComponents.percentEncodedQuery.map { $0 + \"&\" } ?? \"\") + query(parameters)\n                    URLComponents.percentEncodedQuery = percentEncodedQuery\n                    mutableURLRequest.URL = URLComponents.URL\n                }\n            } else {\n                if mutableURLRequest.valueForHTTPHeaderField(\"Content-Type\") == nil {\n                    mutableURLRequest.setValue(\n                        \"application/x-www-form-urlencoded; charset=utf-8\",\n                        forHTTPHeaderField: \"Content-Type\"\n                    )\n                }\n\n                mutableURLRequest.HTTPBody = query(parameters).dataUsingEncoding(\n                    NSUTF8StringEncoding,\n                    allowLossyConversion: false\n                )\n            }\n        case .JSON:\n            do {\n                let options = NSJSONWritingOptions()\n                let data = try NSJSONSerialization.dataWithJSONObject(parameters, options: options)\n\n                mutableURLRequest.setValue(\"application/json\", forHTTPHeaderField: \"Content-Type\")\n                mutableURLRequest.HTTPBody = data\n            } catch {\n                encodingError = error as NSError\n            }\n        case .PropertyList(let format, let options):\n            do {\n                let data = try NSPropertyListSerialization.dataWithPropertyList(\n                    parameters,\n                    format: format,\n                    options: options\n                )\n                mutableURLRequest.setValue(\"application/x-plist\", forHTTPHeaderField: \"Content-Type\")\n                mutableURLRequest.HTTPBody = data\n            } catch {\n                encodingError = error as NSError\n            }\n        case .Custom(let closure):\n            (mutableURLRequest, encodingError) = closure(mutableURLRequest, parameters)\n        }\n\n        return (mutableURLRequest, encodingError)\n    }\n\n    /**\n        Creates percent-escaped, URL encoded query string components from the given key-value pair using recursion.\n\n        - parameter key:   The key of the query component.\n        - parameter value: The value of the query component.\n\n        - returns: The percent-escaped, URL encoded query string components.\n    */\n    public func queryComponents(key: String, _ value: AnyObject) -> [(String, String)] {\n        var components: [(String, String)] = []\n\n        if let dictionary = value as? [String: AnyObject] {\n            for (nestedKey, value) in dictionary {\n                components += queryComponents(\"\\(key)[\\(nestedKey)]\", value)\n            }\n        } else if let array = value as? [AnyObject] {\n            for value in array {\n                components += queryComponents(\"\\(key)[]\", value)\n            }\n        } else {\n            components.append((escape(key), escape(\"\\(value)\")))\n        }\n\n        return components\n    }\n\n    /**\n        Returns a percent-escaped string following RFC 3986 for a query string key or value.\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\n        - parameter string: The string to be percent-escaped.\n\n        - returns: The percent-escaped string.\n    */\n    public func escape(string: String) -> String {\n        let generalDelimitersToEncode = \":#[]@\" // does not include \"?\" or \"/\" due to RFC 3986 - Section 3.4\n        let subDelimitersToEncode = \"!$&'()*+,;=\"\n\n        let allowedCharacterSet = NSCharacterSet.URLQueryAllowedCharacterSet().mutableCopy() as! NSMutableCharacterSet\n        allowedCharacterSet.removeCharactersInString(generalDelimitersToEncode + subDelimitersToEncode)\n\n        var escaped = \"\"\n\n        //==========================================================================================================\n        //\n        //  Batching is required for escaping due to an internal bug in iOS 8.1 and 8.2. Encoding more than a few\n        //  hundred Chinense characters causes various malloc error crashes. To avoid this issue until iOS 8 is no\n        //  longer supported, batching MUST be used for encoding. This introduces roughly a 20% overhead. For more\n        //  info, please refer to:\n        //\n        //      - https://github.com/Alamofire/Alamofire/issues/206\n        //\n        //==========================================================================================================\n\n        if #available(iOS 8.3, OSX 10.10, *) {\n            escaped = string.stringByAddingPercentEncodingWithAllowedCharacters(allowedCharacterSet) ?? string\n        } else {\n            let batchSize = 50\n            var index = string.startIndex\n\n            while index != string.endIndex {\n                let startIndex = index\n                let endIndex = index.advancedBy(batchSize, limit: string.endIndex)\n                let range = Range(start: startIndex, end: endIndex)\n\n                let substring = string.substringWithRange(range)\n\n                escaped += substring.stringByAddingPercentEncodingWithAllowedCharacters(allowedCharacterSet) ?? substring\n\n                index = endIndex\n            }\n        }\n\n        return escaped\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Alamofire/Source/Request.swift",
    "content": "// Request.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\nimport Foundation\n\n/**\n    Responsible for sending a request and receiving the response and associated data from the server, as well as \n    managing its underlying `NSURLSessionTask`.\n*/\npublic class Request {\n\n    // MARK: - Properties\n\n    /// The delegate for the underlying task.\n    public let delegate: TaskDelegate\n\n    /// The underlying task.\n    public var task: NSURLSessionTask { return delegate.task }\n\n    /// The session belonging to the underlying task.\n    public let session: NSURLSession\n\n    /// The request sent or to be sent to the server.\n    public var request: NSURLRequest? { return task.originalRequest }\n\n    /// The response received from the server, if any.\n    public var response: NSHTTPURLResponse? { return task.response as? NSHTTPURLResponse }\n\n    /// The progress of the request lifecycle.\n    public var progress: NSProgress { return delegate.progress }\n\n    var startTime: CFAbsoluteTime?\n    var endTime: CFAbsoluteTime?\n\n    // MARK: - Lifecycle\n\n    init(session: NSURLSession, task: NSURLSessionTask) {\n        self.session = session\n\n        switch task {\n        case is NSURLSessionUploadTask:\n            delegate = UploadTaskDelegate(task: task)\n        case is NSURLSessionDataTask:\n            delegate = DataTaskDelegate(task: task)\n        case is NSURLSessionDownloadTask:\n            delegate = DownloadTaskDelegate(task: task)\n        default:\n            delegate = TaskDelegate(task: task)\n        }\n\n        delegate.queue.addOperationWithBlock { self.endTime = CFAbsoluteTimeGetCurrent() }\n    }\n\n    // MARK: - Authentication\n\n    /**\n        Associates an HTTP Basic credential with the request.\n\n        - parameter user:        The user.\n        - parameter password:    The password.\n        - parameter persistence: The URL credential persistence. `.ForSession` by default.\n\n        - returns: The request.\n    */\n    public func authenticate(\n        user user: String,\n        password: String,\n        persistence: NSURLCredentialPersistence = .ForSession)\n        -> Self\n    {\n        let credential = NSURLCredential(user: user, password: password, persistence: persistence)\n\n        return authenticate(usingCredential: credential)\n    }\n\n    /**\n        Associates a specified credential with the request.\n\n        - parameter credential: The credential.\n\n        - returns: The request.\n    */\n    public func authenticate(usingCredential credential: NSURLCredential) -> Self {\n        delegate.credential = credential\n\n        return self\n    }\n\n    // MARK: - Progress\n\n    /**\n        Sets a closure to be called periodically during the lifecycle of the request as data is written to or read \n        from the server.\n\n        - For uploads, the progress closure returns the bytes written, total bytes written, and total bytes expected \n          to write.\n        - For downloads and data tasks, the progress closure returns the bytes read, total bytes read, and total bytes \n          expected to read.\n\n        - parameter closure: The code to be executed periodically during the lifecycle of the request.\n\n        - returns: The request.\n    */\n    public func progress(closure: ((Int64, Int64, Int64) -> Void)? = nil) -> Self {\n        if let uploadDelegate = delegate as? UploadTaskDelegate {\n            uploadDelegate.uploadProgress = closure\n        } else if let dataDelegate = delegate as? DataTaskDelegate {\n            dataDelegate.dataProgress = closure\n        } else if let downloadDelegate = delegate as? DownloadTaskDelegate {\n            downloadDelegate.downloadProgress = closure\n        }\n\n        return self\n    }\n\n    /**\n        Sets a closure to be called periodically during the lifecycle of the request as data is read from the server.\n\n        This closure returns the bytes most recently received from the server, not including data from previous calls. \n        If this closure is set, data will only be available within this closure, and will not be saved elsewhere. It is \n        also important to note that the `response` closure will be called with nil `responseData`.\n\n        - parameter closure: The code to be executed periodically during the lifecycle of the request.\n\n        - returns: The request.\n    */\n    public func stream(closure: (NSData -> Void)? = nil) -> Self {\n        if let dataDelegate = delegate as? DataTaskDelegate {\n            dataDelegate.dataStream = closure\n        }\n\n        return self\n    }\n\n    // MARK: - State\n\n    /**\n        Resumes the request.\n    */\n    public func resume() {\n        if startTime == nil { startTime = CFAbsoluteTimeGetCurrent() }\n\n        task.resume()\n        NSNotificationCenter.defaultCenter().postNotificationName(Notifications.Task.DidResume, object: task)\n    }\n\n    /**\n        Suspends the request.\n    */\n    public func suspend() {\n        task.suspend()\n        NSNotificationCenter.defaultCenter().postNotificationName(Notifications.Task.DidSuspend, object: task)\n    }\n\n    /**\n        Cancels the request.\n    */\n    public func cancel() {\n        if let\n            downloadDelegate = delegate as? DownloadTaskDelegate,\n            downloadTask = downloadDelegate.downloadTask\n        {\n            downloadTask.cancelByProducingResumeData { data in\n                downloadDelegate.resumeData = data\n            }\n        } else {\n            task.cancel()\n        }\n\n        NSNotificationCenter.defaultCenter().postNotificationName(Notifications.Task.DidCancel, object: task)\n    }\n\n    // MARK: - TaskDelegate\n\n    /**\n        The task delegate is responsible for handling all delegate callbacks for the underlying task as well as \n        executing all operations attached to the serial operation queue upon task completion.\n    */\n    public class TaskDelegate: NSObject {\n\n        /// The serial operation queue used to execute all operations after the task completes.\n        public let queue: NSOperationQueue\n\n        let task: NSURLSessionTask\n        let progress: NSProgress\n\n        var data: NSData? { return nil }\n        var error: NSError?\n\n        var initialResponseTime: CFAbsoluteTime?\n        var credential: NSURLCredential?\n\n        init(task: NSURLSessionTask) {\n            self.task = task\n            self.progress = NSProgress(totalUnitCount: 0)\n            self.queue = {\n                let operationQueue = NSOperationQueue()\n                operationQueue.maxConcurrentOperationCount = 1\n                operationQueue.suspended = true\n\n                if #available(OSX 10.10, *) {\n                    operationQueue.qualityOfService = NSQualityOfService.Utility\n                }\n\n                return operationQueue\n            }()\n        }\n\n        deinit {\n            queue.cancelAllOperations()\n            queue.suspended = false\n        }\n\n        // MARK: - NSURLSessionTaskDelegate\n\n        // MARK: Override Closures\n\n        var taskWillPerformHTTPRedirection: ((NSURLSession, NSURLSessionTask, NSHTTPURLResponse, NSURLRequest) -> NSURLRequest?)?\n        var taskDidReceiveChallenge: ((NSURLSession, NSURLSessionTask, NSURLAuthenticationChallenge) -> (NSURLSessionAuthChallengeDisposition, NSURLCredential?))?\n        var taskNeedNewBodyStream: ((NSURLSession, NSURLSessionTask) -> NSInputStream?)?\n        var taskDidCompleteWithError: ((NSURLSession, NSURLSessionTask, NSError?) -> Void)?\n\n        // MARK: Delegate Methods\n\n        func URLSession(\n            session: NSURLSession,\n            task: NSURLSessionTask,\n            willPerformHTTPRedirection response: NSHTTPURLResponse,\n            newRequest request: NSURLRequest,\n            completionHandler: ((NSURLRequest?) -> Void))\n        {\n            var redirectRequest: NSURLRequest? = request\n\n            if let taskWillPerformHTTPRedirection = taskWillPerformHTTPRedirection {\n                redirectRequest = taskWillPerformHTTPRedirection(session, task, response, request)\n            }\n\n            completionHandler(redirectRequest)\n        }\n\n        func URLSession(\n            session: NSURLSession,\n            task: NSURLSessionTask,\n            didReceiveChallenge challenge: NSURLAuthenticationChallenge,\n            completionHandler: ((NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void))\n        {\n            var disposition: NSURLSessionAuthChallengeDisposition = .PerformDefaultHandling\n            var credential: NSURLCredential?\n\n            if let taskDidReceiveChallenge = taskDidReceiveChallenge {\n                (disposition, credential) = taskDidReceiveChallenge(session, task, challenge)\n            } else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {\n                let host = challenge.protectionSpace.host\n\n                if let\n                    serverTrustPolicy = session.serverTrustPolicyManager?.serverTrustPolicyForHost(host),\n                    serverTrust = challenge.protectionSpace.serverTrust\n                {\n                    if serverTrustPolicy.evaluateServerTrust(serverTrust, isValidForHost: host) {\n                        disposition = .UseCredential\n                        credential = NSURLCredential(forTrust: serverTrust)\n                    } else {\n                        disposition = .CancelAuthenticationChallenge\n                    }\n                }\n            } else {\n                if challenge.previousFailureCount > 0 {\n                    disposition = .CancelAuthenticationChallenge\n                } else {\n                    credential = self.credential ?? session.configuration.URLCredentialStorage?.defaultCredentialForProtectionSpace(challenge.protectionSpace)\n\n                    if credential != nil {\n                        disposition = .UseCredential\n                    }\n                }\n            }\n\n            completionHandler(disposition, credential)\n        }\n\n        func URLSession(\n            session: NSURLSession,\n            task: NSURLSessionTask,\n            needNewBodyStream completionHandler: ((NSInputStream?) -> Void))\n        {\n            var bodyStream: NSInputStream?\n\n            if let taskNeedNewBodyStream = taskNeedNewBodyStream {\n                bodyStream = taskNeedNewBodyStream(session, task)\n            }\n\n            completionHandler(bodyStream)\n        }\n\n        func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {\n            if let taskDidCompleteWithError = taskDidCompleteWithError {\n                taskDidCompleteWithError(session, task, error)\n            } else {\n                if let error = error {\n                    self.error = error\n\n                    if let\n                        downloadDelegate = self as? DownloadTaskDelegate,\n                        userInfo = error.userInfo as? [String: AnyObject],\n                        resumeData = userInfo[NSURLSessionDownloadTaskResumeData] as? NSData\n                    {\n                        downloadDelegate.resumeData = resumeData\n                    }\n                }\n\n                queue.suspended = false\n            }\n        }\n    }\n\n    // MARK: - DataTaskDelegate\n\n    class DataTaskDelegate: TaskDelegate, NSURLSessionDataDelegate {\n        var dataTask: NSURLSessionDataTask? { return task as? NSURLSessionDataTask }\n\n        private var totalBytesReceived: Int64 = 0\n        private var mutableData: NSMutableData\n        override var data: NSData? {\n            if dataStream != nil {\n                return nil\n            } else {\n                return mutableData\n            }\n        }\n\n        private var expectedContentLength: Int64?\n        private var dataProgress: ((bytesReceived: Int64, totalBytesReceived: Int64, totalBytesExpectedToReceive: Int64) -> Void)?\n        private var dataStream: ((data: NSData) -> Void)?\n\n        override init(task: NSURLSessionTask) {\n            mutableData = NSMutableData()\n            super.init(task: task)\n        }\n\n        // MARK: - NSURLSessionDataDelegate\n\n        // MARK: Override Closures\n\n        var dataTaskDidReceiveResponse: ((NSURLSession, NSURLSessionDataTask, NSURLResponse) -> NSURLSessionResponseDisposition)?\n        var dataTaskDidBecomeDownloadTask: ((NSURLSession, NSURLSessionDataTask, NSURLSessionDownloadTask) -> Void)?\n        var dataTaskDidReceiveData: ((NSURLSession, NSURLSessionDataTask, NSData) -> Void)?\n        var dataTaskWillCacheResponse: ((NSURLSession, NSURLSessionDataTask, NSCachedURLResponse) -> NSCachedURLResponse?)?\n\n        // MARK: Delegate Methods\n\n        func URLSession(\n            session: NSURLSession,\n            dataTask: NSURLSessionDataTask,\n            didReceiveResponse response: NSURLResponse,\n            completionHandler: (NSURLSessionResponseDisposition -> Void))\n        {\n            var disposition: NSURLSessionResponseDisposition = .Allow\n\n            expectedContentLength = response.expectedContentLength\n\n            if let dataTaskDidReceiveResponse = dataTaskDidReceiveResponse {\n                disposition = dataTaskDidReceiveResponse(session, dataTask, response)\n            }\n\n            completionHandler(disposition)\n        }\n\n        func URLSession(\n            session: NSURLSession,\n            dataTask: NSURLSessionDataTask,\n            didBecomeDownloadTask downloadTask: NSURLSessionDownloadTask)\n        {\n            dataTaskDidBecomeDownloadTask?(session, dataTask, downloadTask)\n        }\n\n        func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {\n            if initialResponseTime == nil { initialResponseTime = CFAbsoluteTimeGetCurrent() }\n\n            if let dataTaskDidReceiveData = dataTaskDidReceiveData {\n                dataTaskDidReceiveData(session, dataTask, data)\n            } else {\n                if let dataStream = dataStream {\n                    dataStream(data: data)\n                } else {\n                    mutableData.appendData(data)\n                }\n\n                totalBytesReceived += data.length\n                let totalBytesExpected = dataTask.response?.expectedContentLength ?? NSURLSessionTransferSizeUnknown\n\n                progress.totalUnitCount = totalBytesExpected\n                progress.completedUnitCount = totalBytesReceived\n\n                dataProgress?(\n                    bytesReceived: Int64(data.length),\n                    totalBytesReceived: totalBytesReceived,\n                    totalBytesExpectedToReceive: totalBytesExpected\n                )\n            }\n        }\n\n        func URLSession(\n            session: NSURLSession,\n            dataTask: NSURLSessionDataTask,\n            willCacheResponse proposedResponse: NSCachedURLResponse,\n            completionHandler: ((NSCachedURLResponse?) -> Void))\n        {\n            var cachedResponse: NSCachedURLResponse? = proposedResponse\n\n            if let dataTaskWillCacheResponse = dataTaskWillCacheResponse {\n                cachedResponse = dataTaskWillCacheResponse(session, dataTask, proposedResponse)\n            }\n\n            completionHandler(cachedResponse)\n        }\n    }\n}\n\n// MARK: - CustomStringConvertible\n\nextension Request: CustomStringConvertible {\n\n    /**\n        The textual representation used when written to an output stream, which includes the HTTP method and URL, as \n        well as the response status code if a response has been received.\n    */\n    public var description: String {\n        var components: [String] = []\n\n        if let HTTPMethod = request?.HTTPMethod {\n            components.append(HTTPMethod)\n        }\n\n        if let URLString = request?.URL?.absoluteString {\n            components.append(URLString)\n        }\n\n        if let response = response {\n            components.append(\"(\\(response.statusCode))\")\n        }\n\n        return components.joinWithSeparator(\" \")\n    }\n}\n\n// MARK: - CustomDebugStringConvertible\n\nextension Request: CustomDebugStringConvertible {\n    func cURLRepresentation() -> String {\n        var components = [\"$ curl -i\"]\n\n        guard let\n            request = self.request,\n            URL = request.URL,\n            host = URL.host\n        else {\n            return \"$ curl command could not be created\"\n        }\n\n        if let HTTPMethod = request.HTTPMethod where HTTPMethod != \"GET\" {\n            components.append(\"-X \\(HTTPMethod)\")\n        }\n\n        if let credentialStorage = self.session.configuration.URLCredentialStorage {\n            let protectionSpace = NSURLProtectionSpace(\n                host: host,\n                port: URL.port?.integerValue ?? 0,\n                `protocol`: URL.scheme,\n                realm: host,\n                authenticationMethod: NSURLAuthenticationMethodHTTPBasic\n            )\n\n            if let credentials = credentialStorage.credentialsForProtectionSpace(protectionSpace)?.values {\n                for credential in credentials {\n                    components.append(\"-u \\(credential.user!):\\(credential.password!)\")\n                }\n            } else {\n                if let credential = delegate.credential {\n                    components.append(\"-u \\(credential.user!):\\(credential.password!)\")\n                }\n            }\n        }\n\n        if session.configuration.HTTPShouldSetCookies {\n            if let\n                cookieStorage = session.configuration.HTTPCookieStorage,\n                cookies = cookieStorage.cookiesForURL(URL) where !cookies.isEmpty\n            {\n                let string = cookies.reduce(\"\") { $0 + \"\\($1.name)=\\($1.value ?? String());\" }\n                components.append(\"-b \\\"\\(string.substringToIndex(string.endIndex.predecessor()))\\\"\")\n            }\n        }\n\n        if let headerFields = request.allHTTPHeaderFields {\n            for (field, value) in headerFields {\n                switch field {\n                case \"Cookie\":\n                    continue\n                default:\n                    components.append(\"-H \\\"\\(field): \\(value)\\\"\")\n                }\n            }\n        }\n\n        if let additionalHeaders = session.configuration.HTTPAdditionalHeaders {\n            for (field, value) in additionalHeaders {\n                switch field {\n                case \"Cookie\":\n                    continue\n                default:\n                    components.append(\"-H \\\"\\(field): \\(value)\\\"\")\n                }\n            }\n        }\n\n        if let\n            HTTPBodyData = request.HTTPBody,\n            HTTPBody = String(data: HTTPBodyData, encoding: NSUTF8StringEncoding)\n        {\n            let escapedBody = HTTPBody.stringByReplacingOccurrencesOfString(\"\\\"\", withString: \"\\\\\\\"\")\n            components.append(\"-d \\\"\\(escapedBody)\\\"\")\n        }\n\n        components.append(\"\\\"\\(URL.absoluteString)\\\"\")\n\n        return components.joinWithSeparator(\" \\\\\\n\\t\")\n    }\n\n    /// The textual representation used when written to an output stream, in the form of a cURL command.\n    public var debugDescription: String {\n        return cURLRepresentation()\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Alamofire/Source/Response.swift",
    "content": "// Response.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\nimport Foundation\n\n/// Used to store all response data returned from a completed `Request`.\npublic struct Response<Value, Error: ErrorType> {\n    /// The URL request sent to the server.\n    public let request: NSURLRequest?\n\n    /// The server's response to the URL request.\n    public let response: NSHTTPURLResponse?\n\n    /// The data returned by the server.\n    public let data: NSData?\n\n    /// The result of response serialization.\n    public let result: Result<Value, Error>\n\n    /// The timeline of the complete lifecycle of the `Request`.\n    public let timeline: Timeline\n\n    /**\n        Initializes the `Response` instance with the specified URL request, URL response, server data and response\n        serialization result.\n    \n        - parameter request:  The URL request sent to the server.\n        - parameter response: The server's response to the URL request.\n        - parameter data:     The data returned by the server.\n        - parameter result:   The result of response serialization.\n        - parameter timeline: The timeline of the complete lifecycle of the `Request`. Defaults to `Timeline()`.\n\n        - returns: the new `Response` instance.\n    */\n    public init(\n        request: NSURLRequest?,\n        response: NSHTTPURLResponse?,\n        data: NSData?,\n        result: Result<Value, Error>,\n        timeline: Timeline = Timeline())\n    {\n        self.request = request\n        self.response = response\n        self.data = data\n        self.result = result\n        self.timeline = timeline\n    }\n}\n\n// MARK: - CustomStringConvertible\n\nextension Response: CustomStringConvertible {\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        return result.debugDescription\n    }\n}\n\n// MARK: - CustomDebugStringConvertible\n\nextension Response: CustomDebugStringConvertible {\n    /// The debug textual representation used when written to an output stream, which includes the URL request, the URL\n    /// response, the server data and the response serialization result.\n    public var debugDescription: String {\n        var output: [String] = []\n\n        output.append(request != nil ? \"[Request]: \\(request!)\" : \"[Request]: nil\")\n        output.append(response != nil ? \"[Response]: \\(response!)\" : \"[Response]: nil\")\n        output.append(\"[Data]: \\(data?.length ?? 0) bytes\")\n        output.append(\"[Result]: \\(result.debugDescription)\")\n        output.append(\"[Timeline]: \\(timeline.debugDescription)\")\n\n        return output.joinWithSeparator(\"\\n\")\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Alamofire/Source/ResponseSerialization.swift",
    "content": "// ResponseSerialization.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\nimport Foundation\n\n// MARK: ResponseSerializer\n\n/**\n    The type in which all response serializers must conform to in order to serialize a response.\n*/\npublic protocol ResponseSerializerType {\n    /// The type of serialized object to be created by this `ResponseSerializerType`.\n    typealias SerializedObject\n\n    /// The type of error to be created by this `ResponseSerializer` if serialization fails.\n    typealias ErrorObject: ErrorType\n\n    /**\n        A closure used by response handlers that takes a request, response, data and error and returns a result.\n    */\n    var serializeResponse: (NSURLRequest?, NSHTTPURLResponse?, NSData?, NSError?) -> Result<SerializedObject, ErrorObject> { get }\n}\n\n// MARK: -\n\n/**\n    A generic `ResponseSerializerType` used to serialize a request, response, and data into a serialized object.\n*/\npublic struct ResponseSerializer<Value, Error: ErrorType>: ResponseSerializerType {\n    /// The type of serialized object to be created by this `ResponseSerializer`.\n    public typealias SerializedObject = Value\n\n    /// The type of error to be created by this `ResponseSerializer` if serialization fails.\n    public typealias ErrorObject = Error\n\n    /**\n        A closure used by response handlers that takes a request, response, data and error and returns a result.\n    */\n    public var serializeResponse: (NSURLRequest?, NSHTTPURLResponse?, NSData?, NSError?) -> Result<Value, Error>\n\n    /**\n        Initializes the `ResponseSerializer` instance with the given serialize response closure.\n\n        - parameter serializeResponse: The closure used to serialize the response.\n\n        - returns: The new generic response serializer instance.\n    */\n    public init(serializeResponse: (NSURLRequest?, NSHTTPURLResponse?, NSData?, NSError?) -> Result<Value, Error>) {\n        self.serializeResponse = serializeResponse\n    }\n}\n\n// MARK: - Default\n\nextension Request {\n\n    /**\n        Adds a handler to be called once the request has finished.\n\n        - parameter queue:             The queue on which the completion handler is dispatched.\n        - parameter completionHandler: The code to be executed once the request has finished.\n\n        - returns: The request.\n    */\n    public func response(\n        queue queue: dispatch_queue_t? = nil,\n        completionHandler: (NSURLRequest?, NSHTTPURLResponse?, NSData?, NSError?) -> Void)\n        -> Self\n    {\n        delegate.queue.addOperationWithBlock {\n            dispatch_async(queue ?? dispatch_get_main_queue()) {\n                completionHandler(self.request, self.response, self.delegate.data, self.delegate.error)\n            }\n        }\n\n        return self\n    }\n\n    /**\n        Adds a handler to be called once the request has finished.\n\n        - parameter queue:              The queue on which the completion handler is dispatched.\n        - parameter responseSerializer: The response serializer responsible for serializing the request, response, \n                                        and data.\n        - parameter completionHandler:  The code to be executed once the request has finished.\n\n        - returns: The request.\n    */\n    public func response<T: ResponseSerializerType>(\n        queue queue: dispatch_queue_t? = nil,\n        responseSerializer: T,\n        completionHandler: Response<T.SerializedObject, T.ErrorObject> -> Void)\n        -> Self\n    {\n        delegate.queue.addOperationWithBlock {\n            let result = responseSerializer.serializeResponse(\n                self.request,\n                self.response,\n                self.delegate.data,\n                self.delegate.error\n            )\n\n            let requestCompletedTime = self.endTime ?? CFAbsoluteTimeGetCurrent()\n            let initialResponseTime = self.delegate.initialResponseTime ?? requestCompletedTime\n\n            let timeline = Timeline(\n                requestStartTime: self.startTime ?? CFAbsoluteTimeGetCurrent(),\n                initialResponseTime: initialResponseTime,\n                requestCompletedTime: requestCompletedTime,\n                serializationCompletedTime: CFAbsoluteTimeGetCurrent()\n            )\n\n            let response = Response<T.SerializedObject, T.ErrorObject>(\n                request: self.request,\n                response: self.response,\n                data: self.delegate.data,\n                result: result,\n                timeline: timeline\n            )\n\n            dispatch_async(queue ?? dispatch_get_main_queue()) { completionHandler(response) }\n        }\n\n        return self\n    }\n}\n\n// MARK: - Data\n\nextension Request {\n\n    /**\n        Creates a response serializer that returns the associated data as-is.\n\n        - returns: A data response serializer.\n    */\n    public static func dataResponseSerializer() -> ResponseSerializer<NSData, NSError> {\n        return ResponseSerializer { _, response, data, error in\n            guard error == nil else { return .Failure(error!) }\n\n            if let response = response where response.statusCode == 204 { return .Success(NSData()) }\n\n            guard let validData = data else {\n                let failureReason = \"Data could not be serialized. Input data was nil.\"\n                let error = Error.errorWithCode(.DataSerializationFailed, failureReason: failureReason)\n                return .Failure(error)\n            }\n\n            return .Success(validData)\n        }\n    }\n\n    /**\n        Adds a handler to be called once the request has finished.\n\n        - parameter completionHandler: The code to be executed once the request has finished.\n\n        - returns: The request.\n    */\n    public func responseData(completionHandler: Response<NSData, NSError> -> Void) -> Self {\n        return response(responseSerializer: Request.dataResponseSerializer(), completionHandler: completionHandler)\n    }\n}\n\n// MARK: - String\n\nextension Request {\n\n    /**\n        Creates a response serializer that returns a string initialized from the response data with the specified \n        string encoding.\n\n        - parameter encoding: The string encoding. If `nil`, the string encoding will be determined from the server \n                              response, falling back to the default HTTP default character set, ISO-8859-1.\n\n        - returns: A string response serializer.\n    */\n    public static func stringResponseSerializer(\n        var encoding encoding: NSStringEncoding? = nil)\n        -> ResponseSerializer<String, NSError>\n    {\n        return ResponseSerializer { _, response, data, error in\n            guard error == nil else { return .Failure(error!) }\n\n            if let response = response where response.statusCode == 204 { return .Success(\"\") }\n\n            guard let validData = data else {\n                let failureReason = \"String could not be serialized. Input data was nil.\"\n                let error = Error.errorWithCode(.StringSerializationFailed, failureReason: failureReason)\n                return .Failure(error)\n            }\n\n            if let encodingName = response?.textEncodingName where encoding == nil {\n                encoding = CFStringConvertEncodingToNSStringEncoding(\n                    CFStringConvertIANACharSetNameToEncoding(encodingName)\n                )\n            }\n\n            let actualEncoding = encoding ?? NSISOLatin1StringEncoding\n\n            if let string = String(data: validData, encoding: actualEncoding) {\n                return .Success(string)\n            } else {\n                let failureReason = \"String could not be serialized with encoding: \\(actualEncoding)\"\n                let error = Error.errorWithCode(.StringSerializationFailed, failureReason: failureReason)\n                return .Failure(error)\n            }\n        }\n    }\n\n    /**\n        Adds a handler to be called once the request has finished.\n\n        - parameter encoding:          The string encoding. If `nil`, the string encoding will be determined from the \n                                       server response, falling back to the default HTTP default character set, \n                                       ISO-8859-1.\n        - parameter completionHandler: A closure to be executed once the request has finished.\n\n        - returns: The request.\n    */\n    public func responseString(\n        encoding encoding: NSStringEncoding? = nil,\n        completionHandler: Response<String, NSError> -> Void)\n        -> Self\n    {\n        return response(\n            responseSerializer: Request.stringResponseSerializer(encoding: encoding),\n            completionHandler: completionHandler\n        )\n    }\n}\n\n// MARK: - JSON\n\nextension Request {\n\n    /**\n        Creates a response serializer that returns a JSON object constructed from the response data using \n        `NSJSONSerialization` with the specified reading options.\n\n        - parameter options: The JSON serialization reading options. `.AllowFragments` by default.\n\n        - returns: A JSON object response serializer.\n    */\n    public static func JSONResponseSerializer(\n        options options: NSJSONReadingOptions = .AllowFragments)\n        -> ResponseSerializer<AnyObject, NSError>\n    {\n        return ResponseSerializer { _, response, data, error in\n            guard error == nil else { return .Failure(error!) }\n\n            if let response = response where response.statusCode == 204 { return .Success(NSNull()) }\n\n            guard let validData = data where validData.length > 0 else {\n                let failureReason = \"JSON could not be serialized. Input data was nil or zero length.\"\n                let error = Error.errorWithCode(.JSONSerializationFailed, failureReason: failureReason)\n                return .Failure(error)\n            }\n\n            do {\n                let JSON = try NSJSONSerialization.JSONObjectWithData(validData, options: options)\n                return .Success(JSON)\n            } catch {\n                return .Failure(error as NSError)\n            }\n        }\n    }\n\n    /**\n        Adds a handler to be called once the request has finished.\n\n        - parameter options:           The JSON serialization reading options. `.AllowFragments` by default.\n        - parameter completionHandler: A closure to be executed once the request has finished.\n\n        - returns: The request.\n    */\n    public func responseJSON(\n        options options: NSJSONReadingOptions = .AllowFragments,\n        completionHandler: Response<AnyObject, NSError> -> Void)\n        -> Self\n    {\n        return response(\n            responseSerializer: Request.JSONResponseSerializer(options: options),\n            completionHandler: completionHandler\n        )\n    }\n}\n\n// MARK: - Property List\n\nextension Request {\n\n    /**\n        Creates a response serializer that returns an object constructed from the response data using \n        `NSPropertyListSerialization` with the specified reading options.\n\n        - parameter options: The property list reading options. `NSPropertyListReadOptions()` by default.\n\n        - returns: A property list object response serializer.\n    */\n    public static func propertyListResponseSerializer(\n        options options: NSPropertyListReadOptions = NSPropertyListReadOptions())\n        -> ResponseSerializer<AnyObject, NSError>\n    {\n        return ResponseSerializer { _, response, data, error in\n            guard error == nil else { return .Failure(error!) }\n\n            if let response = response where response.statusCode == 204 { return .Success(NSNull()) }\n\n            guard let validData = data where validData.length > 0 else {\n                let failureReason = \"Property list could not be serialized. Input data was nil or zero length.\"\n                let error = Error.errorWithCode(.PropertyListSerializationFailed, failureReason: failureReason)\n                return .Failure(error)\n            }\n\n            do {\n                let plist = try NSPropertyListSerialization.propertyListWithData(validData, options: options, format: nil)\n                return .Success(plist)\n            } catch {\n                return .Failure(error as NSError)\n            }\n        }\n    }\n\n    /**\n        Adds a handler to be called once the request has finished.\n\n        - parameter options:           The property list reading options. `0` by default.\n        - parameter completionHandler: A closure to be executed once the request has finished. The closure takes 3\n                                       arguments: the URL request, the URL response, the server data and the result \n                                       produced while creating the property list.\n\n        - returns: The request.\n    */\n    public func responsePropertyList(\n        options options: NSPropertyListReadOptions = NSPropertyListReadOptions(),\n        completionHandler: Response<AnyObject, NSError> -> Void)\n        -> Self\n    {\n        return response(\n            responseSerializer: Request.propertyListResponseSerializer(options: options),\n            completionHandler: completionHandler\n        )\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Alamofire/Source/Result.swift",
    "content": "// Result.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\nimport Foundation\n\n/**\n    Used to represent whether a request was successful or encountered an error.\n\n    - Success: The request and all post processing operations were successful resulting in the serialization of the \n               provided associated value.\n    - Failure: The request encountered an error resulting in a failure. The associated values are the original data \n               provided by the server as well as the error that caused the failure.\n*/\npublic enum Result<Value, Error: ErrorType> {\n    case Success(Value)\n    case Failure(Error)\n\n    /// Returns `true` if the result is a success, `false` otherwise.\n    public var isSuccess: Bool {\n        switch self {\n        case .Success:\n            return true\n        case .Failure:\n            return false\n        }\n    }\n\n    /// Returns `true` if the result is a failure, `false` otherwise.\n    public var isFailure: Bool {\n        return !isSuccess\n    }\n\n    /// Returns the associated value if the result is a success, `nil` otherwise.\n    public var value: Value? {\n        switch self {\n        case .Success(let value):\n            return value\n        case .Failure:\n            return nil\n        }\n    }\n\n    /// Returns the associated error value if the result is a failure, `nil` otherwise.\n    public var error: Error? {\n        switch self {\n        case .Success:\n            return nil\n        case .Failure(let error):\n            return error\n        }\n    }\n}\n\n// MARK: - CustomStringConvertible\n\nextension Result: CustomStringConvertible {\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        switch self {\n        case .Success:\n            return \"SUCCESS\"\n        case .Failure:\n            return \"FAILURE\"\n        }\n    }\n}\n\n// MARK: - CustomDebugStringConvertible\n\nextension Result: CustomDebugStringConvertible {\n    /// The debug textual representation used when written to an output stream, which includes whether the result was a\n    /// success or failure in addition to the value or error.\n    public var debugDescription: String {\n        switch self {\n        case .Success(let value):\n            return \"SUCCESS: \\(value)\"\n        case .Failure(let error):\n            return \"FAILURE: \\(error)\"\n        }\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Alamofire/Source/ServerTrustPolicy.swift",
    "content": "// 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\nimport Foundation\n\n/// Responsible for managing the mapping of `ServerTrustPolicy` objects to a given host.\npublic class ServerTrustPolicyManager {\n    /// The dictionary of policies mapped to a particular host.\n    public let policies: [String: ServerTrustPolicy]\n\n    /**\n        Initializes the `ServerTrustPolicyManager` instance with the given policies.\n\n        Since different servers and web services can have different leaf certificates, intermediate and even root \n        certficates, 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        - parameter policies: A dictionary of all policies mapped to a particular host.\n\n        - returns: The new `ServerTrustPolicyManager` instance.\n    */\n    public init(policies: [String: ServerTrustPolicy]) {\n        self.policies = policies\n    }\n\n    /**\n        Returns the `ServerTrustPolicy` for the given host if applicable.\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 server trust policy for the given host if found.\n    */\n    public func serverTrustPolicyForHost(host: String) -> ServerTrustPolicy? {\n        return policies[host]\n    }\n}\n\n// MARK: -\n\nextension NSURLSession {\n    private struct AssociatedKeys {\n        static var ManagerKey = \"NSURLSession.ServerTrustPolicyManager\"\n    }\n\n    var serverTrustPolicyManager: ServerTrustPolicyManager? {\n        get {\n            return objc_getAssociatedObject(self, &AssociatedKeys.ManagerKey) as? ServerTrustPolicyManager\n        }\n        set (manager) {\n            objc_setAssociatedObject(self, &AssociatedKeys.ManagerKey, manager, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n        }\n    }\n}\n\n// MARK: - ServerTrustPolicy\n\n/**\n    The `ServerTrustPolicy` evaluates the server trust generally provided by an `NSURLAuthenticationChallenge` when \n    connecting to a server over a secure HTTPS connection. The policy configuration then evaluates the server trust \n    with a given set of criteria to determine whether the server trust is valid and the connection should be made.\n\n    Using pinned certificates or public keys for evaluation helps prevent man-in-the-middle (MITM) attacks and other \n    vulnerabilities. Applications dealing with sensitive customer data or financial information are strongly encouraged \n    to route all communication over an HTTPS connection with pinning enabled.\n\n    - PerformDefaultEvaluation: Uses the default server trust evaluation while allowing you to control whether to \n                                validate the host provided by the challenge. Applications are encouraged to always \n                                validate the host in production environments to guarantee the validity of the server's \n                                certificate chain.\n\n    - PinCertificates:          Uses the pinned certificates to validate the server trust. The server trust is\n                                considered valid if one of the pinned certificates match one of the server certificates. \n                                By validating both the certificate chain and host, certificate pinning provides a very \n                                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 \n                                chain in production environments.\n\n    - PinPublicKeys:            Uses the pinned public keys to validate the server trust. The server trust is considered\n                                valid if one of the pinned public keys match one of the server certificate public keys. \n                                By validating both the certificate chain and host, public key pinning provides a very \n                                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 \n                                chain in production environments.\n\n    - DisableEvaluation:        Disables all evaluation which in turn will always consider any server trust as valid.\n\n    - CustomEvaluation:         Uses the associated closure to evaluate the validity of the server trust.\n*/\npublic enum ServerTrustPolicy {\n    case PerformDefaultEvaluation(validateHost: Bool)\n    case PinCertificates(certificates: [SecCertificate], validateCertificateChain: Bool, validateHost: Bool)\n    case PinPublicKeys(publicKeys: [SecKey], validateCertificateChain: Bool, validateHost: Bool)\n    case DisableEvaluation\n    case CustomEvaluation((serverTrust: SecTrust, host: String) -> Bool)\n\n    // MARK: - Bundle Location\n\n    /**\n        Returns all certificates within the given bundle with a `.cer` file extension.\n\n        - parameter bundle: The bundle to search for all `.cer` files.\n\n        - returns: All certificates within the given bundle.\n    */\n    public static func certificatesInBundle(bundle: NSBundle = NSBundle.mainBundle()) -> [SecCertificate] {\n        var certificates: [SecCertificate] = []\n\n        let paths = Set([\".cer\", \".CER\", \".crt\", \".CRT\", \".der\", \".DER\"].map { fileExtension in\n            bundle.pathsForResourcesOfType(fileExtension, inDirectory: nil)\n        }.flatten())\n\n        for path in paths {\n            if let\n                certificateData = NSData(contentsOfFile: path),\n                certificate = SecCertificateCreateWithData(nil, certificateData)\n            {\n                certificates.append(certificate)\n            }\n        }\n\n        return certificates\n    }\n\n    /**\n        Returns all public keys within the given bundle with a `.cer` file extension.\n\n        - parameter bundle: The bundle to search for all `*.cer` files.\n\n        - returns: All public keys within the given bundle.\n    */\n    public static func publicKeysInBundle(bundle: NSBundle = NSBundle.mainBundle()) -> [SecKey] {\n        var publicKeys: [SecKey] = []\n\n        for certificate in certificatesInBundle(bundle) {\n            if let publicKey = publicKeyForCertificate(certificate) {\n                publicKeys.append(publicKey)\n            }\n        }\n\n        return publicKeys\n    }\n\n    // MARK: - Evaluation\n\n    /**\n        Evaluates whether the server trust is valid for the given host.\n\n        - parameter serverTrust: The server trust to evaluate.\n        - parameter host:        The host of the challenge protection space.\n\n        - returns: Whether the server trust is valid.\n    */\n    public func evaluateServerTrust(serverTrust: SecTrust, isValidForHost host: String) -> Bool {\n        var serverTrustIsValid = false\n\n        switch self {\n        case let .PerformDefaultEvaluation(validateHost):\n            let policy = SecPolicyCreateSSL(true, validateHost ? host as CFString : nil)\n            SecTrustSetPolicies(serverTrust, [policy])\n\n            serverTrustIsValid = trustIsValid(serverTrust)\n        case let .PinCertificates(pinnedCertificates, validateCertificateChain, validateHost):\n            if validateCertificateChain {\n                let policy = SecPolicyCreateSSL(true, validateHost ? host as CFString : nil)\n                SecTrustSetPolicies(serverTrust, [policy])\n\n                SecTrustSetAnchorCertificates(serverTrust, pinnedCertificates)\n                SecTrustSetAnchorCertificatesOnly(serverTrust, true)\n\n                serverTrustIsValid = trustIsValid(serverTrust)\n            } else {\n                let serverCertificatesDataArray = certificateDataForTrust(serverTrust)\n                let pinnedCertificatesDataArray = certificateDataForCertificates(pinnedCertificates)\n\n                outerLoop: for serverCertificateData in serverCertificatesDataArray {\n                    for pinnedCertificateData in pinnedCertificatesDataArray {\n                        if serverCertificateData.isEqualToData(pinnedCertificateData) {\n                            serverTrustIsValid = true\n                            break outerLoop\n                        }\n                    }\n                }\n            }\n        case let .PinPublicKeys(pinnedPublicKeys, validateCertificateChain, validateHost):\n            var certificateChainEvaluationPassed = true\n\n            if validateCertificateChain {\n                let policy = SecPolicyCreateSSL(true, validateHost ? host as CFString : nil)\n                SecTrustSetPolicies(serverTrust, [policy])\n\n                certificateChainEvaluationPassed = trustIsValid(serverTrust)\n            }\n\n            if certificateChainEvaluationPassed {\n                outerLoop: for serverPublicKey in ServerTrustPolicy.publicKeysForTrust(serverTrust) as [AnyObject] {\n                    for pinnedPublicKey in pinnedPublicKeys as [AnyObject] {\n                        if serverPublicKey.isEqual(pinnedPublicKey) {\n                            serverTrustIsValid = true\n                            break outerLoop\n                        }\n                    }\n                }\n            }\n        case .DisableEvaluation:\n            serverTrustIsValid = true\n        case let .CustomEvaluation(closure):\n            serverTrustIsValid = closure(serverTrust: serverTrust, host: host)\n        }\n\n        return serverTrustIsValid\n    }\n\n    // MARK: - Private - Trust Validation\n\n    private func trustIsValid(trust: SecTrust) -> Bool {\n        var isValid = false\n\n        var result = SecTrustResultType(kSecTrustResultInvalid)\n        let status = SecTrustEvaluate(trust, &result)\n\n        if status == errSecSuccess {\n            let unspecified = SecTrustResultType(kSecTrustResultUnspecified)\n            let proceed = SecTrustResultType(kSecTrustResultProceed)\n\n            isValid = result == unspecified || result == proceed\n        }\n\n        return isValid\n    }\n\n    // MARK: - Private - Certificate Data\n\n    private func certificateDataForTrust(trust: SecTrust) -> [NSData] {\n        var certificates: [SecCertificate] = []\n\n        for index in 0..<SecTrustGetCertificateCount(trust) {\n            if let certificate = SecTrustGetCertificateAtIndex(trust, index) {\n                certificates.append(certificate)\n            }\n        }\n\n        return certificateDataForCertificates(certificates)\n    }\n\n    private func certificateDataForCertificates(certificates: [SecCertificate]) -> [NSData] {\n        return certificates.map { SecCertificateCopyData($0) as NSData }\n    }\n\n    // MARK: - Private - Public Key Extraction\n\n    private static func publicKeysForTrust(trust: SecTrust) -> [SecKey] {\n        var publicKeys: [SecKey] = []\n\n        for index in 0..<SecTrustGetCertificateCount(trust) {\n            if let\n                certificate = SecTrustGetCertificateAtIndex(trust, index),\n                publicKey = publicKeyForCertificate(certificate)\n            {\n                publicKeys.append(publicKey)\n            }\n        }\n\n        return publicKeys\n    }\n\n    private static func publicKeyForCertificate(certificate: SecCertificate) -> SecKey? {\n        var publicKey: SecKey?\n\n        let policy = SecPolicyCreateBasicX509()\n        var trust: SecTrust?\n        let trustCreationStatus = SecTrustCreateWithCertificates(certificate, policy, &trust)\n\n        if let trust = trust where trustCreationStatus == errSecSuccess {\n            publicKey = SecTrustCopyPublicKey(trust)\n        }\n\n        return publicKey\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Alamofire/Source/Stream.swift",
    "content": "// Stream.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\nimport Foundation\n\n#if !os(watchOS)\n\n@available(iOS 9.0, OSX 10.11, tvOS 9.0, *)\nextension Manager {\n    private enum Streamable {\n        case Stream(String, Int)\n        case NetService(NSNetService)\n    }\n\n    private func stream(streamable: Streamable) -> Request {\n        var streamTask: NSURLSessionStreamTask!\n\n        switch streamable {\n        case .Stream(let hostName, let port):\n            dispatch_sync(queue) {\n                streamTask = self.session.streamTaskWithHostName(hostName, port: port)\n            }\n        case .NetService(let netService):\n            dispatch_sync(queue) {\n                streamTask = self.session.streamTaskWithNetService(netService)\n            }\n        }\n\n        let request = Request(session: session, task: streamTask)\n\n        delegate[request.delegate.task] = request.delegate\n\n        if startRequestsImmediately {\n            request.resume()\n        }\n\n        return request\n    }\n\n    /**\n        Creates a request for bidirectional streaming with the given hostname and port.\n\n        - parameter hostName: The hostname of the server to connect to.\n        - parameter port:     The port of the server to connect to.\n\n        :returns: The created stream request.\n    */\n    public func stream(hostName hostName: String, port: Int) -> Request {\n        return stream(.Stream(hostName, port))\n    }\n\n    /**\n        Creates a request for bidirectional streaming with the given `NSNetService`.\n\n        - parameter netService: The net service used to identify the endpoint.\n\n        - returns: The created stream request.\n    */\n    public func stream(netService netService: NSNetService) -> Request {\n        return stream(.NetService(netService))\n    }\n}\n\n// MARK: -\n\n@available(iOS 9.0, OSX 10.11, tvOS 9.0, *)\nextension Manager.SessionDelegate: NSURLSessionStreamDelegate {\n\n    // MARK: Override Closures\n\n    /// Overrides default behavior for NSURLSessionStreamDelegate method `URLSession:readClosedForStreamTask:`.\n    public var streamTaskReadClosed: ((NSURLSession, NSURLSessionStreamTask) -> Void)? {\n        get {\n            return _streamTaskReadClosed as? (NSURLSession, NSURLSessionStreamTask) -> Void\n        }\n        set {\n            _streamTaskReadClosed = newValue\n        }\n    }\n\n    /// Overrides default behavior for NSURLSessionStreamDelegate method `URLSession:writeClosedForStreamTask:`.\n    public var streamTaskWriteClosed: ((NSURLSession, NSURLSessionStreamTask) -> Void)? {\n        get {\n            return _streamTaskWriteClosed as? (NSURLSession, NSURLSessionStreamTask) -> Void\n        }\n        set {\n            _streamTaskWriteClosed = newValue\n        }\n    }\n\n    /// Overrides default behavior for NSURLSessionStreamDelegate method `URLSession:betterRouteDiscoveredForStreamTask:`.\n    public var streamTaskBetterRouteDiscovered: ((NSURLSession, NSURLSessionStreamTask) -> Void)? {\n        get {\n            return _streamTaskBetterRouteDiscovered as? (NSURLSession, NSURLSessionStreamTask) -> Void\n        }\n        set {\n            _streamTaskBetterRouteDiscovered = newValue\n        }\n    }\n\n    /// Overrides default behavior for NSURLSessionStreamDelegate method `URLSession:streamTask:didBecomeInputStream:outputStream:`.\n    public var streamTaskDidBecomeInputStream: ((NSURLSession, NSURLSessionStreamTask, NSInputStream, NSOutputStream) -> Void)? {\n        get {\n            return _streamTaskDidBecomeInputStream as? (NSURLSession, NSURLSessionStreamTask, NSInputStream, NSOutputStream) -> Void\n        }\n        set {\n            _streamTaskDidBecomeInputStream = newValue\n        }\n    }\n\n    // MARK: Delegate Methods\n\n    /**\n        Tells the delegate that the read side of the connection has been closed.\n\n        - parameter session:    The session.\n        - parameter streamTask: The stream task.\n    */\n    public func URLSession(session: NSURLSession, readClosedForStreamTask streamTask: NSURLSessionStreamTask) {\n        streamTaskReadClosed?(session, streamTask)\n    }\n\n    /**\n        Tells the delegate that the write side of the connection has been closed.\n\n        - parameter session:    The session.\n        - parameter streamTask: The stream task.\n    */\n    public func URLSession(session: NSURLSession, writeClosedForStreamTask streamTask: NSURLSessionStreamTask) {\n        streamTaskWriteClosed?(session, streamTask)\n    }\n\n    /**\n        Tells the delegate that the system has determined that a better route to the host is available.\n\n        - parameter session:    The session.\n        - parameter streamTask: The stream task.\n    */\n    public func URLSession(session: NSURLSession, betterRouteDiscoveredForStreamTask streamTask: NSURLSessionStreamTask) {\n        streamTaskBetterRouteDiscovered?(session, streamTask)\n    }\n\n    /**\n        Tells the delegate that the stream task has been completed and provides the unopened stream objects.\n\n        - parameter session:      The session.\n        - parameter streamTask:   The stream task.\n        - parameter inputStream:  The new input stream.\n        - parameter outputStream: The new output stream.\n    */\n    public func URLSession(\n        session: NSURLSession,\n        streamTask: NSURLSessionStreamTask,\n        didBecomeInputStream inputStream: NSInputStream,\n        outputStream: NSOutputStream)\n    {\n        streamTaskDidBecomeInputStream?(session, streamTask, inputStream, outputStream)\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Sublime/Pods/Alamofire/Source/Timeline.swift",
    "content": "// Timeline.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\nimport Foundation\n\n/// Responsible for computing the timing metrics for the complete lifecycle of a `Request`.\npublic struct Timeline {\n    /// The time the request was initialized.\n    public let requestStartTime: CFAbsoluteTime\n\n    /// The time the first bytes were received from or sent to the server.\n    public let initialResponseTime: CFAbsoluteTime\n\n    /// The time when the request was completed.\n    public let requestCompletedTime: CFAbsoluteTime\n\n    /// The time when the response serialization was completed.\n    public let serializationCompletedTime: CFAbsoluteTime\n\n    /// The time interval in seconds from the time the request started to the initial response from the server.\n    public let latency: NSTimeInterval\n\n    /// The time interval in seconds from the time the request started to the time the request completed.\n    public let requestDuration: NSTimeInterval\n\n    /// The time interval in seconds from the time the request completed to the time response serialization completed.\n    public let serializationDuration: NSTimeInterval\n\n    /// The time interval in seconds from the time the request started to the time response serialization completed.\n    public let totalDuration: NSTimeInterval\n\n    /**\n        Creates a new `Timeline` instance with the specified request times.\n\n        - parameter requestStartTime:           The time the request was initialized. Defaults to `0.0`.\n        - parameter initialResponseTime:        The time the first bytes were received from or sent to the server. \n                                                Defaults to `0.0`.\n        - parameter requestCompletedTime:       The time when the request was completed. Defaults to `0.0`.\n        - parameter serializationCompletedTime: The time when the response serialization was completed. Defaults \n                                                to `0.0`.\n\n        - returns: The new `Timeline` instance.\n    */\n    public init(\n        requestStartTime: CFAbsoluteTime = 0.0,\n        initialResponseTime: CFAbsoluteTime = 0.0,\n        requestCompletedTime: CFAbsoluteTime = 0.0,\n        serializationCompletedTime: CFAbsoluteTime = 0.0)\n    {\n        self.requestStartTime = requestStartTime\n        self.initialResponseTime = initialResponseTime\n        self.requestCompletedTime = requestCompletedTime\n        self.serializationCompletedTime = serializationCompletedTime\n\n        self.latency = initialResponseTime - requestStartTime\n        self.requestDuration = requestCompletedTime - requestStartTime\n        self.serializationDuration = serializationCompletedTime - requestCompletedTime\n        self.totalDuration = serializationCompletedTime - requestStartTime\n    }\n}\n\n// MARK: - CustomStringConvertible\n\nextension Timeline: CustomStringConvertible {\n    /// The textual representation used when written to an output stream, which includes the latency, the request \n    /// duration and the total duration.\n    public var description: String {\n        let latency = String(format: \"%.3f\", self.latency)\n        let requestDuration = String(format: \"%.3f\", self.requestDuration)\n        let serializationDuration = String(format: \"%.3f\", self.serializationDuration)\n        let totalDuration = String(format: \"%.3f\", self.totalDuration)\n\n        let timings = [\n            \"\\\"Latency\\\": \\(latency) secs\",\n            \"\\\"Request Duration\\\": \\(requestDuration) secs\",\n            \"\\\"Serialization Duration\\\": \\(serializationDuration) secs\",\n            \"\\\"Total Duration\\\": \\(totalDuration) secs\"\n        ]\n\n        return \"Timeline: { \\(timings.joinWithSeparator(\", \")) }\"\n    }\n}\n\n// MARK: - CustomDebugStringConvertible\n\nextension Timeline: CustomDebugStringConvertible {\n    /// The textual representation used when written to an output stream, which includes the request start time, the \n    /// initial response time, the request completed time, the serialization completed time, the latency, the request\n    /// duration and the total duration.\n    public var debugDescription: String {\n        let timings = [\n            \"\\\"Request Start Time\\\": \\(requestStartTime)\",\n            \"\\\"Initial Response Time\\\": \\(initialResponseTime)\",\n            \"\\\"Request Completed Time\\\": \\(requestCompletedTime)\",\n            \"\\\"Serialization Completed Time\\\": \\(serializationCompletedTime)\",\n            \"\\\"Latency\\\": \\(latency) secs\",\n            \"\\\"Request Duration\\\": \\(requestDuration) secs\",\n            \"\\\"Serialization Duration\\\": \\(serializationDuration) secs\",\n            \"\\\"Total Duration\\\": \\(totalDuration) secs\"\n        ]\n\n        return \"Timeline: { \\(timings.joinWithSeparator(\", \")) }\"\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Alamofire/Source/Upload.swift",
    "content": "// Upload.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\nimport Foundation\n\nextension Manager {\n    private enum Uploadable {\n        case Data(NSURLRequest, NSData)\n        case File(NSURLRequest, NSURL)\n        case Stream(NSURLRequest, NSInputStream)\n    }\n\n    private func upload(uploadable: Uploadable) -> Request {\n        var uploadTask: NSURLSessionUploadTask!\n        var HTTPBodyStream: NSInputStream?\n\n        switch uploadable {\n        case .Data(let request, let data):\n            dispatch_sync(queue) {\n                uploadTask = self.session.uploadTaskWithRequest(request, fromData: data)\n            }\n        case .File(let request, let fileURL):\n            dispatch_sync(queue) {\n                uploadTask = self.session.uploadTaskWithRequest(request, fromFile: fileURL)\n            }\n        case .Stream(let request, let stream):\n            dispatch_sync(queue) {\n                uploadTask = self.session.uploadTaskWithStreamedRequest(request)\n            }\n\n            HTTPBodyStream = stream\n        }\n\n        let request = Request(session: session, task: uploadTask)\n\n        if HTTPBodyStream != nil {\n            request.delegate.taskNeedNewBodyStream = { _, _ in\n                return HTTPBodyStream\n            }\n        }\n\n        delegate[request.delegate.task] = request.delegate\n\n        if startRequestsImmediately {\n            request.resume()\n        }\n\n        return request\n    }\n\n    // MARK: File\n\n    /**\n        Creates a request for uploading a file to the specified URL request.\n\n        If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n\n        - parameter URLRequest: The URL request\n        - parameter file:       The file to upload\n\n        - returns: The created upload request.\n    */\n    public func upload(URLRequest: URLRequestConvertible, file: NSURL) -> Request {\n        return upload(.File(URLRequest.URLRequest, file))\n    }\n\n    /**\n        Creates a request for uploading a file to the specified URL request.\n\n        If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n\n        - parameter method:    The HTTP method.\n        - parameter URLString: The URL string.\n        - parameter headers:   The HTTP headers. `nil` by default.\n        - parameter file:      The file to upload\n\n        - returns: The created upload request.\n    */\n    public func upload(\n        method: Method,\n        _ URLString: URLStringConvertible,\n        headers: [String: String]? = nil,\n        file: NSURL)\n        -> Request\n    {\n        let mutableURLRequest = URLRequest(method, URLString, headers: headers)\n        return upload(mutableURLRequest, file: file)\n    }\n\n    // MARK: Data\n\n    /**\n        Creates a request for uploading data to the specified URL request.\n\n        If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n\n        - parameter URLRequest: The URL request.\n        - parameter data:       The data to upload.\n\n        - returns: The created upload request.\n    */\n    public func upload(URLRequest: URLRequestConvertible, data: NSData) -> Request {\n        return upload(.Data(URLRequest.URLRequest, data))\n    }\n\n    /**\n        Creates a request for uploading data to the specified URL request.\n\n        If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n\n        - parameter method:    The HTTP method.\n        - parameter URLString: The URL string.\n        - parameter headers:   The HTTP headers. `nil` by default.\n        - parameter data:      The data to upload\n\n        - returns: The created upload request.\n    */\n    public func upload(\n        method: Method,\n        _ URLString: URLStringConvertible,\n        headers: [String: String]? = nil,\n        data: NSData)\n        -> Request\n    {\n        let mutableURLRequest = URLRequest(method, URLString, headers: headers)\n\n        return upload(mutableURLRequest, data: data)\n    }\n\n    // MARK: Stream\n\n    /**\n        Creates a request for uploading a stream to the specified URL request.\n\n        If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n\n        - parameter URLRequest: The URL request.\n        - parameter stream:     The stream to upload.\n\n        - returns: The created upload request.\n    */\n    public func upload(URLRequest: URLRequestConvertible, stream: NSInputStream) -> Request {\n        return upload(.Stream(URLRequest.URLRequest, stream))\n    }\n\n    /**\n        Creates a request for uploading a stream to the specified URL request.\n\n        If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n\n        - parameter method:    The HTTP method.\n        - parameter URLString: The URL string.\n        - parameter headers:   The HTTP headers. `nil` by default.\n        - parameter stream:    The stream to upload.\n\n        - returns: The created upload request.\n    */\n    public func upload(\n        method: Method,\n        _ URLString: URLStringConvertible,\n        headers: [String: String]? = nil,\n        stream: NSInputStream)\n        -> Request\n    {\n        let mutableURLRequest = URLRequest(method, URLString, headers: headers)\n\n        return upload(mutableURLRequest, stream: stream)\n    }\n\n    // MARK: MultipartFormData\n\n    /// Default memory threshold used when encoding `MultipartFormData`.\n    public static let MultipartFormDataEncodingMemoryThreshold: UInt64 = 10 * 1024 * 1024\n\n    /**\n        Defines whether the `MultipartFormData` encoding was successful and contains result of the encoding as \n        associated values.\n\n        - Success: Represents a successful `MultipartFormData` encoding and contains the new `Request` along with \n                   streaming information.\n        - Failure: Used to represent a failure in the `MultipartFormData` encoding and also contains the encoding \n                   error.\n    */\n    public enum MultipartFormDataEncodingResult {\n        case Success(request: Request, streamingFromDisk: Bool, streamFileURL: NSURL?)\n        case Failure(ErrorType)\n    }\n\n    /**\n        Encodes the `MultipartFormData` and creates a request to upload the result to the specified URL request.\n\n        It is important to understand the memory implications of uploading `MultipartFormData`. If the cummulative \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        If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n\n        - parameter method:                  The HTTP method.\n        - parameter URLString:               The URL string.\n        - parameter headers:                 The HTTP headers. `nil` by default.\n        - parameter multipartFormData:       The closure used to append body parts to the `MultipartFormData`.\n        - parameter encodingMemoryThreshold: The encoding memory threshold in bytes.\n                                             `MultipartFormDataEncodingMemoryThreshold` by default.\n        - parameter encodingCompletion:      The closure called when the `MultipartFormData` encoding is complete.\n    */\n    public func upload(\n        method: Method,\n        _ URLString: URLStringConvertible,\n        headers: [String: String]? = nil,\n        multipartFormData: MultipartFormData -> Void,\n        encodingMemoryThreshold: UInt64 = Manager.MultipartFormDataEncodingMemoryThreshold,\n        encodingCompletion: (MultipartFormDataEncodingResult -> Void)?)\n    {\n        let mutableURLRequest = URLRequest(method, URLString, headers: headers)\n\n        return upload(\n            mutableURLRequest,\n            multipartFormData: multipartFormData,\n            encodingMemoryThreshold: encodingMemoryThreshold,\n            encodingCompletion: encodingCompletion\n        )\n    }\n\n    /**\n        Encodes the `MultipartFormData` and creates a request to upload the result to the specified URL request.\n\n        It is important to understand the memory implications of uploading `MultipartFormData`. If the cummulative\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        If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n\n        - parameter URLRequest:              The URL request.\n        - parameter multipartFormData:       The closure used to append body parts to the `MultipartFormData`.\n        - parameter encodingMemoryThreshold: The encoding memory threshold in bytes.\n                                             `MultipartFormDataEncodingMemoryThreshold` by default.\n        - parameter encodingCompletion:      The closure called when the `MultipartFormData` encoding is complete.\n    */\n    public func upload(\n        URLRequest: URLRequestConvertible,\n        multipartFormData: MultipartFormData -> Void,\n        encodingMemoryThreshold: UInt64 = Manager.MultipartFormDataEncodingMemoryThreshold,\n        encodingCompletion: (MultipartFormDataEncodingResult -> Void)?)\n    {\n        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {\n            let formData = MultipartFormData()\n            multipartFormData(formData)\n\n            let URLRequestWithContentType = URLRequest.URLRequest\n            URLRequestWithContentType.setValue(formData.contentType, forHTTPHeaderField: \"Content-Type\")\n\n            let isBackgroundSession = self.session.configuration.identifier != nil\n\n            if formData.contentLength < encodingMemoryThreshold && !isBackgroundSession {\n                do {\n                    let data = try formData.encode()\n                    let encodingResult = MultipartFormDataEncodingResult.Success(\n                        request: self.upload(URLRequestWithContentType, data: data),\n                        streamingFromDisk: false,\n                        streamFileURL: nil\n                    )\n\n                    dispatch_async(dispatch_get_main_queue()) {\n                        encodingCompletion?(encodingResult)\n                    }\n                } catch {\n                    dispatch_async(dispatch_get_main_queue()) {\n                        encodingCompletion?(.Failure(error as NSError))\n                    }\n                }\n            } else {\n                let fileManager = NSFileManager.defaultManager()\n                let tempDirectoryURL = NSURL(fileURLWithPath: NSTemporaryDirectory())\n                let directoryURL = tempDirectoryURL.URLByAppendingPathComponent(\"com.alamofire.manager/multipart.form.data\")\n                let fileName = NSUUID().UUIDString\n                let fileURL = directoryURL.URLByAppendingPathComponent(fileName)\n\n                do {\n                    try fileManager.createDirectoryAtURL(directoryURL, withIntermediateDirectories: true, attributes: nil)\n                    try formData.writeEncodedDataToDisk(fileURL)\n\n                    dispatch_async(dispatch_get_main_queue()) {\n                        let encodingResult = MultipartFormDataEncodingResult.Success(\n                            request: self.upload(URLRequestWithContentType, file: fileURL),\n                            streamingFromDisk: true,\n                            streamFileURL: fileURL\n                        )\n                        encodingCompletion?(encodingResult)\n                    }\n                } catch {\n                    dispatch_async(dispatch_get_main_queue()) {\n                        encodingCompletion?(.Failure(error as NSError))\n                    }\n                }\n            }\n        }\n    }\n}\n\n// MARK: -\n\nextension Request {\n\n    // MARK: - UploadTaskDelegate\n\n    class UploadTaskDelegate: DataTaskDelegate {\n        var uploadTask: NSURLSessionUploadTask? { return task as? NSURLSessionUploadTask }\n        var uploadProgress: ((Int64, Int64, Int64) -> Void)!\n\n        // MARK: - NSURLSessionTaskDelegate\n\n        // MARK: Override Closures\n\n        var taskDidSendBodyData: ((NSURLSession, NSURLSessionTask, Int64, Int64, Int64) -> Void)?\n\n        // MARK: Delegate Methods\n\n        func URLSession(\n            session: NSURLSession,\n            task: NSURLSessionTask,\n            didSendBodyData bytesSent: Int64,\n            totalBytesSent: Int64,\n            totalBytesExpectedToSend: Int64)\n        {\n            if initialResponseTime == nil { initialResponseTime = CFAbsoluteTimeGetCurrent() }\n\n            if let taskDidSendBodyData = taskDidSendBodyData {\n                taskDidSendBodyData(session, task, bytesSent, totalBytesSent, totalBytesExpectedToSend)\n            } else {\n                progress.totalUnitCount = totalBytesExpectedToSend\n                progress.completedUnitCount = totalBytesSent\n\n                uploadProgress?(bytesSent, totalBytesSent, totalBytesExpectedToSend)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Alamofire/Source/Validation.swift",
    "content": "// Validation.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\nimport Foundation\n\nextension Request {\n\n    /**\n        Used to represent whether validation was successful or encountered an error resulting in a failure.\n\n        - Success: The validation was successful.\n        - Failure: The validation failed encountering the provided error.\n    */\n    public enum ValidationResult {\n        case Success\n        case Failure(NSError)\n    }\n\n    /**\n        A closure used to validate a request that takes a URL request and URL response, and returns whether the \n        request was valid.\n    */\n    public typealias Validation = (NSURLRequest?, NSHTTPURLResponse) -> ValidationResult\n\n    /**\n        Validates the request, using the specified closure.\n\n        If validation fails, subsequent calls to response handlers will have an associated error.\n\n        - parameter validation: A closure to validate the request.\n\n        - returns: The request.\n    */\n    public func validate(validation: Validation) -> Self {\n        delegate.queue.addOperationWithBlock {\n            if let\n                response = self.response where self.delegate.error == nil,\n                case let .Failure(error) = validation(self.request, response)\n            {\n                self.delegate.error = error\n            }\n        }\n\n        return self\n    }\n\n    // MARK: - Status Code\n\n    /**\n        Validates that the response has a status code in the specified range.\n\n        If validation fails, subsequent calls to response handlers will have an associated error.\n\n        - parameter range: The range of acceptable status codes.\n\n        - returns: The request.\n    */\n    public func validate<S: SequenceType where S.Generator.Element == Int>(statusCode acceptableStatusCode: S) -> Self {\n        return validate { _, response in\n            if acceptableStatusCode.contains(response.statusCode) {\n                return .Success\n            } else {\n                let failureReason = \"Response status code was unacceptable: \\(response.statusCode)\"\n                return .Failure(Error.errorWithCode(.StatusCodeValidationFailed, failureReason: failureReason))\n            }\n        }\n    }\n\n    // MARK: - Content-Type\n\n    private struct MIMEType {\n        let type: String\n        let subtype: String\n\n        init?(_ string: String) {\n            let components: [String] = {\n                let stripped = string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())\n                let split = stripped.substringToIndex(stripped.rangeOfString(\";\")?.startIndex ?? stripped.endIndex)\n                return split.componentsSeparatedByString(\"/\")\n            }()\n\n            if let\n                type = components.first,\n                subtype = components.last\n            {\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    /**\n        Validates that the response has a content type in the specified array.\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    */\n    public func validate<S : SequenceType where S.Generator.Element == String>(contentType acceptableContentTypes: S) -> Self {\n        return validate { _, response in\n            guard let validData = self.delegate.data where validData.length > 0 else { return .Success }\n\n            if let\n                responseContentType = response.MIMEType,\n                responseMIMEType = MIMEType(responseContentType)\n            {\n                for contentType in acceptableContentTypes {\n                    if let acceptableMIMEType = MIMEType(contentType) where acceptableMIMEType.matches(responseMIMEType) {\n                        return .Success\n                    }\n                }\n            } else {\n                for contentType in acceptableContentTypes {\n                    if let MIMEType = MIMEType(contentType) where MIMEType.type == \"*\" && MIMEType.subtype == \"*\" {\n                        return .Success\n                    }\n                }\n            }\n\n            let failureReason: String\n\n            if let responseContentType = response.MIMEType {\n                failureReason = (\n                    \"Response content type \\\"\\(responseContentType)\\\" does not match any acceptable \" +\n                    \"content types: \\(acceptableContentTypes)\"\n                )\n            } else {\n                failureReason = \"Response content type was missing and acceptable content type does not match \\\"*/*\\\"\"\n            }\n\n            return .Failure(Error.errorWithCode(.ContentTypeValidationFailed, failureReason: failureReason))\n        }\n    }\n\n    // MARK: - Automatic\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    */\n    public func validate() -> Self {\n        let acceptableStatusCodes: Range<Int> = 200..<300\n        let acceptableContentTypes: [String] = {\n            if let accept = request?.valueForHTTPHeaderField(\"Accept\") {\n                return accept.componentsSeparatedByString(\",\")\n            }\n\n            return [\"*/*\"]\n        }()\n\n        return validate(statusCode: acceptableStatusCodes).validate(contentType: acceptableContentTypes)\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/AlamofireRSSParser/LICENSE",
    "content": "Copyright (c) 2016 Don Angelillo <dangelillo@gmail.com>\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": "Sublime/Pods/AlamofireRSSParser/Pod/Classes/AlamofireRSSParser.h",
    "content": "//\n//  AlamofireRSSParser.h\n//  AlamofireRSSParser\n//\n//  Created by Donald Angelillo on 3/1/16.\n//  Copyright © 2016 Donald Angelillo. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n//! Project version number for AlamofireRSSParser.\nFOUNDATION_EXPORT double AlamofireRSSParserVersionNumber;\n\n//! Project version string for AlamofireRSSParser.\nFOUNDATION_EXPORT const unsigned char AlamofireRSSParserVersionString[];\n\n// In this header, you should import all the public headers of your framework using statements like #import <AlamofireRSSParser/PublicHeader.h>\n\n\n"
  },
  {
    "path": "Sublime/Pods/AlamofireRSSParser/Pod/Classes/AlamofireRSSParser.swift",
    "content": "//\n//  AlamofireRSSParser.swift\n//  Pods\n//\n//  Created by Donald Angelillo on 3/2/16.\n//\n//\n\nimport Foundation\nimport Alamofire\n\nextension Request {\n    /**\n        Creates a response serializer that returns an `RSSFeed` object initialized from the response data.\n     \n        - Returns: An RSS response serializer.\n     */\n    public static func RSSResponseSerializer() -> ResponseSerializer<RSSFeed, NSError> {\n        return ResponseSerializer { request, response, data, error in\n            guard error == nil else {\n                return .Failure(error!)\n            }\n            \n            guard let validData = data else {\n                let failureReason = \"Data could not be serialized. Input data was nil.\"\n                let error = Error.errorWithCode(.DataSerializationFailed, failureReason: failureReason)\n                return .Failure(error)\n            }\n            \n            let parser = AlamofireRSSParser(data: validData)\n            \n            let parsedResults: (feed: RSSFeed?, error: NSError?) = parser.parse()\n            \n            if let feed = parsedResults.feed {\n                return .Success(feed)\n            } else {\n                return .Failure(parsedResults.error!)\n            }\n        }\n    }\n    \n    \n    /**\n        Adds a handler to be called once the request has finished.\n        \n        - Parameter completionHandler: A closure to be executed once the request has finished.\n    \n        - Returns: The request.\n    */\n    public func responseRSS(completionHandler: Response<RSSFeed, NSError> -> Void) -> Self {\n        return response(responseSerializer: Request.RSSResponseSerializer(), completionHandler: completionHandler)\n    }\n    \n    //public func responseRSS(parser parser: AlamofireRSSParser?, completionHandler: Response<RSSFeed, NSError> -> Void) -> Self {\n    //  return response(responseSerializer: Request.RSSResponseSerializer(parser), completionHandler: completionHandler)\n    //}\n}\n\n\n/**\n    This class does the bulk of the work.  Implements the `NSXMLParserDelegate` protocol.\n    Unfortunately due to this it's also required to implement the `NSObject` protocol.\n    \n    And unfortunately due to that there doesn't seem to be any way to make this class have a valid public initializer,\n    despite it being marked public.  I would love to have it be publicly accessible because I would like to able to pass\n    a custom-created instance of this class with configuration properties set into `responseRSS` (see the commented out overload above)\n*/\npublic class AlamofireRSSParser: NSObject, NSXMLParserDelegate {\n    var parser: NSXMLParser? = nil\n    var feed: RSSFeed? = nil\n    var parsingItems: Bool = false\n    \n    var currentItem: RSSItem? = nil\n    var currentString: String!\n    var currentAttributes: [String: String]? = nil\n    var parseError: NSError? = nil\n    \n    public var data: NSData? = nil {\n        didSet {\n            if let data = data {\n                self.parser = NSXMLParser(data: data)\n                self.parser?.delegate = self\n            }\n        }\n    }\n    \n    override init() {\n        self.parser = NSXMLParser();\n        \n        super.init()\n    }\n    \n    init(data: NSData) {\n        self.parser = NSXMLParser(data: data)\n        super.init()\n        \n        self.parser?.delegate = self\n    }\n    \n    \n    /**\n        Kicks off the RSS parsing.\n     \n        - Returns: A tuple containing an `RSSFeed` object if parsing was successful (`nil` otherwise) and\n            an `NSError` object if an error occurred (`nil` otherwise).\n    */\n    func parse() -> (feed: RSSFeed?, error: NSError?) {\n        self.feed = RSSFeed()\n        self.currentItem = nil\n        self.currentAttributes = nil\n        self.currentString = String()\n        \n        self.parser?.parse()\n        return (feed: self.feed, error: self.parseError)\n    }\n    \n    //MARK: - NSXMLParserDelegate\n    public func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {\n        self.currentString = String()\n        \n        self.currentAttributes = attributeDict\n        \n        if ((elementName == \"item\") || (elementName == \"entry\")) {\n            self.currentItem = RSSItem()\n        }\n    }\n    \n    public func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {\n        //if we're at the item level\n        if let currentItem = self.currentItem {\n            if ((elementName == \"item\") || (elementName == \"entry\")) {\n                self.feed?.items.append(currentItem)\n                return\n            }\n            \n            if (elementName == \"title\") {\n                currentItem.title = self.currentString\n            }\n            \n            if (elementName == \"description\") {\n                currentItem.itemDescription = self.currentString\n            }\n            \n            if (elementName == \"link\") {\n                currentItem.link = self.currentString\n            }\n            \n            if (elementName == \"guid\") {\n                currentItem.guid = self.currentString\n            }\n            \n            if (elementName == \"author\") {\n                currentItem.author = self.currentString\n            }\n            \n            if (elementName == \"comments\") {\n                currentItem.comments = self.currentString\n            }\n            \n            if (elementName == \"source\") {\n                currentItem.source = self.currentString\n            }\n            \n            if (elementName == \"pubDate\") {\n                if let date = RSSDateFormatter.rfc822DateFormatter().dateFromString(self.currentString) {\n                    currentItem.pubDate = date\n                } else if let date = RSSDateFormatter.rfc822DateFormatter2().dateFromString(self.currentString) {\n                    currentItem.pubDate = date\n                }\n            }\n            \n            if (elementName == \"published\") {\n                if let date = RSSDateFormatter.publishedDateFormatter().dateFromString(self.currentString) {\n                    currentItem.pubDate = date\n                } else if let date = RSSDateFormatter.publishedDateFormatter2().dateFromString(self.currentString) {\n                    currentItem.pubDate = date\n                }\n            }\n            \n            if (elementName == \"media:thumbnail\") {\n                if let attributes = self.currentAttributes {\n                    if let url = attributes[\"url\"] {\n                        currentItem.mediaThumbnail = url\n                    }\n                }\n            }\n            \n            if (elementName == \"media:content\") {\n                if let attributes = self.currentAttributes {\n                    if let url = attributes[\"url\"] {\n                        currentItem.mediaContent = url\n                    }\n                }\n            }\n            \n            \n        //if we're at the top level\n        } else {\n            if (elementName == \"title\") {\n                self.feed?.title = self.currentString\n            }\n            \n            if (elementName == \"description\") {\n                self.feed?.feedDescription = self.currentString\n            }\n            \n            if (elementName == \"link\") {\n                self.feed?.link = self.currentString\n            }\n            \n            if (elementName == \"language\") {\n                self.feed?.language = self.currentString\n            }\n            \n            if (elementName == \"copyright\") {\n                self.feed?.copyright = self.currentString\n            }\n            \n            if (elementName == \"managingEditor\") {\n                self.feed?.managingEditor = self.currentString\n            }\n            \n            if (elementName == \"webMaster\") {\n                self.feed?.webMaster = self.currentString\n            }\n            \n            if (elementName == \"generator\") {\n                self.feed?.generator = self.currentString\n            }\n            \n            if (elementName == \"docs\") {\n                self.feed?.docs = self.currentString\n            }\n            \n            if (elementName == \"ttl\") {\n                self.feed?.ttl = Int(self.currentString)\n            }\n            \n            if (elementName == \"pubDate\") {\n                if let date = RSSDateFormatter.rfc822DateFormatter().dateFromString(self.currentString) {\n                    self.feed?.pubDate = date\n                } else if let date = RSSDateFormatter.rfc822DateFormatter2().dateFromString(self.currentString) {\n                    self.feed?.pubDate = date\n                }\n            }\n            \n            if (elementName == \"published\") {\n                if let date = RSSDateFormatter.publishedDateFormatter().dateFromString(self.currentString) {\n                    self.feed?.pubDate = date\n                } else if let date = RSSDateFormatter.publishedDateFormatter2().dateFromString(self.currentString) {\n                    self.feed?.pubDate = date\n                }\n            }\n            \n            if (elementName == \"lastBuildDate\") {\n                if let date = RSSDateFormatter.rfc822DateFormatter().dateFromString(self.currentString) {\n                    self.feed?.lastBuildDate = date\n                } else if let date = RSSDateFormatter.rfc822DateFormatter2().dateFromString(self.currentString) {\n                    self.feed?.lastBuildDate = date\n                }\n            }\n        }\n    }\n    \n    public func parser(parser: NSXMLParser, foundCharacters string: String) {\n        self.currentString.appendContentsOf(string)\n    }\n    \n    public func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) {\n        self.parseError = parseError\n        self.parser?.abortParsing()\n    }\n}\n\n/**\n    Struct containing various `NSDateFormatter` s\n*/\nstruct RSSDateFormatter {\n    static func rfc822DateFormatter() -> NSDateFormatter {\n        let dateFormatter: NSDateFormatter = NSDateFormatter()\n        dateFormatter.locale = NSLocale(localeIdentifier: \"en_US\")\n        dateFormatter.dateFormat = \"EEE, dd MMM yyyy HH:mm:ss Z\"\n        return dateFormatter\n    }\n    \n    static func rfc822DateFormatter2() -> NSDateFormatter {\n        let dateFormatter: NSDateFormatter = NSDateFormatter()\n        dateFormatter.locale = NSLocale(localeIdentifier: \"en_US\")\n        dateFormatter.dateFormat = \"EEE, dd MMM yyyy HH:mm:ss z\"\n        return dateFormatter\n    }\n    \n    static func publishedDateFormatter() -> NSDateFormatter {\n        let dateFormatter: NSDateFormatter = NSDateFormatter()\n        dateFormatter.locale = NSLocale(localeIdentifier: \"en_US\")\n        dateFormatter.dateFormat = \"yyyy-MM-dd'T'HH:mm:ssZ\"\n        return dateFormatter\n    }\n    \n    static func publishedDateFormatter2() -> NSDateFormatter {\n        let dateFormatter: NSDateFormatter = NSDateFormatter()\n        dateFormatter.locale = NSLocale(localeIdentifier: \"en_US\")\n        dateFormatter.dateFormat = \"yyyy-MM-dd'T'HH:mm:ssz\"\n        return dateFormatter\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/AlamofireRSSParser/Pod/Classes/RSSFeed.swift",
    "content": "//\n//  RSSFeed.swift\n//  AlamofireRSSParser\n//\n//  Created by Donald Angelillo on 3/1/16.\n//  Copyright © 2016 Donald Angelillo. All rights reserved.\n//\n\nimport Foundation\n\n/**\n    RSS gets deserialized into an instance of `RSSFeed`.  Top-level RSS elements are housed here.\n    \n    Item-level elements are deserialized into `RSSItem` objects and stored in the `items` property.\n*/\npublic class RSSFeed: CustomStringConvertible {\n    public var title: String? = nil\n    public var link: String? = nil\n    public var feedDescription: String? = nil\n    public var pubDate: NSDate? = nil\n    public var lastBuildDate: NSDate? = nil\n    public var language: String? = nil\n    public var copyright: String? = nil\n    public var managingEditor: String? = nil\n    public var webMaster: String? = nil\n    public var generator: String? = nil\n    public var docs: String? = nil\n    public var ttl: NSNumber? = nil\n    \n    public var items: [RSSItem] = Array()\n    \n    public var description: String {\n        return \"title: \\(self.title)\\nfeedDescription: \\(self.feedDescription)\\nlink: \\(self.link)\\npubDate: \\(self.pubDate)\\nlastBuildDate: \\(self.lastBuildDate)\\nlanguage: \\(self.language)\\ncopyright: \\(self.copyright)\\nmanagingEditor: \\(self.managingEditor)\\nwebMaster: \\(self.webMaster)\\ngenerator: \\(self.generator)\\ndocs: \\(self.docs)\\nttl: \\(self.ttl)\\nitems: \\n\\(self.items)\"\n    }\n    \n}"
  },
  {
    "path": "Sublime/Pods/AlamofireRSSParser/Pod/Classes/RSSItem.swift",
    "content": "//\n//  RSSItem.swift\n//  AlamofireRSSParser\n//\n//  Created by Donald Angelillo on 3/1/16.\n//  Copyright © 2016 Donald Angelillo. All rights reserved.\n//\n\nimport Foundation\n\n/**\n    Item-level elements are deserialized into `RSSItem` objects and stored in the `items` array of an `RSSFeed` instance\n*/\npublic class RSSItem: CustomStringConvertible {\n    public var title: String? = nil\n    public var link: String? = nil\n    \n    /**\n        Upon setting this property the `itemDescription` will be scanned for HTML and all image urls will be extracted and stored in `imagesFromDescription`\n     */\n    public var itemDescription: String? = nil {\n        didSet {\n            if let itemDescription = self.itemDescription {\n                self.imagesFromDescription = self.imagesFromHTMLString(itemDescription)\n            }\n        }\n    }\n    \n    public var guid: String? = nil\n    public var author: String? = nil\n    public var comments: String? = nil\n    public var source: String? = nil\n    public var pubDate: NSDate? = nil\n    public var mediaThumbnail: String? = nil;\n    public var mediaContent: String? = nil;\n    public var imagesFromDescription: [String]? = nil;\n\n    public var description: String {\n        return \"\\ttitle: \\(self.title)\\n\\tlink: \\(self.link)\\n\\titemDescription: \\(self.itemDescription)\\n\\tguid: \\(self.guid)\\n\\tauthor: \\(self.author)\\n\\tcomments: \\(self.comments)\\n\\tsource: \\(self.source)\\n\\tpubDate: \\(self.pubDate)\\nmediaThumbnail: \\(self.mediaThumbnail)\\nmediaContent: \\(self.mediaContent)\\nimagesFromDescription: \\(self.imagesFromDescription)\\n\\n\"\n    }\n    \n    \n    /**\n        Retrieves all the images (\\<img\\> tags) from a given String contaning HTML using a regex.\n        \n        - Parameter htmlString: A String containing HTML\n     \n        - Returns: an array of image url Strings ([String])\n     */\n    private func imagesFromHTMLString(htmlString: String) -> [String] {\n        let htmlNSString = htmlString as NSString;\n        var images: [String] = Array();\n        \n        do {\n            let regex = try NSRegularExpression(pattern: \"(https?)\\\\S*(png|jpg|jpeg|gif)\", options: [NSRegularExpressionOptions.CaseInsensitive])\n        \n            regex.enumerateMatchesInString(htmlString, options: [NSMatchingOptions.ReportProgress], range: NSMakeRange(0, htmlString.characters.count)) { (result, flags, stop) -> Void in\n                if let range = result?.range {\n                    images.append(htmlNSString.substringWithRange(range))  //because Swift ranges are still completely ridiculous\n                }\n            }\n        }\n        \n        catch {\n            \n        }\n        \n        return images;\n    }\n}"
  },
  {
    "path": "Sublime/Pods/AlamofireRSSParser/README.md",
    "content": "# AlamofireRSSParser\n\n[![CI Status](http://img.shields.io/travis/AdeptusAstartes/AlamofireRSSParser.svg?style=flat)](https://travis-ci.org/AdeptusAstartes/AlamofireRSSParser)\n[![Version](https://img.shields.io/cocoapods/v/AlamofireRSSParser.svg?style=flat)](http://cocoapods.org/pods/AlamofireRSSParser)\n[![License](https://img.shields.io/cocoapods/l/AlamofireRSSParser.svg?style=flat)](http://cocoapods.org/pods/AlamofireRSSParser)\n[![Platform](https://img.shields.io/cocoapods/p/AlamofireRSSParser.svg?style=flat)](http://cocoapods.org/pods/AlamofireRSSParser)\n\n## Requirements\n- Xcode 7.2+\n- Alamofire 3.0.0 or higher\n\n**Note:** Version 1.0.1 currently locks the Alamofire dependency at ~> 3.2.1 because for some misguided reason the Alamofire Foundation decided to force us to use Xcode 7.3 in order to use Alamofire 3.3.0.\n\n## Installation\n\n### Cocoapods\nAlamofireRSSParser is available through [CocoaPods](http://cocoapods.org). To install\nit, simply add the following line to your Podfile:\n\n```ruby\npod \"AlamofireRSSParser\"\n```\n\nThen \n\n```swift\nimport AlamofireRSSParser\n``` \n wherever you're using it.\n \n\n### Manually\nAlternately you can add the contents of AlamofireRSSParser/Pod/Classes/ to your project and import the classes as appropriate.\n\n## Usage\n\n_Note: To run the example project, clone the repo, and run `pod install` from the Example directory first._\n\nYou use AlamofireRSSParser just like any other response handler in Alamofire:\n\n```swift\nlet url = \"http://rss.cnn.com/rss/cnn_topstories.rss\"\n    \nAlamofire.request(.GET, url).responseRSS() { (response) -> Void in\n    if let feed: RSSFeed = response.result.value {\n        //do something with your new RSSFeed object!\n        for item in feed.items {\n            print(item)\n        }\n    }\n}\n```\n\nAlamofireRSSParser returns an RSSFeed object that contains an array of RSSItem objects.\n\n##What It Does and Doesn't Do\n\nI think we can all admit that RSS implementations are a bit all over the place.  This project is meant to parse all of the common, high level bits of the [RSS 2.0 spec](http://cyber.law.harvard.edu/rss/rss.html) that people actually use/care about.  It is not meant to comprehensively parse **all** RSS.\n\nRSS 2.0 spec elements that it currently parses:\n\n- title\n- link\n- itemDescription\n- guid\n- author\n- comments\n- source\n- pubDate\n\nIn addition, since this is a Swift port of what was originally the backbone of [Heavy Headlines](https://itunes.apple.com/us/app/heavy-headlines-metal-news/id623879550?mt=8) it also parses portions of the [Media RSS Specification 1.5.1](http://www.rssboard.org/media-rss).  \n\nCurrent elements:\n\n- media:content\n- media: thumbnail\n\nIt also yanks all of the images that may be linked in the `itemDescription` (if it's HTML) and creates a nice array named `imagesFromDescription` that you can use for more image content.\n\n\nIf you need more elements parsed please file an issue or even better, **please contribute**!  That's why this is on GitHub.\n\n\n## Author\n\nDon Angelillo, dangelillo@gmail.com\n\nInspired by Thibaut LE LEVIER's awesome orginal [Block RSSParser](https://github.com/tibo/BlockRSSParser) AFNetworking Plugin. \n\n## License\n\nAlamofireRSSParser is available under the MIT license. See the LICENSE file for more info.\n"
  },
  {
    "path": "Sublime/Pods/CYRTextView/CYRTextView/CYRLayoutManager.h",
    "content": "//\n//  CYRLayoutManager.h\n//\n//  Version 0.4.0\n//\n//  Created by Illya Busigin on 01/05/2014.\n//  Copyright (c) 2014 Cyrillian, Inc.\n//\n//  Distributed under MIT license.\n//  Get the latest version from here:\n//\n//  https://github.com/illyabusigin/CYRTextView\n//  Original implementation taken from: https://github.com/alldritt/TextKit_LineNumbers\n//\n// The MIT License (MIT)\n//\n// Copyright (c) 2014 Cyrillian, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of\n// this software and associated documentation files (the \"Software\"), to deal in\n// the Software without restriction, including without limitation the rights to\n// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n// the Software, and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// 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, FITNESS\n// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n#import <UIKit/UIKit.h>\n\n@interface CYRLayoutManager : NSLayoutManager\n\n@property (nonatomic, strong) UIFont *lineNumberFont;\n@property (nonatomic, strong) UIColor *lineNumberColor;\n@property (nonatomic, strong) UIColor *selectedLineNumberColor;\n\n@property (nonatomic, readonly) CGFloat gutterWidth;\n@property (nonatomic, assign) NSRange selectedRange;\n\n- (CGRect)paragraphRectForRange:(NSRange)range;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/CYRTextView/CYRTextView/CYRLayoutManager.m",
    "content": "//\n//  CYRLayoutManager.h\n//\n//  Version 0.4.0\n//\n//  Created by Illya Busigin on 01/05/2014.\n//  Copyright (c) 2014 Cyrillian, Inc.\n//\n//  Distributed under MIT license.\n//  Get the latest version from here:\n//\n//  https://github.com/illyabusigin/CYRTextView\n//  Original implementation taken from: https://github.com/alldritt/TextKit_LineNumbers\n//\n// The MIT License (MIT)\n//\n// Copyright (c) 2014 Cyrillian, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of\n// this software and associated documentation files (the \"Software\"), to deal in\n// the Software without restriction, including without limitation the rights to\n// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n// the Software, and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// 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, FITNESS\n// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n#import \"CYRLayoutManager.h\"\n\nstatic CGFloat kMinimumGutterWidth = 30.f;\n\n@interface CYRLayoutManager ()\n\n@property (nonatomic, assign) CGFloat gutterWidth;\n@property (nonatomic, assign) UIEdgeInsets lineAreaInset;\n\n@property (nonatomic) NSUInteger lastParaLocation;\n@property (nonatomic) NSUInteger lastParaNumber;\n\n@end\n\n@implementation CYRLayoutManager\n\n#pragma mark - Initialization & Setup\n\n- (instancetype)init\n{\n    self = [super init];\n    \n    if (self)\n    {\n        [self _commonSetup];\n    }\n    \n    return self;\n}\n\n- (instancetype)initWithCoder:(NSCoder *)aDecoder\n{\n    self = [super initWithCoder:aDecoder];\n    \n    if (self)\n    {\n        [self _commonSetup];\n    }\n    \n    return self;\n}\n\n- (void)_commonSetup\n{\n    self.gutterWidth = kMinimumGutterWidth;\n    self.selectedRange = NSMakeRange(0, 0);\n    \n    self.lineAreaInset = UIEdgeInsetsMake(0, 10, 0, 4);\n    self.lineNumberColor = [UIColor grayColor];\n    self.lineNumberFont = [UIFont systemFontOfSize:10.0f];\n    self.selectedLineNumberColor = [UIColor colorWithWhite:0.9 alpha:0];\n}\n\n\n#pragma mark - Convenience\n\n- (CGRect)paragraphRectForRange:(NSRange)range\n{\n    range = [self.textStorage.string paragraphRangeForRange:range];\n    range = [self glyphRangeForCharacterRange:range actualCharacterRange:NULL];\n    \n    CGRect startRect = [self lineFragmentRectForGlyphAtIndex:range.location effectiveRange:NULL];\n    CGRect endRect = [self lineFragmentRectForGlyphAtIndex:range.location + range.length - 1 effectiveRange:NULL];\n    \n    CGRect paragraphRectForRange = CGRectUnion(startRect, endRect);\n    paragraphRectForRange = CGRectOffset(paragraphRectForRange, _gutterWidth, 8);\n    \n    return paragraphRectForRange;\n}\n\n- (NSUInteger) _paraNumberForRange:(NSRange) charRange\n{\n    //  NSString does not provide a means of efficiently determining the paragraph number of a range of text.  This code\n    //  attempts to optimize what would normally be a series linear searches by keeping track of the last paragraph number\n    //  found and uses that as the starting point for next paragraph number search.  This works (mostly) because we\n    //  are generally asked for continguous increasing sequences of paragraph numbers.  Also, this code is called in the\n    //  course of drawing a pagefull of text, and so even when moving back, the number of paragraphs to search for is\n    //  relativly low, even in really long bodies of text.\n    //\n    //  This all falls down when the user edits the text, and can potentially invalidate the cached paragraph number which\n    //  causes a (potentially lengthy) search from the beginning of the string.\n    \n    if (charRange.location == self.lastParaLocation)\n        return self.lastParaNumber;\n    else if (charRange.location < self.lastParaLocation)\n    {\n        //  We need to look backwards from the last known paragraph for the new paragraph range.  This generally happens\n        //  when the text in the UITextView scrolls downward, revaling paragraphs before/above the ones previously drawn.\n        \n        NSString* s = self.textStorage.string;\n        __block NSUInteger paraNumber = self.lastParaNumber;\n        \n        [s enumerateSubstringsInRange:NSMakeRange(charRange.location, self.lastParaLocation - charRange.location)\n                              options:NSStringEnumerationByParagraphs |\n         NSStringEnumerationSubstringNotRequired |\n         NSStringEnumerationReverse\n                           usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop){\n                               if (enclosingRange.location <= charRange.location) {\n                                   *stop = YES;\n                               }\n                               --paraNumber;\n                           }];\n        \n        self.lastParaLocation = charRange.location;\n        self.lastParaNumber = paraNumber;\n        \n        return paraNumber;\n    }\n    else\n    {\n        //  We need to look forward from the last known paragraph for the new paragraph range.  This generally happens\n        //  when the text in the UITextView scrolls upwards, revealing paragraphs that follow the ones previously drawn.\n        \n        NSString* s = self.textStorage.string;\n        __block NSUInteger paraNumber = self.lastParaNumber;\n        \n        [s enumerateSubstringsInRange:NSMakeRange(self.lastParaLocation, charRange.location - self.lastParaLocation)\n                              options:NSStringEnumerationByParagraphs | NSStringEnumerationSubstringNotRequired\n                           usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop){\n                               if (enclosingRange.location >= charRange.location) {\n                                   *stop = YES;\n                               }\n                               ++paraNumber;\n                           }];\n        \n        self.lastParaLocation = charRange.location;\n        self.lastParaNumber = paraNumber;\n\n        return paraNumber;\n    }\n}\n\n\n#pragma mark - Layouting\n\n- (void)processEditingForTextStorage:(NSTextStorage *)textStorage edited:(NSTextStorageEditActions)editMask range:(NSRange)newCharRange changeInLength:(NSInteger)delta invalidatedRange:(NSRange)invalidatedCharRange\n{\n    [super processEditingForTextStorage:textStorage edited:editMask range:newCharRange changeInLength:delta invalidatedRange:invalidatedCharRange];\n    \n    if (invalidatedCharRange.location < self.lastParaLocation)\n    {\n        //  When the backing store is edited ahead the cached paragraph location, invalidate the cache and force a complete\n        //  recalculation.  We cannot be much smarter than this because we don't know how many paragraphs have been deleted\n        //  since the text has already been removed from the backing store.\n        self.lastParaLocation = 0;\n        self.lastParaNumber = 0;\n    }\n}\n\n\n#pragma mark - Drawing\n\n- (void) drawBackgroundForGlyphRange:(NSRange)glyphsToShow atPoint:(CGPoint)origin\n{\n    [super drawBackgroundForGlyphRange:glyphsToShow atPoint:origin];\n\n    //  Draw line numbers.  Note that the background for line number gutter is drawn by the LineNumberTextView class.\n    NSDictionary* atts = @{NSFontAttributeName : _lineNumberFont ,\n                           NSForegroundColorAttributeName : _lineNumberColor};\n    \n    [self enumerateLineFragmentsForGlyphRange:glyphsToShow\n                                   usingBlock:^(CGRect rect, CGRect usedRect, NSTextContainer *textContainer, NSRange glyphRange, BOOL *stop) {\n                                       NSRange charRange = [self characterRangeForGlyphRange:glyphRange actualGlyphRange:nil];\n                                       NSRange paraRange = [self.textStorage.string paragraphRangeForRange:charRange];\n                                       \n                                       BOOL showCursorRect = NSLocationInRange(_selectedRange.location, paraRange);\n                                       \n                                       if (showCursorRect)\n                                       {\n                                           CGContextRef context = UIGraphicsGetCurrentContext();\n                                           CGRect cursorRect = CGRectMake(0, usedRect.origin.y + 8, _gutterWidth, usedRect.size.height);\n                                           \n                                           CGContextSetFillColorWithColor(context, _selectedLineNumberColor.CGColor);\n                                           CGContextFillRect(context, cursorRect);\n                                       }\n                                       \n                                       //   Only draw line numbers for the paragraph's first line fragment.  Subsequent fragments are wrapped portions of the paragraph and don't get the line number.\n                                       if (charRange.location == paraRange.location) {\n                                           CGRect gutterRect = CGRectOffset(CGRectMake(0, rect.origin.y, _gutterWidth, rect.size.height), origin.x, origin.y);\n                                           NSUInteger paraNumber = [self _paraNumberForRange:charRange];\n                                           NSString* ln = [NSString stringWithFormat:@\"%ld\", (unsigned long) paraNumber + 1];\n                                           CGSize size = [ln sizeWithAttributes:atts];\n                                           \n                                           [ln drawInRect:CGRectOffset(gutterRect, CGRectGetWidth(gutterRect) - _lineAreaInset.right - size.width - _gutterWidth, (CGRectGetHeight(gutterRect) - size.height) / 2.0)\n                                           withAttributes:atts];\n                                       }\n\n                                   }];\n}\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/CYRTextView/CYRTextView/CYRTextStorage.h",
    "content": "//\n//  CYRTextStorage.h\n//\n//  Version 0.4.0\n//\n//  Created by Illya Busigin on 01/05/2014.\n//  Copyright (c) 2014 Cyrillian, Inc.\n//\n//  Distributed under MIT license.\n//  Get the latest version from here:\n//\n//  https://github.com/illyabusigin/CYRTextView\n//\n// The MIT License (MIT)\n//\n// Copyright (c) 2014 Cyrillian, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of\n// this software and associated documentation files (the \"Software\"), to deal in\n// the Software without restriction, including without limitation the rights to\n// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n// the Software, and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// 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, FITNESS\n// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n#import <UIKit/UIKit.h>\n\n@interface CYRTextStorage : NSTextStorage\n\n@property (nonatomic, strong) NSArray *tokens;\n@property (nonatomic, strong) UIFont *defaultFont;\n@property (nonatomic, strong) UIColor *defaultTextColor;\n\n- (void)update;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/CYRTextView/CYRTextView/CYRTextStorage.m",
    "content": "//\n//  CYRTextStorage.m\n//\n//  Version 0.4.0\n//\n//  Created by Illya Busigin on 01/05/2014.\n//  Copyright (c) 2014 Cyrillian, Inc.\n//\n//  Distributed under MIT license.\n//  Get the latest version from here:\n//\n//  https://github.com/illyabusigin/CYRTextView\n//\n// The MIT License (MIT)\n//\n// Copyright (c) 2014 Cyrillian, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of\n// this software and associated documentation files (the \"Software\"), to deal in\n// the Software without restriction, including without limitation the rights to\n// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n// the Software, and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// 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, FITNESS\n// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n#import \"CYRTextStorage.h\"\n#import \"CYRToken.h\"\n\n@interface CYRTextStorage ()\n\n@property (nonatomic, strong) NSMutableAttributedString *attributedString;\n@property (nonatomic, strong) NSMutableDictionary *regularExpressionCache;\n\n@end\n\n@implementation CYRTextStorage\n\n#pragma mark - Initialization & Setup\n\n- (id)init\n{\n    if (self = [super init])\n    {\n        _defaultFont = [UIFont systemFontOfSize:12.0f];\n        _defaultTextColor = [UIColor blackColor];\n        _attributedString = [NSMutableAttributedString new];\n        \n        _tokens = @[];\n        _regularExpressionCache = @{}.mutableCopy;\n    }\n    \n    return self;\n}\n\n\n#pragma mark - Overrides\n\n- (void)setTokens:(NSMutableArray *)tokens\n{\n    _tokens = tokens;\n    \n    // Clear the regular expression cache\n    [self.regularExpressionCache removeAllObjects];\n    \n    // Redraw all text\n    [self update];\n}\n\n- (NSString *)string\n{\n    return [_attributedString string];\n}\n\n- (NSDictionary *)attributesAtIndex:(NSUInteger)location effectiveRange:(NSRangePointer)range\n{\n    return [_attributedString attributesAtIndex:location effectiveRange:range];\n}\n\n- (void)replaceCharactersInRange:(NSRange)range withString:(NSString*)str\n{\n    [self beginEditing];\n    \n    [_attributedString replaceCharactersInRange:range withString:str];\n    \n    [self edited:NSTextStorageEditedCharacters | NSTextStorageEditedAttributes range:range changeInLength:str.length - range.length];\n    [self endEditing];\n}\n\n- (void)setAttributes:(NSDictionary*)attrs range:(NSRange)range\n{\n    [self beginEditing];\n    \n    [_attributedString setAttributes:attrs range:range];\n    \n    [self edited:NSTextStorageEditedAttributes range:range changeInLength:0];\n    [self endEditing];\n}\n\n-(void)processEditing\n{\n    [self performReplacementsForRange:[self editedRange]];\n    [super processEditing];\n}\n\n- (void)performReplacementsForRange:(NSRange)changedRange\n{\n    NSRange extendedRange = NSUnionRange(changedRange, [[_attributedString string] lineRangeForRange:NSMakeRange(NSMaxRange(changedRange), 0)]);\n    \n    [self applyStylesToRange:extendedRange];\n}\n\n\n-(void)update\n{\n    NSRange range = NSMakeRange(0, self.length);\n\n    NSDictionary *attributes =\n    @{\n      NSFontAttributeName : self.defaultFont,\n      NSForegroundColorAttributeName : self.defaultTextColor\n     };\n    [self addAttributes:attributes range:range];\n\n    [self applyStylesToRange:range];\n}\n\n- (void)applyStylesToRange:(NSRange)searchRange\n{\n    if (self.editedRange.location == NSNotFound)\n    {\n        return;\n    }\n    \n    NSRange paragaphRange = [self.string paragraphRangeForRange: self.editedRange];\n\n    // Reset the text attributes\n    NSDictionary *attributes =\n    @{\n      NSFontAttributeName : self.defaultFont,\n      NSForegroundColorAttributeName : self.defaultTextColor\n     };\n    [self setAttributes:attributes range:paragaphRange];\n    \n    for (CYRToken *attribute in self.tokens)\n    {\n        NSRegularExpression *regex = [self expressionForDefinition:attribute.name];\n        \n        [regex enumerateMatchesInString:self.string options:0 range:paragaphRange\n                             usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {\n                                 \n                                 [attribute.attributes enumerateKeysAndObjectsUsingBlock:^(NSString *attributeName, id attributeValue, BOOL *stop) {\n                                     [self addAttribute:attributeName value:attributeValue range:result.range];\n                                 }];\n                             }];\n    }\n}\n\n- (NSRegularExpression *)expressionForDefinition:(NSString *)definition\n{\n    __block CYRToken *attribute = nil;\n    \n    [self.tokens enumerateObjectsUsingBlock:^(CYRToken *enumeratedAttribute, NSUInteger idx, BOOL *stop) {\n        if ([enumeratedAttribute.name isEqualToString:definition])\n        {\n            attribute = enumeratedAttribute;\n            *stop = YES;\n        }\n    }];\n    \n    NSRegularExpression *expression = self.regularExpressionCache[attribute.expression];\n    \n    if (!expression)\n    {\n        expression = [NSRegularExpression regularExpressionWithPattern:attribute.expression\n                                                               options:NSRegularExpressionCaseInsensitive error:nil];\n        \n        [self.regularExpressionCache setObject:expression forKey:definition];\n    }\n    \n    return expression;\n}\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/CYRTextView/CYRTextView/CYRTextView.h",
    "content": "//\n//  CYRTextView.h\n//\n//  Version 0.4.0\n//\n//  Created by Illya Busigin on 01/05/2014.\n//  Copyright (c) 2014 Cyrillian, Inc.\n//  Copyright (c) 2013 Dominik Hauser\n//  Copyright (c) 2013 Sam Rijs\n//\n//  Distributed under MIT license.\n//  Get the latest version from here:\n//\n//  https://github.com/illyabusigin/CYRTextView\n//  Gestures sourced from: https://github.com/srijs/NLTextView\n//\n// The MIT License (MIT)\n//\n// Copyright (c) 2014 Cyrillian, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of\n// this software and associated documentation files (the \"Software\"), to deal in\n// the Software without restriction, including without limitation the rights to\n// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n// the Software, and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// 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, FITNESS\n// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n#import <UIKit/UIKit.h>\n#import \"CYRToken.h\"\n\n@interface CYRTextView : UITextView\n\n@property (nonatomic, strong) NSArray *tokens;\n@property (nonatomic, strong) UIPanGestureRecognizer *singleFingerPanRecognizer;\n@property (nonatomic, strong) UIPanGestureRecognizer *doubleFingerPanRecognizer;\n\n@property UIColor *gutterBackgroundColor;\n@property UIColor *gutterLineColor;\n\n@property (nonatomic, assign) BOOL lineCursorEnabled;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/CYRTextView/CYRTextView/CYRTextView.m",
    "content": "//\n//  CYRTextView.m\n//\n//  Version 0.4.0\n//\n//  Created by Illya Busigin on 01/05/2014.\n//  Copyright (c) 2014 Cyrillian, Inc.\n//  Copyright (c) 2013 Dominik Hauser\n//  Copyright (c) 2013 Sam Rijs\n//\n//  Distributed under MIT license.\n//  Get the latest version from here:\n//\n//  https://github.com/illyabusigin/CYRTextView\n//\n// The MIT License (MIT)\n//\n// Copyright (c) 2014 Cyrillian, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of\n// this software and associated documentation files (the \"Software\"), to deal in\n// the Software without restriction, including without limitation the rights to\n// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n// the Software, and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// 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, FITNESS\n// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n#import \"CYRTextView.h\"\n#import \"CYRLayoutManager.h\"\n#import \"CYRTextStorage.h\"\n\n#define RGB(r,g,b) [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:1.0f]\n\nstatic void *CYRTextViewContext = &CYRTextViewContext;\nstatic const float kCursorVelocity = 1.0f/8.0f;\n\n@interface CYRTextView ()\n\n@property (nonatomic, strong) CYRLayoutManager *lineNumberLayoutManager;\n@property (nonatomic, strong) CYRTextStorage *syntaxTextStorage;\n\n@end\n\n@implementation CYRTextView\n{\n    NSRange startRange;\n}\n\n#pragma mark - Initialization & Setup\n\n- (id)initWithFrame:(CGRect)frame\n{\n    CYRTextStorage *textStorage = [CYRTextStorage new];\n    CYRLayoutManager *layoutManager = [CYRLayoutManager new];\n    \n    self.lineNumberLayoutManager = layoutManager;\n    \n    NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)];\n    \n    //  Wrap text to the text view's frame\n    textContainer.widthTracksTextView = YES;\n    \n    [layoutManager addTextContainer:textContainer];\n\n    [textStorage removeLayoutManager:textStorage.layoutManagers.firstObject];\n    [textStorage addLayoutManager:layoutManager];\n    \n    self.syntaxTextStorage = textStorage;\n    \n    if ((self = [super initWithFrame:frame textContainer:textContainer]))\n    {\n        self.contentMode = UIViewContentModeRedraw; // causes drawRect: to be called on frame resizing and device rotation\n        \n        [self _commonSetup];\n    }\n    \n    return self;\n}\n\n- (void)_commonSetup\n{\n    // Setup observers\n    [self addObserver:self forKeyPath:NSStringFromSelector(@selector(font)) options:NSKeyValueObservingOptionNew context:CYRTextViewContext];\n    [self addObserver:self forKeyPath:NSStringFromSelector(@selector(textColor)) options:NSKeyValueObservingOptionNew context:CYRTextViewContext];\n    [self addObserver:self forKeyPath:NSStringFromSelector(@selector(selectedTextRange)) options:NSKeyValueObservingOptionNew context:CYRTextViewContext];\n    [self addObserver:self forKeyPath:NSStringFromSelector(@selector(selectedRange)) options:NSKeyValueObservingOptionNew context:CYRTextViewContext];\n\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleTextViewDidChangeNotification:) name:UITextViewTextDidChangeNotification object:self];\n    \n    // Setup defaults\n    self.font = [UIFont systemFontOfSize:16.0f];\n    self.textColor = [UIColor blackColor];\n    self.autocapitalizationType = UITextAutocapitalizationTypeNone;\n    self.autocorrectionType     = UITextAutocorrectionTypeNo;\n    self.lineCursorEnabled = YES;\n    self.gutterBackgroundColor = [UIColor colorWithWhite:0.95 alpha:1];\n    self.gutterLineColor       = [UIColor lightGrayColor];\n    \n    // Inset the content to make room for line numbers\n    self.textContainerInset = UIEdgeInsetsMake(8, self.lineNumberLayoutManager.gutterWidth, 8, 0);\n    \n    // Setup the gesture recognizers\n    _singleFingerPanRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(singleFingerPanHappend:)];\n    _singleFingerPanRecognizer.maximumNumberOfTouches = 1;\n    [self addGestureRecognizer:_singleFingerPanRecognizer];\n    \n    _doubleFingerPanRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(doubleFingerPanHappend:)];\n    _doubleFingerPanRecognizer.minimumNumberOfTouches = 2;\n    [self addGestureRecognizer:_doubleFingerPanRecognizer];\n}\n\n\n#pragma mark - Cleanup\n\n- (void)dealloc\n{\n    [self removeObserver:self forKeyPath:NSStringFromSelector(@selector(font))];\n    [self removeObserver:self forKeyPath:NSStringFromSelector(@selector(textColor))];\n    [self removeObserver:self forKeyPath:NSStringFromSelector(@selector(selectedTextRange))];\n    [self removeObserver:self forKeyPath:NSStringFromSelector(@selector(selectedRange))];\n}\n\n\n#pragma mark - KVO\n\n- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context\n{\n    if ([keyPath isEqualToString:NSStringFromSelector(@selector(font))] && context == CYRTextViewContext)\n    {\n        // Whenever the UITextView font is changed we want to keep a reference in the stickyFont ivar. We do this to counteract a bug where the underlying font can be changed without notice and cause undesired behaviour.\n        self.syntaxTextStorage.defaultFont = self.font;\n    }\n    else if ([keyPath isEqualToString:NSStringFromSelector(@selector(textColor))] && context == CYRTextViewContext)\n    {\n        self.syntaxTextStorage.defaultTextColor = self.textColor;\n    }\n    else if (([keyPath isEqualToString:NSStringFromSelector(@selector(selectedTextRange))] ||\n              [keyPath isEqualToString:NSStringFromSelector(@selector(selectedRange))]) && context == CYRTextViewContext)\n    {\n        [self setNeedsDisplay];\n    }\n    else\n    {\n        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];\n    }\n}\n\n\n#pragma mark - Notifications\n\n- (void)handleTextViewDidChangeNotification:(NSNotification *)notification\n{\n    if (notification.object == self)\n    {\n        CGRect line = [self caretRectForPosition: self.selectedTextRange.start];\n        CGFloat overflow = line.origin.y + line.size.height - ( self.contentOffset.y + self.bounds.size.height - self.contentInset.bottom - self.contentInset.top );\n        \n        if ( overflow > 0 )\n        {\n            // We are at the bottom of the visible text and introduced a line feed, scroll down (iOS 7 does not do it)\n            // Scroll caret to visible area\n            CGPoint offset = self.contentOffset;\n            offset.y += overflow + 7; // leave 7 pixels margin\n            // Cannot animate with setContentOffset:animated: or caret will not appear\n//            [UIView animateWithDuration:.2 animations:^{\n//                [self setContentOffset:offset];\n//            }];\n        }\n    }\n}\n\n\n#pragma mark - Overrides\n\n- (void)setTokens:(NSMutableArray *)tokens\n{\n    [self.syntaxTextStorage setTokens:tokens];\n}\n\n- (NSArray *)tokens\n{\n    CYRTextStorage *syntaxTextStorage = (CYRTextStorage *)self.textStorage;\n    \n    return syntaxTextStorage.tokens;\n}\n\n- (void)setText:(NSString *)text\n{\n    UITextRange *textRange = [self textRangeFromPosition:self.beginningOfDocument toPosition:self.endOfDocument];\n    [self replaceRange:textRange withText:text];\n}\n\n\n#pragma mark - Line Drawing\n\n// Original implementation sourced from: https://github.com/alldritt/TextKit_LineNumbers\n- (void)drawRect:(CGRect)rect\n{\n    //  Drag the line number gutter background.  The line numbers them selves are drawn by LineNumberLayoutManager.\n    CGContextRef context = UIGraphicsGetCurrentContext();\n    CGRect bounds = self.bounds;\n    \n    CGFloat height = MAX(CGRectGetHeight(bounds), self.contentSize.height) + 200;\n    \n    // Set the regular fill\n    CGContextSetFillColorWithColor(context, self.gutterBackgroundColor.CGColor);\n    CGContextFillRect(context, CGRectMake(bounds.origin.x, bounds.origin.y, self.lineNumberLayoutManager.gutterWidth, height));\n    \n    // Draw line\n    CGContextSetFillColorWithColor(context, self.gutterLineColor.CGColor);\n    CGContextFillRect(context, CGRectMake(self.lineNumberLayoutManager.gutterWidth, bounds.origin.y, 0.5, height));\n    \n    if (_lineCursorEnabled)\n    {\n        self.lineNumberLayoutManager.selectedRange = self.selectedRange;\n        \n        NSRange glyphRange = [self.lineNumberLayoutManager.textStorage.string paragraphRangeForRange:self.selectedRange];\n        glyphRange = [self.lineNumberLayoutManager glyphRangeForCharacterRange:glyphRange actualCharacterRange:NULL];\n        self.lineNumberLayoutManager.selectedRange = glyphRange;\n        [self.lineNumberLayoutManager invalidateDisplayForGlyphRange:glyphRange];\n    }\n    \n    [super drawRect:rect];\n}\n\n\n#pragma mark - Gestures\n\n// Sourced from: https://github.com/srijs/NLTextView\n- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer\n{\n    // Only accept horizontal pans for the code navigation to preserve correct scrolling behaviour.\n    if (gestureRecognizer == _singleFingerPanRecognizer || gestureRecognizer == _doubleFingerPanRecognizer)\n    {\n        CGPoint translation = [gestureRecognizer translationInView:self];\n        return fabs(translation.x) > fabs(translation.y);\n    }\n    \n    return YES;\n    \n}\n\n// Sourced from: https://github.com/srijs/NLTextView\n- (void)singleFingerPanHappend:(UIPanGestureRecognizer *)sender\n{\n    if (sender.state == UIGestureRecognizerStateBegan)\n    {\n        startRange = self.selectedRange;\n    }\n    \n    CGFloat cursorLocation = MAX(startRange.location + [sender translationInView:self].x * kCursorVelocity, 0);\n    \n    self.selectedRange = NSMakeRange(cursorLocation, 0);\n}\n\n// Sourced from: https://github.com/srijs/NLTextView\n- (void)doubleFingerPanHappend:(UIPanGestureRecognizer *)sender\n{\n    if (sender.state == UIGestureRecognizerStateBegan)\n    {\n        startRange = self.selectedRange;\n    }\n    \n    CGFloat cursorLocation = MAX(startRange.location + [sender translationInView:self].x * kCursorVelocity, 0);\n    \n    if (cursorLocation > startRange.location)\n    {\n        self.selectedRange = NSMakeRange(startRange.location, fabs(startRange.location - cursorLocation));\n    }\n    else\n    {\n        self.selectedRange = NSMakeRange(cursorLocation, fabs(startRange.location - cursorLocation));\n    }\n}\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/CYRTextView/CYRTextView/CYRToken.h",
    "content": "//\n//  CYRTextAttribute.h\n//\n//  Version 0.4.0\n//\n//  Created by Illya Busigin on 01/05/2014.\n//  Copyright (c) 2014 Cyrillian, Inc.\n//\n//  Distributed under MIT license.\n//  Get the latest version from here:\n//\n//  https://github.com/illyabusigin/CYRTextView\n//\n// The MIT License (MIT)\n//\n// Copyright (c) 2014 Cyrillian, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of\n// this software and associated documentation files (the \"Software\"), to deal in\n// the Software without restriction, including without limitation the rights to\n// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n// the Software, and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// 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, FITNESS\n// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n#import <Foundation/Foundation.h>\n\n@interface CYRToken : NSObject\n\n@property (nonatomic, strong) NSString *name;\n@property (nonatomic, strong) NSString *expression;\n@property (nonatomic, strong) NSDictionary *attributes;\n\n+ (instancetype)tokenWithName:(NSString *)name expression:(NSString *)expression attributes:(NSDictionary *)attributes;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/CYRTextView/CYRTextView/CYRToken.m",
    "content": "//\n//  CYRTextAttribute.m\n//\n//  Version 0.4.0\n//\n//  Created by Illya Busigin on 01/05/2014.\n//  Copyright (c) 2014 Cyrillian, Inc.\n//\n//  Distributed under MIT license.\n//  Get the latest version from here:\n//\n//  https://github.com/illyabusigin/CYRTextView\n//\n// The MIT License (MIT)\n//\n// Copyright (c) 2014 Cyrillian, Inc.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of\n// this software and associated documentation files (the \"Software\"), to deal in\n// the Software without restriction, including without limitation the rights to\n// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n// the Software, and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// 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, FITNESS\n// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n#import \"CYRToken.h\"\n\n@implementation CYRToken\n\n+ (instancetype)tokenWithName:(NSString *)name expression:(NSString *)expression attributes:(NSDictionary *)attributes\n{\n    CYRToken *textAttribute = [CYRToken new];\n    \n    textAttribute.name = name;\n    textAttribute.expression = expression;\n    textAttribute.attributes = attributes;\n    \n    return textAttribute;\n}\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/CYRTextView/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Cyrillian, Inc.\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 of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject 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, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Sublime/Pods/CYRTextView/README.md",
    "content": "# CYRTextView\n\nby **Illya Busigin**\n\n- Visit my blog at [http://illyabusigin.com/](http://illyabusigin.com/)\n- Follow [@illyabusigin on Twitter](http://twitter.com/illyabusigin)\n\nPurpose\n--------------\n\nCYRTextView is a UITextView subclass that implements a variety of features that are relevant to a syntax or code text view. There are many subclasses of UITextView out there with the release of TextKit but none that are specifically tailored towards a code/syntax view. CYRTextView aims to change this. Features include:\n- Regular expression based text highlighting with support for multiple text attributes for each expression\n- Line numbers\n- Gesture based navigation\n\nLong term, I would like to turn CYRTextView into a full fledged code editor component with code folding, markers, annotation, and more.\n\n\nScreenshot\n--------------\n<img src=\"https://raw.github.com/illyabusigin/CYRTextView/master/Screenshots/1.png\">\n\n\nRequirements\n-----------------------------\n\niOS 7.0 or later (**with ARC**) for iPhone, iPad and iPod touch\n\n\nInstallation\n---------------\n\nTo use CYRTextView, just drag the class files into your project and add the CoreText framework. You can create CYRTextView instances programatically, or create them in Interface Builder by dragging an ordinary UITextView into your view and setting its class to CYRTextView.\n\nIf you are using Interface Builder, to set the custom properties of CYRTextView (ones that are not supported by regular UIViews) either create an IBOutlet for your view and set the properties in code, or use the User Defined Runtime Attributes feature in Interface Builder (introduced in Xcode 4.2 for iOS 5+).\n\n**NOTE**: The current version (0.4.0) is alpha quality at best. Use at your own risk!\n\n\nExample\n---------------\n\nCYRTextView includes an example project that demonstrates how to subclass CYRTextView to provide highlighting behavior for multiple attributes with a default set of normal, bold, and italic fonts.\n\n\nBugs & Feature Requests\n---------------\n\nThere is **no support** offered with this component. If you would like a feature or find a bug, please submit a feature request through the [GitHub issue tracker](http://github.com/illyabusigin/CYRTextView/issues).\n\nPull-requests for bug-fixes and features are welcome!\n\nAttribution\n--------------\n\nCYRTextView uses portions of code from the following sources.\n\n| Component     | Description   | License  |\n| ------------- |:-------------:| -----:|\n| [NLTextView](https://github.com/srijs/NLTextView)      | A UITextView with Syntax Highlighting and Pan-Gesture Navigation / Selection | [MIT](https://github.com/srijs/NLTextView/blob/master/NLTextView/NLTextView.h) |\n| [TextKit_LineNumbers](https://github.com/alldritt/TextKit_LineNumbers)      | iOS7 Text Kit - Text View with Line Numbers      |   [MIT](https://github.com/alldritt/TextKit_LineNumbers) |\n\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Animation/ChartAnimationEasing.swift",
    "content": "//\n//  ChartAnimationUtils.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n@objc\npublic enum ChartEasingOption: Int\n{\n    case Linear\n    case EaseInQuad\n    case EaseOutQuad\n    case EaseInOutQuad\n    case EaseInCubic\n    case EaseOutCubic\n    case EaseInOutCubic\n    case EaseInQuart\n    case EaseOutQuart\n    case EaseInOutQuart\n    case EaseInQuint\n    case EaseOutQuint\n    case EaseInOutQuint\n    case EaseInSine\n    case EaseOutSine\n    case EaseInOutSine\n    case EaseInExpo\n    case EaseOutExpo\n    case EaseInOutExpo\n    case EaseInCirc\n    case EaseOutCirc\n    case EaseInOutCirc\n    case EaseInElastic\n    case EaseOutElastic\n    case EaseInOutElastic\n    case EaseInBack\n    case EaseOutBack\n    case EaseInOutBack\n    case EaseInBounce\n    case EaseOutBounce\n    case EaseInOutBounce\n}\n\npublic typealias ChartEasingFunctionBlock = ((elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat)\n\ninternal func easingFunctionFromOption(easing: ChartEasingOption) -> ChartEasingFunctionBlock\n{\n    switch easing\n    {\n    case .Linear:\n        return EasingFunctions.Linear\n    case .EaseInQuad:\n        return EasingFunctions.EaseInQuad\n    case .EaseOutQuad:\n        return EasingFunctions.EaseOutQuad\n    case .EaseInOutQuad:\n        return EasingFunctions.EaseInOutQuad\n    case .EaseInCubic:\n        return EasingFunctions.EaseInCubic\n    case .EaseOutCubic:\n        return EasingFunctions.EaseOutCubic\n    case .EaseInOutCubic:\n        return EasingFunctions.EaseInOutCubic\n    case .EaseInQuart:\n        return EasingFunctions.EaseInQuart\n    case .EaseOutQuart:\n        return EasingFunctions.EaseOutQuart\n    case .EaseInOutQuart:\n        return EasingFunctions.EaseInOutQuart\n    case .EaseInQuint:\n        return EasingFunctions.EaseInQuint\n    case .EaseOutQuint:\n        return EasingFunctions.EaseOutQuint\n    case .EaseInOutQuint:\n        return EasingFunctions.EaseInOutQuint\n    case .EaseInSine:\n        return EasingFunctions.EaseInSine\n    case .EaseOutSine:\n        return EasingFunctions.EaseOutSine\n    case .EaseInOutSine:\n        return EasingFunctions.EaseInOutSine\n    case .EaseInExpo:\n        return EasingFunctions.EaseInExpo\n    case .EaseOutExpo:\n        return EasingFunctions.EaseOutExpo\n    case .EaseInOutExpo:\n        return EasingFunctions.EaseInOutExpo\n    case .EaseInCirc:\n        return EasingFunctions.EaseInCirc\n    case .EaseOutCirc:\n        return EasingFunctions.EaseOutCirc\n    case .EaseInOutCirc:\n        return EasingFunctions.EaseInOutCirc\n    case .EaseInElastic:\n        return EasingFunctions.EaseInElastic\n    case .EaseOutElastic:\n        return EasingFunctions.EaseOutElastic\n    case .EaseInOutElastic:\n        return EasingFunctions.EaseInOutElastic\n    case .EaseInBack:\n        return EasingFunctions.EaseInBack\n    case .EaseOutBack:\n        return EasingFunctions.EaseOutBack\n    case .EaseInOutBack:\n        return EasingFunctions.EaseInOutBack\n    case .EaseInBounce:\n        return EasingFunctions.EaseInBounce\n    case .EaseOutBounce:\n        return EasingFunctions.EaseOutBounce\n    case .EaseInOutBounce:\n        return EasingFunctions.EaseInOutBounce\n    }\n}\n\ninternal struct EasingFunctions\n{\n    internal static let Linear = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in return CGFloat(elapsed / duration); }\n    \n    internal static let EaseInQuad = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        var position = CGFloat(elapsed / duration)\n        return position * position\n    }\n    \n    internal static let EaseOutQuad = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        var position = CGFloat(elapsed / duration)\n        return -position * (position - 2.0)\n    }\n    \n    internal static let EaseInOutQuad = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        var position = CGFloat(elapsed / (duration / 2.0))\n        if (position < 1.0)\n        {\n            return 0.5 * position * position\n        }\n        return -0.5 * ((--position) * (position - 2.0) - 1.0)\n    }\n    \n    internal static let EaseInCubic = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        var position = CGFloat(elapsed / duration)\n        return position * position * position\n    }\n    \n    internal static let EaseOutCubic = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        var position = CGFloat(elapsed / duration)\n        position--\n        return (position * position * position + 1.0)\n    }\n    \n    internal static let EaseInOutCubic = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        var position = CGFloat(elapsed / (duration / 2.0))\n        if (position < 1.0)\n        {\n            return 0.5 * position * position * position\n        }\n        position -= 2.0\n        return 0.5 * (position * position * position + 2.0)\n    }\n    \n    internal static let EaseInQuart = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        var position = CGFloat(elapsed / duration)\n        return position * position * position * position\n    }\n    \n    internal static let EaseOutQuart = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        var position = CGFloat(elapsed / duration)\n        position--\n        return -(position * position * position * position - 1.0)\n    }\n    \n    internal static let EaseInOutQuart = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        var position = CGFloat(elapsed / (duration / 2.0))\n        if (position < 1.0)\n        {\n            return 0.5 * position * position * position * position\n        }\n        position -= 2.0\n        return -0.5 * (position * position * position * position - 2.0)\n    }\n    \n    internal static let EaseInQuint = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        var position = CGFloat(elapsed / duration)\n        return position * position * position * position * position\n    }\n    \n    internal static let EaseOutQuint = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        var position = CGFloat(elapsed / duration)\n        position--\n        return (position * position * position * position * position + 1.0)\n    }\n    \n    internal static let EaseInOutQuint = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        var position = CGFloat(elapsed / (duration / 2.0))\n        if (position < 1.0)\n        {\n            return 0.5 * position * position * position * position * position\n        }\n        else\n        {\n            position -= 2.0\n            return 0.5 * (position * position * position * position * position + 2.0)\n        }\n    }\n    \n    internal static let EaseInSine = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        var position: NSTimeInterval = elapsed / duration\n        return CGFloat( -cos(position * M_PI_2) + 1.0 )\n    }\n    \n    internal static let EaseOutSine = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        var position: NSTimeInterval = elapsed / duration\n        return CGFloat( sin(position * M_PI_2) )\n    }\n    \n    internal static let EaseInOutSine = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        var position: NSTimeInterval = elapsed / duration\n        return CGFloat( -0.5 * (cos(M_PI * position) - 1.0) )\n    }\n    \n    internal static let EaseInExpo = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        return (elapsed == 0) ? 0.0 : CGFloat(pow(2.0, 10.0 * (elapsed / duration - 1.0)))\n    }\n    \n    internal static let EaseOutExpo = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        return (elapsed == duration) ? 1.0 : (-CGFloat(pow(2.0, -10.0 * elapsed / duration)) + 1.0)\n    }\n    \n    internal static let EaseInOutExpo = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        if (elapsed == 0)\n        {\n            return 0.0\n        }\n        if (elapsed == duration)\n        {\n            return 1.0\n        }\n        \n        var position: NSTimeInterval = elapsed / (duration / 2.0)\n        if (position < 1.0)\n        {\n            return CGFloat( 0.5 * pow(2.0, 10.0 * (position - 1.0)) )\n        }\n        \n        position = position - 1.0\n        return CGFloat( 0.5 * (-pow(2.0, -10.0 * position) + 2.0) )\n    }\n    \n    internal static let EaseInCirc = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        var position = CGFloat(elapsed / duration)\n        return -(CGFloat(sqrt(1.0 - position * position)) - 1.0)\n    }\n    \n    internal static let EaseOutCirc = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        var position = CGFloat(elapsed / duration)\n        position--\n        return CGFloat( sqrt(1 - position * position) )\n    }\n    \n    internal static let EaseInOutCirc = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        var position: NSTimeInterval = elapsed / (duration / 2.0)\n        if (position < 1.0)\n        {\n            return CGFloat( -0.5 * (sqrt(1.0 - position * position) - 1.0) )\n        }\n        position -= 2.0\n        return CGFloat( 0.5 * (sqrt(1.0 - position * position) + 1.0) )\n    }\n    \n    internal static let EaseInElastic = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        if (elapsed == 0.0)\n        {\n            return 0.0\n        }\n        \n        var position: NSTimeInterval = elapsed / duration\n        if (position == 1.0)\n        {\n            return 1.0\n        }\n        \n        var p = duration * 0.3\n        var s = p / (2.0 * M_PI) * asin(1.0)\n        position -= 1.0\n        return CGFloat( -(pow(2.0, 10.0 * position) * sin((position * duration - s) * (2.0 * M_PI) / p)) )\n    }\n    \n    internal static let EaseOutElastic = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        if (elapsed == 0.0)\n        {\n            return 0.0\n        }\n        \n        var position: NSTimeInterval = elapsed / duration\n        if (position == 1.0)\n        {\n            return 1.0\n        }\n        \n        var p = duration * 0.3\n        var s = p / (2.0 * M_PI) * asin(1.0)\n        return CGFloat( pow(2.0, -10.0 * position) * sin((position * duration - s) * (2.0 * M_PI) / p) + 1.0 )\n    }\n    \n    internal static let EaseInOutElastic = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        if (elapsed == 0.0)\n        {\n            return 0.0\n        }\n        \n        var position: NSTimeInterval = elapsed / (duration / 2.0)\n        if (position == 2.0)\n        {\n            return 1.0\n        }\n        \n        var p = duration * (0.3 * 1.5)\n        var s = p / (2.0 * M_PI) * asin(1.0)\n        if (position < 1.0)\n        {\n            position -= 1.0\n            return CGFloat( -0.5 * (pow(2.0, 10.0 * position) * sin((position * duration - s) * (2.0 * M_PI) / p)) )\n        }\n        position -= 1.0\n        return CGFloat( pow(2.0, -10.0 * position) * sin((position * duration - s) * (2.0 * M_PI) / p) * 0.5 + 1.0 )\n    }\n    \n    internal static let EaseInBack = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        let s: NSTimeInterval = 1.70158\n        var position: NSTimeInterval = elapsed / duration\n        return CGFloat( position * position * ((s + 1.0) * position - s) )\n    }\n    \n    internal static let EaseOutBack = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        let s: NSTimeInterval = 1.70158\n        var position: NSTimeInterval = elapsed / duration\n        position -= 1.0\n        return CGFloat( position * position * ((s + 1.0) * position + s) + 1.0 )\n    }\n    \n    internal static let EaseInOutBack = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        var s: NSTimeInterval = 1.70158\n        var position: NSTimeInterval = elapsed / (duration / 2.0)\n        if (position < 1.0)\n        {\n            s *= 1.525\n            return CGFloat( 0.5 * (position * position * ((s + 1.0) * position - s)) )\n        }\n        s *= 1.525\n        position -= 2.0\n        return CGFloat( 0.5 * (position * position * ((s + 1.0) * position + s) + 2.0) )\n    }\n    \n    internal static let EaseInBounce = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        return 1.0 - EaseOutBounce(duration - elapsed, duration)\n    }\n    \n    internal static let EaseOutBounce = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        var position: NSTimeInterval = elapsed / duration\n        if (position < (1.0 / 2.75))\n        {\n            return CGFloat( 7.5625 * position * position )\n        }\n        else if (position < (2.0 / 2.75))\n        {\n            position -= (1.5 / 2.75)\n            return CGFloat( 7.5625 * position * position + 0.75 )\n        }\n        else if (position < (2.5 / 2.75))\n        {\n            position -= (2.25 / 2.75)\n            return CGFloat( 7.5625 * position * position + 0.9375 )\n        }\n        else\n        {\n            position -= (2.625 / 2.75)\n            return CGFloat( 7.5625 * position * position + 0.984375 )\n        }\n    }\n    \n    internal static let EaseInOutBounce = { (elapsed: NSTimeInterval, duration: NSTimeInterval) -> CGFloat in\n        if (elapsed < (duration / 2.0))\n        {\n            return EaseInBounce(elapsed * 2.0, duration) * 0.5\n        }\n        return EaseOutBounce(elapsed * 2.0 - duration, duration) * 0.5 + 0.5\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Animation/ChartAnimator.swift",
    "content": "//\n//  ChartAnimator.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 3/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n@objc\npublic protocol ChartAnimatorDelegate\n{\n    /// Called when the Animator has stepped.\n    func chartAnimatorUpdated(chartAnimator: ChartAnimator)\n    \n    /// Called when the Animator has stopped.\n    func chartAnimatorStopped(chartAnimator: ChartAnimator)\n}\n\npublic class ChartAnimator: NSObject\n{\n    public weak var delegate: ChartAnimatorDelegate?\n    public var updateBlock: (() -> Void)?\n    public var stopBlock: (() -> Void)?\n    \n    /// the phase that is animated and influences the drawn values on the x-axis\n    public var phaseX: CGFloat = 1.0\n    \n    /// the phase that is animated and influences the drawn values on the y-axis\n    public var phaseY: CGFloat = 1.0\n    \n    private var _startTimeX: NSTimeInterval = 0.0\n    private var _startTimeY: NSTimeInterval = 0.0\n    private var _displayLink: NSUIDisplayLink!\n    \n    private var _durationX: NSTimeInterval = 0.0\n    private var _durationY: NSTimeInterval = 0.0\n    \n    private var _endTimeX: NSTimeInterval = 0.0\n    private var _endTimeY: NSTimeInterval = 0.0\n    private var _endTime: NSTimeInterval = 0.0\n    \n    private var _enabledX: Bool = false\n    private var _enabledY: Bool = false\n    \n    private var _easingX: ChartEasingFunctionBlock?\n    private var _easingY: ChartEasingFunctionBlock?\n    \n    public override init()\n    {\n        super.init()\n    }\n    \n    deinit\n    {\n        stop()\n    }\n    \n    public func stop()\n    {\n        if (_displayLink != nil)\n        {\n            _displayLink.removeFromRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)\n            _displayLink = nil\n            \n            _enabledX = false\n            _enabledY = false\n            \n            // If we stopped an animation in the middle, we do not want to leave it like this\n            if phaseX != 1.0 || phaseY != 1.0\n            {\n                phaseX = 1.0\n                phaseY = 1.0\n                \n                if (delegate != nil)\n                {\n                    delegate!.chartAnimatorUpdated(self)\n                }\n                if (updateBlock != nil)\n                {\n                    updateBlock!()\n                }\n            }\n            \n            if (delegate != nil)\n            {\n                delegate!.chartAnimatorStopped(self)\n            }\n            if (stopBlock != nil)\n            {\n                stopBlock?()\n            }\n        }\n    }\n    \n    private func updateAnimationPhases(currentTime: NSTimeInterval)\n    {\n        if (_enabledX)\n        {\n            let elapsedTime: NSTimeInterval = currentTime - _startTimeX\n            let duration: NSTimeInterval = _durationX\n            var elapsed: NSTimeInterval = elapsedTime\n            if (elapsed > duration)\n            {\n                elapsed = duration\n            }\n           \n            if (_easingX != nil)\n            {\n                phaseX = _easingX!(elapsed: elapsed, duration: duration)\n            }\n            else\n            {\n                phaseX = CGFloat(elapsed / duration)\n            }\n        }\n        if (_enabledY)\n        {\n            let elapsedTime: NSTimeInterval = currentTime - _startTimeY\n            let duration: NSTimeInterval = _durationY\n            var elapsed: NSTimeInterval = elapsedTime\n            if (elapsed > duration)\n            {\n                elapsed = duration\n            }\n            \n            if (_easingY != nil)\n            {\n                phaseY = _easingY!(elapsed: elapsed, duration: duration)\n            }\n            else\n            {\n                phaseY = CGFloat(elapsed / duration)\n            }\n        }\n    }\n    \n    @objc private func animationLoop()\n    {\n        let currentTime: NSTimeInterval = CACurrentMediaTime()\n        \n        updateAnimationPhases(currentTime)\n        \n        if (delegate != nil)\n        {\n            delegate!.chartAnimatorUpdated(self)\n        }\n        if (updateBlock != nil)\n        {\n            updateBlock!()\n        }\n        \n        if (currentTime >= _endTime)\n        {\n            stop()\n        }\n    }\n    \n    /// Animates the drawing / rendering of the chart on both x- and y-axis with the specified animation time.\n    /// If `animate(...)` is called, no further calling of `invalidate()` is necessary to refresh the chart.\n    /// - parameter xAxisDuration: duration for animating the x axis\n    /// - parameter yAxisDuration: duration for animating the y axis\n    /// - parameter easingX: an easing function for the animation on the x axis\n    /// - parameter easingY: an easing function for the animation on the y axis\n    public func animate(xAxisDuration xAxisDuration: NSTimeInterval, yAxisDuration: NSTimeInterval, easingX: ChartEasingFunctionBlock?, easingY: ChartEasingFunctionBlock?)\n    {\n        stop()\n        \n        _startTimeX = CACurrentMediaTime()\n        _startTimeY = _startTimeX\n        _durationX = xAxisDuration\n        _durationY = yAxisDuration\n        _endTimeX = _startTimeX + xAxisDuration\n        _endTimeY = _startTimeY + yAxisDuration\n        _endTime = _endTimeX > _endTimeY ? _endTimeX : _endTimeY\n        _enabledX = xAxisDuration > 0.0\n        _enabledY = yAxisDuration > 0.0\n        \n        _easingX = easingX\n        _easingY = easingY\n        \n        // Take care of the first frame if rendering is already scheduled...\n        updateAnimationPhases(_startTimeX)\n        \n        if (_enabledX || _enabledY)\n        {\n            _displayLink = NSUIDisplayLink(target: self, selector: #selector(ChartAnimator.animationLoop))\n            _displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)\n        }\n    }\n    \n    /// Animates the drawing / rendering of the chart on both x- and y-axis with the specified animation time.\n    /// If `animate(...)` is called, no further calling of `invalidate()` is necessary to refresh the chart.\n    /// - parameter xAxisDuration: duration for animating the x axis\n    /// - parameter yAxisDuration: duration for animating the y axis\n    /// - parameter easingOptionX: the easing function for the animation on the x axis\n    /// - parameter easingOptionY: the easing function for the animation on the y axis\n    public func animate(xAxisDuration xAxisDuration: NSTimeInterval, yAxisDuration: NSTimeInterval, easingOptionX: ChartEasingOption, easingOptionY: ChartEasingOption)\n    {\n        animate(xAxisDuration: xAxisDuration, yAxisDuration: yAxisDuration, easingX: easingFunctionFromOption(easingOptionX), easingY: easingFunctionFromOption(easingOptionY))\n    }\n    \n    /// Animates the drawing / rendering of the chart on both x- and y-axis with the specified animation time.\n    /// If `animate(...)` is called, no further calling of `invalidate()` is necessary to refresh the chart.\n    /// - parameter xAxisDuration: duration for animating the x axis\n    /// - parameter yAxisDuration: duration for animating the y axis\n    /// - parameter easing: an easing function for the animation\n    public func animate(xAxisDuration xAxisDuration: NSTimeInterval, yAxisDuration: NSTimeInterval, easing: ChartEasingFunctionBlock?)\n    {\n        animate(xAxisDuration: xAxisDuration, yAxisDuration: yAxisDuration, easingX: easing, easingY: easing)\n    }\n    \n    /// Animates the drawing / rendering of the chart on both x- and y-axis with the specified animation time.\n    /// If `animate(...)` is called, no further calling of `invalidate()` is necessary to refresh the chart.\n    /// - parameter xAxisDuration: duration for animating the x axis\n    /// - parameter yAxisDuration: duration for animating the y axis\n    /// - parameter easingOption: the easing function for the animation\n    public func animate(xAxisDuration xAxisDuration: NSTimeInterval, yAxisDuration: NSTimeInterval, easingOption: ChartEasingOption)\n    {\n        animate(xAxisDuration: xAxisDuration, yAxisDuration: yAxisDuration, easing: easingFunctionFromOption(easingOption))\n    }\n    \n    /// Animates the drawing / rendering of the chart on both x- and y-axis with the specified animation time.\n    /// If `animate(...)` is called, no further calling of `invalidate()` is necessary to refresh the chart.\n    /// - parameter xAxisDuration: duration for animating the x axis\n    /// - parameter yAxisDuration: duration for animating the y axis\n    public func animate(xAxisDuration xAxisDuration: NSTimeInterval, yAxisDuration: NSTimeInterval)\n    {\n        animate(xAxisDuration: xAxisDuration, yAxisDuration: yAxisDuration, easingOption: .EaseInOutSine)\n    }\n    \n    /// Animates the drawing / rendering of the chart the x-axis with the specified animation time.\n    /// If `animate(...)` is called, no further calling of `invalidate()` is necessary to refresh the chart.\n    /// - parameter xAxisDuration: duration for animating the x axis\n    /// - parameter easing: an easing function for the animation\n    public func animate(xAxisDuration xAxisDuration: NSTimeInterval, easing: ChartEasingFunctionBlock?)\n    {\n        _startTimeX = CACurrentMediaTime()\n        _durationX = xAxisDuration\n        _endTimeX = _startTimeX + xAxisDuration\n        _endTime = _endTimeX > _endTimeY ? _endTimeX : _endTimeY\n        _enabledX = xAxisDuration > 0.0\n        \n        _easingX = easing\n        \n        // Take care of the first frame if rendering is already scheduled...\n        updateAnimationPhases(_startTimeX)\n        \n        if (_enabledX || _enabledY)\n        {\n            if _displayLink === nil\n            {\n                _displayLink = NSUIDisplayLink(target: self, selector: #selector(ChartAnimator.animationLoop))\n                _displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)\n            }\n        }\n    }\n    \n    /// Animates the drawing / rendering of the chart the x-axis with the specified animation time.\n    /// If `animate(...)` is called, no further calling of `invalidate()` is necessary to refresh the chart.\n    /// - parameter xAxisDuration: duration for animating the x axis\n    /// - parameter easingOption: the easing function for the animation\n    public func animate(xAxisDuration xAxisDuration: NSTimeInterval, easingOption: ChartEasingOption)\n    {\n        animate(xAxisDuration: xAxisDuration, easing: easingFunctionFromOption(easingOption))\n    }\n    \n    /// Animates the drawing / rendering of the chart the x-axis with the specified animation time.\n    /// If `animate(...)` is called, no further calling of `invalidate()` is necessary to refresh the chart.\n    /// - parameter xAxisDuration: duration for animating the x axis\n    public func animate(xAxisDuration xAxisDuration: NSTimeInterval)\n    {\n        animate(xAxisDuration: xAxisDuration, easingOption: .EaseInOutSine)\n    }\n    \n    /// Animates the drawing / rendering of the chart the y-axis with the specified animation time.\n    /// If `animate(...)` is called, no further calling of `invalidate()` is necessary to refresh the chart.\n    /// - parameter yAxisDuration: duration for animating the y axis\n    /// - parameter easing: an easing function for the animation\n    public func animate(yAxisDuration yAxisDuration: NSTimeInterval, easing: ChartEasingFunctionBlock?)\n    {\n        _startTimeY = CACurrentMediaTime()\n        _durationY = yAxisDuration\n        _endTimeY = _startTimeY + yAxisDuration\n        _endTime = _endTimeX > _endTimeY ? _endTimeX : _endTimeY\n        _enabledY = yAxisDuration > 0.0\n        \n        _easingY = easing\n        \n        // Take care of the first frame if rendering is already scheduled...\n        updateAnimationPhases(_startTimeY)\n        \n        if (_enabledX || _enabledY)\n        {\n            if _displayLink === nil\n            {\n                _displayLink = NSUIDisplayLink(target: self, selector: #selector(ChartAnimator.animationLoop))\n                _displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)\n            }\n        }\n    }\n    \n    /// Animates the drawing / rendering of the chart the y-axis with the specified animation time.\n    /// If `animate(...)` is called, no further calling of `invalidate()` is necessary to refresh the chart.\n    /// - parameter yAxisDuration: duration for animating the y axis\n    /// - parameter easingOption: the easing function for the animation\n    public func animate(yAxisDuration yAxisDuration: NSTimeInterval, easingOption: ChartEasingOption)\n    {\n        animate(yAxisDuration: yAxisDuration, easing: easingFunctionFromOption(easingOption))\n    }\n    \n    /// Animates the drawing / rendering of the chart the y-axis with the specified animation time.\n    /// If `animate(...)` is called, no further calling of `invalidate()` is necessary to refresh the chart.\n    /// - parameter yAxisDuration: duration for animating the y axis\n    public func animate(yAxisDuration yAxisDuration: NSTimeInterval)\n    {\n        animate(yAxisDuration: yAxisDuration, easingOption: .EaseInOutSine)\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Charts/BarChartView.swift",
    "content": "//\n//  BarChartView.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n/// Chart that draws bars.\npublic class BarChartView: BarLineChartViewBase, BarChartDataProvider\n{\n    /// flag that enables or disables the highlighting arrow\n    private var _drawHighlightArrowEnabled = false\n    \n    /// if set to true, all values are drawn above their bars, instead of below their top\n    private var _drawValueAboveBarEnabled = true\n\n    /// if set to true, a grey area is drawn behind each bar that indicates the maximum value\n    private var _drawBarShadowEnabled = false\n    \n    internal override func initialize()\n    {\n        super.initialize()\n        \n        renderer = BarChartRenderer(dataProvider: self, animator: _animator, viewPortHandler: _viewPortHandler)\n        _xAxisRenderer = ChartXAxisRendererBarChart(viewPortHandler: _viewPortHandler, xAxis: _xAxis, transformer: _leftAxisTransformer, chart: self)\n        \n        self.highlighter = BarChartHighlighter(chart: self)\n        \n        _xAxis._axisMinimum = -0.5\n    }\n    \n    internal override func calcMinMax()\n    {\n        super.calcMinMax()\n        \n        guard let data = _data else { return }\n        \n        let barData = data as! BarChartData\n        \n        // increase deltax by 1 because the bars have a width of 1\n        _xAxis.axisRange += 0.5\n        \n        // extend xDelta to make space for multiple datasets (if ther are one)\n        _xAxis.axisRange *= Double(data.dataSetCount)\n        \n        let groupSpace = barData.groupSpace\n        _xAxis.axisRange += Double(barData.xValCount) * Double(groupSpace)\n        _xAxis._axisMaximum = _xAxis.axisRange - _xAxis._axisMinimum\n    }\n    \n    /// - returns: the Highlight object (contains x-index and DataSet index) of the selected value at the given touch point inside the BarChart.\n    public override func getHighlightByTouchPoint(pt: CGPoint) -> ChartHighlight?\n    {\n        if _data === nil\n        {\n            Swift.print(\"Can't select by touch. No data set.\")\n            return nil\n        }\n\n        return self.highlighter?.getHighlight(x: Double(pt.x), y: Double(pt.y))\n    }\n        \n    /// - returns: the bounding box of the specified Entry in the specified DataSet. Returns null if the Entry could not be found in the charts data.\n    public func getBarBounds(e: BarChartDataEntry) -> CGRect\n    {\n        guard let\n            set = _data?.getDataSetForEntry(e) as? IBarChartDataSet\n            else { return CGRectNull }\n        \n        let barspace = set.barSpace\n        let y = CGFloat(e.value)\n        let x = CGFloat(e.xIndex)\n        \n        let barWidth: CGFloat = 0.5\n        \n        let spaceHalf = barspace / 2.0\n        let left = x - barWidth + spaceHalf\n        let right = x + barWidth - spaceHalf\n        let top = y >= 0.0 ? y : 0.0\n        let bottom = y <= 0.0 ? y : 0.0\n        \n        var bounds = CGRect(x: left, y: top, width: right - left, height: bottom - top)\n        \n        getTransformer(set.axisDependency).rectValueToPixel(&bounds)\n        \n        return bounds\n    }\n    \n    public override var lowestVisibleXIndex: Int\n    {\n        let step = CGFloat(_data?.dataSetCount ?? 0)\n        let div = (step <= 1.0) ? 1.0 : step + (_data as! BarChartData).groupSpace\n        \n        var pt = CGPoint(x: _viewPortHandler.contentLeft, y: _viewPortHandler.contentBottom)\n        getTransformer(ChartYAxis.AxisDependency.Left).pixelToValue(&pt)\n        \n        return Int((pt.x <= CGFloat(chartXMin)) ? 0.0 : (pt.x / div) + 1.0)\n    }\n\n    public override var highestVisibleXIndex: Int\n    {\n        let step = CGFloat(_data?.dataSetCount ?? 0)\n        let div = (step <= 1.0) ? 1.0 : step + (_data as! BarChartData).groupSpace\n        \n        var pt = CGPoint(x: _viewPortHandler.contentRight, y: _viewPortHandler.contentBottom)\n        getTransformer(ChartYAxis.AxisDependency.Left).pixelToValue(&pt)\n        \n        return Int((pt.x >= CGFloat(chartXMax)) ? CGFloat(chartXMax) / div : (pt.x / div))\n    }\n\n    // MARK: Accessors\n    \n    /// flag that enables or disables the highlighting arrow\n    public var drawHighlightArrowEnabled: Bool\n    {\n        get { return _drawHighlightArrowEnabled; }\n        set\n        {\n            _drawHighlightArrowEnabled = newValue\n            setNeedsDisplay()\n        }\n    }\n    \n    /// if set to true, all values are drawn above their bars, instead of below their top\n    public var drawValueAboveBarEnabled: Bool\n    {\n        get { return _drawValueAboveBarEnabled; }\n        set\n        {\n            _drawValueAboveBarEnabled = newValue\n            setNeedsDisplay()\n        }\n    }\n    \n    /// if set to true, a grey area is drawn behind each bar that indicates the maximum value\n    public var drawBarShadowEnabled: Bool\n    {\n        get { return _drawBarShadowEnabled; }\n        set\n        {\n            _drawBarShadowEnabled = newValue\n            setNeedsDisplay()\n        }\n    }\n    \n    // MARK: - BarChartDataProbider\n    \n    public var barData: BarChartData? { return _data as? BarChartData }\n    \n    /// - returns: true if drawing the highlighting arrow is enabled, false if not\n    public var isDrawHighlightArrowEnabled: Bool { return drawHighlightArrowEnabled }\n    \n    /// - returns: true if drawing values above bars is enabled, false if not\n    public var isDrawValueAboveBarEnabled: Bool { return drawValueAboveBarEnabled }\n    \n    /// - returns: true if drawing shadows (maxvalue) for each bar is enabled, false if not\n    public var isDrawBarShadowEnabled: Bool { return drawBarShadowEnabled }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Charts/BarLineChartViewBase.swift",
    "content": "//\n//  BarLineChartViewBase.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n/// Base-class of LineChart, BarChart, ScatterChart and CandleStickChart.\npublic class BarLineChartViewBase: ChartViewBase, BarLineScatterCandleBubbleChartDataProvider, NSUIGestureRecognizerDelegate\n{\n    /// the maximum number of entries to which values will be drawn\n    /// (entry numbers greater than this value will cause value-labels to disappear)\n    internal var _maxVisibleValueCount = 100\n    \n    /// flag that indicates if auto scaling on the y axis is enabled\n    private var _autoScaleMinMaxEnabled = false\n    private var _autoScaleLastLowestVisibleXIndex: Int!\n    private var _autoScaleLastHighestVisibleXIndex: Int!\n    \n    private var _pinchZoomEnabled = false\n    private var _doubleTapToZoomEnabled = true\n    private var _dragEnabled = true\n    \n    private var _scaleXEnabled = true\n    private var _scaleYEnabled = true\n    \n    /// the color for the background of the chart-drawing area (everything behind the grid lines).\n    public var gridBackgroundColor = NSUIColor(red: 240/255.0, green: 240/255.0, blue: 240/255.0, alpha: 1.0)\n    \n    public var borderColor = NSUIColor.blackColor()\n    public var borderLineWidth: CGFloat = 1.0\n    \n    /// flag indicating if the grid background should be drawn or not\n    public var drawGridBackgroundEnabled = false\n    \n    /// Sets drawing the borders rectangle to true. If this is enabled, there is no point drawing the axis-lines of x- and y-axis.\n    public var drawBordersEnabled = false\n\n    /// Sets the minimum offset (padding) around the chart, defaults to 10\n    public var minOffset = CGFloat(10.0)\n    \n    /// Sets whether the chart should keep its position (zoom / scroll) after a rotation (orientation change)\n    /// **default**: false\n    public var keepPositionOnRotation: Bool = false\n    \n    /// the object representing the left y-axis\n    internal var _leftAxis: ChartYAxis!\n    \n    /// the object representing the right y-axis\n    internal var _rightAxis: ChartYAxis!\n\n    internal var _leftYAxisRenderer: ChartYAxisRenderer!\n    internal var _rightYAxisRenderer: ChartYAxisRenderer!\n    \n    internal var _leftAxisTransformer: ChartTransformer!\n    internal var _rightAxisTransformer: ChartTransformer!\n    \n    internal var _xAxisRenderer: ChartXAxisRenderer!\n    \n    internal var _tapGestureRecognizer: NSUITapGestureRecognizer!\n    internal var _doubleTapGestureRecognizer: NSUITapGestureRecognizer!\n    #if !os(tvOS)\n    internal var _pinchGestureRecognizer: NSUIPinchGestureRecognizer!\n    #endif\n    internal var _panGestureRecognizer: NSUIPanGestureRecognizer!\n    \n    /// flag that indicates if a custom viewport offset has been set\n    private var _customViewPortEnabled = false\n    \n    public override init(frame: CGRect)\n    {\n        super.init(frame: frame)\n    }\n    \n    public required init?(coder aDecoder: NSCoder)\n    {\n        super.init(coder: aDecoder)\n    }\n    \n    deinit\n    {\n        stopDeceleration()\n    }\n    \n    internal override func initialize()\n    {\n        super.initialize()\n        \n        _leftAxis = ChartYAxis(position: .Left)\n        _rightAxis = ChartYAxis(position: .Right)\n        \n        _leftAxisTransformer = ChartTransformer(viewPortHandler: _viewPortHandler)\n        _rightAxisTransformer = ChartTransformer(viewPortHandler: _viewPortHandler)\n        \n        _leftYAxisRenderer = ChartYAxisRenderer(viewPortHandler: _viewPortHandler, yAxis: _leftAxis, transformer: _leftAxisTransformer)\n        _rightYAxisRenderer = ChartYAxisRenderer(viewPortHandler: _viewPortHandler, yAxis: _rightAxis, transformer: _rightAxisTransformer)\n        \n        _xAxisRenderer = ChartXAxisRenderer(viewPortHandler: _viewPortHandler, xAxis: _xAxis, transformer: _leftAxisTransformer)\n        \n        self.highlighter = ChartHighlighter(chart: self)\n        \n        _tapGestureRecognizer = NSUITapGestureRecognizer(target: self, action: #selector(BarLineChartViewBase.tapGestureRecognized(_:)))\n        _doubleTapGestureRecognizer = NSUITapGestureRecognizer(target: self, action: #selector(BarLineChartViewBase.doubleTapGestureRecognized(_:)))\n        _doubleTapGestureRecognizer.nsuiNumberOfTapsRequired = 2\n        _panGestureRecognizer = NSUIPanGestureRecognizer(target: self, action: #selector(BarLineChartViewBase.panGestureRecognized(_:)))\n        \n        _panGestureRecognizer.delegate = self\n        \n        self.addGestureRecognizer(_tapGestureRecognizer)\n        self.addGestureRecognizer(_doubleTapGestureRecognizer)\n        self.addGestureRecognizer(_panGestureRecognizer)\n        \n        _doubleTapGestureRecognizer.enabled = _doubleTapToZoomEnabled\n        _panGestureRecognizer.enabled = _dragEnabled\n\n        #if !os(tvOS)\n            _pinchGestureRecognizer = NSUIPinchGestureRecognizer(target: self, action: #selector(BarLineChartViewBase.pinchGestureRecognized(_:)))\n            _pinchGestureRecognizer.delegate = self\n            self.addGestureRecognizer(_pinchGestureRecognizer)\n            _pinchGestureRecognizer.enabled = _pinchZoomEnabled || _scaleXEnabled || _scaleYEnabled\n        #endif\n    }\n    \n    public override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>)\n    {\n        // Saving current position of chart.\n        var oldPoint: CGPoint?\n        if (keepPositionOnRotation && (keyPath == \"frame\" || keyPath == \"bounds\"))\n        {\n            oldPoint = viewPortHandler.contentRect.origin\n            getTransformer(.Left).pixelToValue(&oldPoint!)\n        }\n        \n        // Superclass transforms chart.\n        super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)\n        \n        // Restoring old position of chart\n        if var newPoint = oldPoint where keepPositionOnRotation\n        {\n            getTransformer(.Left).pointValueToPixel(&newPoint)\n            viewPortHandler.centerViewPort(pt: newPoint, chart: self)\n        }\n        else\n        {\n            viewPortHandler.refresh(newMatrix: viewPortHandler.touchMatrix, chart: self, invalidate: true)\n        }\n    }\n    \n    public override func drawRect(rect: CGRect)\n    {\n        super.drawRect(rect)\n        \n        if _data === nil\n        {\n            return\n        }\n        \n        let optionalContext = NSUIGraphicsGetCurrentContext()\n        guard let context = optionalContext else { return }\n        \n        calcModulus()\n        \n        if (_xAxisRenderer !== nil)\n        {\n            _xAxisRenderer!.calcXBounds(chart: self, xAxisModulus: _xAxis.axisLabelModulus)\n        }\n        if (renderer !== nil)\n        {\n            renderer!.calcXBounds(chart: self, xAxisModulus: _xAxis.axisLabelModulus)\n        }\n\n        // execute all drawing commands\n        drawGridBackground(context: context)\n        \n        if (_leftAxis.isEnabled)\n        {\n            _leftYAxisRenderer?.computeAxis(yMin: _leftAxis._axisMinimum, yMax: _leftAxis._axisMaximum)\n        }\n        if (_rightAxis.isEnabled)\n        {\n            _rightYAxisRenderer?.computeAxis(yMin: _rightAxis._axisMinimum, yMax: _rightAxis._axisMaximum)\n        }\n        \n        _xAxisRenderer?.renderAxisLine(context: context)\n        _leftYAxisRenderer?.renderAxisLine(context: context)\n        _rightYAxisRenderer?.renderAxisLine(context: context)\n\n        if (_autoScaleMinMaxEnabled)\n        {\n            let lowestVisibleXIndex = self.lowestVisibleXIndex,\n                highestVisibleXIndex = self.highestVisibleXIndex\n            \n            if (_autoScaleLastLowestVisibleXIndex == nil || _autoScaleLastLowestVisibleXIndex != lowestVisibleXIndex ||\n                _autoScaleLastHighestVisibleXIndex == nil || _autoScaleLastHighestVisibleXIndex != highestVisibleXIndex)\n            {\n                calcMinMax()\n                calculateOffsets()\n                \n                _autoScaleLastLowestVisibleXIndex = lowestVisibleXIndex\n                _autoScaleLastHighestVisibleXIndex = highestVisibleXIndex\n            }\n        }\n        \n        // make sure the graph values and grid cannot be drawn outside the content-rect\n        CGContextSaveGState(context)\n\n        CGContextClipToRect(context, _viewPortHandler.contentRect)\n        \n        _xAxisRenderer?.renderGridLines(context: context)\n        _leftYAxisRenderer?.renderGridLines(context: context)\n        _rightYAxisRenderer?.renderGridLines(context: context)\n        \n        if (_xAxis.isDrawLimitLinesBehindDataEnabled)\n        {\n            _xAxisRenderer?.renderLimitLines(context: context)\n        }\n        if (_leftAxis.isDrawLimitLinesBehindDataEnabled)\n        {\n            _leftYAxisRenderer?.renderLimitLines(context: context)\n        }\n        if (_rightAxis.isDrawLimitLinesBehindDataEnabled)\n        {\n            _rightYAxisRenderer?.renderLimitLines(context: context)\n        }\n        \n        renderer?.drawData(context: context)\n\n        // if highlighting is enabled\n        if (valuesToHighlight())\n        {\n            renderer?.drawHighlighted(context: context, indices: _indicesToHighlight)\n        }\n\n        // Removes clipping rectangle\n        CGContextRestoreGState(context)\n        \n        renderer!.drawExtras(context: context)\n        \n        if (!_xAxis.isDrawLimitLinesBehindDataEnabled)\n        {\n            _xAxisRenderer?.renderLimitLines(context: context)\n        }\n        if (!_leftAxis.isDrawLimitLinesBehindDataEnabled)\n        {\n            _leftYAxisRenderer?.renderLimitLines(context: context)\n        }\n        if (!_rightAxis.isDrawLimitLinesBehindDataEnabled)\n        {\n            _rightYAxisRenderer?.renderLimitLines(context: context)\n        }\n        \n        _xAxisRenderer.renderAxisLabels(context: context)\n        _leftYAxisRenderer.renderAxisLabels(context: context)\n        _rightYAxisRenderer.renderAxisLabels(context: context)\n\n        renderer!.drawValues(context: context)\n\n        _legendRenderer.renderLegend(context: context)\n        // drawLegend()\n\n        drawMarkers(context: context)\n\n        drawDescription(context: context)\n    }\n    \n    internal func prepareValuePxMatrix()\n    {\n        _rightAxisTransformer.prepareMatrixValuePx(chartXMin: _xAxis._axisMinimum, deltaX: CGFloat(xAxis.axisRange), deltaY: CGFloat(_rightAxis.axisRange), chartYMin: _rightAxis._axisMinimum)\n        _leftAxisTransformer.prepareMatrixValuePx(chartXMin: xAxis._axisMinimum, deltaX: CGFloat(xAxis.axisRange), deltaY: CGFloat(_leftAxis.axisRange), chartYMin: _leftAxis._axisMinimum)\n    }\n    \n    internal func prepareOffsetMatrix()\n    {\n        _rightAxisTransformer.prepareMatrixOffset(_rightAxis.isInverted)\n        _leftAxisTransformer.prepareMatrixOffset(_leftAxis.isInverted)\n    }\n    \n    public override func notifyDataSetChanged()\n    {\n        calcMinMax()\n        \n        _leftAxis?._defaultValueFormatter = _defaultValueFormatter\n        _rightAxis?._defaultValueFormatter = _defaultValueFormatter\n        \n        _leftYAxisRenderer?.computeAxis(yMin: _leftAxis._axisMinimum, yMax: _leftAxis._axisMaximum)\n        _rightYAxisRenderer?.computeAxis(yMin: _rightAxis._axisMinimum, yMax: _rightAxis._axisMaximum)\n        \n        if let data = _data\n        {\n            _xAxisRenderer?.computeAxis(xValAverageLength: data.xValAverageLength, xValues: data.xVals)\n\n            if (_legend !== nil)\n            {\n                _legendRenderer?.computeLegend(data)\n            }\n        }\n        \n        calculateOffsets()\n        \n        setNeedsDisplay()\n    }\n    \n    internal override func calcMinMax()\n    {\n        if (_autoScaleMinMaxEnabled)\n        {\n            _data?.calcMinMax(start: lowestVisibleXIndex, end: highestVisibleXIndex)\n        }\n        \n        // calculate / set x-axis range\n        _xAxis._axisMaximum = Double((_data?.xVals.count ?? 0) - 1)\n        _xAxis.axisRange = .abs(_xAxis._axisMaximum - _xAxis._axisMinimum);\n        \n        // calculate axis range (min / max) according to provided data\n        _leftAxis.calcMinMax(min: _data?.getYMin(.Left) ?? 0.0, max: _data?.getYMax(.Left) ?? 0.0)\n        _rightAxis.calcMinMax(min: _data?.getYMin(.Right) ?? 0.0, max: _data?.getYMax(.Right) ?? 0.0)\n    }\n    \n    internal override func calculateOffsets()\n    {\n        if (!_customViewPortEnabled)\n        {\n            var offsetLeft = CGFloat(0.0)\n            var offsetRight = CGFloat(0.0)\n            var offsetTop = CGFloat(0.0)\n            var offsetBottom = CGFloat(0.0)\n            \n            // setup offsets for legend\n            if (_legend !== nil && _legend.isEnabled)\n            {\n                if (_legend.position == .RightOfChart\n                    || _legend.position == .RightOfChartCenter)\n                {\n                    offsetRight += min(_legend.neededWidth, _viewPortHandler.chartWidth * _legend.maxSizePercent) + _legend.xOffset * 2.0\n                }\n                if (_legend.position == .LeftOfChart\n                    || _legend.position == .LeftOfChartCenter)\n                {\n                    offsetLeft += min(_legend.neededWidth, _viewPortHandler.chartWidth * _legend.maxSizePercent) + _legend.xOffset * 2.0\n                }\n                else if (_legend.position == .BelowChartLeft\n                    || _legend.position == .BelowChartRight\n                    || _legend.position == .BelowChartCenter)\n                {\n                    // It's possible that we do not need this offset anymore as it\n                    //   is available through the extraOffsets, but changing it can mean\n                    //   changing default visibility for existing apps.\n                    let yOffset = _legend.textHeightMax\n                    \n                    offsetBottom += min(_legend.neededHeight + yOffset, _viewPortHandler.chartHeight * _legend.maxSizePercent)\n                }\n                else if (_legend.position == .AboveChartLeft\n                    || _legend.position == .AboveChartRight\n                    || _legend.position == .AboveChartCenter)\n                {\n                    // It's possible that we do not need this offset anymore as it\n                    //   is available through the extraOffsets, but changing it can mean\n                    //   changing default visibility for existing apps.\n                    let yOffset = _legend.textHeightMax\n                    \n                    offsetTop += min(_legend.neededHeight + yOffset, _viewPortHandler.chartHeight * _legend.maxSizePercent)\n                }\n            }\n            \n            // offsets for y-labels\n            if (leftAxis.needsOffset)\n            {\n                offsetLeft += leftAxis.requiredSize().width\n            }\n            \n            if (rightAxis.needsOffset)\n            {\n                offsetRight += rightAxis.requiredSize().width\n            }\n\n            if (xAxis.isEnabled && xAxis.isDrawLabelsEnabled)\n            {\n                let xlabelheight = xAxis.labelRotatedHeight + xAxis.yOffset\n                \n                // offsets for x-labels\n                if (xAxis.labelPosition == .Bottom)\n                {\n                    offsetBottom += xlabelheight\n                }\n                else if (xAxis.labelPosition == .Top)\n                {\n                    offsetTop += xlabelheight\n                }\n                else if (xAxis.labelPosition == .BothSided)\n                {\n                    offsetBottom += xlabelheight\n                    offsetTop += xlabelheight\n                }\n            }\n            \n            offsetTop += self.extraTopOffset\n            offsetRight += self.extraRightOffset\n            offsetBottom += self.extraBottomOffset\n            offsetLeft += self.extraLeftOffset\n\n            _viewPortHandler.restrainViewPort(\n                offsetLeft: max(self.minOffset, offsetLeft),\n                offsetTop: max(self.minOffset, offsetTop),\n                offsetRight: max(self.minOffset, offsetRight),\n                offsetBottom: max(self.minOffset, offsetBottom))\n        }\n        \n        prepareOffsetMatrix()\n        prepareValuePxMatrix()\n    }\n   \n\n    /// calculates the modulus for x-labels and grid\n    internal func calcModulus()\n    {\n        if (_xAxis === nil || !_xAxis.isEnabled)\n        {\n            return\n        }\n        \n        if (!_xAxis.isAxisModulusCustom)\n        {\n            _xAxis.axisLabelModulus = Int(ceil((CGFloat(_data?.xValCount ?? 0) * _xAxis.labelRotatedWidth) / (_viewPortHandler.contentWidth * _viewPortHandler.touchMatrix.a)))\n        }\n        \n        if (_xAxis.axisLabelModulus < 1)\n        {\n            _xAxis.axisLabelModulus = 1\n        }\n    }\n    \n    public override func getMarkerPosition(entry e: ChartDataEntry, highlight: ChartHighlight) -> CGPoint\n    {\n        guard let data = _data else { return CGPointZero }\n\n        let dataSetIndex = highlight.dataSetIndex\n        var xPos = CGFloat(e.xIndex)\n        var yPos = CGFloat(e.value)\n        \n        if (self.isKindOfClass(BarChartView))\n        {\n            let bd = _data as! BarChartData\n            let space = bd.groupSpace\n            let setCount = data.dataSetCount\n            let i = e.xIndex\n            \n            if self is HorizontalBarChartView\n            {\n                // calculate the x-position, depending on datasetcount\n                let y = CGFloat(i + i * (setCount - 1) + dataSetIndex) + space * CGFloat(i) + space / 2.0\n                \n                yPos = y\n                \n                if let entry = e as? BarChartDataEntry\n                {\n                    if entry.values != nil && highlight.range !== nil\n                    {\n                        xPos = CGFloat(highlight.range!.to)\n                    }\n                    else\n                    {\n                        xPos = CGFloat(e.value)\n                    }\n                }\n            }\n            else\n            {\n                let x = CGFloat(i + i * (setCount - 1) + dataSetIndex) + space * CGFloat(i) + space / 2.0\n                \n                xPos = x\n                \n                if let entry = e as? BarChartDataEntry\n                {\n                    if entry.values != nil && highlight.range !== nil\n                    {\n                        yPos = CGFloat(highlight.range!.to)\n                    }\n                    else\n                    {\n                        yPos = CGFloat(e.value)\n                    }\n                }\n            }\n        }\n        \n        // position of the marker depends on selected value index and value\n        var pt = CGPoint(x: xPos, y: yPos * _animator.phaseY)\n        \n        getTransformer(data.getDataSetByIndex(dataSetIndex)!.axisDependency).pointValueToPixel(&pt)\n        \n        return pt\n    }\n    \n    /// draws the grid background\n    internal func drawGridBackground(context context: CGContext)\n    {\n        if (drawGridBackgroundEnabled || drawBordersEnabled)\n        {\n            CGContextSaveGState(context)\n        }\n        \n        if (drawGridBackgroundEnabled)\n        {\n            // draw the grid background\n            CGContextSetFillColorWithColor(context, gridBackgroundColor.CGColor)\n            CGContextFillRect(context, _viewPortHandler.contentRect)\n        }\n        \n        if (drawBordersEnabled)\n        {\n            CGContextSetLineWidth(context, borderLineWidth)\n            CGContextSetStrokeColorWithColor(context, borderColor.CGColor)\n            CGContextStrokeRect(context, _viewPortHandler.contentRect)\n        }\n        \n        if (drawGridBackgroundEnabled || drawBordersEnabled)\n        {\n            CGContextRestoreGState(context)\n        }\n    }\n    \n    // MARK: - Gestures\n    \n    private enum GestureScaleAxis\n    {\n        case Both\n        case X\n        case Y\n    }\n    \n    private var _isDragging = false\n    private var _isScaling = false\n    private var _gestureScaleAxis = GestureScaleAxis.Both\n    private var _closestDataSetToTouch: IChartDataSet!\n    private var _panGestureReachedEdge: Bool = false\n    private weak var _outerScrollView: NSUIScrollView?\n    \n    private var _lastPanPoint = CGPoint() /// This is to prevent using setTranslation which resets velocity\n    \n    private var _decelerationLastTime: NSTimeInterval = 0.0\n    private var _decelerationDisplayLink: NSUIDisplayLink!\n    private var _decelerationVelocity = CGPoint()\n    \n    @objc private func tapGestureRecognized(recognizer: NSUITapGestureRecognizer)\n    {\n        if _data === nil\n        {\n            return\n        }\n        \n        if (recognizer.state == NSUIGestureRecognizerState.Ended)\n        {\n            if !self.isHighLightPerTapEnabled { return }\n            \n            let h = getHighlightByTouchPoint(recognizer.locationInView(self))\n            \n            if (h === nil || h!.isEqual(self.lastHighlighted))\n            {\n                self.highlightValue(highlight: nil, callDelegate: true)\n                self.lastHighlighted = nil\n            }\n            else\n            {\n                self.lastHighlighted = h\n                self.highlightValue(highlight: h, callDelegate: true)\n            }\n        }\n    }\n    \n    @objc private func doubleTapGestureRecognized(recognizer: NSUITapGestureRecognizer)\n    {\n        if _data === nil\n        {\n            return\n        }\n        \n        if (recognizer.state == NSUIGestureRecognizerState.Ended)\n        {\n            if _data !== nil && _doubleTapToZoomEnabled\n            {\n                var location = recognizer.locationInView(self)\n                location.x = location.x - _viewPortHandler.offsetLeft\n                \n                if (isAnyAxisInverted && _closestDataSetToTouch !== nil && getAxis(_closestDataSetToTouch.axisDependency).isInverted)\n                {\n                    location.y = -(location.y - _viewPortHandler.offsetTop)\n                }\n                else\n                {\n                    location.y = -(self.bounds.size.height - location.y - _viewPortHandler.offsetBottom)\n                }\n                \n                self.zoom(isScaleXEnabled ? 1.4 : 1.0, scaleY: isScaleYEnabled ? 1.4 : 1.0, x: location.x, y: location.y)\n            }\n        }\n    }\n    \n    #if !os(tvOS)\n    @objc private func pinchGestureRecognized(recognizer: NSUIPinchGestureRecognizer)\n    {\n        if (recognizer.state == NSUIGestureRecognizerState.Began)\n        {\n            stopDeceleration()\n            \n            if _data !== nil && (_pinchZoomEnabled || _scaleXEnabled || _scaleYEnabled)\n            {\n                _isScaling = true\n                \n                if (_pinchZoomEnabled)\n                {\n                    _gestureScaleAxis = .Both\n                }\n                else\n                {\n                    let x = abs(recognizer.locationInView(self).x - recognizer.nsuiLocationOfTouch(1, inView: self).x)\n                    let y = abs(recognizer.locationInView(self).y - recognizer.nsuiLocationOfTouch(1, inView: self).y)\n                    \n                    if (x > y)\n                    {\n                        _gestureScaleAxis = .X\n                    }\n                    else\n                    {\n                        _gestureScaleAxis = .Y\n                    }\n                }\n            }\n        }\n        else if (recognizer.state == NSUIGestureRecognizerState.Ended ||\n            recognizer.state == NSUIGestureRecognizerState.Cancelled)\n        {\n            if (_isScaling)\n            {\n                _isScaling = false\n                \n                // Range might have changed, which means that Y-axis labels could have changed in size, affecting Y-axis size. So we need to recalculate offsets.\n                calculateOffsets()\n                setNeedsDisplay()\n            }\n        }\n        else if (recognizer.state == NSUIGestureRecognizerState.Changed)\n        {\n            let isZoomingOut = (recognizer.nsuiScale < 1)\n            var canZoomMoreX = isZoomingOut ? _viewPortHandler.canZoomOutMoreX : _viewPortHandler.canZoomInMoreX\n            var canZoomMoreY = isZoomingOut ? _viewPortHandler.canZoomOutMoreY : _viewPortHandler.canZoomInMoreY\n            \n            if (_isScaling)\n            {\n                canZoomMoreX = canZoomMoreX && _scaleXEnabled && (_gestureScaleAxis == .Both || _gestureScaleAxis == .X);\n                canZoomMoreY = canZoomMoreY && _scaleYEnabled && (_gestureScaleAxis == .Both || _gestureScaleAxis == .Y);\n                if canZoomMoreX || canZoomMoreY\n                {\n                    var location = recognizer.locationInView(self)\n                    location.x = location.x - _viewPortHandler.offsetLeft\n\n                    if (isAnyAxisInverted && _closestDataSetToTouch !== nil && getAxis(_closestDataSetToTouch.axisDependency).isInverted)\n                    {\n                        location.y = -(location.y - _viewPortHandler.offsetTop)\n                    }\n                    else\n                    {\n                        location.y = -(_viewPortHandler.chartHeight - location.y - _viewPortHandler.offsetBottom)\n                    }\n                    \n                    let scaleX = canZoomMoreX ? recognizer.nsuiScale : 1.0\n                    let scaleY = canZoomMoreY ? recognizer.nsuiScale : 1.0\n                    \n                    var matrix = CGAffineTransformMakeTranslation(location.x, location.y)\n                    matrix = CGAffineTransformScale(matrix, scaleX, scaleY)\n                    matrix = CGAffineTransformTranslate(matrix,\n                        -location.x, -location.y)\n                    \n                    matrix = CGAffineTransformConcat(_viewPortHandler.touchMatrix, matrix)\n                    \n                    _viewPortHandler.refresh(newMatrix: matrix, chart: self, invalidate: true)\n                    \n                    if (delegate !== nil)\n                    {\n                        delegate?.chartScaled?(self, scaleX: scaleX, scaleY: scaleY)\n                    }\n                }\n                \n                recognizer.nsuiScale = 1.0\n            }\n        }\n    }\n    #endif\n    \n    @objc private func panGestureRecognized(recognizer: NSUIPanGestureRecognizer)\n    {\n        if (recognizer.state == NSUIGestureRecognizerState.Began && recognizer.nsuiNumberOfTouches() > 0)\n        {\n            stopDeceleration()\n            \n            if _data === nil\n            { // If we have no data, we have nothing to pan and no data to highlight\n                return;\n            }\n            \n            // If drag is enabled and we are in a position where there's something to drag:\n            //  * If we're zoomed in, then obviously we have something to drag.\n            //  * If we have a drag offset - we always have something to drag\n            if self.isDragEnabled &&\n                (!self.hasNoDragOffset || !self.isFullyZoomedOut)\n            {\n                _isDragging = true\n                \n                _closestDataSetToTouch = getDataSetByTouchPoint(recognizer.nsuiLocationOfTouch(0, inView: self))\n                \n                let translation = recognizer.translationInView(self)\n                let didUserDrag = (self is HorizontalBarChartView) ? translation.y != 0.0 : translation.x != 0.0\n                \n                // Check to see if user dragged at all and if so, can the chart be dragged by the given amount\n                if (didUserDrag && !performPanChange(translation: translation))\n                {\n                    if (_outerScrollView !== nil)\n                    {\n                        // We can stop dragging right now, and let the scroll view take control\n                        _outerScrollView = nil\n                        _isDragging = false\n                    }\n                }\n                else\n                {\n                    if (_outerScrollView !== nil)\n                    {\n                        // Prevent the parent scroll view from scrolling\n                        _outerScrollView?.scrollEnabled = false\n                    }\n                }\n                \n                _lastPanPoint = recognizer.translationInView(self)\n            }\n            else if self.isHighlightPerDragEnabled\n            {\n                // We will only handle highlights on NSUIGestureRecognizerState.Changed\n                \n                _isDragging = false\n            }\n        }\n        else if (recognizer.state == NSUIGestureRecognizerState.Changed)\n        {\n            if (_isDragging)\n            {\n                let originalTranslation = recognizer.translationInView(self)\n                let translation = CGPoint(x: originalTranslation.x - _lastPanPoint.x, y: originalTranslation.y - _lastPanPoint.y)\n                \n                performPanChange(translation: translation)\n                \n                _lastPanPoint = originalTranslation\n            }\n            else if (isHighlightPerDragEnabled)\n            {\n                let h = getHighlightByTouchPoint(recognizer.locationInView(self))\n                \n                let lastHighlighted = self.lastHighlighted\n                \n                if ((h === nil && lastHighlighted !== nil) ||\n                    (h !== nil && lastHighlighted === nil) ||\n                    (h !== nil && lastHighlighted !== nil && !h!.isEqual(lastHighlighted)))\n                {\n                    self.lastHighlighted = h\n                    self.highlightValue(highlight: h, callDelegate: true)\n                }\n            }\n        }\n        else if (recognizer.state == NSUIGestureRecognizerState.Ended || recognizer.state == NSUIGestureRecognizerState.Cancelled)\n        {\n            if (_isDragging)\n            {\n                if (recognizer.state == NSUIGestureRecognizerState.Ended && isDragDecelerationEnabled)\n                {\n                    stopDeceleration()\n                    \n                    _decelerationLastTime = CACurrentMediaTime()\n                    _decelerationVelocity = recognizer.velocityInView(self)\n                    \n                    _decelerationDisplayLink = NSUIDisplayLink(target: self, selector: #selector(BarLineChartViewBase.decelerationLoop))\n                    _decelerationDisplayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)\n                }\n                \n                _isDragging = false\n            }\n            \n            if (_outerScrollView !== nil)\n            {\n                _outerScrollView?.scrollEnabled = true\n                _outerScrollView = nil\n            }\n        }\n    }\n    \n    private func performPanChange(translation translation: CGPoint) -> Bool\n    {\n        var translation = translation\n        \n        if (isAnyAxisInverted && _closestDataSetToTouch !== nil\n            && getAxis(_closestDataSetToTouch.axisDependency).isInverted)\n        {\n            if (self is HorizontalBarChartView)\n            {\n                translation.x = -translation.x\n            }\n            else\n            {\n                translation.y = -translation.y\n            }\n        }\n        \n        let originalMatrix = _viewPortHandler.touchMatrix\n        \n        var matrix = CGAffineTransformMakeTranslation(translation.x, translation.y)\n        matrix = CGAffineTransformConcat(originalMatrix, matrix)\n        \n        matrix = _viewPortHandler.refresh(newMatrix: matrix, chart: self, invalidate: true)\n        \n        if (delegate !== nil)\n        {\n            delegate?.chartTranslated?(self, dX: translation.x, dY: translation.y)\n        }\n        \n        // Did we managed to actually drag or did we reach the edge?\n        return matrix.tx != originalMatrix.tx || matrix.ty != originalMatrix.ty\n    }\n    \n    public func stopDeceleration()\n    {\n        if (_decelerationDisplayLink !== nil)\n        {\n            _decelerationDisplayLink.removeFromRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)\n            _decelerationDisplayLink = nil\n        }\n    }\n    \n    @objc private func decelerationLoop()\n    {\n        let currentTime = CACurrentMediaTime()\n        \n        _decelerationVelocity.x *= self.dragDecelerationFrictionCoef\n        _decelerationVelocity.y *= self.dragDecelerationFrictionCoef\n        \n        let timeInterval = CGFloat(currentTime - _decelerationLastTime)\n        \n        let distance = CGPoint(\n            x: _decelerationVelocity.x * timeInterval,\n            y: _decelerationVelocity.y * timeInterval\n        )\n        \n        if (!performPanChange(translation: distance))\n        {\n            // We reached the edge, stop\n            _decelerationVelocity.x = 0.0\n            _decelerationVelocity.y = 0.0\n        }\n        \n        _decelerationLastTime = currentTime\n        \n        if (abs(_decelerationVelocity.x) < 0.001 && abs(_decelerationVelocity.y) < 0.001)\n        {\n            stopDeceleration()\n            \n            // Range might have changed, which means that Y-axis labels could have changed in size, affecting Y-axis size. So we need to recalculate offsets.\n            calculateOffsets()\n            setNeedsDisplay()\n        }\n    }\n    \n    private func nsuiGestureRecognizerShouldBegin(gestureRecognizer: NSUIGestureRecognizer) -> Bool\n    {\n        if (gestureRecognizer == _panGestureRecognizer)\n        {\n            if _data === nil || !_dragEnabled ||\n                (self.hasNoDragOffset && self.isFullyZoomedOut && !self.isHighlightPerDragEnabled)\n            {\n                return false\n            }\n        }\n        else\n        {\n            #if !os(tvOS)\n                if (gestureRecognizer == _pinchGestureRecognizer)\n                {\n                    if _data === nil || (!_pinchZoomEnabled && !_scaleXEnabled && !_scaleYEnabled)\n                    {\n                        return false\n                    }\n                }\n            #endif\n        }\n        \n        return true\n    }\n    \n    #if !os(OSX)\n    public override func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool\n    {\n        if (!super.gestureRecognizerShouldBegin(gestureRecognizer))\n        {\n            return false\n        }\n        \n        return nsuiGestureRecognizerShouldBegin(gestureRecognizer)\n    }\n    #endif\n    \n    #if os(OSX)\n    public func gestureRecognizerShouldBegin(gestureRecognizer: NSGestureRecognizer) -> Bool\n    {\n        return nsuiGestureRecognizerShouldBegin(gestureRecognizer)\n    }\n    #endif\n    \n    public func gestureRecognizer(gestureRecognizer: NSUIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: NSUIGestureRecognizer) -> Bool\n    {\n        #if !os(tvOS)\n        if ((gestureRecognizer.isKindOfClass(NSUIPinchGestureRecognizer) &&\n            otherGestureRecognizer.isKindOfClass(NSUIPanGestureRecognizer)) ||\n            (gestureRecognizer.isKindOfClass(NSUIPanGestureRecognizer) &&\n                otherGestureRecognizer.isKindOfClass(NSUIPinchGestureRecognizer)))\n        {\n            return true\n        }\n        #endif\n        \n        if (gestureRecognizer.isKindOfClass(NSUIPanGestureRecognizer) &&\n            otherGestureRecognizer.isKindOfClass(NSUIPanGestureRecognizer) && (\n                gestureRecognizer == _panGestureRecognizer\n            ))\n        {\n            var scrollView = self.superview\n            while (scrollView !== nil && !scrollView!.isKindOfClass(NSUIScrollView))\n            {\n                scrollView = scrollView?.superview\n            }\n            \n            // If there is two scrollview together, we pick the superview of the inner scrollview.\n            // In the case of UITableViewWrepperView, the superview will be UITableView\n            if let superViewOfScrollView = scrollView?.superview where superViewOfScrollView.isKindOfClass(NSUIScrollView)\n            {\n                scrollView = superViewOfScrollView\n            }\n\n            var foundScrollView = scrollView as? NSUIScrollView\n            \n            if (foundScrollView !== nil && !foundScrollView!.scrollEnabled)\n            {\n                foundScrollView = nil\n            }\n            \n            var scrollViewPanGestureRecognizer: NSUIGestureRecognizer!\n            \n            if (foundScrollView !== nil)\n            {\n                for scrollRecognizer in foundScrollView!.nsuiGestureRecognizers!\n                {\n                    if (scrollRecognizer.isKindOfClass(NSUIPanGestureRecognizer))\n                    {\n                        scrollViewPanGestureRecognizer = scrollRecognizer as! NSUIPanGestureRecognizer\n                        break\n                    }\n                }\n            }\n            \n            if (otherGestureRecognizer === scrollViewPanGestureRecognizer)\n            {\n                _outerScrollView = foundScrollView\n                \n                return true\n            }\n        }\n        \n        return false\n    }\n    \n    /// MARK: Viewport modifiers\n    \n    /// Zooms in by 1.4, into the charts center. center.\n    public func zoomIn()\n    {\n        let center = _viewPortHandler.contentCenter\n        \n        let matrix = _viewPortHandler.zoomIn(x: center.x, y: -center.y)\n        _viewPortHandler.refresh(newMatrix: matrix, chart: self, invalidate: false)\n        \n        // Range might have changed, which means that Y-axis labels could have changed in size, affecting Y-axis size. So we need to recalculate offsets.\n        calculateOffsets()\n        setNeedsDisplay()\n    }\n\n    /// Zooms out by 0.7, from the charts center. center.\n    public func zoomOut()\n    {\n        let center = _viewPortHandler.contentCenter\n        \n        let matrix = _viewPortHandler.zoomOut(x: center.x, y: -center.y)\n        _viewPortHandler.refresh(newMatrix: matrix, chart: self, invalidate: false)\n\n        // Range might have changed, which means that Y-axis labels could have changed in size, affecting Y-axis size. So we need to recalculate offsets.\n        calculateOffsets()\n        setNeedsDisplay()\n    }\n\n    /// Zooms in or out by the given scale factor. x and y are the coordinates\n    /// (in pixels) of the zoom center.\n    ///\n    /// - parameter scaleX: if < 1 --> zoom out, if > 1 --> zoom in\n    /// - parameter scaleY: if < 1 --> zoom out, if > 1 --> zoom in\n    /// - parameter x:\n    /// - parameter y:\n    public func zoom(scaleX: CGFloat, scaleY: CGFloat, x: CGFloat, y: CGFloat)\n    {\n        let matrix = _viewPortHandler.zoom(scaleX: scaleX, scaleY: scaleY, x: x, y: y)\n        _viewPortHandler.refresh(newMatrix: matrix, chart: self, invalidate: false)\n        \n        // Range might have changed, which means that Y-axis labels could have changed in size, affecting Y-axis size. So we need to recalculate offsets.\n        calculateOffsets()\n        setNeedsDisplay()\n    }\n\n    /// Zooms in or out by the given scale factor.\n    /// x and y are the values (**not pixels**) which to zoom to or from (the values of the zoom center).\n    ///\n    /// - parameter scaleX: if < 1 --> zoom out, if > 1 --> zoom in\n    /// - parameter scaleY: if < 1 --> zoom out, if > 1 --> zoom in\n    /// - parameter xIndex:\n    /// - parameter yValue:\n    /// - parameter axis:\n    public func zoom(\n        scaleX: CGFloat,\n        scaleY: CGFloat,\n        xIndex: CGFloat,\n        yValue: Double,\n        axis: ChartYAxis.AxisDependency)\n    {\n        let job = ZoomChartViewJob(viewPortHandler: viewPortHandler, scaleX: scaleX, scaleY: scaleY, xIndex: xIndex, yValue: yValue, transformer: getTransformer(axis), axis: axis, view: self)\n        addViewportJob(job)\n    }\n    \n    /// Zooms by the specified scale factor to the specified values on the specified axis.\n    ///\n    /// - parameter scaleX:\n    /// - parameter scaleY:\n    /// - parameter xIndex:\n    /// - parameter yValue:\n    /// - parameter axis: which axis should be used as a reference for the y-axis\n    /// - parameter duration: the duration of the animation in seconds\n    /// - parameter easing:\n    public func zoomAndCenterViewAnimated(\n        scaleX scaleX: CGFloat,\n        scaleY: CGFloat,\n        xIndex: CGFloat,\n        yValue: Double,\n        axis: ChartYAxis.AxisDependency,\n        duration: NSTimeInterval,\n        easing: ChartEasingFunctionBlock?)\n    {\n        let origin = getValueByTouchPoint(\n            pt: CGPoint(x: viewPortHandler.contentLeft, y: viewPortHandler.contentTop),\n            axis: axis)\n        \n        let job = AnimatedZoomChartViewJob(\n            viewPortHandler: viewPortHandler,\n            transformer: getTransformer(axis),\n            view: self,\n            yAxis: getAxis(axis),\n            xValCount: _xAxis.values.count,\n            scaleX: scaleX,\n            scaleY: scaleY,\n            xOrigin: viewPortHandler.scaleX,\n            yOrigin: viewPortHandler.scaleY,\n            zoomCenterX: xIndex,\n            zoomCenterY: CGFloat(yValue),\n            zoomOriginX: origin.x,\n            zoomOriginY: origin.y,\n            duration: duration,\n            easing: easing)\n            \n        addViewportJob(job)\n    }\n    \n    /// Zooms by the specified scale factor to the specified values on the specified axis.\n    ///\n    /// - parameter scaleX:\n    /// - parameter scaleY:\n    /// - parameter xIndex:\n    /// - parameter yValue:\n    /// - parameter axis: which axis should be used as a reference for the y-axis\n    /// - parameter duration: the duration of the animation in seconds\n    /// - parameter easing:\n    public func zoomAndCenterViewAnimated(\n        scaleX scaleX: CGFloat,\n        scaleY: CGFloat,\n        xIndex: CGFloat,\n        yValue: Double,\n        axis: ChartYAxis.AxisDependency,\n        duration: NSTimeInterval,\n        easingOption: ChartEasingOption)\n    {\n        zoomAndCenterViewAnimated(scaleX: scaleX, scaleY: scaleY, xIndex: xIndex, yValue: yValue, axis: axis, duration: duration, easing: easingFunctionFromOption(easingOption))\n    }\n    \n    /// Zooms by the specified scale factor to the specified values on the specified axis.\n    ///\n    /// - parameter scaleX:\n    /// - parameter scaleY:\n    /// - parameter xIndex:\n    /// - parameter yValue:\n    /// - parameter axis: which axis should be used as a reference for the y-axis\n    /// - parameter duration: the duration of the animation in seconds\n    /// - parameter easing:\n    public func zoomAndCenterViewAnimated(\n        scaleX scaleX: CGFloat,\n        scaleY: CGFloat,\n        xIndex: CGFloat,\n        yValue: Double,\n        axis: ChartYAxis.AxisDependency,\n        duration: NSTimeInterval)\n    {\n        zoomAndCenterViewAnimated(scaleX: scaleX, scaleY: scaleY, xIndex: xIndex, yValue: yValue, axis: axis, duration: duration, easingOption: .EaseInOutSine)\n    }\n    \n    /// Resets all zooming and dragging and makes the chart fit exactly it's bounds.\n    public func fitScreen()\n    {\n        let matrix = _viewPortHandler.fitScreen()\n        _viewPortHandler.refresh(newMatrix: matrix, chart: self, invalidate: false)\n        \n        calculateOffsets()\n        setNeedsDisplay()\n    }\n    \n    /// Sets the minimum scale value to which can be zoomed out. 1 = fitScreen\n    public func setScaleMinima(scaleX: CGFloat, scaleY: CGFloat)\n    {\n        _viewPortHandler.setMinimumScaleX(scaleX)\n        _viewPortHandler.setMinimumScaleY(scaleY)\n    }\n    \n    /// Sets the size of the area (range on the x-axis) that should be maximum visible at once (no further zomming out allowed).\n    /// If this is e.g. set to 10, no more than 10 values on the x-axis can be viewed at once without scrolling.\n    public func setVisibleXRangeMaximum(maxXRange: CGFloat)\n    {\n        let xScale = CGFloat(_xAxis.axisRange) / maxXRange\n        _viewPortHandler.setMinimumScaleX(xScale)\n    }\n    \n    /// Sets the size of the area (range on the x-axis) that should be minimum visible at once (no further zooming in allowed).\n    /// If this is e.g. set to 10, no less than 10 values on the x-axis can be viewed at once without scrolling.\n    public func setVisibleXRangeMinimum(minXRange: CGFloat)\n    {\n        let xScale = CGFloat(_xAxis.axisRange) / minXRange\n        _viewPortHandler.setMaximumScaleX(xScale)\n    }\n\n    /// Limits the maximum and minimum value count that can be visible by pinching and zooming.\n    /// e.g. minRange=10, maxRange=100 no less than 10 values and no more that 100 values can be viewed\n    /// at once without scrolling\n    public func setVisibleXRange(minXRange minXRange: CGFloat, maxXRange: CGFloat)\n    {\n        let maxScale = CGFloat(_xAxis.axisRange) / minXRange\n        let minScale = CGFloat(_xAxis.axisRange) / maxXRange\n        _viewPortHandler.setMinMaxScaleX(minScaleX: minScale, maxScaleX: maxScale)\n    }\n    \n    /// Sets the size of the area (range on the y-axis) that should be maximum visible at once.\n    /// \n    /// - parameter yRange:\n    /// - parameter axis: - the axis for which this limit should apply\n    public func setVisibleYRangeMaximum(maxYRange: CGFloat, axis: ChartYAxis.AxisDependency)\n    {\n        let yScale = getDeltaY(axis) / maxYRange\n        _viewPortHandler.setMinimumScaleY(yScale)\n    }\n\n    /// Moves the left side of the current viewport to the specified x-index.\n    /// This also refreshes the chart by calling setNeedsDisplay().\n    public func moveViewToX(xIndex: CGFloat)\n    {\n        let job = MoveChartViewJob(\n            viewPortHandler: viewPortHandler,\n            xIndex: xIndex,\n            yValue: 0.0,\n            transformer: getTransformer(.Left),\n            view: self)\n        \n        addViewportJob(job)\n    }\n\n    /// Centers the viewport to the specified y-value on the y-axis.\n    /// This also refreshes the chart by calling setNeedsDisplay().\n    /// \n    /// - parameter yValue:\n    /// - parameter axis: - which axis should be used as a reference for the y-axis\n    public func moveViewToY(yValue: Double, axis: ChartYAxis.AxisDependency)\n    {\n        let valsInView = getDeltaY(axis) / _viewPortHandler.scaleY\n        \n        let job = MoveChartViewJob(\n            viewPortHandler: viewPortHandler,\n            xIndex: 0,\n            yValue: yValue + Double(valsInView) / 2.0,\n            transformer: getTransformer(axis),\n            view: self)\n        \n        addViewportJob(job)\n    }\n\n    /// This will move the left side of the current viewport to the specified x-index on the x-axis, and center the viewport to the specified y-value on the y-axis.\n    /// This also refreshes the chart by calling setNeedsDisplay().\n    /// \n    /// - parameter xIndex:\n    /// - parameter yValue:\n    /// - parameter axis: - which axis should be used as a reference for the y-axis\n    public func moveViewTo(xIndex xIndex: CGFloat, yValue: Double, axis: ChartYAxis.AxisDependency)\n    {\n        let valsInView = getDeltaY(axis) / _viewPortHandler.scaleY\n        \n        let job = MoveChartViewJob(\n            viewPortHandler: viewPortHandler,\n            xIndex: xIndex,\n            yValue: yValue + Double(valsInView) / 2.0,\n            transformer: getTransformer(axis),\n            view: self)\n        \n        addViewportJob(job)\n    }\n    \n    /// This will move the left side of the current viewport to the specified x-position and center the viewport to the specified y-position animated.\n    /// This also refreshes the chart by calling setNeedsDisplay().\n    ///\n    /// - parameter xIndex:\n    /// - parameter yValue:\n    /// - parameter axis: which axis should be used as a reference for the y-axis\n    /// - parameter duration: the duration of the animation in seconds\n    /// - parameter easing:\n    public func moveViewToAnimated(\n        xIndex xIndex: CGFloat,\n        yValue: Double,\n        axis: ChartYAxis.AxisDependency,\n        duration: NSTimeInterval,\n        easing: ChartEasingFunctionBlock?)\n    {\n        let bounds = getValueByTouchPoint(\n            pt: CGPoint(x: viewPortHandler.contentLeft, y: viewPortHandler.contentTop),\n            axis: axis)\n        \n        let valsInView = getDeltaY(axis) / _viewPortHandler.scaleY\n        \n        let job = AnimatedMoveChartViewJob(\n            viewPortHandler: viewPortHandler,\n            xIndex: xIndex,\n            yValue: yValue + Double(valsInView) / 2.0,\n            transformer: getTransformer(axis),\n            view: self,\n            xOrigin: bounds.x,\n            yOrigin: bounds.y,\n            duration: duration,\n            easing: easing)\n        \n        addViewportJob(job)\n    }\n    \n    /// This will move the left side of the current viewport to the specified x-position and center the viewport to the specified y-position animated.\n    /// This also refreshes the chart by calling setNeedsDisplay().\n    ///\n    /// - parameter xIndex:\n    /// - parameter yValue:\n    /// - parameter axis: which axis should be used as a reference for the y-axis\n    /// - parameter duration: the duration of the animation in seconds\n    /// - parameter easing:\n    public func moveViewToAnimated(\n        xIndex xIndex: CGFloat,\n        yValue: Double,\n        axis: ChartYAxis.AxisDependency,\n        duration: NSTimeInterval,\n        easingOption: ChartEasingOption)\n    {\n        moveViewToAnimated(xIndex: xIndex, yValue: yValue, axis: axis, duration: duration, easing: easingFunctionFromOption(easingOption))\n    }\n    \n    /// This will move the left side of the current viewport to the specified x-position and center the viewport to the specified y-position animated.\n    /// This also refreshes the chart by calling setNeedsDisplay().\n    ///\n    /// - parameter xIndex:\n    /// - parameter yValue:\n    /// - parameter axis: which axis should be used as a reference for the y-axis\n    /// - parameter duration: the duration of the animation in seconds\n    /// - parameter easing:\n    public func moveViewToAnimated(\n        xIndex xIndex: CGFloat,\n        yValue: Double,\n        axis: ChartYAxis.AxisDependency,\n        duration: NSTimeInterval)\n    {\n        moveViewToAnimated(xIndex: xIndex, yValue: yValue, axis: axis, duration: duration, easingOption: .EaseInOutSine)\n    }\n    \n    /// This will move the center of the current viewport to the specified x-index and y-value.\n    /// This also refreshes the chart by calling setNeedsDisplay().\n    ///\n    /// - parameter xIndex:\n    /// - parameter yValue:\n    /// - parameter axis: - which axis should be used as a reference for the y-axis\n    public func centerViewTo(\n        xIndex xIndex: CGFloat,\n        yValue: Double,\n        axis: ChartYAxis.AxisDependency)\n    {\n        let valsInView = getDeltaY(axis) / _viewPortHandler.scaleY\n        let xsInView = CGFloat(xAxis.values.count) / _viewPortHandler.scaleX\n        \n        let job = MoveChartViewJob(\n            viewPortHandler: viewPortHandler,\n            xIndex: xIndex - xsInView / 2.0,\n            yValue: yValue + Double(valsInView) / 2.0,\n            transformer: getTransformer(axis),\n            view: self)\n        \n        addViewportJob(job)\n    }\n    \n    /// This will move the center of the current viewport to the specified x-value and y-value animated.\n    ///\n    /// - parameter xIndex:\n    /// - parameter yValue:\n    /// - parameter axis: which axis should be used as a reference for the y-axis\n    /// - parameter duration: the duration of the animation in seconds\n    /// - parameter easing:\n    public func centerViewToAnimated(\n        xIndex xIndex: CGFloat,\n        yValue: Double,\n        axis: ChartYAxis.AxisDependency,\n        duration: NSTimeInterval,\n        easing: ChartEasingFunctionBlock?)\n    {\n        let bounds = getValueByTouchPoint(\n            pt: CGPoint(x: viewPortHandler.contentLeft, y: viewPortHandler.contentTop),\n            axis: axis)\n        \n        let valsInView = getDeltaY(axis) / _viewPortHandler.scaleY\n        let xsInView = CGFloat(xAxis.values.count) / _viewPortHandler.scaleX\n        \n        let job = AnimatedMoveChartViewJob(\n            viewPortHandler: viewPortHandler,\n            xIndex: xIndex - xsInView / 2.0,\n            yValue: yValue + Double(valsInView) / 2.0,\n            transformer: getTransformer(axis),\n            view: self,\n            xOrigin: bounds.x,\n            yOrigin: bounds.y,\n            duration: duration,\n            easing: easing)\n        \n        addViewportJob(job)\n    }\n    \n    /// This will move the center of the current viewport to the specified x-value and y-value animated.\n    ///\n    /// - parameter xIndex:\n    /// - parameter yValue:\n    /// - parameter axis: which axis should be used as a reference for the y-axis\n    /// - parameter duration: the duration of the animation in seconds\n    /// - parameter easing:\n    public func centerViewToAnimated(\n        xIndex xIndex: CGFloat,\n        yValue: Double,\n        axis: ChartYAxis.AxisDependency,\n        duration: NSTimeInterval,\n        easingOption: ChartEasingOption)\n    {\n        centerViewToAnimated(xIndex: xIndex, yValue: yValue, axis: axis, duration: duration, easing: easingFunctionFromOption(easingOption))\n    }\n    \n    /// This will move the center of the current viewport to the specified x-value and y-value animated.\n    ///\n    /// - parameter xIndex:\n    /// - parameter yValue:\n    /// - parameter axis: which axis should be used as a reference for the y-axis\n    /// - parameter duration: the duration of the animation in seconds\n    /// - parameter easing:\n    public func centerViewToAnimated(\n        xIndex xIndex: CGFloat,\n        yValue: Double,\n        axis: ChartYAxis.AxisDependency,\n        duration: NSTimeInterval)\n    {\n        centerViewToAnimated(xIndex: xIndex, yValue: yValue, axis: axis, duration: duration, easingOption: .EaseInOutSine)\n    }\n\n    /// Sets custom offsets for the current `ChartViewPort` (the offsets on the sides of the actual chart window). Setting this will prevent the chart from automatically calculating it's offsets. Use `resetViewPortOffsets()` to undo this.\n    /// ONLY USE THIS WHEN YOU KNOW WHAT YOU ARE DOING, else use `setExtraOffsets(...)`.\n    public func setViewPortOffsets(left left: CGFloat, top: CGFloat, right: CGFloat, bottom: CGFloat)\n    {\n        _customViewPortEnabled = true\n        \n        if (NSThread.isMainThread())\n        {\n            self._viewPortHandler.restrainViewPort(offsetLeft: left, offsetTop: top, offsetRight: right, offsetBottom: bottom)\n            prepareOffsetMatrix()\n            prepareValuePxMatrix()\n        }\n        else\n        {\n            dispatch_async(dispatch_get_main_queue(), {\n                self.setViewPortOffsets(left: left, top: top, right: right, bottom: bottom)\n            })\n        }\n    }\n\n    /// Resets all custom offsets set via `setViewPortOffsets(...)` method. Allows the chart to again calculate all offsets automatically.\n    public func resetViewPortOffsets()\n    {\n        _customViewPortEnabled = false\n        calculateOffsets()\n    }\n\n    // MARK: - Accessors\n    \n    /// - returns: the delta-y value (y-value range) of the specified axis.\n    public func getDeltaY(axis: ChartYAxis.AxisDependency) -> CGFloat\n    {\n        if (axis == .Left)\n        {\n            return CGFloat(leftAxis.axisRange)\n        }\n        else\n        {\n            return CGFloat(rightAxis.axisRange)\n        }\n    }\n\n    /// - returns: the position (in pixels) the provided Entry has inside the chart view\n    public func getPosition(e: ChartDataEntry, axis: ChartYAxis.AxisDependency) -> CGPoint\n    {\n        var vals = CGPoint(x: CGFloat(e.xIndex), y: CGFloat(e.value))\n\n        getTransformer(axis).pointValueToPixel(&vals)\n\n        return vals\n    }\n\n    /// is dragging enabled? (moving the chart with the finger) for the chart (this does not affect scaling).\n    public var dragEnabled: Bool\n    {\n        get\n        {\n            return _dragEnabled\n        }\n        set\n        {\n            if (_dragEnabled != newValue)\n            {\n                _dragEnabled = newValue\n            }\n        }\n    }\n    \n    /// is dragging enabled? (moving the chart with the finger) for the chart (this does not affect scaling).\n    public var isDragEnabled: Bool\n    {\n        return dragEnabled\n    }\n    \n    /// is scaling enabled? (zooming in and out by gesture) for the chart (this does not affect dragging).\n    public func setScaleEnabled(enabled: Bool)\n    {\n        if (_scaleXEnabled != enabled || _scaleYEnabled != enabled)\n        {\n            _scaleXEnabled = enabled\n            _scaleYEnabled = enabled\n            #if !os(tvOS)\n                _pinchGestureRecognizer.enabled = _pinchZoomEnabled || _scaleXEnabled || _scaleYEnabled\n            #endif\n        }\n    }\n    \n    public var scaleXEnabled: Bool\n    {\n        get\n        {\n            return _scaleXEnabled\n        }\n        set\n        {\n            if (_scaleXEnabled != newValue)\n            {\n                _scaleXEnabled = newValue\n                #if !os(tvOS)\n                    _pinchGestureRecognizer.enabled = _pinchZoomEnabled || _scaleXEnabled || _scaleYEnabled\n                #endif\n            }\n        }\n    }\n    \n    public var scaleYEnabled: Bool\n    {\n        get\n        {\n            return _scaleYEnabled\n        }\n        set\n        {\n            if (_scaleYEnabled != newValue)\n            {\n                _scaleYEnabled = newValue\n                #if !os(tvOS)\n                    _pinchGestureRecognizer.enabled = _pinchZoomEnabled || _scaleXEnabled || _scaleYEnabled\n                #endif\n            }\n        }\n    }\n    \n    public var isScaleXEnabled: Bool { return scaleXEnabled; }\n    public var isScaleYEnabled: Bool { return scaleYEnabled; }\n    \n    /// flag that indicates if double tap zoom is enabled or not\n    public var doubleTapToZoomEnabled: Bool\n    {\n        get\n        {\n            return _doubleTapToZoomEnabled\n        }\n        set\n        {\n            if (_doubleTapToZoomEnabled != newValue)\n            {\n                _doubleTapToZoomEnabled = newValue\n                _doubleTapGestureRecognizer.enabled = _doubleTapToZoomEnabled\n            }\n        }\n    }\n    \n    /// **default**: true\n    /// - returns: true if zooming via double-tap is enabled false if not.\n    public var isDoubleTapToZoomEnabled: Bool\n    {\n        return doubleTapToZoomEnabled\n    }\n    \n    /// flag that indicates if highlighting per dragging over a fully zoomed out chart is enabled\n    public var highlightPerDragEnabled = true\n    \n    /// If set to true, highlighting per dragging over a fully zoomed out chart is enabled\n    /// You might want to disable this when using inside a `NSUIScrollView`\n    /// \n    /// **default**: true\n    public var isHighlightPerDragEnabled: Bool\n    {\n        return highlightPerDragEnabled\n    }\n    \n    /// **default**: true\n    /// - returns: true if drawing the grid background is enabled, false if not.\n    public var isDrawGridBackgroundEnabled: Bool\n    {\n        return drawGridBackgroundEnabled\n    }\n    \n    /// **default**: false\n    /// - returns: true if drawing the borders rectangle is enabled, false if not.\n    public var isDrawBordersEnabled: Bool\n    {\n        return drawBordersEnabled\n    }\n    \n    /// - returns: the Highlight object (contains x-index and DataSet index) of the selected value at the given touch point inside the Line-, Scatter-, or CandleStick-Chart.\n    public func getHighlightByTouchPoint(pt: CGPoint) -> ChartHighlight?\n    {\n        if _data === nil\n        {\n            Swift.print(\"Can't select by touch. No data set.\")\n            return nil\n        }\n\n        return self.highlighter?.getHighlight(x: Double(pt.x), y: Double(pt.y))\n    }\n\n    /// - returns: the x and y values in the chart at the given touch point\n    /// (encapsulated in a `CGPoint`). This method transforms pixel coordinates to\n    /// coordinates / values in the chart. This is the opposite method to\n    /// `getPixelsForValues(...)`.\n    public func getValueByTouchPoint(pt pt: CGPoint, axis: ChartYAxis.AxisDependency) -> CGPoint\n    {\n        var pt = pt\n        \n        getTransformer(axis).pixelToValue(&pt)\n\n        return pt\n    }\n\n    /// Transforms the given chart values into pixels. This is the opposite\n    /// method to `getValueByTouchPoint(...)`.\n    public func getPixelForValue(x: Double, y: Double, axis: ChartYAxis.AxisDependency) -> CGPoint\n    {\n        var pt = CGPoint(x: CGFloat(x), y: CGFloat(y))\n        \n        getTransformer(axis).pointValueToPixel(&pt)\n        \n        return pt\n    }\n\n    /// - returns: the y-value at the given touch position (must not necessarily be\n    /// a value contained in one of the datasets)\n    public func getYValueByTouchPoint(pt pt: CGPoint, axis: ChartYAxis.AxisDependency) -> CGFloat\n    {\n        return getValueByTouchPoint(pt: pt, axis: axis).y\n    }\n    \n    /// - returns: the Entry object displayed at the touched position of the chart\n    public func getEntryByTouchPoint(pt: CGPoint) -> ChartDataEntry!\n    {\n        let h = getHighlightByTouchPoint(pt)\n        if (h !== nil)\n        {\n            return _data!.getEntryForHighlight(h!)\n        }\n        return nil\n    }\n    \n    /// - returns: the DataSet object displayed at the touched position of the chart\n    public func getDataSetByTouchPoint(pt: CGPoint) -> IBarLineScatterCandleBubbleChartDataSet!\n    {\n        let h = getHighlightByTouchPoint(pt)\n        if (h !== nil)\n        {\n            return _data?.getDataSetByIndex(h!.dataSetIndex) as! IBarLineScatterCandleBubbleChartDataSet!\n        }\n        return nil\n    }\n\n    /// - returns: the current x-scale factor\n    public var scaleX: CGFloat\n    {\n        if (_viewPortHandler === nil)\n        {\n            return 1.0\n        }\n        return _viewPortHandler.scaleX\n    }\n\n    /// - returns: the current y-scale factor\n    public var scaleY: CGFloat\n    {\n        if (_viewPortHandler === nil)\n        {\n            return 1.0\n        }\n        return _viewPortHandler.scaleY\n    }\n\n    /// if the chart is fully zoomed out, return true\n    public var isFullyZoomedOut: Bool { return _viewPortHandler.isFullyZoomedOut; }\n\n    /// - returns: the left y-axis object. In the horizontal bar-chart, this is the\n    /// top axis.\n    public var leftAxis: ChartYAxis\n    {\n        return _leftAxis\n    }\n\n    /// - returns: the right y-axis object. In the horizontal bar-chart, this is the\n    /// bottom axis.\n    public var rightAxis: ChartYAxis { return _rightAxis; }\n\n    /// - returns: the y-axis object to the corresponding AxisDependency. In the\n    /// horizontal bar-chart, LEFT == top, RIGHT == BOTTOM\n    public func getAxis(axis: ChartYAxis.AxisDependency) -> ChartYAxis\n    {\n        if (axis == .Left)\n        {\n            return _leftAxis\n        }\n        else\n        {\n            return _rightAxis\n        }\n    }\n    \n    /// flag that indicates if pinch-zoom is enabled. if true, both x and y axis can be scaled simultaneously with 2 fingers, if false, x and y axis can be scaled separately\n    public var pinchZoomEnabled: Bool\n    {\n        get\n        {\n            return _pinchZoomEnabled\n        }\n        set\n        {\n            if (_pinchZoomEnabled != newValue)\n            {\n                _pinchZoomEnabled = newValue\n                #if !os(tvOS)\n                    _pinchGestureRecognizer.enabled = _pinchZoomEnabled || _scaleXEnabled || _scaleYEnabled\n                #endif\n            }\n        }\n    }\n\n    /// **default**: false\n    /// - returns: true if pinch-zoom is enabled, false if not\n    public var isPinchZoomEnabled: Bool { return pinchZoomEnabled; }\n\n    /// Set an offset in dp that allows the user to drag the chart over it's\n    /// bounds on the x-axis.\n    public func setDragOffsetX(offset: CGFloat)\n    {\n        _viewPortHandler.setDragOffsetX(offset)\n    }\n\n    /// Set an offset in dp that allows the user to drag the chart over it's\n    /// bounds on the y-axis.\n    public func setDragOffsetY(offset: CGFloat)\n    {\n        _viewPortHandler.setDragOffsetY(offset)\n    }\n\n    /// - returns: true if both drag offsets (x and y) are zero or smaller.\n    public var hasNoDragOffset: Bool { return _viewPortHandler.hasNoDragOffset; }\n\n    /// The X axis renderer. This is a read-write property so you can set your own custom renderer here.\n    /// **default**: An instance of ChartXAxisRenderer\n    /// - returns: The current set X axis renderer\n    public var xAxisRenderer: ChartXAxisRenderer\n    {\n        get { return _xAxisRenderer }\n        set { _xAxisRenderer = newValue }\n    }\n    \n    /// The left Y axis renderer. This is a read-write property so you can set your own custom renderer here.\n    /// **default**: An instance of ChartYAxisRenderer\n    /// - returns: The current set left Y axis renderer\n    public var leftYAxisRenderer: ChartYAxisRenderer\n    {\n        get { return _leftYAxisRenderer }\n        set { _leftYAxisRenderer = newValue }\n    }\n    \n    /// The right Y axis renderer. This is a read-write property so you can set your own custom renderer here.\n    /// **default**: An instance of ChartYAxisRenderer\n    /// - returns: The current set right Y axis renderer\n    public var rightYAxisRenderer: ChartYAxisRenderer\n    {\n        get { return _rightYAxisRenderer }\n        set { _rightYAxisRenderer = newValue }\n    }\n    \n    public override var chartYMax: Double\n    {\n        return max(leftAxis._axisMaximum, rightAxis._axisMaximum)\n    }\n\n    public override var chartYMin: Double\n    {\n        return min(leftAxis._axisMinimum, rightAxis._axisMinimum)\n    }\n    \n    /// - returns: true if either the left or the right or both axes are inverted.\n    public var isAnyAxisInverted: Bool\n    {\n        return _leftAxis.isInverted || _rightAxis.isInverted\n    }\n    \n    /// flag that indicates if auto scaling on the y axis is enabled.\n    /// if yes, the y axis automatically adjusts to the min and max y values of the current x axis range whenever the viewport changes\n    public var autoScaleMinMaxEnabled: Bool\n    {\n        get { return _autoScaleMinMaxEnabled; }\n        set { _autoScaleMinMaxEnabled = newValue; }\n    }\n    \n    /// **default**: false\n    /// - returns: true if auto scaling on the y axis is enabled.\n    public var isAutoScaleMinMaxEnabled : Bool { return autoScaleMinMaxEnabled; }\n    \n    /// Sets a minimum width to the specified y axis.\n    public func setYAxisMinWidth(which: ChartYAxis.AxisDependency, width: CGFloat)\n    {\n        if (which == .Left)\n        {\n            _leftAxis.minWidth = width\n        }\n        else\n        {\n            _rightAxis.minWidth = width\n        }\n    }\n    \n    /// **default**: 0.0\n    /// - returns: the (custom) minimum width of the specified Y axis.\n    public func getYAxisMinWidth(which: ChartYAxis.AxisDependency) -> CGFloat\n    {\n        if (which == .Left)\n        {\n            return _leftAxis.minWidth\n        }\n        else\n        {\n            return _rightAxis.minWidth\n        }\n    }\n    /// Sets a maximum width to the specified y axis.\n    /// Zero (0.0) means there's no maximum width\n    public func setYAxisMaxWidth(which: ChartYAxis.AxisDependency, width: CGFloat)\n    {\n        if (which == .Left)\n        {\n            _leftAxis.maxWidth = width\n        }\n        else\n        {\n            _rightAxis.maxWidth = width\n        }\n    }\n    \n    /// Zero (0.0) means there's no maximum width\n    ///\n    /// **default**: 0.0 (no maximum specified)\n    /// - returns: the (custom) maximum width of the specified Y axis.\n    public func getYAxisMaxWidth(which: ChartYAxis.AxisDependency) -> CGFloat\n    {\n        if (which == .Left)\n        {\n            return _leftAxis.maxWidth\n        }\n        else\n        {\n            return _rightAxis.maxWidth\n        }\n    }\n\n    /// - returns the width of the specified y axis.\n    public func getYAxisWidth(which: ChartYAxis.AxisDependency) -> CGFloat\n    {\n        if (which == .Left)\n        {\n            return _leftAxis.requiredSize().width\n        }\n        else\n        {\n            return _rightAxis.requiredSize().width\n        }\n    }\n    \n    // MARK: - BarLineScatterCandleBubbleChartDataProvider\n    \n    /// - returns: the Transformer class that contains all matrices and is\n    /// responsible for transforming values into pixels on the screen and\n    /// backwards.\n    public func getTransformer(which: ChartYAxis.AxisDependency) -> ChartTransformer\n    {\n        if (which == .Left)\n        {\n            return _leftAxisTransformer\n        }\n        else\n        {\n            return _rightAxisTransformer\n        }\n    }\n    \n    /// the number of maximum visible drawn values on the chart\n    /// only active when `setDrawValues()` is enabled\n    public var maxVisibleValueCount: Int\n    {\n        get\n        {\n            return _maxVisibleValueCount\n        }\n        set\n        {\n            _maxVisibleValueCount = newValue\n        }\n    }\n    \n    public func isInverted(axis: ChartYAxis.AxisDependency) -> Bool\n    {\n        return getAxis(axis).isInverted\n    }\n    \n    /// - returns: the lowest x-index (value on the x-axis) that is still visible on he chart.\n    public var lowestVisibleXIndex: Int\n    {\n        var pt = CGPoint(x: viewPortHandler.contentLeft, y: viewPortHandler.contentBottom)\n        getTransformer(.Left).pixelToValue(&pt)\n        return (pt.x <= 0.0) ? 0 : Int(round(pt.x + 1.0))\n    }\n    \n    /// - returns: the highest x-index (value on the x-axis) that is still visible on the chart.\n    public var highestVisibleXIndex: Int\n    {\n        var pt = CGPoint(\n            x: viewPortHandler.contentRight,\n            y: viewPortHandler.contentBottom)\n        \n        getTransformer(.Left).pixelToValue(&pt)\n\n        guard let\n            data = _data\n            else { return Int(round(pt.x)) }\n\n        return min(data.xValCount - 1, Int(round(pt.x)))\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Charts/BubbleChartView.swift",
    "content": "//\n//  BubbleChartView.swift\n//  Charts\n//\n//  Bubble chart implementation:\n//    Copyright 2015 Pierre-Marc Airoldi\n//    Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\npublic class BubbleChartView: BarLineChartViewBase, BubbleChartDataProvider\n{\n    public override func initialize()\n    {\n        super.initialize()\n        \n        renderer = BubbleChartRenderer(dataProvider: self, animator: _animator, viewPortHandler: _viewPortHandler)\n    }\n    \n    public override func calcMinMax()\n    {\n        super.calcMinMax()\n        guard let data = _data else { return }\n        \n        if _xAxis.axisRange == 0.0 && data.yValCount > 0\n        {\n            _xAxis.axisRange = 1.0\n        }\n        \n        _xAxis._axisMinimum = -0.5\n        _xAxis._axisMaximum = Double(data.xVals.count) - 0.5\n        \n        if renderer as? BubbleChartRenderer !== nil,\n            let sets = data.dataSets as? [IBubbleChartDataSet]\n        {\n            for set in sets {\n                \n                let xmin = set.xMin\n                let xmax = set.xMax\n                \n                if (xmin < _xAxis._axisMinimum)\n                {\n                    _xAxis._axisMinimum = xmin\n                }\n                \n                if (xmax > _xAxis._axisMaximum)\n                {\n                    _xAxis._axisMaximum = xmax\n                }\n            }\n        }\n        \n        _xAxis.axisRange = abs(_xAxis._axisMaximum - _xAxis._axisMinimum)\n    }\n    \n    // MARK: - BubbleChartDataProbider\n    \n    public var bubbleData: BubbleChartData? { return _data as? BubbleChartData }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Charts/CandleStickChartView.swift",
    "content": "//\n//  CandleStickChartView.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n/// Financial chart type that draws candle-sticks.\npublic class CandleStickChartView: BarLineChartViewBase, CandleChartDataProvider\n{\n    internal override func initialize()\n    {\n        super.initialize()\n        \n        renderer = CandleStickChartRenderer(dataProvider: self, animator: _animator, viewPortHandler: _viewPortHandler)\n        _xAxis._axisMinimum = -0.5\n    }\n\n    internal override func calcMinMax()\n    {\n        super.calcMinMax()\n\n        _xAxis._axisMaximum += 0.5\n        _xAxis.axisRange = abs(_xAxis._axisMaximum - _xAxis._axisMinimum)\n    }\n    \n    // MARK: - CandleChartDataProvider\n    \n    public var candleData: CandleChartData?\n    {\n        return _data as? CandleChartData\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Charts/ChartViewBase.swift",
    "content": "//\n//  ChartViewBase.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n//  Based on https://github.com/PhilJay/MPAndroidChart/commit/c42b880\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n@objc\npublic protocol ChartViewDelegate\n{\n    /// Called when a value has been selected inside the chart.\n    /// - parameter entry: The selected Entry.\n    /// - parameter dataSetIndex: The index in the datasets array of the data object the Entrys DataSet is in.\n    optional func chartValueSelected(chartView: ChartViewBase, entry: ChartDataEntry, dataSetIndex: Int, highlight: ChartHighlight)\n    \n    // Called when nothing has been selected or an \"un-select\" has been made.\n    optional func chartValueNothingSelected(chartView: ChartViewBase)\n    \n    // Callbacks when the chart is scaled / zoomed via pinch zoom gesture.\n    optional func chartScaled(chartView: ChartViewBase, scaleX: CGFloat, scaleY: CGFloat)\n    \n    // Callbacks when the chart is moved / translated via drag gesture.\n    optional func chartTranslated(chartView: ChartViewBase, dX: CGFloat, dY: CGFloat)\n}\n\npublic class ChartViewBase: NSUIView, ChartDataProvider, ChartAnimatorDelegate\n{\n    // MARK: - Properties\n    \n    /// - returns: the object representing all x-labels, this method can be used to\n    /// acquire the XAxis object and modify it (e.g. change the position of the\n    /// labels)\n    public var xAxis: ChartXAxis\n    {\n        return _xAxis\n    }\n    \n    /// the default value formatter\n    internal var _defaultValueFormatter: NSNumberFormatter = ChartUtils.defaultValueFormatter()\n    \n    /// object that holds all data that was originally set for the chart, before it was modified or any filtering algorithms had been applied\n    internal var _data: ChartData?\n    \n    /// Flag that indicates if highlighting per tap (touch) is enabled\n    private var _highlightPerTapEnabled = true\n    \n    /// If set to true, chart continues to scroll after touch up\n    public var dragDecelerationEnabled = true\n    \n    /// Deceleration friction coefficient in [0 ; 1] interval, higher values indicate that speed will decrease slowly, for example if it set to 0, it will stop immediately.\n    /// 1 is an invalid value, and will be converted to 0.999 automatically.\n    private var _dragDecelerationFrictionCoef: CGFloat = 0.9\n    \n    /// Font object used for drawing the description text (by default in the bottom right corner of the chart)\n    public var descriptionFont: NSUIFont? = NSUIFont(name: \"HelveticaNeue\", size: 9.0)\n    \n    /// Text color used for drawing the description text\n    public var descriptionTextColor: NSUIColor? = NSUIColor.blackColor()\n    \n    /// Text align used for drawing the description text\n    public var descriptionTextAlign: NSTextAlignment = NSTextAlignment.Right\n    \n    /// Custom position for the description text in pixels on the screen.\n    public var descriptionTextPosition: CGPoint? = nil\n    \n    /// font object for drawing the information text when there are no values in the chart\n    public var infoFont: NSUIFont! = NSUIFont(name: \"HelveticaNeue\", size: 12.0)\n    public var infoTextColor: NSUIColor! = NSUIColor(red: 247.0/255.0, green: 189.0/255.0, blue: 51.0/255.0, alpha: 1.0) // orange\n    \n    /// description text that appears in the bottom right corner of the chart\n    public var descriptionText = \"Description\"\n    \n    /// if true, units are drawn next to the values in the chart\n    internal var _drawUnitInChart = false\n    \n    /// the object representing the labels on the x-axis\n    internal var _xAxis: ChartXAxis!\n    \n    /// the legend object containing all data associated with the legend\n    internal var _legend: ChartLegend!\n    \n    /// delegate to receive chart events\n    public weak var delegate: ChartViewDelegate?\n    \n    /// text that is displayed when the chart is empty\n    public var noDataText = \"No chart data available.\"\n    \n    /// text that is displayed when the chart is empty that describes why the chart is empty\n    public var noDataTextDescription: String?\n    \n    internal var _legendRenderer: ChartLegendRenderer!\n    \n    /// object responsible for rendering the data\n    public var renderer: ChartDataRendererBase?\n    \n    public var highlighter: ChartHighlighter?\n    \n    /// object that manages the bounds and drawing constraints of the chart\n    internal var _viewPortHandler: ChartViewPortHandler!\n    \n    /// object responsible for animations\n    internal var _animator: ChartAnimator!\n    \n    /// flag that indicates if offsets calculation has already been done or not\n    private var _offsetsCalculated = false\n    \n    /// array of Highlight objects that reference the highlighted slices in the chart\n    internal var _indicesToHighlight = [ChartHighlight]()\n    \n    /// if set to true, the marker is drawn when a value is clicked\n    public var drawMarkers = true\n    \n    /// the view that represents the marker\n    public var marker: ChartMarker?\n    \n    private var _interceptTouchEvents = false\n    \n    /// An extra offset to be appended to the viewport's top\n    public var extraTopOffset: CGFloat = 0.0\n    \n    /// An extra offset to be appended to the viewport's right\n    public var extraRightOffset: CGFloat = 0.0\n    \n    /// An extra offset to be appended to the viewport's bottom\n    public var extraBottomOffset: CGFloat = 0.0\n    \n    /// An extra offset to be appended to the viewport's left\n    public var extraLeftOffset: CGFloat = 0.0\n    \n    public func setExtraOffsets(left left: CGFloat, top: CGFloat, right: CGFloat, bottom: CGFloat)\n    {\n        extraLeftOffset = left\n        extraTopOffset = top\n        extraRightOffset = right\n        extraBottomOffset = bottom\n    }\n    \n    // MARK: - Initializers\n    \n    public override init(frame: CGRect)\n    {\n        super.init(frame: frame)\n\n\t\t#if os(iOS)\n\t\t\tself.backgroundColor = NSUIColor.clearColor()\n\t\t#endif\n        initialize()\n    }\n    \n    public required init?(coder aDecoder: NSCoder)\n    {\n        super.init(coder: aDecoder)\n        initialize()\n    }\n    \n    deinit\n    {\n        self.removeObserver(self, forKeyPath: \"bounds\")\n        self.removeObserver(self, forKeyPath: \"frame\")\n    }\n    \n    internal func initialize()\n    {\n        _animator = ChartAnimator()\n        _animator.delegate = self\n\n        _viewPortHandler = ChartViewPortHandler()\n        _viewPortHandler.setChartDimens(width: bounds.size.width, height: bounds.size.height)\n        \n        _legend = ChartLegend()\n        _legendRenderer = ChartLegendRenderer(viewPortHandler: _viewPortHandler, legend: _legend)\n        \n        _xAxis = ChartXAxis()\n        \n        self.addObserver(self, forKeyPath: \"bounds\", options: .New, context: nil)\n        self.addObserver(self, forKeyPath: \"frame\", options: .New, context: nil)\n    }\n    \n    // MARK: - ChartViewBase\n    \n    /// The data for the chart\n    public var data: ChartData?\n    {\n        get\n        {\n            return _data\n        }\n        set\n        {\n            _offsetsCalculated = false\n            _data = newValue\n            \n            // calculate how many digits are needed\n            if let data = _data\n            {\n                calculateFormatter(min: data.getYMin(), max: data.getYMax())\n            }\n            \n            notifyDataSetChanged()\n        }\n    }\n    \n    /// Clears the chart from all data (sets it to null) and refreshes it (by calling setNeedsDisplay()).\n    public func clear()\n    {\n        _data = nil\n        _indicesToHighlight.removeAll()\n        setNeedsDisplay()\n    }\n    \n    /// Removes all DataSets (and thereby Entries) from the chart. Does not remove the x-values. Also refreshes the chart by calling setNeedsDisplay().\n    public func clearValues()\n    {\n        _data?.clearValues()\n        setNeedsDisplay()\n    }\n    \n    /// - returns: true if the chart is empty (meaning it's data object is either null or contains no entries).\n    public func isEmpty() -> Bool\n    {\n        guard let data = _data else { return true }\n\n        if (data.yValCount <= 0)\n        {\n            return true\n        }\n        else\n        {\n            return false\n        }\n    }\n    \n    /// Lets the chart know its underlying data has changed and should perform all necessary recalculations.\n    /// It is crucial that this method is called everytime data is changed dynamically. Not calling this method can lead to crashes or unexpected behaviour.\n    public func notifyDataSetChanged()\n    {\n        fatalError(\"notifyDataSetChanged() cannot be called on ChartViewBase\")\n    }\n    \n    /// calculates the offsets of the chart to the border depending on the position of an eventual legend or depending on the length of the y-axis and x-axis labels and their position\n    internal func calculateOffsets()\n    {\n        fatalError(\"calculateOffsets() cannot be called on ChartViewBase\")\n    }\n    \n    /// calcualtes the y-min and y-max value and the y-delta and x-delta value\n    internal func calcMinMax()\n    {\n        fatalError(\"calcMinMax() cannot be called on ChartViewBase\")\n    }\n    \n    /// calculates the required number of digits for the values that might be drawn in the chart (if enabled), and creates the default value formatter\n    internal func calculateFormatter(min min: Double, max: Double)\n    {\n        // check if a custom formatter is set or not\n        var reference = Double(0.0)\n        \n        if let data = _data where data.xValCount >= 2\n        {\n            reference = fabs(max - min)\n        }\n        else\n        {\n            let absMin = fabs(min)\n            let absMax = fabs(max)\n            reference = absMin > absMax ? absMin : absMax\n        }\n        \n        let digits = ChartUtils.decimals(reference)\n    \n        _defaultValueFormatter.maximumFractionDigits = digits\n        _defaultValueFormatter.minimumFractionDigits = digits\n    }\n    \n    public override func drawRect(rect: CGRect)\n    {\n        let optionalContext = NSUIGraphicsGetCurrentContext()\n        guard let context = optionalContext else { return }\n        \n        let frame = self.bounds\n\n        if _data === nil\n        {\n            CGContextSaveGState(context)\n            defer { CGContextRestoreGState(context) }\n            \n            let hasText = noDataText.characters.count > 0\n            let hasDescription = noDataTextDescription?.characters.count > 0\n            var textHeight = hasText ? infoFont.lineHeight : 0.0\n            if hasDescription\n            {\n                textHeight += infoFont.lineHeight\n            }\n            \n            // if no data, inform the user\n            \n            var y = (frame.height - textHeight) / 2.0\n            \n            if hasText\n            {\n                ChartUtils.drawText(\n                    context: context,\n                    text: noDataText,\n                    point: CGPoint(x: frame.width / 2.0, y: y),\n                    align: .Center,\n                    attributes: [NSFontAttributeName: infoFont, NSForegroundColorAttributeName: infoTextColor]\n                )\n                y = y + infoFont.lineHeight\n            }\n            \n            if (noDataTextDescription != nil && (noDataTextDescription!).characters.count > 0)\n            {\n                ChartUtils.drawText(context: context, text: noDataTextDescription!, point: CGPoint(x: frame.width / 2.0, y: y), align: .Center, attributes: [NSFontAttributeName: infoFont, NSForegroundColorAttributeName: infoTextColor])\n            }\n            \n            return\n        }\n        \n        if (!_offsetsCalculated)\n        {\n            calculateOffsets()\n            _offsetsCalculated = true\n        }\n    }\n    \n    /// draws the description text in the bottom right corner of the chart\n    internal func drawDescription(context context: CGContext)\n    {\n        if (descriptionText.lengthOfBytesUsingEncoding(NSUTF16StringEncoding) == 0)\n        {\n            return\n        }\n        \n        let frame = self.bounds\n        \n        var attrs = [String : AnyObject]()\n        \n        var font = descriptionFont\n        \n        if (font == nil)\n        {\n            #if os(tvOS)\n                // 23 is the smallest recommened font size on the TV\n                font = NSUIFont.systemFontOfSize(23, weight: UIFontWeightMedium)\n            #else\n                font = NSUIFont.systemFontOfSize(NSUIFont.systemFontSize())\n            #endif\n        }\n        \n        attrs[NSFontAttributeName] = font\n        attrs[NSForegroundColorAttributeName] = descriptionTextColor\n\n        if descriptionTextPosition == nil\n        {\n            ChartUtils.drawText(\n                context: context,\n                text: descriptionText,\n                point: CGPoint(\n                    x: frame.width - _viewPortHandler.offsetRight - 10.0,\n                    y: frame.height - _viewPortHandler.offsetBottom - 10.0 - (font?.lineHeight ?? 0.0)),\n                align: descriptionTextAlign,\n                attributes: attrs)\n        }\n        else\n        {\n            ChartUtils.drawText(\n                context: context,\n                text: descriptionText,\n                point: descriptionTextPosition!,\n                align: descriptionTextAlign,\n                attributes: attrs)\n        }\n    }\n    \n    // MARK: - Highlighting\n    \n    /// - returns: the array of currently highlighted values. This might an empty if nothing is highlighted.\n    public var highlighted: [ChartHighlight]\n    {\n        return _indicesToHighlight\n    }\n    \n    /// Set this to false to prevent values from being highlighted by tap gesture.\n    /// Values can still be highlighted via drag or programmatically.\n    /// **default**: true\n    public var highlightPerTapEnabled: Bool\n    {\n        get { return _highlightPerTapEnabled }\n        set { _highlightPerTapEnabled = newValue }\n    }\n    \n    /// Returns true if values can be highlighted via tap gesture, false if not.\n    public var isHighLightPerTapEnabled: Bool\n    {\n        return highlightPerTapEnabled\n    }\n    \n    /// Checks if the highlight array is null, has a length of zero or if the first object is null.\n    /// - returns: true if there are values to highlight, false if there are no values to highlight.\n    public func valuesToHighlight() -> Bool\n    {\n        return _indicesToHighlight.count > 0\n    }\n\n    /// Highlights the values at the given indices in the given DataSets. Provide\n    /// null or an empty array to undo all highlighting. \n    /// This should be used to programmatically highlight values. \n    /// This DOES NOT generate a callback to the delegate.\n    public func highlightValues(highs: [ChartHighlight]?)\n    {\n        // set the indices to highlight\n        _indicesToHighlight = highs ?? [ChartHighlight]()\n        \n        if (_indicesToHighlight.isEmpty)\n        {\n            self.lastHighlighted = nil\n        }\n        else\n        {\n            self.lastHighlighted = _indicesToHighlight[0];\n        }\n\n        // redraw the chart\n        setNeedsDisplay()\n    }\n    \n    \n    /// Highlights the values represented by the provided Highlight object\n    /// This DOES NOT generate a callback to the delegate.\n    /// - parameter highlight: contains information about which entry should be highlighted\n    public func highlightValue(highlight: ChartHighlight?)\n    {\n        highlightValue(highlight: highlight, callDelegate: false)\n    }\n    \n    /// Highlights the value at the given x-index in the given DataSet.\n    /// Provide -1 as the x-index to undo all highlighting.\n    public func highlightValue(xIndex xIndex: Int, dataSetIndex: Int, callDelegate: Bool)\n    {\n        guard let data = _data else\n        {\n            Swift.print(\"Value not highlighted because data is nil\")\n            return\n        }\n\n        if (xIndex < 0 || dataSetIndex < 0 || xIndex >= data.xValCount || dataSetIndex >= data.dataSetCount)\n        {\n            highlightValue(highlight: nil, callDelegate: callDelegate)\n        }\n        else\n        {\n            highlightValue(highlight: ChartHighlight(xIndex: xIndex, dataSetIndex: dataSetIndex), callDelegate: callDelegate)\n        }\n    }\n\n    /// Highlights the value selected by touch gesture.\n    public func highlightValue(highlight highlight: ChartHighlight?, callDelegate: Bool)\n    {\n        var entry: ChartDataEntry?\n        var h = highlight\n        \n        if (h == nil)\n        {\n            _indicesToHighlight.removeAll(keepCapacity: false)\n        }\n        else\n        {\n            // set the indices to highlight\n            entry = _data?.getEntryForHighlight(h!)\n            if (entry === nil || entry!.xIndex != h?.xIndex)\n            {\n                h = nil\n                entry = nil\n                _indicesToHighlight.removeAll(keepCapacity: false)\n            }\n            else\n            {\n                _indicesToHighlight = [h!]\n            }\n        }\n        \n        if (callDelegate && delegate != nil)\n        {\n            if (h == nil)\n            {\n                delegate!.chartValueNothingSelected?(self)\n            }\n            else\n            {\n                // notify the listener\n                delegate!.chartValueSelected?(self, entry: entry!, dataSetIndex: h!.dataSetIndex, highlight: h!)\n            }\n        }\n        \n        // redraw the chart\n        setNeedsDisplay()\n    }\n    \n    /// The last value that was highlighted via touch.\n    public var lastHighlighted: ChartHighlight?\n  \n    // MARK: - Markers\n\n    /// draws all MarkerViews on the highlighted positions\n    internal func drawMarkers(context context: CGContext)\n    {\n        // if there is no marker view or drawing marker is disabled\n        if (marker === nil || !drawMarkers || !valuesToHighlight())\n        {\n            return\n        }\n\n        for i in 0 ..< _indicesToHighlight.count\n        {\n            let highlight = _indicesToHighlight[i]\n            let xIndex = highlight.xIndex\n\n            let deltaX = _xAxis.axisRange\n            if xIndex <= Int(deltaX) && xIndex <= Int(CGFloat(deltaX) * _animator.phaseX)\n            {\n                let e = _data?.getEntryForHighlight(highlight)\n                if (e === nil || e!.xIndex != highlight.xIndex)\n                {\n                    continue\n                }\n                \n                let pos = getMarkerPosition(entry: e!, highlight: highlight)\n\n                // check bounds\n                if (!_viewPortHandler.isInBounds(x: pos.x, y: pos.y))\n                {\n                    continue\n                }\n\n                // callbacks to update the content\n                marker!.refreshContent(entry: e!, highlight: highlight)\n\n                let markerSize = marker!.size\n                if (pos.y - markerSize.height <= 0.0)\n                {\n                    let y = markerSize.height - pos.y\n                    marker!.draw(context: context, point: CGPoint(x: pos.x, y: pos.y + y))\n                }\n                else\n                {\n                    marker!.draw(context: context, point: pos)\n                }\n            }\n        }\n    }\n    \n    /// - returns: the actual position in pixels of the MarkerView for the given Entry in the given DataSet.\n    public func getMarkerPosition(entry entry: ChartDataEntry, highlight: ChartHighlight) -> CGPoint\n    {\n        fatalError(\"getMarkerPosition() cannot be called on ChartViewBase\")\n    }\n    \n    // MARK: - Animation\n    \n    /// - returns: the animator responsible for animating chart values.\n    public var chartAnimator: ChartAnimator!\n    {\n        return _animator\n    }\n    \n    /// Animates the drawing / rendering of the chart on both x- and y-axis with the specified animation time.\n    /// If `animate(...)` is called, no further calling of `invalidate()` is necessary to refresh the chart.\n    /// - parameter xAxisDuration: duration for animating the x axis\n    /// - parameter yAxisDuration: duration for animating the y axis\n    /// - parameter easingX: an easing function for the animation on the x axis\n    /// - parameter easingY: an easing function for the animation on the y axis\n    public func animate(xAxisDuration xAxisDuration: NSTimeInterval, yAxisDuration: NSTimeInterval, easingX: ChartEasingFunctionBlock?, easingY: ChartEasingFunctionBlock?)\n    {\n        _animator.animate(xAxisDuration: xAxisDuration, yAxisDuration: yAxisDuration, easingX: easingX, easingY: easingY)\n    }\n    \n    /// Animates the drawing / rendering of the chart on both x- and y-axis with the specified animation time.\n    /// If `animate(...)` is called, no further calling of `invalidate()` is necessary to refresh the chart.\n    /// - parameter xAxisDuration: duration for animating the x axis\n    /// - parameter yAxisDuration: duration for animating the y axis\n    /// - parameter easingOptionX: the easing function for the animation on the x axis\n    /// - parameter easingOptionY: the easing function for the animation on the y axis\n    public func animate(xAxisDuration xAxisDuration: NSTimeInterval, yAxisDuration: NSTimeInterval, easingOptionX: ChartEasingOption, easingOptionY: ChartEasingOption)\n    {\n        _animator.animate(xAxisDuration: xAxisDuration, yAxisDuration: yAxisDuration, easingOptionX: easingOptionX, easingOptionY: easingOptionY)\n    }\n    \n    /// Animates the drawing / rendering of the chart on both x- and y-axis with the specified animation time.\n    /// If `animate(...)` is called, no further calling of `invalidate()` is necessary to refresh the chart.\n    /// - parameter xAxisDuration: duration for animating the x axis\n    /// - parameter yAxisDuration: duration for animating the y axis\n    /// - parameter easing: an easing function for the animation\n    public func animate(xAxisDuration xAxisDuration: NSTimeInterval, yAxisDuration: NSTimeInterval, easing: ChartEasingFunctionBlock?)\n    {\n        _animator.animate(xAxisDuration: xAxisDuration, yAxisDuration: yAxisDuration, easing: easing)\n    }\n    \n    /// Animates the drawing / rendering of the chart on both x- and y-axis with the specified animation time.\n    /// If `animate(...)` is called, no further calling of `invalidate()` is necessary to refresh the chart.\n    /// - parameter xAxisDuration: duration for animating the x axis\n    /// - parameter yAxisDuration: duration for animating the y axis\n    /// - parameter easingOption: the easing function for the animation\n    public func animate(xAxisDuration xAxisDuration: NSTimeInterval, yAxisDuration: NSTimeInterval, easingOption: ChartEasingOption)\n    {\n        _animator.animate(xAxisDuration: xAxisDuration, yAxisDuration: yAxisDuration, easingOption: easingOption)\n    }\n    \n    /// Animates the drawing / rendering of the chart on both x- and y-axis with the specified animation time.\n    /// If `animate(...)` is called, no further calling of `invalidate()` is necessary to refresh the chart.\n    /// - parameter xAxisDuration: duration for animating the x axis\n    /// - parameter yAxisDuration: duration for animating the y axis\n    public func animate(xAxisDuration xAxisDuration: NSTimeInterval, yAxisDuration: NSTimeInterval)\n    {\n        _animator.animate(xAxisDuration: xAxisDuration, yAxisDuration: yAxisDuration)\n    }\n    \n    /// Animates the drawing / rendering of the chart the x-axis with the specified animation time.\n    /// If `animate(...)` is called, no further calling of `invalidate()` is necessary to refresh the chart.\n    /// - parameter xAxisDuration: duration for animating the x axis\n    /// - parameter easing: an easing function for the animation\n    public func animate(xAxisDuration xAxisDuration: NSTimeInterval, easing: ChartEasingFunctionBlock?)\n    {\n        _animator.animate(xAxisDuration: xAxisDuration, easing: easing)\n    }\n    \n    /// Animates the drawing / rendering of the chart the x-axis with the specified animation time.\n    /// If `animate(...)` is called, no further calling of `invalidate()` is necessary to refresh the chart.\n    /// - parameter xAxisDuration: duration for animating the x axis\n    /// - parameter easingOption: the easing function for the animation\n    public func animate(xAxisDuration xAxisDuration: NSTimeInterval, easingOption: ChartEasingOption)\n    {\n        _animator.animate(xAxisDuration: xAxisDuration, easingOption: easingOption)\n    }\n    \n    /// Animates the drawing / rendering of the chart the x-axis with the specified animation time.\n    /// If `animate(...)` is called, no further calling of `invalidate()` is necessary to refresh the chart.\n    /// - parameter xAxisDuration: duration for animating the x axis\n    public func animate(xAxisDuration xAxisDuration: NSTimeInterval)\n    {\n        _animator.animate(xAxisDuration: xAxisDuration)\n    }\n    \n    /// Animates the drawing / rendering of the chart the y-axis with the specified animation time.\n    /// If `animate(...)` is called, no further calling of `invalidate()` is necessary to refresh the chart.\n    /// - parameter yAxisDuration: duration for animating the y axis\n    /// - parameter easing: an easing function for the animation\n    public func animate(yAxisDuration yAxisDuration: NSTimeInterval, easing: ChartEasingFunctionBlock?)\n    {\n        _animator.animate(yAxisDuration: yAxisDuration, easing: easing)\n    }\n    \n    /// Animates the drawing / rendering of the chart the y-axis with the specified animation time.\n    /// If `animate(...)` is called, no further calling of `invalidate()` is necessary to refresh the chart.\n    /// - parameter yAxisDuration: duration for animating the y axis\n    /// - parameter easingOption: the easing function for the animation\n    public func animate(yAxisDuration yAxisDuration: NSTimeInterval, easingOption: ChartEasingOption)\n    {\n        _animator.animate(yAxisDuration: yAxisDuration, easingOption: easingOption)\n    }\n    \n    /// Animates the drawing / rendering of the chart the y-axis with the specified animation time.\n    /// If `animate(...)` is called, no further calling of `invalidate()` is necessary to refresh the chart.\n    /// - parameter yAxisDuration: duration for animating the y axis\n    public func animate(yAxisDuration yAxisDuration: NSTimeInterval)\n    {\n        _animator.animate(yAxisDuration: yAxisDuration)\n    }\n    \n    // MARK: - Accessors\n\n    /// - returns: the current y-max value across all DataSets\n    public var chartYMax: Double\n    {\n        return _data?.yMax ?? 0.0\n    }\n\n    /// - returns: the current y-min value across all DataSets\n    public var chartYMin: Double\n    {\n        return _data?.yMin ?? 0.0\n    }\n    \n    public var chartXMax: Double\n    {\n        return _xAxis._axisMaximum\n    }\n    \n    public var chartXMin: Double\n    {\n        return _xAxis._axisMinimum\n    }\n    \n    public var xValCount: Int\n    {\n        return _data?.xValCount ?? 0\n    }\n    \n    /// - returns: the total number of (y) values the chart holds (across all DataSets)\n    public var valueCount: Int\n    {\n        return _data?.yValCount ?? 0\n    }\n    \n    /// *Note: (Equivalent of getCenter() in MPAndroidChart, as center is already a standard in iOS that returns the center point relative to superview, and MPAndroidChart returns relative to self)*\n    /// - returns: the center point of the chart (the whole View) in pixels.\n    public var midPoint: CGPoint\n    {\n        let bounds = self.bounds\n        return CGPoint(x: bounds.origin.x + bounds.size.width / 2.0, y: bounds.origin.y + bounds.size.height / 2.0)\n    }\n    \n    public func setDescriptionTextPosition(x x: CGFloat, y: CGFloat)\n    {\n        descriptionTextPosition = CGPoint(x: x, y: y)\n    }\n    \n    /// - returns: the center of the chart taking offsets under consideration. (returns the center of the content rectangle)\n    public var centerOffsets: CGPoint\n    {\n        return _viewPortHandler.contentCenter\n    }\n    \n    /// - returns: the Legend object of the chart. This method can be used to get an instance of the legend in order to customize the automatically generated Legend.\n    public var legend: ChartLegend\n    {\n        return _legend\n    }\n    \n    /// - returns: the renderer object responsible for rendering / drawing the Legend.\n    public var legendRenderer: ChartLegendRenderer!\n    {\n        return _legendRenderer\n    }\n    \n    /// - returns: the rectangle that defines the borders of the chart-value surface (into which the actual values are drawn).\n    public var contentRect: CGRect\n    {\n        return _viewPortHandler.contentRect\n    }\n    \n    /// - returns: the x-value at the given index\n    public func getXValue(index: Int) -> String!\n    {\n        guard let data = _data where data.xValCount > index else\n        {\n            return nil\n        }\n\n        return data.xVals[index]\n    }\n    \n    /// Get all Entry objects at the given index across all DataSets.\n    public func getEntriesAtIndex(xIndex: Int) -> [ChartDataEntry]\n    {\n        var vals = [ChartDataEntry]()\n        \n        guard let data = _data else { return vals }\n\n        for i in 0 ..< data.dataSetCount\n        {\n            let set = data.getDataSetByIndex(i)\n            let e = set.entryForXIndex(xIndex)\n            if (e !== nil)\n            {\n                vals.append(e!)\n            }\n        }\n        \n        return vals\n    }\n    \n    /// - returns: the ViewPortHandler of the chart that is responsible for the\n    /// content area of the chart and its offsets and dimensions.\n    public var viewPortHandler: ChartViewPortHandler!\n    {\n        return _viewPortHandler\n    }\n    \n    /// - returns: the bitmap that represents the chart.\n    public func getChartImage(transparent transparent: Bool) -> NSUIImage?\n    {\n        NSUIGraphicsBeginImageContextWithOptions(bounds.size, opaque || !transparent, NSUIMainScreen()?.nsuiScale ?? 1.0)\n        \n        let context = NSUIGraphicsGetCurrentContext()\n        let rect = CGRect(origin: CGPoint(x: 0, y: 0), size: bounds.size)\n        \n        if (opaque || !transparent)\n        {\n            // Background color may be partially transparent, we must fill with white if we want to output an opaque image\n            CGContextSetFillColorWithColor(context, NSUIColor.whiteColor().CGColor)\n            CGContextFillRect(context, rect)\n            \n            if (self.backgroundColor !== nil)\n            {\n                CGContextSetFillColorWithColor(context, self.backgroundColor?.CGColor)\n                CGContextFillRect(context, rect)\n            }\n        }\n        \n        if let context = context\n        {\n            nsuiLayer?.renderInContext(context)\n        }\n        \n        let image = NSUIGraphicsGetImageFromCurrentImageContext()\n        \n        NSUIGraphicsEndImageContext()\n        \n        return image\n    }\n    \n    public enum ImageFormat\n    {\n        case JPEG\n        case PNG\n    }\n    \n    /// Saves the current chart state with the given name to the given path on\n    /// the sdcard leaving the path empty \"\" will put the saved file directly on\n    /// the SD card chart is saved as a PNG image, example:\n    /// saveToPath(\"myfilename\", \"foldername1/foldername2\")\n    ///\n    /// - parameter filePath: path to the image to save\n    /// - parameter format: the format to save\n    /// - parameter compressionQuality: compression quality for lossless formats (JPEG)\n    ///\n    /// - returns: true if the image was saved successfully\n    public func saveToPath(path: String, format: ImageFormat, compressionQuality: Double) -> Bool\n    {\n\t\tif let image = getChartImage(transparent: format != .JPEG) {\n\t\t\tvar imageData: NSData!\n\t\t\tswitch (format)\n\t\t\t{\n\t\t\tcase .PNG:\n\t\t\t\timageData = NSUIImagePNGRepresentation(image)\n\t\t\t\tbreak\n\t\t\t\t\n\t\t\tcase .JPEG:\n\t\t\t\timageData = NSUIImageJPEGRepresentation(image, CGFloat(compressionQuality))\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\treturn imageData.writeToFile(path, atomically: true)\n\t\t}\n\t\treturn false\n    }\n    \n    #if !os(tvOS) && !os(OSX)\n    /// Saves the current state of the chart to the camera roll\n    public func saveToCameraRoll()\n    {\n\t\tif let img = getChartImage(transparent: false) {\n\t\t\tUIImageWriteToSavedPhotosAlbum(img, nil, nil, nil)\n\t\t}\n    }\n    #endif\n    \n    internal var _viewportJobs = [ChartViewPortJob]()\n    \n    public override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>)\n    {\n        if (keyPath == \"bounds\" || keyPath == \"frame\")\n        {\n            let bounds = self.bounds\n            \n            if (_viewPortHandler !== nil &&\n                (bounds.size.width != _viewPortHandler.chartWidth ||\n                bounds.size.height != _viewPortHandler.chartHeight))\n            {\n                _viewPortHandler.setChartDimens(width: bounds.size.width, height: bounds.size.height)\n                \n                // Finish any pending viewport changes\n                while (!_viewportJobs.isEmpty)\n                {\n                    let job = _viewportJobs.removeAtIndex(0)\n                    job.doJob()\n                }\n                \n                notifyDataSetChanged()\n            }\n        }\n    }\n    \n    public func removeViewportJob(job: ChartViewPortJob)\n    {\n        if let index = _viewportJobs.indexOf({ $0 === job })\n        {\n            _viewportJobs.removeAtIndex(index)\n        }\n    }\n    \n    public func clearAllViewportJobs()\n    {\n        _viewportJobs.removeAll(keepCapacity: false)\n    }\n    \n    public func addViewportJob(job: ChartViewPortJob)\n    {\n        if (_viewPortHandler.hasChartDimens)\n        {\n            job.doJob()\n        }\n        else\n        {\n            _viewportJobs.append(job)\n        }\n    }\n    \n    /// **default**: true\n    /// - returns: true if chart continues to scroll after touch up, false if not.\n    public var isDragDecelerationEnabled: Bool\n        {\n            return dragDecelerationEnabled\n    }\n    \n    /// Deceleration friction coefficient in [0 ; 1] interval, higher values indicate that speed will decrease slowly, for example if it set to 0, it will stop immediately.\n    /// 1 is an invalid value, and will be converted to 0.999 automatically.\n    /// \n    /// **default**: true\n    public var dragDecelerationFrictionCoef: CGFloat\n    {\n        get\n        {\n            return _dragDecelerationFrictionCoef\n        }\n        set\n        {\n            var val = newValue\n            if (val < 0.0)\n            {\n                val = 0.0\n            }\n            if (val >= 1.0)\n            {\n                val = 0.999\n            }\n            \n            _dragDecelerationFrictionCoef = val\n        }\n    }\n    \n    // MARK: - ChartAnimatorDelegate\n    \n    public func chartAnimatorUpdated(chartAnimator: ChartAnimator)\n    {\n        setNeedsDisplay()\n    }\n    \n    public func chartAnimatorStopped(chartAnimator: ChartAnimator)\n    {\n        \n    }\n    \n    // MARK: - Touches\n    \n    public override func nsuiTouchesBegan(touches: Set<NSUITouch>, withEvent event: NSUIEvent?)\n    {\n        if (!_interceptTouchEvents)\n        {\n            super.nsuiTouchesBegan(touches, withEvent: event)\n        }\n    }\n    \n    public override func nsuiTouchesMoved(touches: Set<NSUITouch>, withEvent event: NSUIEvent?)\n    {\n        if (!_interceptTouchEvents)\n        {\n            super.nsuiTouchesMoved(touches, withEvent: event)\n        }\n    }\n    \n    public override func nsuiTouchesEnded(touches: Set<NSUITouch>, withEvent event: NSUIEvent?)\n    {\n        if (!_interceptTouchEvents)\n        {\n            super.nsuiTouchesEnded(touches, withEvent: event)\n        }\n    }\n    \n    public override func nsuiTouchesCancelled(touches: Set<NSUITouch>?, withEvent event: NSUIEvent?)\n    {\n        if (!_interceptTouchEvents)\n        {\n            super.nsuiTouchesCancelled(touches, withEvent: event)\n        }\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Charts/CombinedChartView.swift",
    "content": "//\n//  CombinedChartView.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n/// This chart class allows the combination of lines, bars, scatter and candle data all displayed in one chart area.\npublic class CombinedChartView: BarLineChartViewBase, LineChartDataProvider, BarChartDataProvider, ScatterChartDataProvider, CandleChartDataProvider, BubbleChartDataProvider\n{\n    /// the fill-formatter used for determining the position of the fill-line\n    internal var _fillFormatter: ChartFillFormatter!\n    \n    /// enum that allows to specify the order in which the different data objects for the combined-chart are drawn\n    @objc\n    public enum CombinedChartDrawOrder: Int\n    {\n        case Bar\n        case Bubble\n        case Line\n        case Candle\n        case Scatter\n    }\n    \n    public override func initialize()\n    {\n        super.initialize()\n        \n        self.highlighter = CombinedHighlighter(chart: self)\n        \n        /// WORKAROUND: Swift 2.0 compiler malfunctions when optimizations are enabled, and assigning directly to _fillFormatter causes a crash with a EXC_BAD_ACCESS. See https://github.com/danielgindi/ios-charts/issues/406\n        let workaroundFormatter = ChartDefaultFillFormatter()\n        _fillFormatter = workaroundFormatter\n        \n        renderer = CombinedChartRenderer(chart: self, animator: _animator, viewPortHandler: _viewPortHandler)\n    }\n    \n    override func calcMinMax()\n    {\n        super.calcMinMax()\n        guard let data = _data else { return }\n        \n        if (self.barData !== nil || self.candleData !== nil || self.bubbleData !== nil)\n        {\n            _xAxis._axisMinimum = -0.5\n            _xAxis._axisMaximum = Double(data.xVals.count) - 0.5\n            \n            if (self.bubbleData !== nil)\n            {\n                for set in self.bubbleData?.dataSets as! [IBubbleChartDataSet]\n                {\n                    let xmin = set.xMin\n                    let xmax = set.xMax\n                    \n                    if (xmin < chartXMin)\n                    {\n                        _xAxis._axisMinimum = xmin\n                    }\n                    \n                    if (xmax > chartXMax)\n                    {\n                        _xAxis._axisMaximum = xmax\n                    }\n                }\n            }\n        }\n        \n        _xAxis.axisRange = abs(_xAxis._axisMaximum - _xAxis._axisMinimum)\n        \n        if _xAxis.axisRange == 0.0 && self.lineData?.yValCount > 0\n        {\n            _xAxis.axisRange = 1.0\n        }\n    }\n    \n    public override var data: ChartData?\n    {\n        get\n        {\n            return super.data\n        }\n        set\n        {\n            super.data = newValue\n            (renderer as! CombinedChartRenderer?)!.createRenderers()\n        }\n    }\n    \n    public var fillFormatter: ChartFillFormatter\n    {\n        get\n        {\n            return _fillFormatter\n        }\n        set\n        {\n            _fillFormatter = newValue\n            if (_fillFormatter == nil)\n            {\n                _fillFormatter = ChartDefaultFillFormatter()\n            }\n        }\n    }\n    \n    // MARK: - LineChartDataProvider\n    \n    public var lineData: LineChartData?\n    {\n        get\n        {\n            if (_data === nil)\n            {\n                return nil\n            }\n            return (_data as! CombinedChartData!).lineData\n        }\n    }\n    \n    // MARK: - BarChartDataProvider\n    \n    public var barData: BarChartData?\n    {\n        get\n        {\n            if (_data === nil)\n            {\n                return nil\n            }\n            return (_data as! CombinedChartData!).barData\n        }\n    }\n    \n    // MARK: - ScatterChartDataProvider\n    \n    public var scatterData: ScatterChartData?\n    {\n        get\n        {\n            if (_data === nil)\n            {\n                return nil\n            }\n            return (_data as! CombinedChartData!).scatterData\n        }\n    }\n    \n    // MARK: - CandleChartDataProvider\n    \n    public var candleData: CandleChartData?\n    {\n        get\n        {\n            if (_data === nil)\n            {\n                return nil\n            }\n            return (_data as! CombinedChartData!).candleData\n        }\n    }\n    \n    // MARK: - BubbleChartDataProvider\n    \n    public var bubbleData: BubbleChartData?\n    {\n        get\n        {\n            if (_data === nil)\n            {\n                return nil\n            }\n            return (_data as! CombinedChartData!).bubbleData\n        }\n    }\n    \n    // MARK: - Accessors\n    \n    /// flag that enables or disables the highlighting arrow\n    public var drawHighlightArrowEnabled: Bool\n    {\n        get { return (renderer as! CombinedChartRenderer!).drawHighlightArrowEnabled }\n        set { (renderer as! CombinedChartRenderer!).drawHighlightArrowEnabled = newValue }\n    }\n    \n    /// if set to true, all values are drawn above their bars, instead of below their top\n    public var drawValueAboveBarEnabled: Bool\n        {\n        get { return (renderer as! CombinedChartRenderer!).drawValueAboveBarEnabled }\n        set { (renderer as! CombinedChartRenderer!).drawValueAboveBarEnabled = newValue }\n    }\n    \n    /// if set to true, a grey area is drawn behind each bar that indicates the maximum value\n    public var drawBarShadowEnabled: Bool\n    {\n        get { return (renderer as! CombinedChartRenderer!).drawBarShadowEnabled }\n        set { (renderer as! CombinedChartRenderer!).drawBarShadowEnabled = newValue }\n    }\n    \n    /// - returns: true if drawing the highlighting arrow is enabled, false if not\n    public var isDrawHighlightArrowEnabled: Bool { return (renderer as! CombinedChartRenderer!).drawHighlightArrowEnabled; }\n    \n    /// - returns: true if drawing values above bars is enabled, false if not\n    public var isDrawValueAboveBarEnabled: Bool { return (renderer as! CombinedChartRenderer!).drawValueAboveBarEnabled; }\n    \n    /// - returns: true if drawing shadows (maxvalue) for each bar is enabled, false if not\n    public var isDrawBarShadowEnabled: Bool { return (renderer as! CombinedChartRenderer!).drawBarShadowEnabled; }\n    \n    /// the order in which the provided data objects should be drawn.\n    /// The earlier you place them in the provided array, the further they will be in the background. \n    /// e.g. if you provide [DrawOrder.Bar, DrawOrder.Line], the bars will be drawn behind the lines.\n    public var drawOrder: [Int]\n    {\n        get\n        {\n            return (renderer as! CombinedChartRenderer!).drawOrder.map { $0.rawValue }\n        }\n        set\n        {\n            (renderer as! CombinedChartRenderer!).drawOrder = newValue.map { CombinedChartDrawOrder(rawValue: $0)! }\n        }\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Charts/HorizontalBarChartView.swift",
    "content": "//\n//  HorizontalBarChartView.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n/// BarChart with horizontal bar orientation. In this implementation, x- and y-axis are switched.\npublic class HorizontalBarChartView: BarChartView\n{\n    internal override func initialize()\n    {\n        super.initialize()\n        \n        _leftAxisTransformer = ChartTransformerHorizontalBarChart(viewPortHandler: _viewPortHandler)\n        _rightAxisTransformer = ChartTransformerHorizontalBarChart(viewPortHandler: _viewPortHandler)\n        \n        renderer = HorizontalBarChartRenderer(dataProvider: self, animator: _animator, viewPortHandler: _viewPortHandler)\n        _leftYAxisRenderer = ChartYAxisRendererHorizontalBarChart(viewPortHandler: _viewPortHandler, yAxis: _leftAxis, transformer: _leftAxisTransformer)\n        _rightYAxisRenderer = ChartYAxisRendererHorizontalBarChart(viewPortHandler: _viewPortHandler, yAxis: _rightAxis, transformer: _rightAxisTransformer)\n        _xAxisRenderer = ChartXAxisRendererHorizontalBarChart(viewPortHandler: _viewPortHandler, xAxis: _xAxis, transformer: _leftAxisTransformer, chart: self)\n        \n        self.highlighter = HorizontalBarChartHighlighter(chart: self)\n    }\n    \n    internal override func calculateOffsets()\n    {\n        var offsetLeft: CGFloat = 0.0,\n        offsetRight: CGFloat = 0.0,\n        offsetTop: CGFloat = 0.0,\n        offsetBottom: CGFloat = 0.0\n        \n        // setup offsets for legend\n        if (_legend !== nil && _legend.isEnabled)\n        {\n            if (_legend.position == .RightOfChart\n                || _legend.position == .RightOfChartCenter)\n            {\n                offsetRight += min(_legend.neededWidth, _viewPortHandler.chartWidth * _legend.maxSizePercent) + _legend.xOffset * 2.0\n            }\n            else if (_legend.position == .LeftOfChart\n                || _legend.position == .LeftOfChartCenter)\n            {\n                offsetLeft += min(_legend.neededWidth, _viewPortHandler.chartWidth * _legend.maxSizePercent) + _legend.xOffset * 2.0\n            }\n            else if (_legend.position == .BelowChartLeft\n                || _legend.position == .BelowChartRight\n                || _legend.position == .BelowChartCenter)\n            {\n                // It's possible that we do not need this offset anymore as it\n                //   is available through the extraOffsets, but changing it can mean\n                //   changing default visibility for existing apps.\n                let yOffset = _legend.textHeightMax + 2.5 * 2.0\n                \n                offsetBottom += min(_legend.neededHeight + yOffset, _viewPortHandler.chartHeight * _legend.maxSizePercent)\n            }\n            else if (_legend.position == .AboveChartLeft\n                || _legend.position == .AboveChartRight\n                || _legend.position == .AboveChartCenter)\n            {\n                // It's possible that we do not need this offset anymore as it\n                //   is available through the extraOffsets, but changing it can mean\n                //   changing default visibility for existing apps.\n                let yOffset = _legend.textHeightMax\n                \n                offsetTop += min(_legend.neededHeight + yOffset, _viewPortHandler.chartHeight * _legend.maxSizePercent)\n            }\n        }\n        \n        // offsets for y-labels\n        if (_leftAxis.needsOffset)\n        {\n            offsetTop += _leftAxis.getRequiredHeightSpace()\n        }\n        \n        if (_rightAxis.needsOffset)\n        {\n            offsetBottom += _rightAxis.getRequiredHeightSpace()\n        }\n        \n        let xlabelwidth = _xAxis.labelRotatedWidth\n        \n        if (_xAxis.isEnabled)\n        {\n            // offsets for x-labels\n            if (_xAxis.labelPosition == .Bottom)\n            {\n                offsetLeft += xlabelwidth\n            }\n            else if (_xAxis.labelPosition == .Top)\n            {\n                offsetRight += xlabelwidth\n            }\n            else if (_xAxis.labelPosition == .BothSided)\n            {\n                offsetLeft += xlabelwidth\n                offsetRight += xlabelwidth\n            }\n        }\n        \n        offsetTop += self.extraTopOffset\n        offsetRight += self.extraRightOffset\n        offsetBottom += self.extraBottomOffset\n        offsetLeft += self.extraLeftOffset\n        \n        _viewPortHandler.restrainViewPort(\n            offsetLeft: max(self.minOffset, offsetLeft),\n            offsetTop: max(self.minOffset, offsetTop),\n            offsetRight: max(self.minOffset, offsetRight),\n            offsetBottom: max(self.minOffset, offsetBottom))\n        \n        prepareOffsetMatrix()\n        prepareValuePxMatrix()\n    }\n    \n    internal override func prepareValuePxMatrix()\n    {\n        _rightAxisTransformer.prepareMatrixValuePx(chartXMin: _rightAxis._axisMinimum, deltaX: CGFloat(_rightAxis.axisRange), deltaY: CGFloat(_xAxis.axisRange), chartYMin: _xAxis._axisMinimum)\n        _leftAxisTransformer.prepareMatrixValuePx(chartXMin: _leftAxis._axisMinimum, deltaX: CGFloat(_leftAxis.axisRange), deltaY: CGFloat(_xAxis.axisRange), chartYMin: _xAxis._axisMinimum)\n    }\n\n    internal override func calcModulus()\n    {\n        if let data = _data\n        {\n            _xAxis.axisLabelModulus = Int(ceil((CGFloat(data.xValCount) * _xAxis.labelRotatedHeight) / (_viewPortHandler.contentHeight * viewPortHandler.touchMatrix.d)))\n        }\n        else\n        {\n            _xAxis.axisLabelModulus = 1\n        }\n        \n        if (_xAxis.axisLabelModulus < 1)\n        {\n            _xAxis.axisLabelModulus = 1\n        }\n    }\n    \n    public override func getBarBounds(e: BarChartDataEntry) -> CGRect\n    {\n        guard let\n            set = _data?.getDataSetForEntry(e) as? IBarChartDataSet\n            else { return CGRectNull }\n        \n        let barspace = set.barSpace\n        let y = CGFloat(e.value)\n        let x = CGFloat(e.xIndex)\n        \n        let spaceHalf = barspace / 2.0\n        let top = x - 0.5 + spaceHalf\n        let bottom = x + 0.5 - spaceHalf\n        let left = y >= 0.0 ? y : 0.0\n        let right = y <= 0.0 ? y : 0.0\n        \n        var bounds = CGRect(x: left, y: top, width: right - left, height: bottom - top)\n        \n        getTransformer(set.axisDependency).rectValueToPixel(&bounds)\n        \n        return bounds\n    }\n    \n    public override func getPosition(e: ChartDataEntry, axis: ChartYAxis.AxisDependency) -> CGPoint\n    {\n        var vals = CGPoint(x: CGFloat(e.value), y: CGFloat(e.xIndex))\n        \n        getTransformer(axis).pointValueToPixel(&vals)\n        \n        return vals\n    }\n\n    public override func getHighlightByTouchPoint(pt: CGPoint) -> ChartHighlight?\n    {\n        if _data === nil\n        {\n            Swift.print(\"Can't select by touch. No data set.\", terminator: \"\\n\")\n            return nil\n        }\n        \n        return self.highlighter?.getHighlight(x: Double(pt.y), y: Double(pt.x))\n    }\n    \n    public override var lowestVisibleXIndex: Int\n    {\n        let step = CGFloat(_data?.dataSetCount ?? 0)\n        let div = (step <= 1.0) ? 1.0 : step + (_data as! BarChartData).groupSpace\n        \n        var pt = CGPoint(x: _viewPortHandler.contentLeft, y: _viewPortHandler.contentBottom)\n        getTransformer(ChartYAxis.AxisDependency.Left).pixelToValue(&pt)\n        \n        return Int(((pt.y <= 0.0) ? 0.0 : pt.y / div) + 1.0)\n    }\n    \n    public override var highestVisibleXIndex: Int\n    {\n        let step = CGFloat(_data?.dataSetCount ?? 0)\n        let div = (step <= 1.0) ? 1.0 : step + (_data as! BarChartData).groupSpace\n        \n        var pt = CGPoint(x: _viewPortHandler.contentLeft, y: _viewPortHandler.contentTop)\n        getTransformer(ChartYAxis.AxisDependency.Left).pixelToValue(&pt)\n        \n        return Int((pt.y >= CGFloat(chartXMax)) ? CGFloat(chartXMax) / div : (pt.y / div))\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Charts/LineChartView.swift",
    "content": "//\n//  LineChartView.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n/// Chart that draws lines, surfaces, circles, ...\npublic class LineChartView: BarLineChartViewBase, LineChartDataProvider\n{\n    internal override func initialize()\n    {\n        super.initialize()\n        \n        renderer = LineChartRenderer(dataProvider: self, animator: _animator, viewPortHandler: _viewPortHandler)\n    }\n    \n    internal override func calcMinMax()\n    {\n        super.calcMinMax()\n        guard let data = _data else { return }\n        \n        if _xAxis.axisRange == 0.0 && data.yValCount > 0\n        {\n            _xAxis.axisRange = 1.0\n        }\n    }\n    \n    // MARK: - LineChartDataProvider\n    \n    public var lineData: LineChartData? { return _data as? LineChartData }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Charts/PieChartView.swift",
    "content": "//\n//  PieChartView.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n/// View that represents a pie chart. Draws cake like slices.\npublic class PieChartView: PieRadarChartViewBase\n{\n    /// rect object that represents the bounds of the piechart, needed for drawing the circle\n    private var _circleBox = CGRect()\n    \n    private var _drawXLabelsEnabled = true\n    \n    /// array that holds the width of each pie-slice in degrees\n    private var _drawAngles = [CGFloat]()\n    \n    /// array that holds the absolute angle in degrees of each slice\n    private var _absoluteAngles = [CGFloat]()\n    \n    /// if true, the hole inside the chart will be drawn\n    private var _drawHoleEnabled = true\n    \n    private var _holeColor: NSUIColor? = NSUIColor.whiteColor()\n    \n    /// if true, the hole will see-through to the inner tips of the slices\n    private var _drawSlicesUnderHoleEnabled = false\n    \n    /// if true, the values inside the piechart are drawn as percent values\n    private var _usePercentValuesEnabled = false\n    \n    /// variable for the text that is drawn in the center of the pie-chart\n    private var _centerAttributedText: NSAttributedString?\n    \n    /// indicates the size of the hole in the center of the piechart\n    ///\n    /// **default**: `0.5`\n    private var _holeRadiusPercent = CGFloat(0.5)\n    \n    private var _transparentCircleColor: NSUIColor? = NSUIColor(white: 1.0, alpha: 105.0/255.0)\n    \n    /// the radius of the transparent circle next to the chart-hole in the center\n    private var _transparentCircleRadiusPercent = CGFloat(0.55)\n    \n    /// if enabled, centertext is drawn\n    private var _drawCenterTextEnabled = true\n    \n    private var _centerTextRadiusPercent: CGFloat = 1.0\n    \n    /// maximum angle for this pie\n    private var _maxAngle: CGFloat = 360.0\n\n    public override init(frame: CGRect)\n    {\n        super.init(frame: frame)\n    }\n    \n    public required init?(coder aDecoder: NSCoder)\n    {\n        super.init(coder: aDecoder)\n    }\n    \n    internal override func initialize()\n    {\n        super.initialize()\n        \n        renderer = PieChartRenderer(chart: self, animator: _animator, viewPortHandler: _viewPortHandler)\n        _xAxis = nil\n    }\n    \n    public override func drawRect(rect: CGRect)\n    {\n        super.drawRect(rect)\n        \n        if _data === nil\n        {\n            return\n        }\n        \n        let optionalContext = NSUIGraphicsGetCurrentContext()\n        guard let context = optionalContext else { return }\n        \n        renderer!.drawData(context: context)\n        \n        if (valuesToHighlight())\n        {\n            renderer!.drawHighlighted(context: context, indices: _indicesToHighlight)\n        }\n        \n        renderer!.drawExtras(context: context)\n        \n        renderer!.drawValues(context: context)\n        \n        _legendRenderer.renderLegend(context: context)\n        \n        drawDescription(context: context)\n        \n        drawMarkers(context: context)\n    }\n    \n    internal override func calculateOffsets()\n    {\n        super.calculateOffsets()\n        \n        // prevent nullpointer when no data set\n        if _data === nil\n        {\n            return\n        }\n        \n        let radius = diameter / 2.0\n        \n        let c = self.centerOffsets\n        \n        let shift = (data as? PieChartData)?.dataSet?.selectionShift ?? 0.0\n        \n        // create the circle box that will contain the pie-chart (the bounds of the pie-chart)\n        _circleBox.origin.x = (c.x - radius) + shift\n        _circleBox.origin.y = (c.y - radius) + shift\n        _circleBox.size.width = diameter - shift * 2.0\n        _circleBox.size.height = diameter - shift * 2.0\n    }\n    \n    internal override func calcMinMax()\n    {\n        calcAngles()\n    }\n    \n    public override func getMarkerPosition(entry e: ChartDataEntry, highlight: ChartHighlight) -> CGPoint\n    {\n        let center = self.centerCircleBox\n        var r = self.radius\n        \n        var off = r / 10.0 * 3.6\n        \n        if self.isDrawHoleEnabled\n        {\n            off = (r - (r * self.holeRadiusPercent)) / 2.0\n        }\n        \n        r -= off // offset to keep things inside the chart\n        \n        let rotationAngle = self.rotationAngle\n        \n        let i = e.xIndex\n        \n        // offset needed to center the drawn text in the slice\n        let offset = drawAngles[i] / 2.0\n        \n        // calculate the text position\n        let x: CGFloat = (r * cos(((rotationAngle + absoluteAngles[i] - offset) * _animator.phaseY) * ChartUtils.Math.FDEG2RAD) + center.x)\n        let y: CGFloat = (r * sin(((rotationAngle + absoluteAngles[i] - offset) * _animator.phaseY) * ChartUtils.Math.FDEG2RAD) + center.y)\n        \n        return CGPoint(x: x, y: y)\n    }\n    \n    /// calculates the needed angles for the chart slices\n    private func calcAngles()\n    {\n        _drawAngles = [CGFloat]()\n        _absoluteAngles = [CGFloat]()\n        \n        guard let data = _data else { return }\n\n        _drawAngles.reserveCapacity(data.yValCount)\n        _absoluteAngles.reserveCapacity(data.yValCount)\n        \n        let yValueSum = (_data as! PieChartData).yValueSum\n        \n        var dataSets = data.dataSets\n\n        var cnt = 0\n\n        for i in 0 ..< data.dataSetCount\n        {\n            let set = dataSets[i]\n            let entryCount = set.entryCount\n\n            for j in 0 ..< entryCount\n            {\n                guard let e = set.entryForIndex(j) else { continue }\n                \n                _drawAngles.append(calcAngle(abs(e.value), yValueSum: yValueSum))\n\n                if (cnt == 0)\n                {\n                    _absoluteAngles.append(_drawAngles[cnt])\n                }\n                else\n                {\n                    _absoluteAngles.append(_absoluteAngles[cnt - 1] + _drawAngles[cnt])\n                }\n\n                cnt += 1\n            }\n        }\n    }\n    \n    /// checks if the given index in the given DataSet is set for highlighting or not\n    public func needsHighlight(xIndex xIndex: Int, dataSetIndex: Int) -> Bool\n    {\n        // no highlight\n        if (!valuesToHighlight() || dataSetIndex < 0)\n        {\n            return false\n        }\n        \n        for i in 0 ..< _indicesToHighlight.count\n        {\n            // check if the xvalue for the given dataset needs highlight\n            if (_indicesToHighlight[i].xIndex == xIndex\n                && _indicesToHighlight[i].dataSetIndex == dataSetIndex)\n            {\n                return true\n            }\n        }\n        \n        return false\n    }\n    \n    /// calculates the needed angle for a given value\n    private func calcAngle(value: Double) -> CGFloat\n    {\n        return calcAngle(value, yValueSum: (_data as! PieChartData).yValueSum)\n    }\n    \n    /// calculates the needed angle for a given value\n    private func calcAngle(value: Double, yValueSum: Double) -> CGFloat\n    {\n        return CGFloat(value) / CGFloat(yValueSum) * _maxAngle\n    }\n    \n    /// This will throw an exception, PieChart has no XAxis object.\n    public override var xAxis: ChartXAxis\n    {\n        fatalError(\"PieChart has no XAxis\")\n    }\n    \n    public override func indexForAngle(angle: CGFloat) -> Int\n    {\n        // take the current angle of the chart into consideration\n        let a = ChartUtils.normalizedAngleFromAngle(angle - self.rotationAngle)\n        for i in 0 ..< _absoluteAngles.count\n        {\n            if (_absoluteAngles[i] > a)\n            {\n                return i\n            }\n        }\n        \n        return -1; // return -1 if no index found\n    }\n    \n    /// - returns: the index of the DataSet this x-index belongs to.\n    public func dataSetIndexForIndex(xIndex: Int) -> Int\n    {\n        var dataSets = _data?.dataSets ?? []\n        \n        for i in 0 ..< dataSets.count\n        {\n            if (dataSets[i].entryForXIndex(xIndex) !== nil)\n            {\n                return i\n            }\n        }\n        \n        return -1\n    }\n    \n    /// - returns: an integer array of all the different angles the chart slices\n    /// have the angles in the returned array determine how much space (of 360°)\n    /// each slice takes\n    public var drawAngles: [CGFloat]\n    {\n        return _drawAngles\n    }\n\n    /// - returns: the absolute angles of the different chart slices (where the\n    /// slices end)\n    public var absoluteAngles: [CGFloat]\n    {\n        return _absoluteAngles\n    }\n    \n    /// The color for the hole that is drawn in the center of the PieChart (if enabled).\n    /// \n    /// *Note: Use holeTransparent with holeColor = nil to make the hole transparent.*\n    public var holeColor: NSUIColor?\n    {\n        get\n        {\n            return _holeColor\n        }\n        set\n        {\n            _holeColor = newValue\n            setNeedsDisplay()\n        }\n    }\n    \n    /// if true, the hole will see-through to the inner tips of the slices\n    ///\n    /// **default**: `false`\n    public var drawSlicesUnderHoleEnabled: Bool\n    {\n        get\n        {\n            return _drawSlicesUnderHoleEnabled\n        }\n        set\n        {\n            _drawSlicesUnderHoleEnabled = newValue\n            setNeedsDisplay()\n        }\n    }\n    \n    /// - returns: `true` if the inner tips of the slices are visible behind the hole, `false` if not.\n    public var isDrawSlicesUnderHoleEnabled: Bool\n    {\n        return drawSlicesUnderHoleEnabled\n    }\n    \n    /// true if the hole in the center of the pie-chart is set to be visible, false if not\n    public var drawHoleEnabled: Bool\n    {\n        get\n        {\n            return _drawHoleEnabled\n        }\n        set\n        {\n            _drawHoleEnabled = newValue\n            setNeedsDisplay()\n        }\n    }\n    \n    /// - returns: true if the hole in the center of the pie-chart is set to be visible, false if not\n    public var isDrawHoleEnabled: Bool\n    {\n        get\n        {\n            return drawHoleEnabled\n        }\n    }\n    \n    /// the text that is displayed in the center of the pie-chart\n    public var centerText: String?\n    {\n        get\n        {\n            return self.centerAttributedText?.string\n        }\n        set\n        {\n            var attrString: NSMutableAttributedString?\n            if newValue == nil\n            {\n                attrString = nil\n            }\n            else\n            {\n                let paragraphStyle = NSParagraphStyle.defaultParagraphStyle().mutableCopy() as! NSMutableParagraphStyle\n                paragraphStyle.lineBreakMode = NSLineBreakMode.ByTruncatingTail\n                paragraphStyle.alignment = .Center\n                \n                attrString = NSMutableAttributedString(string: newValue!)\n                attrString?.setAttributes([\n                    NSForegroundColorAttributeName: NSUIColor.blackColor(),\n                    NSFontAttributeName: NSUIFont.systemFontOfSize(12.0),\n                    NSParagraphStyleAttributeName: paragraphStyle\n                    ], range: NSMakeRange(0, attrString!.length))\n            }\n            self.centerAttributedText = attrString\n        }\n    }\n    \n    /// the text that is displayed in the center of the pie-chart\n    public var centerAttributedText: NSAttributedString?\n    {\n        get\n        {\n            return _centerAttributedText\n        }\n        set\n        {\n            _centerAttributedText = newValue\n            setNeedsDisplay()\n        }\n    }\n    \n    /// true if drawing the center text is enabled\n    public var drawCenterTextEnabled: Bool\n    {\n        get\n        {\n            return _drawCenterTextEnabled\n        }\n        set\n        {\n            _drawCenterTextEnabled = newValue\n            setNeedsDisplay()\n        }\n    }\n    \n    /// - returns: true if drawing the center text is enabled\n    public var isDrawCenterTextEnabled: Bool\n    {\n        get\n        {\n            return drawCenterTextEnabled\n        }\n    }\n    \n    internal override var requiredLegendOffset: CGFloat\n    {\n        return _legend.font.pointSize * 2.0\n    }\n    \n    internal override var requiredBaseOffset: CGFloat\n    {\n        return 0.0\n    }\n    \n    public override var radius: CGFloat\n    {\n        return _circleBox.width / 2.0\n    }\n    \n    /// - returns: the circlebox, the boundingbox of the pie-chart slices\n    public var circleBox: CGRect\n    {\n        return _circleBox\n    }\n    \n    /// - returns: the center of the circlebox\n    public var centerCircleBox: CGPoint\n    {\n        return CGPoint(x: _circleBox.midX, y: _circleBox.midY)\n    }\n    \n    /// the radius of the hole in the center of the piechart in percent of the maximum radius (max = the radius of the whole chart)\n    /// \n    /// **default**: 0.5 (50%) (half the pie)\n    public var holeRadiusPercent: CGFloat\n    {\n        get\n        {\n            return _holeRadiusPercent\n        }\n        set\n        {\n            _holeRadiusPercent = newValue\n            setNeedsDisplay()\n        }\n    }\n    \n    /// The color that the transparent-circle should have.\n    ///\n    /// **default**: `nil`\n    public var transparentCircleColor: NSUIColor?\n    {\n        get\n        {\n            return _transparentCircleColor\n        }\n        set\n        {\n            _transparentCircleColor = newValue\n            setNeedsDisplay()\n        }\n    }\n    \n    /// the radius of the transparent circle that is drawn next to the hole in the piechart in percent of the maximum radius (max = the radius of the whole chart)\n    /// \n    /// **default**: 0.55 (55%) -> means 5% larger than the center-hole by default\n    public var transparentCircleRadiusPercent: CGFloat\n    {\n        get\n        {\n            return _transparentCircleRadiusPercent\n        }\n        set\n        {\n            _transparentCircleRadiusPercent = newValue\n            setNeedsDisplay()\n        }\n    }\n    \n    /// set this to true to draw the x-value text into the pie slices\n    public var drawSliceTextEnabled: Bool\n    {\n        get\n        {\n            return _drawXLabelsEnabled\n        }\n        set\n        {\n            _drawXLabelsEnabled = newValue\n            setNeedsDisplay()\n        }\n    }\n    \n    /// - returns: true if drawing x-values is enabled, false if not\n    public var isDrawSliceTextEnabled: Bool\n    {\n        get\n        {\n            return drawSliceTextEnabled\n        }\n    }\n    \n    /// If this is enabled, values inside the PieChart are drawn in percent and not with their original value. Values provided for the ValueFormatter to format are then provided in percent.\n    public var usePercentValuesEnabled: Bool\n    {\n        get\n        {\n            return _usePercentValuesEnabled\n        }\n        set\n        {\n            _usePercentValuesEnabled = newValue\n            setNeedsDisplay()\n        }\n    }\n    \n    /// - returns: true if drawing x-values is enabled, false if not\n    public var isUsePercentValuesEnabled: Bool\n    {\n        get\n        {\n            return usePercentValuesEnabled\n        }\n    }\n    \n    /// the rectangular radius of the bounding box for the center text, as a percentage of the pie hole\n    public var centerTextRadiusPercent: CGFloat\n    {\n        get\n        {\n            return _centerTextRadiusPercent\n        }\n        set\n        {\n            _centerTextRadiusPercent = newValue\n            setNeedsDisplay()\n        }\n    }\n    \n    /// The max angle that is used for calculating the pie-circle.\n    /// 360 means it's a full pie-chart, 180 results in a half-pie-chart.\n    /// **default**: 360.0\n    public var maxAngle: CGFloat\n    {\n        get\n        {\n            return _maxAngle\n        }\n        set\n        {\n            _maxAngle = newValue\n            \n            if _maxAngle > 360.0\n            {\n                _maxAngle = 360.0\n            }\n            \n            if _maxAngle < 90.0\n            {\n                _maxAngle = 90.0\n            }\n        }\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Charts/PieRadarChartViewBase.swift",
    "content": "//\n//  PieRadarChartViewBase.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n/// Base class of PieChartView and RadarChartView.\npublic class PieRadarChartViewBase: ChartViewBase\n{\n    /// holds the normalized version of the current rotation angle of the chart\n    private var _rotationAngle = CGFloat(270.0)\n    \n    /// holds the raw version of the current rotation angle of the chart\n    private var _rawRotationAngle = CGFloat(270.0)\n    \n    /// flag that indicates if rotation is enabled or not\n    public var rotationEnabled = true\n    \n    /// Sets the minimum offset (padding) around the chart, defaults to 0.0\n    public var minOffset = CGFloat(0.0)\n\n    /// iOS && OSX only: Enabled multi-touch rotation using two fingers.\n    private var _rotationWithTwoFingers = false\n    \n    private var _tapGestureRecognizer: NSUITapGestureRecognizer!\n    #if !os(tvOS)\n    private var _rotationGestureRecognizer: NSUIRotationGestureRecognizer!\n    #endif\n    \n    public override init(frame: CGRect)\n    {\n        super.init(frame: frame)\n    }\n    \n    public required init?(coder aDecoder: NSCoder)\n    {\n        super.init(coder: aDecoder)\n    }\n    \n    deinit\n    {\n        stopDeceleration()\n    }\n    \n    internal override func initialize()\n    {\n        super.initialize()\n        \n        _tapGestureRecognizer = NSUITapGestureRecognizer(target: self, action: #selector(PieRadarChartViewBase.tapGestureRecognized(_:)))\n        \n        self.addGestureRecognizer(_tapGestureRecognizer)\n\n        #if !os(tvOS)\n            _rotationGestureRecognizer = NSUIRotationGestureRecognizer(target: self, action: #selector(PieRadarChartViewBase.rotationGestureRecognized(_:)))\n            self.addGestureRecognizer(_rotationGestureRecognizer)\n            _rotationGestureRecognizer.enabled = rotationWithTwoFingers\n        #endif\n    }\n    \n    internal override func calcMinMax()\n    {\n        _xAxis.axisRange = Double((_data?.xVals.count ?? 0) - 1)\n    }\n    \n    public override func notifyDataSetChanged()\n    {\n        calcMinMax()\n        \n        if let data = _data where _legend !== nil\n        {\n            _legendRenderer.computeLegend(data)\n        }\n        \n        calculateOffsets()\n        \n        setNeedsDisplay()\n    }\n  \n    internal override func calculateOffsets()\n    {\n        var legendLeft = CGFloat(0.0)\n        var legendRight = CGFloat(0.0)\n        var legendBottom = CGFloat(0.0)\n        var legendTop = CGFloat(0.0)\n\n        if (_legend != nil && _legend.enabled)\n        {\n            var fullLegendWidth = min(_legend.neededWidth, _viewPortHandler.chartWidth * _legend.maxSizePercent)\n            fullLegendWidth += _legend.formSize + _legend.formToTextSpace\n            \n            if (_legend.position == .RightOfChartCenter)\n            {\n                // this is the space between the legend and the chart\n                let spacing = CGFloat(13.0)\n\n                legendRight = fullLegendWidth + spacing\n            }\n            else if (_legend.position == .RightOfChart)\n            {\n                // this is the space between the legend and the chart\n                let spacing = CGFloat(8.0)\n                \n                let legendWidth = fullLegendWidth + spacing\n                let legendHeight = _legend.neededHeight + _legend.textHeightMax\n\n                let c = self.midPoint\n\n                let bottomRight = CGPoint(x: self.bounds.width - legendWidth + 15.0, y: legendHeight + 15)\n                let distLegend = distanceToCenter(x: bottomRight.x, y: bottomRight.y)\n\n                let reference = getPosition(center: c, dist: self.radius,\n                    angle: angleForPoint(x: bottomRight.x, y: bottomRight.y))\n\n                let distReference = distanceToCenter(x: reference.x, y: reference.y)\n                let minOffset = CGFloat(5.0)\n\n                if (distLegend < distReference)\n                {\n                    let diff = distReference - distLegend\n                    legendRight = minOffset + diff\n                }\n\n                if (bottomRight.y >= c.y && self.bounds.height - legendWidth > self.bounds.width)\n                {\n                    legendRight = legendWidth\n                }\n            }\n            else if (_legend.position == .LeftOfChartCenter)\n            {\n                // this is the space between the legend and the chart\n                let spacing = CGFloat(13.0)\n\n                legendLeft = fullLegendWidth + spacing\n            }\n            else if (_legend.position == .LeftOfChart)\n            {\n\n                // this is the space between the legend and the chart\n                let spacing = CGFloat(8.0)\n                \n                let legendWidth = fullLegendWidth + spacing\n                let legendHeight = _legend.neededHeight + _legend.textHeightMax\n\n                let c = self.midPoint\n\n                let bottomLeft = CGPoint(x: legendWidth - 15.0, y: legendHeight + 15)\n                let distLegend = distanceToCenter(x: bottomLeft.x, y: bottomLeft.y)\n\n                let reference = getPosition(center: c, dist: self.radius,\n                    angle: angleForPoint(x: bottomLeft.x, y: bottomLeft.y))\n\n                let distReference = distanceToCenter(x: reference.x, y: reference.y)\n                let min = CGFloat(5.0)\n\n                if (distLegend < distReference)\n                {\n                    let diff = distReference - distLegend\n                    legendLeft = min + diff\n                }\n\n                if (bottomLeft.y >= c.y && self.bounds.height - legendWidth > self.bounds.width)\n                {\n                    legendLeft = legendWidth\n                }\n            }\n            else if (_legend.position == .BelowChartLeft\n                    || _legend.position == .BelowChartRight\n                    || _legend.position == .BelowChartCenter)\n            {\n                // It's possible that we do not need this offset anymore as it\n                //   is available through the extraOffsets, but changing it can mean\n                //   changing default visibility for existing apps.\n                let yOffset = self.requiredLegendOffset\n                \n                legendBottom = min(_legend.neededHeight + yOffset, _viewPortHandler.chartHeight * _legend.maxSizePercent)\n            }\n            else if (_legend.position == .AboveChartLeft\n                || _legend.position == .AboveChartRight\n                || _legend.position == .AboveChartCenter)\n            {\n                // It's possible that we do not need this offset anymore as it\n                //   is available through the extraOffsets, but changing it can mean\n                //   changing default visibility for existing apps.\n                let yOffset = self.requiredLegendOffset\n                \n                legendTop = min(_legend.neededHeight + yOffset, _viewPortHandler.chartHeight * _legend.maxSizePercent)\n            }\n\n            legendLeft += self.requiredBaseOffset\n            legendRight += self.requiredBaseOffset\n            legendTop += self.requiredBaseOffset\n        }\n        \n        legendTop += self.extraTopOffset\n        legendRight += self.extraRightOffset\n        legendBottom += self.extraBottomOffset\n        legendLeft += self.extraLeftOffset\n        \n        var minOffset = self.minOffset\n        \n        if (self.isKindOfClass(RadarChartView))\n        {\n            let x = (self as! RadarChartView).xAxis\n            \n            if x.isEnabled && x.drawLabelsEnabled\n            {\n                minOffset = max(minOffset, x.labelRotatedWidth)\n            }\n        }\n\n        let offsetLeft = max(minOffset, legendLeft)\n        let offsetTop = max(minOffset, legendTop)\n        let offsetRight = max(minOffset, legendRight)\n        let offsetBottom = max(minOffset, max(self.requiredBaseOffset, legendBottom))\n\n        _viewPortHandler.restrainViewPort(offsetLeft: offsetLeft, offsetTop: offsetTop, offsetRight: offsetRight, offsetBottom: offsetBottom)\n    }\n\n    /// - returns: the angle relative to the chart center for the given point on the chart in degrees.\n    /// The angle is always between 0 and 360°, 0° is NORTH, 90° is EAST, ...\n    public func angleForPoint(x x: CGFloat, y: CGFloat) -> CGFloat\n    {\n        let c = centerOffsets\n        \n        let tx = Double(x - c.x)\n        let ty = Double(y - c.y)\n        let length = sqrt(tx * tx + ty * ty)\n        let r = acos(ty / length)\n\n        var angle = r * ChartUtils.Math.RAD2DEG\n\n        if (x > c.x)\n        {\n            angle = 360.0 - angle\n        }\n\n        // add 90° because chart starts EAST\n        angle = angle + 90.0\n\n        // neutralize overflow\n        if (angle > 360.0)\n        {\n            angle = angle - 360.0\n        }\n\n        return CGFloat(angle)\n    }\n    \n    /// Calculates the position around a center point, depending on the distance\n    /// from the center, and the angle of the position around the center.\n    internal func getPosition(center center: CGPoint, dist: CGFloat, angle: CGFloat) -> CGPoint\n    {\n        return CGPoint(x: center.x + dist * cos(angle * ChartUtils.Math.FDEG2RAD),\n                y: center.y + dist * sin(angle * ChartUtils.Math.FDEG2RAD))\n    }\n\n    /// - returns: the distance of a certain point on the chart to the center of the chart.\n    public func distanceToCenter(x x: CGFloat, y: CGFloat) -> CGFloat\n    {\n        let c = self.centerOffsets\n\n        var dist = CGFloat(0.0)\n\n        var xDist = CGFloat(0.0)\n        var yDist = CGFloat(0.0)\n\n        if (x > c.x)\n        {\n            xDist = x - c.x\n        }\n        else\n        {\n            xDist = c.x - x\n        }\n\n        if (y > c.y)\n        {\n            yDist = y - c.y\n        }\n        else\n        {\n            yDist = c.y - y\n        }\n\n        // pythagoras\n        dist = sqrt(pow(xDist, 2.0) + pow(yDist, 2.0))\n\n        return dist\n    }\n\n    /// - returns: the xIndex for the given angle around the center of the chart.\n    /// -1 if not found / outofbounds.\n    public func indexForAngle(angle: CGFloat) -> Int\n    {\n        fatalError(\"indexForAngle() cannot be called on PieRadarChartViewBase\")\n    }\n\n    /// current rotation angle of the pie chart\n    ///\n    /// **default**: 270 --> top (NORTH)\n    /// - returns: will always return a normalized value, which will be between 0.0 < 360.0\n    public var rotationAngle: CGFloat\n    {\n        get\n        {\n            return _rotationAngle\n        }\n        set\n        {\n            _rawRotationAngle = newValue\n            _rotationAngle = ChartUtils.normalizedAngleFromAngle(newValue)\n            setNeedsDisplay()\n        }\n    }\n    \n    /// gets the raw version of the current rotation angle of the pie chart the returned value could be any value, negative or positive, outside of the 360 degrees. \n    /// this is used when working with rotation direction, mainly by gestures and animations.\n    public var rawRotationAngle: CGFloat\n    {\n        return _rawRotationAngle\n    }\n\n    /// - returns: the diameter of the pie- or radar-chart\n    public var diameter: CGFloat\n    {\n        let content = _viewPortHandler.contentRect\n        return min(content.width, content.height)\n    }\n\n    /// - returns: the radius of the chart in pixels.\n    public var radius: CGFloat\n    {\n        fatalError(\"radius cannot be called on PieRadarChartViewBase\")\n    }\n\n    /// - returns: the required offset for the chart legend.\n    internal var requiredLegendOffset: CGFloat\n    {\n        fatalError(\"requiredLegendOffset cannot be called on PieRadarChartViewBase\")\n    }\n\n    /// - returns: the base offset needed for the chart without calculating the\n    /// legend size.\n    internal var requiredBaseOffset: CGFloat\n    {\n        fatalError(\"requiredBaseOffset cannot be called on PieRadarChartViewBase\")\n    }\n    \n    public override var chartYMax: Double\n    {\n        return 0.0\n    }\n    \n    public override var chartYMin: Double\n    {\n        return 0.0\n    }\n    \n    /// The SelectionDetail objects give information about the value at the selected index and the DataSet it belongs to.\n    /// - returns: an array of SelectionDetail objects for the given x-index.\n    public func getSelectionDetailsAtIndex(xIndex: Int) -> [ChartSelectionDetail]\n    {\n        var vals = [ChartSelectionDetail]()\n        \n        guard let data = _data else { return vals }\n\n        for i in 0 ..< data.dataSetCount\n        {\n            guard let dataSet = data.getDataSetByIndex(i) else { continue }\n            \n            if !dataSet.isHighlightEnabled\n            {\n                continue\n            }\n            \n            // extract all y-values from all DataSets at the given x-index\n            let yVal = dataSet.yValForXIndex(xIndex)\n            if (yVal.isNaN)\n            {\n                continue\n            }\n            \n            vals.append(ChartSelectionDetail(value: yVal, dataSetIndex: i, dataSet: dataSet))\n        }\n        \n        return vals\n    }\n    \n    public var isRotationEnabled: Bool { return rotationEnabled; }\n    \n    /// flag that indicates if rotation is done with two fingers or one.\n    /// when the chart is inside a scrollview, you need a two-finger rotation because a one-finger rotation eats up all touch events.\n    ///\n    /// On iOS this will disable one-finger rotation.\n    /// On OSX this will keep two-finger multitouch rotation, and one-pointer mouse rotation.\n    /// \n    /// **default**: false\n    public var rotationWithTwoFingers: Bool\n    {\n        get\n        {\n            return _rotationWithTwoFingers\n        }\n        set\n        {\n            _rotationWithTwoFingers = newValue\n            #if !os(tvOS)\n                _rotationGestureRecognizer.enabled = _rotationWithTwoFingers\n            #endif\n        }\n    }\n    \n    /// flag that indicates if rotation is done with two fingers or one.\n    /// when the chart is inside a scrollview, you need a two-finger rotation because a one-finger rotation eats up all touch events.\n    ///\n    /// On iOS this will disable one-finger rotation.\n    /// On OSX this will keep two-finger multitouch rotation, and one-pointer mouse rotation.\n    ///\n    /// **default**: false\n    public var isRotationWithTwoFingers: Bool\n    {\n        return _rotationWithTwoFingers\n    }\n    \n    // MARK: - Animation\n    \n    private var _spinAnimator: ChartAnimator!\n    \n    /// Applys a spin animation to the Chart.\n    public func spin(duration duration: NSTimeInterval, fromAngle: CGFloat, toAngle: CGFloat, easing: ChartEasingFunctionBlock?)\n    {\n        if (_spinAnimator != nil)\n        {\n            _spinAnimator.stop()\n        }\n        \n        _spinAnimator = ChartAnimator()\n        _spinAnimator.updateBlock = {\n            self.rotationAngle = (toAngle - fromAngle) * self._spinAnimator.phaseX + fromAngle\n        }\n        _spinAnimator.stopBlock = { self._spinAnimator = nil; }\n        \n        _spinAnimator.animate(xAxisDuration: duration, easing: easing)\n    }\n    \n    public func spin(duration duration: NSTimeInterval, fromAngle: CGFloat, toAngle: CGFloat, easingOption: ChartEasingOption)\n    {\n        spin(duration: duration, fromAngle: fromAngle, toAngle: toAngle, easing: easingFunctionFromOption(easingOption))\n    }\n    \n    public func spin(duration duration: NSTimeInterval, fromAngle: CGFloat, toAngle: CGFloat)\n    {\n        spin(duration: duration, fromAngle: fromAngle, toAngle: toAngle, easing: nil)\n    }\n    \n    public func stopSpinAnimation()\n    {\n        if (_spinAnimator != nil)\n        {\n            _spinAnimator.stop()\n        }\n    }\n    \n    // MARK: - Gestures\n    \n    private var _rotationGestureStartPoint: CGPoint!\n    private var _isRotating = false\n    private var _startAngle = CGFloat(0.0)\n    \n    private struct AngularVelocitySample\n    {\n        var time: NSTimeInterval\n        var angle: CGFloat\n    }\n    \n    private var _velocitySamples = [AngularVelocitySample]()\n    \n    private var _decelerationLastTime: NSTimeInterval = 0.0\n    private var _decelerationDisplayLink: NSUIDisplayLink!\n    private var _decelerationAngularVelocity: CGFloat = 0.0\n    \n    internal final func processRotationGestureBegan(location location: CGPoint)\n    {\n        self.resetVelocity()\n        \n        if rotationEnabled\n        {\n            self.sampleVelocity(touchLocation: location)\n        }\n        \n        self.setGestureStartAngle(x: location.x, y: location.y)\n        \n        _rotationGestureStartPoint = location\n    }\n    \n    internal final func processRotationGestureMoved(location location: CGPoint)\n    {\n        if isDragDecelerationEnabled\n        {\n            sampleVelocity(touchLocation: location)\n        }\n        \n        if !_isRotating &&\n            distance(\n                eventX: location.x,\n                startX: _rotationGestureStartPoint.x,\n                eventY: location.y,\n                startY: _rotationGestureStartPoint.y) > CGFloat(8.0)\n        {\n            _isRotating = true\n        }\n        else\n        {\n            self.updateGestureRotation(x: location.x, y: location.y)\n            setNeedsDisplay()\n        }\n    }\n    \n    internal final func processRotationGestureEnded(location location: CGPoint)\n    {\n        if isDragDecelerationEnabled\n        {\n            stopDeceleration()\n            \n            sampleVelocity(touchLocation: location)\n            \n            _decelerationAngularVelocity = calculateVelocity()\n            \n            if _decelerationAngularVelocity != 0.0\n            {\n                _decelerationLastTime = CACurrentMediaTime()\n                _decelerationDisplayLink = NSUIDisplayLink(target: self, selector: #selector(PieRadarChartViewBase.decelerationLoop))\n                _decelerationDisplayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)\n            }\n        }\n    }\n    \n    internal final func processRotationGestureCancelled()\n    {\n        if (_isRotating)\n        {\n            _isRotating = false\n        }\n    }\n    \n    #if !os(OSX)\n    public override func nsuiTouchesBegan(touches: Set<NSUITouch>, withEvent event: NSUIEvent?)\n    {\n        // if rotation by touch is enabled\n        if (rotationEnabled)\n        {\n            stopDeceleration()\n            \n            if (!rotationWithTwoFingers)\n            {\n                let touch = touches.first as NSUITouch!\n                \n                let touchLocation = touch.locationInView(self)\n                \n                processRotationGestureBegan(location: touchLocation)\n            }\n        }\n        \n        if (!_isRotating)\n        {\n            super.nsuiTouchesBegan(touches, withEvent: event)\n        }\n    }\n    \n    public override func nsuiTouchesMoved(touches: Set<NSUITouch>, withEvent event: NSUIEvent?)\n    {\n        if (rotationEnabled && !rotationWithTwoFingers)\n        {\n            let touch = touches.first as NSUITouch!\n            \n            let touchLocation = touch.locationInView(self)\n            \n            processRotationGestureMoved(location: touchLocation)\n        }\n        \n        if (!_isRotating)\n        {\n            super.nsuiTouchesMoved(touches, withEvent: event)\n        }\n    }\n    \n    public override func nsuiTouchesEnded(touches: Set<NSUITouch>, withEvent event: NSUIEvent?)\n    {\n        if (!_isRotating)\n        {\n            super.nsuiTouchesEnded(touches, withEvent: event)\n        }\n        \n        if (rotationEnabled && !rotationWithTwoFingers)\n        {\n            let touch = touches.first as NSUITouch!\n            \n            let touchLocation = touch.locationInView(self)\n            \n            processRotationGestureEnded(location: touchLocation)\n        }\n        \n        if (_isRotating)\n        {\n            _isRotating = false\n        }\n    }\n    \n    public override func nsuiTouchesCancelled(touches: Set<NSUITouch>?, withEvent event: NSUIEvent?)\n    {\n        super.nsuiTouchesCancelled(touches, withEvent: event)\n        \n        processRotationGestureCancelled()\n    }\n    #endif\n    \n    #if os(OSX)\n    public override func mouseDown(theEvent: NSEvent)\n    {\n        // if rotation by touch is enabled\n        if rotationEnabled\n        {\n            stopDeceleration()\n        \n            let location = self.convertPoint(theEvent.locationInWindow, fromView: nil)\n            \n            processRotationGestureBegan(location: location)\n        }\n        \n        if !_isRotating\n        {\n            super.mouseDown(theEvent)\n        }\n    }\n    \n    public override func mouseDragged(theEvent: NSEvent)\n    {\n        if rotationEnabled\n        {\n            let location = self.convertPoint(theEvent.locationInWindow, fromView: nil)\n            \n            processRotationGestureMoved(location: location)\n        }\n        \n        if !_isRotating\n        {\n            super.mouseDragged(theEvent)\n        }\n    }\n    \n    public override func mouseUp(theEvent: NSEvent)\n    {\n        if !_isRotating\n        {\n            super.mouseUp(theEvent)\n        }\n        \n        if rotationEnabled\n        {\n            let location = self.convertPoint(theEvent.locationInWindow, fromView: nil)\n            \n            processRotationGestureEnded(location: location)\n        }\n        \n        if _isRotating\n        {\n            _isRotating = false\n        }\n    }\n    #endif\n    \n    private func resetVelocity()\n    {\n        _velocitySamples.removeAll(keepCapacity: false)\n    }\n    \n    private func sampleVelocity(touchLocation touchLocation: CGPoint)\n    {\n        let currentTime = CACurrentMediaTime()\n        \n        _velocitySamples.append(AngularVelocitySample(time: currentTime, angle: angleForPoint(x: touchLocation.x, y: touchLocation.y)))\n        \n        // Remove samples older than our sample time - 1 seconds\n        var i = 0, count = _velocitySamples.count\n        while (i < count - 2)\n        {\n            if (currentTime - _velocitySamples[i].time > 1.0)\n            {\n                _velocitySamples.removeAtIndex(0)\n                i -= 1\n                count -= 1\n            }\n            else\n            {\n                break\n            }\n            \n            i += 1\n        }\n    }\n    \n    private func calculateVelocity() -> CGFloat\n    {\n        if (_velocitySamples.isEmpty)\n        {\n            return 0.0\n        }\n        \n        var firstSample = _velocitySamples[0]\n        var lastSample = _velocitySamples[_velocitySamples.count - 1]\n        \n        // Look for a sample that's closest to the latest sample, but not the same, so we can deduce the direction\n        var beforeLastSample = firstSample\n        for i in (_velocitySamples.count - 1).stride(through: 0, by: -1)\n        {\n            beforeLastSample = _velocitySamples[i]\n            if (beforeLastSample.angle != lastSample.angle)\n            {\n                break\n            }\n        }\n        \n        // Calculate the sampling time\n        var timeDelta = lastSample.time - firstSample.time\n        if (timeDelta == 0.0)\n        {\n            timeDelta = 0.1\n        }\n        \n        // Calculate clockwise/ccw by choosing two values that should be closest to each other,\n        // so if the angles are two far from each other we know they are inverted \"for sure\"\n        var clockwise = lastSample.angle >= beforeLastSample.angle\n        if (abs(lastSample.angle - beforeLastSample.angle) > 270.0)\n        {\n            clockwise = !clockwise\n        }\n        \n        // Now if the \"gesture\" is over a too big of an angle - then we know the angles are inverted, and we need to move them closer to each other from both sides of the 360.0 wrapping point\n        if (lastSample.angle - firstSample.angle > 180.0)\n        {\n            firstSample.angle += 360.0\n        }\n        else if (firstSample.angle - lastSample.angle > 180.0)\n        {\n            lastSample.angle += 360.0\n        }\n        \n        // The velocity\n        var velocity = abs((lastSample.angle - firstSample.angle) / CGFloat(timeDelta))\n        \n        // Direction?\n        if (!clockwise)\n        {\n            velocity = -velocity\n        }\n        \n        return velocity\n    }\n    \n    /// sets the starting angle of the rotation, this is only used by the touch listener, x and y is the touch position\n    private func setGestureStartAngle(x x: CGFloat, y: CGFloat)\n    {\n        _startAngle = angleForPoint(x: x, y: y)\n        \n        // take the current angle into consideration when starting a new drag\n        _startAngle -= _rotationAngle\n    }\n    \n    /// updates the view rotation depending on the given touch position, also takes the starting angle into consideration\n    private func updateGestureRotation(x x: CGFloat, y: CGFloat)\n    {\n        self.rotationAngle = angleForPoint(x: x, y: y) - _startAngle\n    }\n    \n    public func stopDeceleration()\n    {\n        if (_decelerationDisplayLink !== nil)\n        {\n            _decelerationDisplayLink.removeFromRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)\n            _decelerationDisplayLink = nil\n        }\n    }\n    \n    @objc private func decelerationLoop()\n    {\n        let currentTime = CACurrentMediaTime()\n        \n        _decelerationAngularVelocity *= self.dragDecelerationFrictionCoef\n        \n        let timeInterval = CGFloat(currentTime - _decelerationLastTime)\n        \n        self.rotationAngle += _decelerationAngularVelocity * timeInterval\n        \n        _decelerationLastTime = currentTime\n        \n        if(abs(_decelerationAngularVelocity) < 0.001)\n        {\n            stopDeceleration()\n        }\n    }\n    \n    /// - returns: the distance between two points\n    private func distance(eventX eventX: CGFloat, startX: CGFloat, eventY: CGFloat, startY: CGFloat) -> CGFloat\n    {\n        let dx = eventX - startX\n        let dy = eventY - startY\n        return sqrt(dx * dx + dy * dy)\n    }\n    \n    /// - returns: the distance between two points\n    private func distance(from from: CGPoint, to: CGPoint) -> CGFloat\n    {\n        let dx = from.x - to.x\n        let dy = from.y - to.y\n        return sqrt(dx * dx + dy * dy)\n    }\n    \n    /// reference to the last highlighted object\n    private var _lastHighlight: ChartHighlight!\n    \n    @objc private func tapGestureRecognized(recognizer: NSUITapGestureRecognizer)\n    {\n        if (recognizer.state == NSUIGestureRecognizerState.Ended)\n        {\n            if !self.isHighLightPerTapEnabled { return }\n            \n            let location = recognizer.locationInView(self)\n            let distance = distanceToCenter(x: location.x, y: location.y)\n            \n            // check if a slice was touched\n            if (distance > self.radius)\n            {\n                // if no slice was touched, highlight nothing\n                self.highlightValues(nil)\n                \n                if _lastHighlight == nil\n                {\n                    self.highlightValues(nil) // do not call delegate\n                }\n                else\n                {\n                    self.highlightValue(highlight: nil, callDelegate: true) // call delegate\n                }\n                \n                _lastHighlight = nil\n            }\n            else\n            {\n                var angle = angleForPoint(x: location.x, y: location.y)\n                \n                if (self.isKindOfClass(PieChartView))\n                {\n                    angle /= _animator.phaseY\n                }\n                \n                let index = indexForAngle(angle)\n                \n                // check if the index could be found\n                if (index < 0)\n                {\n                    self.highlightValues(nil)\n                    _lastHighlight = nil\n                }\n                else\n                {\n                    let valsAtIndex = getSelectionDetailsAtIndex(index)\n                    \n                    var dataSetIndex = 0\n                    \n                    // get the dataset that is closest to the selection (PieChart only has one DataSet)\n                    if (self.isKindOfClass(RadarChartView))\n                    {\n                        dataSetIndex = ChartUtils.closestDataSetIndex(valsAtIndex, value: Double(distance / (self as! RadarChartView).factor), axis: nil)\n                    }\n                    \n                    if (dataSetIndex < 0)\n                    {\n                        self.highlightValues(nil)\n                        _lastHighlight = nil\n                    }\n                    else\n                    {\n                        let h = ChartHighlight(xIndex: index, dataSetIndex: dataSetIndex)\n                        \n                        if (_lastHighlight !== nil && h == _lastHighlight)\n                        {\n                            self.highlightValue(highlight: nil, callDelegate: true)\n                            _lastHighlight = nil\n                        }\n                        else\n                        {\n                            self.highlightValue(highlight: h, callDelegate: true)\n                            _lastHighlight = h\n                        }\n                    }\n                }\n            }\n        }\n    }\n    \n    #if !os(tvOS)\n    @objc private func rotationGestureRecognized(recognizer: NSUIRotationGestureRecognizer)\n    {\n        if (recognizer.state == NSUIGestureRecognizerState.Began)\n        {\n            stopDeceleration()\n            \n            _startAngle = self.rawRotationAngle\n        }\n        \n        if (recognizer.state == NSUIGestureRecognizerState.Began || recognizer.state == NSUIGestureRecognizerState.Changed)\n        {\n            let angle = ChartUtils.Math.FRAD2DEG * recognizer.nsuiRotation\n            \n            self.rotationAngle = _startAngle + angle\n            setNeedsDisplay()\n        }\n        else if (recognizer.state == NSUIGestureRecognizerState.Ended)\n        {\n            let angle = ChartUtils.Math.FRAD2DEG * recognizer.nsuiRotation\n            \n            self.rotationAngle = _startAngle + angle\n            setNeedsDisplay()\n            \n            if (isDragDecelerationEnabled)\n            {\n                stopDeceleration()\n                \n                _decelerationAngularVelocity = ChartUtils.Math.FRAD2DEG * recognizer.velocity\n                \n                if (_decelerationAngularVelocity != 0.0)\n                {\n                    _decelerationLastTime = CACurrentMediaTime()\n                    _decelerationDisplayLink = NSUIDisplayLink(target: self, selector: #selector(PieRadarChartViewBase.decelerationLoop))\n                    _decelerationDisplayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)\n                }\n            }\n        }\n    }\n    #endif\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Charts/RadarChartView.swift",
    "content": "//\n//  RadarChartView.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n\n/// Implementation of the RadarChart, a \"spidernet\"-like chart. It works best\n/// when displaying 5-10 entries per DataSet.\npublic class RadarChartView: PieRadarChartViewBase\n{\n    /// width of the web lines that come from the center.\n    public var webLineWidth = CGFloat(1.5)\n    \n    /// width of the web lines that are in between the lines coming from the center\n    public var innerWebLineWidth = CGFloat(0.75)\n    \n    /// color for the web lines that come from the center\n    public var webColor = NSUIColor(red: 122/255.0, green: 122/255.0, blue: 122.0/255.0, alpha: 1.0)\n    \n    /// color for the web lines in between the lines that come from the center.\n    public var innerWebColor = NSUIColor(red: 122/255.0, green: 122/255.0, blue: 122.0/255.0, alpha: 1.0)\n    \n    /// transparency the grid is drawn with (0.0 - 1.0)\n    public var webAlpha: CGFloat = 150.0 / 255.0\n    \n    /// flag indicating if the web lines should be drawn or not\n    public var drawWeb = true\n    \n    /// modulus that determines how many labels and web-lines are skipped before the next is drawn\n    private var _skipWebLineCount = 0\n    \n    /// the object reprsenting the y-axis labels\n    private var _yAxis: ChartYAxis!\n    \n    internal var _yAxisRenderer: ChartYAxisRendererRadarChart!\n    internal var _xAxisRenderer: ChartXAxisRendererRadarChart!\n    \n    public override init(frame: CGRect)\n    {\n        super.init(frame: frame)\n    }\n    \n    public required init?(coder aDecoder: NSCoder)\n    {\n        super.init(coder: aDecoder)\n    }\n    \n    internal override func initialize()\n    {\n        super.initialize()\n        \n        _yAxis = ChartYAxis(position: .Left)\n        _xAxis.spaceBetweenLabels = 0\n        \n        renderer = RadarChartRenderer(chart: self, animator: _animator, viewPortHandler: _viewPortHandler)\n        \n        _yAxisRenderer = ChartYAxisRendererRadarChart(viewPortHandler: _viewPortHandler, yAxis: _yAxis, chart: self)\n        _xAxisRenderer = ChartXAxisRendererRadarChart(viewPortHandler: _viewPortHandler, xAxis: _xAxis, chart: self)\n    }\n\n    internal override func calcMinMax()\n    {\n        super.calcMinMax()\n        guard let data = _data else { return }\n        \n        // calculate / set x-axis range\n        _xAxis._axisMaximum = Double(data.xVals.count) - 1.0\n        _xAxis.axisRange = Double(abs(_xAxis._axisMaximum - _xAxis._axisMinimum))\n        \n        _yAxis.calcMinMax(min: data.getYMin(.Left), max: data.getYMax(.Left))\n    }\n\n    public override func getMarkerPosition(entry entry: ChartDataEntry, highlight: ChartHighlight) -> CGPoint\n    {\n        let angle = self.sliceAngle * CGFloat(entry.xIndex) + self.rotationAngle\n        let val = CGFloat(entry.value) * self.factor\n        let c = self.centerOffsets\n        \n        let p = CGPoint(x: c.x + val * cos(angle * ChartUtils.Math.FDEG2RAD),\n            y: c.y + val * sin(angle * ChartUtils.Math.FDEG2RAD))\n        \n        return p\n    }\n    \n    public override func notifyDataSetChanged()\n    {\n        calcMinMax()\n        \n        _yAxis?._defaultValueFormatter = _defaultValueFormatter\n        \n        _yAxisRenderer?.computeAxis(yMin: _yAxis._axisMinimum, yMax: _yAxis._axisMaximum)\n        _xAxisRenderer?.computeAxis(xValAverageLength: data?.xValAverageLength ?? 0, xValues: data?.xVals ?? [])\n        \n        if let data = _data, legend = _legend where !legend.isLegendCustom\n        {\n            _legendRenderer?.computeLegend(data)\n        }\n        \n        calculateOffsets()\n        \n        setNeedsDisplay()\n    }\n    \n    public override func drawRect(rect: CGRect)\n    {\n        super.drawRect(rect)\n\n        if _data === nil\n        {\n            return\n        }\n        \n        let optionalContext = NSUIGraphicsGetCurrentContext()\n        guard let context = optionalContext else { return }\n        \n        _xAxisRenderer?.renderAxisLabels(context: context)\n\n        if (drawWeb)\n        {\n            renderer!.drawExtras(context: context)\n        }\n        \n        _yAxisRenderer.renderLimitLines(context: context)\n\n        renderer!.drawData(context: context)\n\n        if (valuesToHighlight())\n        {\n            renderer!.drawHighlighted(context: context, indices: _indicesToHighlight)\n        }\n\n        _yAxisRenderer.renderAxisLabels(context: context)\n\n        renderer!.drawValues(context: context)\n\n        _legendRenderer.renderLegend(context: context)\n\n        drawDescription(context: context)\n\n        drawMarkers(context: context)\n    }\n\n    /// - returns: the factor that is needed to transform values into pixels.\n    public var factor: CGFloat\n    {\n        let content = _viewPortHandler.contentRect\n        return min(content.width / 2.0, content.height / 2.0)\n                / CGFloat(_yAxis.axisRange)\n    }\n\n    /// - returns: the angle that each slice in the radar chart occupies.\n    public var sliceAngle: CGFloat\n    {\n        return 360.0 / CGFloat(_data?.xValCount ?? 0)\n    }\n\n    public override func indexForAngle(angle: CGFloat) -> Int\n    {\n        // take the current angle of the chart into consideration\n        let a = ChartUtils.normalizedAngleFromAngle(angle - self.rotationAngle)\n        \n        let sliceAngle = self.sliceAngle\n        \n        for i in 0 ..< (_data?.xValCount ?? 0)\n        {\n            if (sliceAngle * CGFloat(i + 1) - sliceAngle / 2.0 > a)\n            {\n                return i\n            }\n        }\n        \n        return 0\n    }\n\n    /// - returns: the object that represents all y-labels of the RadarChart.\n    public var yAxis: ChartYAxis\n    {\n        return _yAxis\n    }\n\n    /// Sets the number of web-lines that should be skipped on chart web before the next one is drawn. This targets the lines that come from the center of the RadarChart.\n    /// if count = 1 -> 1 line is skipped in between\n    public var skipWebLineCount: Int\n    {\n        get\n        {\n            return _skipWebLineCount\n        }\n        set\n        {\n            _skipWebLineCount = max(0, newValue)\n        }\n    }\n    \n    internal override var requiredLegendOffset: CGFloat\n    {\n        return _legend.font.pointSize * 4.0\n    }\n\n    internal override var requiredBaseOffset: CGFloat\n    {\n        return _xAxis.isEnabled && _xAxis.isDrawLabelsEnabled ? _xAxis.labelRotatedWidth : 10.0\n    }\n\n    public override var radius: CGFloat\n    {\n        let content = _viewPortHandler.contentRect\n        return min(content.width / 2.0, content.height / 2.0)\n    }\n\n    /// - returns: the maximum value this chart can display on it's y-axis.\n    public override var chartYMax: Double { return _yAxis._axisMaximum; }\n    \n    /// - returns: the minimum value this chart can display on it's y-axis.\n    public override var chartYMin: Double { return _yAxis._axisMinimum; }\n    \n    /// - returns: the range of y-values this chart can display.\n    public var yRange: Double { return _yAxis.axisRange}\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Charts/ScatterChartView.swift",
    "content": "//\n//  ScatterChartView.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n/// The ScatterChart. Draws dots, triangles, squares and custom shapes into the chartview.\npublic class ScatterChartView: BarLineChartViewBase, ScatterChartDataProvider\n{\n    public override func initialize()\n    {\n        super.initialize()\n        \n        renderer = ScatterChartRenderer(dataProvider: self, animator: _animator, viewPortHandler: _viewPortHandler)\n        _xAxis._axisMinimum = -0.5\n    }\n\n    public override func calcMinMax()\n    {\n        super.calcMinMax()\n        guard let data = _data else { return }\n\n        if _xAxis.axisRange == 0.0 && data.yValCount > 0\n        {\n            _xAxis.axisRange = 1.0\n        }\n        \n        _xAxis._axisMaximum += 0.5\n        _xAxis.axisRange = abs(_xAxis._axisMaximum - _xAxis._axisMinimum)\n    }\n    \n    // MARK: - ScatterChartDataProbider\n    \n    public var scatterData: ScatterChartData? { return _data as? ScatterChartData }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Components/ChartAxisBase.swift",
    "content": "//\n//  ChartAxisBase.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n/// Base class for all axes\npublic class ChartAxisBase: ChartComponentBase\n{\n    public var labelFont = NSUIFont.systemFontOfSize(10.0)\n    public var labelTextColor = NSUIColor.blackColor()\n    \n    public var axisLineColor = NSUIColor.grayColor()\n    public var axisLineWidth = CGFloat(0.5)\n    public var axisLineDashPhase = CGFloat(0.0)\n    public var axisLineDashLengths: [CGFloat]!\n    \n    public var gridColor = NSUIColor.grayColor().colorWithAlphaComponent(0.9)\n    public var gridLineWidth = CGFloat(0.5)\n    public var gridLineDashPhase = CGFloat(0.0)\n    public var gridLineDashLengths: [CGFloat]!\n    public var gridLineCap = CGLineCap.Butt\n    \n    public var drawGridLinesEnabled = true\n    public var drawAxisLineEnabled = true\n    \n    /// flag that indicates of the labels of this axis should be drawn or not\n    public var drawLabelsEnabled = true\n    \n    /// array of limitlines that can be set for the axis\n    private var _limitLines = [ChartLimitLine]()\n    \n    /// Are the LimitLines drawn behind the data or in front of the data?\n    /// \n    /// **default**: false\n    public var drawLimitLinesBehindDataEnabled = false\n\n    /// the flag can be used to turn off the antialias for grid lines\n    public var gridAntialiasEnabled = true\n\n    public override init()\n    {\n        super.init()\n    }\n    \n    public func getLongestLabel() -> String\n    {\n        fatalError(\"getLongestLabel() cannot be called on ChartAxisBase\")\n    }\n    \n    public var isDrawGridLinesEnabled: Bool { return drawGridLinesEnabled; }\n    \n    public var isDrawAxisLineEnabled: Bool { return drawAxisLineEnabled; }\n    \n    public var isDrawLabelsEnabled: Bool { return drawLabelsEnabled; }\n    \n    /// Are the LimitLines drawn behind the data or in front of the data?\n    /// \n    /// **default**: false\n    public var isDrawLimitLinesBehindDataEnabled: Bool { return drawLimitLinesBehindDataEnabled; }\n    \n    /// Flag indicating that the axis-min value has been customized\n    internal var _customAxisMin: Bool = false\n    \n    /// Flag indicating that the axis-max value has been customized\n    internal var _customAxisMax: Bool = false\n    \n    /// Do not touch this directly, instead, use axisMinValue.\n    /// This is automatically calculated to represent the real min value,\n    /// and is used when calculating the effective minimum.\n    public var _axisMinimum = Double(0)\n    \n    /// Do not touch this directly, instead, use axisMaxValue.\n    /// This is automatically calculated to represent the real max value,\n    /// and is used when calculating the effective maximum.\n    public var _axisMaximum = Double(0)\n    \n    /// the total range of values this axis covers\n    public var axisRange = Double(0)\n    \n    /// Adds a new ChartLimitLine to this axis.\n    public func addLimitLine(line: ChartLimitLine)\n    {\n        _limitLines.append(line)\n    }\n    \n    /// Removes the specified ChartLimitLine from the axis.\n    public func removeLimitLine(line: ChartLimitLine)\n    {\n        for i in 0 ..< _limitLines.count\n        {\n            if (_limitLines[i] === line)\n            {\n                _limitLines.removeAtIndex(i)\n                return\n            }\n        }\n    }\n    \n    /// Removes all LimitLines from the axis.\n    public func removeAllLimitLines()\n    {\n        _limitLines.removeAll(keepCapacity: false)\n    }\n    \n    /// - returns: the LimitLines of this axis.\n    public var limitLines : [ChartLimitLine]\n    {\n        return _limitLines\n    }\n    \n    // MARK: Custom axis ranges\n    \n    /// By calling this method, any custom minimum value that has been previously set is reseted, and the calculation is done automatically.\n    public func resetCustomAxisMin()\n    {\n        _customAxisMin = false\n    }\n    \n    public var isAxisMinCustom: Bool { return _customAxisMin }\n    \n    /// By calling this method, any custom maximum value that has been previously set is reseted, and the calculation is done automatically.\n    public func resetCustomAxisMax()\n    {\n        _customAxisMax = false\n    }\n    \n    public var isAxisMaxCustom: Bool { return _customAxisMax }\n    \n    /// The minimum value for this axis.\n    /// If set, this value will not be calculated automatically depending on the provided data.\n    /// Use `resetCustomAxisMin()` to undo this.\n    public var axisMinValue: Double\n    {\n        get\n        {\n            return _axisMinimum\n        }\n        set\n        {\n            _customAxisMin = true\n            _axisMinimum = newValue\n        }\n    }\n    \n    /// The maximum value for this axis.\n    /// If set, this value will not be calculated automatically depending on the provided data.\n    /// Use `resetCustomAxisMin()` to undo this.\n    public var axisMaxValue: Double\n    {\n        get\n        {\n            return _axisMaximum\n        }\n        set\n        {\n            _customAxisMax = true\n            _axisMaximum = newValue\n        }\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Components/ChartComponentBase.swift",
    "content": "//\n//  ChartComponentBase.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 16/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n\n/// This class encapsulates everything both Axis, Legend and LimitLines have in common\npublic class ChartComponentBase: NSObject\n{\n    /// flag that indicates if this component is enabled or not\n    public var enabled = true\n    \n    /// Sets the used x-axis offset for the labels on this axis.\n    /// **default**: 5.0\n    public var xOffset = CGFloat(5.0)\n    \n    /// Sets the used y-axis offset for the labels on this axis.\n    /// **default**: 5.0 (or 0.0 on ChartYAxis)\n    public var yOffset = CGFloat(5.0)\n    \n    public override init()\n    {\n        super.init()\n    }\n\n    public var isEnabled: Bool { return enabled; }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Components/ChartLegend.swift",
    "content": "//\n//  ChartLegend.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 24/2/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n\npublic class ChartLegend: ChartComponentBase\n{\n    @objc\n    public enum ChartLegendPosition: Int\n    {\n        case RightOfChart\n        case RightOfChartCenter\n        case RightOfChartInside\n        case LeftOfChart\n        case LeftOfChartCenter\n        case LeftOfChartInside\n        case BelowChartLeft\n        case BelowChartRight\n        case BelowChartCenter\n        case AboveChartLeft\n        case AboveChartRight\n        case AboveChartCenter\n        case PiechartCenter\n    }\n    \n    @objc\n    public enum ChartLegendForm: Int\n    {\n        case Square\n        case Circle\n        case Line\n    }\n    \n    @objc\n    public enum ChartLegendDirection: Int\n    {\n        case LeftToRight\n        case RightToLeft\n    }\n\n    /// the legend colors array, each color is for the form drawn at the same index\n    public var colors = [NSUIColor?]()\n    \n    // the legend text array. a nil label will start a group.\n    public var labels = [String?]()\n    \n    internal var _extraColors = [NSUIColor?]()\n    internal var _extraLabels = [String?]()\n    \n    /// colors that will be appended to the end of the colors array after calculating the legend.\n    public var extraColors: [NSUIColor?] { return _extraColors; }\n    \n    /// labels that will be appended to the end of the labels array after calculating the legend. a nil label will start a group.\n    public var extraLabels: [String?] { return _extraLabels; }\n    \n    /// Are the legend labels/colors a custom value or auto calculated? If false, then it's auto, if true, then custom.\n    /// \n    /// **default**: false (automatic legend)\n    private var _isLegendCustom = false\n\n    public var position = ChartLegendPosition.BelowChartLeft\n    public var direction = ChartLegendDirection.LeftToRight\n\n    public var font: NSUIFont = NSUIFont.systemFontOfSize(10.0)\n    public var textColor = NSUIColor.blackColor()\n\n    public var form = ChartLegendForm.Square\n    public var formSize = CGFloat(8.0)\n    public var formLineWidth = CGFloat(1.5)\n    \n    public var xEntrySpace = CGFloat(6.0)\n    public var yEntrySpace = CGFloat(0.0)\n    public var formToTextSpace = CGFloat(5.0)\n    public var stackSpace = CGFloat(3.0)\n    \n    public var calculatedLabelSizes = [CGSize]()\n    public var calculatedLabelBreakPoints = [Bool]()\n    public var calculatedLineSizes = [CGSize]()\n    \n    public override init()\n    {\n        super.init()\n        \n        self.xOffset = 5.0\n        self.yOffset = 4.0\n    }\n    \n    public init(colors: [NSUIColor?], labels: [String?])\n    {\n        super.init()\n        \n        self.colors = colors\n        self.labels = labels\n    }\n    \n    public init(colors: [NSObject], labels: [NSObject])\n    {\n        super.init()\n        \n        self.colorsObjc = colors\n        self.labelsObjc = labels\n    }\n    \n    public func getMaximumEntrySize(font: NSUIFont) -> CGSize\n    {\n        var maxW = CGFloat(0.0)\n        var maxH = CGFloat(0.0)\n        \n        var labels = self.labels\n        for i in 0 ..< labels.count\n        {\n            if (labels[i] == nil)\n            {\n                continue\n            }\n            \n            let size = (labels[i] as NSString!).sizeWithAttributes([NSFontAttributeName: font])\n            \n            if (size.width > maxW)\n            {\n                maxW = size.width\n            }\n            if (size.height > maxH)\n            {\n                maxH = size.height\n            }\n        }\n        \n        return CGSize(\n            width: maxW + formSize + formToTextSpace,\n            height: maxH\n        )\n    }\n    \n    public func getLabel(index: Int) -> String?\n    {\n        return labels[index]\n    }\n    \n    public func getFullSize(labelFont: NSUIFont) -> CGSize\n    {\n        var width = CGFloat(0.0)\n        var height = CGFloat(0.0)\n        \n        var labels = self.labels\n        let count = labels.count\n        for i in 0 ..< count\n        {\n            if (labels[i] != nil)\n            {\n                // make a step to the left\n                if (colors[i] != nil)\n                {\n                    width += formSize + formToTextSpace\n                }\n                \n                let size = (labels[i] as NSString!).sizeWithAttributes([NSFontAttributeName: labelFont])\n                \n                width += size.width\n                height += size.height\n                \n                if (i < count - 1)\n                {\n                    width += xEntrySpace\n                    height += yEntrySpace\n                }\n            }\n            else\n            {\n                width += formSize + stackSpace\n                \n                if (i < count - 1)\n                {\n                    width += stackSpace\n                }\n            }\n        }\n        \n        return CGSize(width: width, height: height)\n    }\n\n    public var neededWidth = CGFloat(0.0)\n    public var neededHeight = CGFloat(0.0)\n    public var textWidthMax = CGFloat(0.0)\n    public var textHeightMax = CGFloat(0.0)\n    \n    /// flag that indicates if word wrapping is enabled\n    /// this is currently supported only for: `BelowChartLeft`, `BelowChartRight`, `BelowChartCenter`.\n    /// note that word wrapping a legend takes a toll on performance.\n    /// you may want to set maxSizePercent when word wrapping, to set the point where the text wraps.\n    /// \n    /// **default**: false\n    public var wordWrapEnabled = false\n    \n    /// if this is set, then word wrapping the legend is enabled.\n    public var isWordWrapEnabled: Bool { return wordWrapEnabled }\n\n    /// The maximum relative size out of the whole chart view in percent.\n    /// If the legend is to the right/left of the chart, then this affects the width of the legend.\n    /// If the legend is to the top/bottom of the chart, then this affects the height of the legend.\n    /// If the legend is the center of the piechart, then this defines the size of the rectangular bounds out of the size of the \"hole\".\n    /// \n    /// **default**: 0.95 (95%)\n    public var maxSizePercent: CGFloat = 0.95\n    \n    public func calculateDimensions(labelFont labelFont: NSUIFont, viewPortHandler: ChartViewPortHandler)\n    {\n        if (position == .RightOfChart\n            || position == .RightOfChartCenter\n            || position == .LeftOfChart\n            || position == .LeftOfChartCenter\n            || position == .PiechartCenter)\n        {\n            let maxEntrySize = getMaximumEntrySize(labelFont)\n            let fullSize = getFullSize(labelFont)\n            \n            neededWidth = maxEntrySize.width\n            neededHeight = fullSize.height\n            textWidthMax = maxEntrySize.width\n            textHeightMax = maxEntrySize.height\n        }\n        else if (position == .BelowChartLeft\n            || position == .BelowChartRight\n            || position == .BelowChartCenter\n            || position == .AboveChartLeft\n            || position == .AboveChartRight\n            || position == .AboveChartCenter)\n        {\n            var labels = self.labels\n            var colors = self.colors\n            let labelCount = labels.count\n            \n            let labelLineHeight = labelFont.lineHeight\n            let formSize = self.formSize\n            let formToTextSpace = self.formToTextSpace\n            let xEntrySpace = self.xEntrySpace\n            let stackSpace = self.stackSpace\n            let wordWrapEnabled = self.wordWrapEnabled\n            \n            let contentWidth: CGFloat = viewPortHandler.contentWidth\n            \n            // Prepare arrays for calculated layout\n            if (calculatedLabelSizes.count != labelCount)\n            {\n                calculatedLabelSizes = [CGSize](count: labelCount, repeatedValue: CGSize())\n            }\n            \n            if (calculatedLabelBreakPoints.count != labelCount)\n            {\n                calculatedLabelBreakPoints = [Bool](count: labelCount, repeatedValue: false)\n            }\n            \n            calculatedLineSizes.removeAll(keepCapacity: true)\n            \n            // Start calculating layout\n            \n            let labelAttrs = [NSFontAttributeName: labelFont]\n            var maxLineWidth: CGFloat = 0.0\n            var currentLineWidth: CGFloat = 0.0\n            var requiredWidth: CGFloat = 0.0\n            var stackedStartIndex: Int = -1\n            \n            for i in 0 ..< labelCount\n            {\n                let drawingForm = colors[i] != nil\n                \n                calculatedLabelBreakPoints[i] = false\n                \n                if (stackedStartIndex == -1)\n                {\n                    // we are not stacking, so required width is for this label only\n                    requiredWidth = 0.0\n                }\n                else\n                {\n                    // add the spacing appropriate for stacked labels/forms\n                    requiredWidth += stackSpace\n                }\n                \n                // grouped forms have null labels\n                if (labels[i] != nil)\n                {\n                    calculatedLabelSizes[i] = (labels[i] as NSString!).sizeWithAttributes(labelAttrs)\n                    requiredWidth += drawingForm ? formToTextSpace + formSize : 0.0\n                    requiredWidth += calculatedLabelSizes[i].width\n                }\n                else\n                {\n                    calculatedLabelSizes[i] = CGSize()\n                    requiredWidth += drawingForm ? formSize : 0.0\n                    \n                    if (stackedStartIndex == -1)\n                    {\n                        // mark this index as we might want to break here later\n                        stackedStartIndex = i\n                    }\n                }\n                \n                if (labels[i] != nil || i == labelCount - 1)\n                {\n                    let requiredSpacing = currentLineWidth == 0.0 ? 0.0 : xEntrySpace\n                    \n                    if (!wordWrapEnabled || // No word wrapping, it must fit.\n                        currentLineWidth == 0.0 || // The line is empty, it must fit.\n                        (contentWidth - currentLineWidth >= requiredSpacing + requiredWidth)) // It simply fits\n                    {\n                        // Expand current line\n                        currentLineWidth += requiredSpacing + requiredWidth\n                    }\n                    else\n                    { // It doesn't fit, we need to wrap a line\n                        \n                        // Add current line size to array\n                        calculatedLineSizes.append(CGSize(width: currentLineWidth, height: labelLineHeight))\n                        maxLineWidth = max(maxLineWidth, currentLineWidth)\n                        \n                        // Start a new line\n                        calculatedLabelBreakPoints[stackedStartIndex > -1 ? stackedStartIndex : i] = true\n                        currentLineWidth = requiredWidth\n                    }\n                    \n                    if (i == labelCount - 1)\n                    { // Add last line size to array\n                        calculatedLineSizes.append(CGSize(width: currentLineWidth, height: labelLineHeight))\n                        maxLineWidth = max(maxLineWidth, currentLineWidth)\n                    }\n                }\n                \n                stackedStartIndex = labels[i] != nil ? -1 : stackedStartIndex\n            }\n            \n            let maxEntrySize = getMaximumEntrySize(labelFont)\n            \n            textWidthMax = maxEntrySize.width\n            textHeightMax = maxEntrySize.height\n            neededWidth = maxLineWidth\n            neededHeight = labelLineHeight * CGFloat(calculatedLineSizes.count) +\n                yEntrySpace * CGFloat(calculatedLineSizes.count == 0 ? 0 : (calculatedLineSizes.count - 1))\n        }\n        else\n        {\n            let maxEntrySize = getMaximumEntrySize(labelFont)\n            let fullSize = getFullSize(labelFont)\n            \n            /* RightOfChartInside, LeftOfChartInside */\n            neededWidth = fullSize.width\n            neededHeight = maxEntrySize.height\n            textWidthMax = maxEntrySize.width\n            textHeightMax = maxEntrySize.height\n        }\n    }\n    \n    /// MARK: - Custom legend\n    \n    /// colors and labels that will be appended to the end of the auto calculated colors and labels after calculating the legend.\n    /// (if the legend has already been calculated, you will need to call notifyDataSetChanged() to let the changes take effect)\n    public func setExtra(colors colors: [NSUIColor?], labels: [String?])\n    {\n        self._extraLabels = labels\n        self._extraColors = colors\n    }\n    \n    /// Sets a custom legend's labels and colors arrays.\n    /// The colors count should match the labels count.\n    /// * Each color is for the form drawn at the same index.\n    /// * A nil label will start a group.\n    /// * A nil color will avoid drawing a form, and a clearColor will leave a space for the form.\n    /// This will disable the feature that automatically calculates the legend labels and colors from the datasets.\n    /// Call `resetCustom(...)` to re-enable automatic calculation (and then `notifyDataSetChanged()` is needed).\n    public func setCustom(colors colors: [NSUIColor?], labels: [String?])\n    {\n        self.labels = labels\n        self.colors = colors\n        _isLegendCustom = true\n    }\n    \n    /// Calling this will disable the custom legend labels (set by `setLegend(...)`). Instead, the labels will again be calculated automatically (after `notifyDataSetChanged()` is called).\n    public func resetCustom()\n    {\n        _isLegendCustom = false\n    }\n    \n    /// **default**: false (automatic legend)\n    /// - returns: true if a custom legend labels and colors has been set\n    public var isLegendCustom: Bool\n    {\n        return _isLegendCustom\n    }\n    \n    /// MARK: - ObjC compatibility\n    \n    /// colors that will be appended to the end of the colors array after calculating the legend.\n    public var extraColorsObjc: [NSObject] { return ChartUtils.bridgedObjCGetNSUIColorArray(swift: _extraColors); }\n    \n    /// labels that will be appended to the end of the labels array after calculating the legend. a nil label will start a group.\n    public var extraLabelsObjc: [NSObject] { return ChartUtils.bridgedObjCGetStringArray(swift: _extraLabels); }\n    \n    /// the legend colors array, each color is for the form drawn at the same index\n    /// (ObjC bridging functions, as Swift 1.2 does not bridge optionals in array to `NSNull`s)\n    public var colorsObjc: [NSObject]\n    {\n        get { return ChartUtils.bridgedObjCGetNSUIColorArray(swift: colors); }\n        set { self.colors = ChartUtils.bridgedObjCGetNSUIColorArray(objc: newValue); }\n    }\n    \n    // the legend text array. a nil label will start a group.\n    /// (ObjC bridging functions, as Swift 1.2 does not bridge optionals in array to `NSNull`s)\n    public var labelsObjc: [NSObject]\n    {\n        get { return ChartUtils.bridgedObjCGetStringArray(swift: labels); }\n        set { self.labels = ChartUtils.bridgedObjCGetStringArray(objc: newValue); }\n    }\n    \n    /// colors and labels that will be appended to the end of the auto calculated colors and labels after calculating the legend.\n    /// (if the legend has already been calculated, you will need to call `notifyDataSetChanged()` to let the changes take effect)\n    public func setExtra(colors colors: [NSObject], labels: [NSObject])\n    {\n        if (colors.count != labels.count)\n        {\n            fatalError(\"ChartLegend:setExtra() - colors array and labels array need to be of same size\")\n        }\n        \n        self._extraLabels = ChartUtils.bridgedObjCGetStringArray(objc: labels)\n        self._extraColors = ChartUtils.bridgedObjCGetNSUIColorArray(objc: colors)\n    }\n    \n    /// Sets a custom legend's labels and colors arrays.\n    /// The colors count should match the labels count.\n    /// * Each color is for the form drawn at the same index.\n    /// * A nil label will start a group.\n    /// * A nil color will avoid drawing a form, and a clearColor will leave a space for the form.\n    /// This will disable the feature that automatically calculates the legend labels and colors from the datasets.\n    /// Call `resetLegendToAuto(...)` to re-enable automatic calculation, and then if needed - call `notifyDataSetChanged()` on the chart to make it refresh the data.\n    public func setCustom(colors colors: [NSObject], labels: [NSObject])\n    {\n        if (colors.count != labels.count)\n        {\n            fatalError(\"ChartLegend:setCustom() - colors array and labels array need to be of same size\")\n        }\n        \n        self.labelsObjc = labels\n        self.colorsObjc = colors\n        _isLegendCustom = true\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Components/ChartLimitLine.swift",
    "content": "//\n//  ChartLimitLine.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n\n/// The limit line is an additional feature for all Line, Bar and ScatterCharts.\n/// It allows the displaying of an additional line in the chart that marks a certain maximum / limit on the specified axis (x- or y-axis).\npublic class ChartLimitLine: ChartComponentBase\n{\n    @objc\n    public enum ChartLimitLabelPosition: Int\n    {\n        case LeftTop\n        case LeftBottom\n        case RightTop\n        case RightBottom\n    }\n    \n    /// limit / maximum (the y-value or xIndex)\n    public var limit = Double(0.0)\n    \n    private var _lineWidth = CGFloat(2.0)\n    public var lineColor = NSUIColor(red: 237.0/255.0, green: 91.0/255.0, blue: 91.0/255.0, alpha: 1.0)\n    public var lineDashPhase = CGFloat(0.0)\n    public var lineDashLengths: [CGFloat]?\n    public var valueTextColor = NSUIColor.blackColor()\n    public var valueFont = NSUIFont.systemFontOfSize(13.0)\n    public var label = \"\"\n    public var labelPosition = ChartLimitLabelPosition.RightTop\n    \n    public override init()\n    {\n        super.init()\n    }\n    \n    public init(limit: Double)\n    {\n        super.init()\n        self.limit = limit\n    }\n    \n    public init(limit: Double, label: String)\n    {\n        super.init()\n        self.limit = limit\n        self.label = label\n    }\n    \n    /// set the line width of the chart (min = 0.2, max = 12); default 2\n    public var lineWidth: CGFloat\n    {\n        get\n        {\n            return _lineWidth\n        }\n        set\n        {\n            if (newValue < 0.2)\n            {\n                _lineWidth = 0.2\n            }\n            else if (newValue > 12.0)\n            {\n                _lineWidth = 12.0\n            }\n            else\n            {\n                _lineWidth = newValue\n            }\n        }\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Components/ChartMarker.swift",
    "content": "//\n//  ChartMarker.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 3/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n\npublic class ChartMarker: ChartComponentBase\n{\n    /// The marker image to render\n    public var image: NSUIImage?\n    \n    /// Use this to return the desired offset you wish the MarkerView to have on the x-axis.\n    public var offset: CGPoint = CGPoint()\n    \n    /// The marker's size\n    public var size: CGSize\n    {\n        get\n        {\n            return image!.size\n        }\n    }\n    \n    public override init()\n    {\n        super.init()\n    }\n    \n    /// Returns the offset for drawing at the specific `point`\n    ///\n    /// - parameter point: This is the point at which the marker wants to be drawn. You can adjust the offset conditionally based on this argument.\n    /// - By default returns the self.offset property. You can return any other value to override that.\n    public func offsetForDrawingAtPos(point: CGPoint) -> CGPoint\n    {\n        return offset;\n    }\n    \n    /// Draws the ChartMarker on the given position on the given context\n    public func draw(context context: CGContext, point: CGPoint)\n    {\n        let offset = self.offsetForDrawingAtPos(point)\n        let size = self.size\n        \n        let rect = CGRect(x: point.x + offset.x, y: point.y + offset.y, width: size.width, height: size.height)\n        \n        NSUIGraphicsPushContext(context)\n        image!.drawInRect(rect)\n        NSUIGraphicsPopContext()\n    }\n    \n    /// This method enables a custom ChartMarker to update it's content everytime the MarkerView is redrawn according to the data entry it points to.\n    ///\n    /// - parameter highlight: the highlight object contains information about the highlighted value such as it's dataset-index, the selected range or stack-index (only stacked bar entries).\n    public func refreshContent(entry entry: ChartDataEntry, highlight: ChartHighlight)\n    {\n        // Do nothing here...\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Components/ChartXAxis.swift",
    "content": "//\n//  ChartXAxis.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\npublic class ChartXAxis: ChartAxisBase\n{\n    @objc\n    public enum XAxisLabelPosition: Int\n    {\n        case Top\n        case Bottom\n        case BothSided\n        case TopInside\n        case BottomInside\n    }\n    \n    public var values = [String?]()\n    \n    /// width of the x-axis labels in pixels - this is automatically calculated by the computeAxis() methods in the renderers\n    public var labelWidth = CGFloat(1.0)\n    \n    /// height of the x-axis labels in pixels - this is automatically calculated by the computeAxis() methods in the renderers\n    public var labelHeight = CGFloat(1.0)\n    \n    /// width of the (rotated) x-axis labels in pixels - this is automatically calculated by the computeAxis() methods in the renderers\n    public var labelRotatedWidth = CGFloat(1.0)\n    \n    /// height of the (rotated) x-axis labels in pixels - this is automatically calculated by the computeAxis() methods in the renderers\n    public var labelRotatedHeight = CGFloat(1.0)\n    \n    /// This is the angle for drawing the X axis labels (in degrees)\n    public var labelRotationAngle = CGFloat(0.0)\n    \n    /// the space that should be left out (in characters) between the x-axis labels\n    /// This only applies if the number of labels that will be skipped in between drawn axis labels is not custom set.\n    /// \n    /// **default**: 4\n    public var spaceBetweenLabels = Int(4)\n    \n    /// the modulus that indicates if a value at a specified index in an array(list) for the x-axis-labels is drawn or not. Draw when `(index % modulus) == 0`.\n    public var axisLabelModulus = Int(1)\n    \n    /// Is axisLabelModulus a custom value or auto calculated? If false, then it's auto, if true, then custom.\n    /// \n    /// **default**: false (automatic modulus)\n    private var _isAxisModulusCustom = false\n\n    /// the modulus that indicates if a value at a specified index in an array(list) for the y-axis-labels is drawn or not. Draw when `(index % modulus) == 0`.\n    /// Used only for Horizontal BarChart\n    public var yAxisLabelModulus = Int(1)\n\n    /// if set to true, the chart will avoid that the first and last label entry in the chart \"clip\" off the edge of the chart\n    public var avoidFirstLastClippingEnabled = false\n    \n    /// Custom formatter for adjusting x-value strings\n    private var _xAxisValueFormatter: ChartXAxisValueFormatter = ChartDefaultXAxisValueFormatter()\n    \n    /// Custom XValueFormatter for the data object that allows custom-formatting of all x-values before rendering them.\n    /// Provide null to reset back to the default formatting.\n    public var valueFormatter: ChartXAxisValueFormatter?\n    {\n        get\n        {\n            return _xAxisValueFormatter\n        }\n        set\n        {\n            _xAxisValueFormatter = newValue ?? ChartDefaultXAxisValueFormatter()\n        }\n    }\n    \n    /// the position of the x-labels relative to the chart\n    public var labelPosition = XAxisLabelPosition.Top\n    \n    /// if set to true, word wrapping the labels will be enabled.\n    /// word wrapping is done using `(value width * labelRotatedWidth)`\n    ///\n    /// *Note: currently supports all charts except pie/radar/horizontal-bar*\n    public var wordWrapEnabled = false\n    \n    /// - returns: true if word wrapping the labels is enabled\n    public var isWordWrapEnabled: Bool { return wordWrapEnabled }\n    \n    /// the width for wrapping the labels, as percentage out of one value width.\n    /// used only when isWordWrapEnabled = true.\n    /// \n    /// **default**: 1.0\n    public var wordWrapWidthPercent: CGFloat = 1.0\n    \n    public override init()\n    {\n        super.init()\n        \n        self.yOffset = 4.0;\n    }\n\n    public override func getLongestLabel() -> String\n    {\n        var longest = \"\"\n        \n        for i in 0 ..< values.count\n        {\n            let text = values[i]\n            \n            if (text != nil && longest.characters.count < (text!).characters.count)\n            {\n                longest = text!\n            }\n        }\n        \n        return longest\n    }\n    \n    public var isAvoidFirstLastClippingEnabled: Bool\n    {\n        return avoidFirstLastClippingEnabled\n    }\n\n    /// Sets the number of labels that should be skipped on the axis before the next label is drawn. \n    /// This will disable the feature that automatically calculates an adequate space between the axis labels and set the number of labels to be skipped to the fixed number provided by this method. \n    /// Call `resetLabelsToSkip(...)` to re-enable automatic calculation.\n    public func setLabelsToSkip(count: Int)\n    {\n        _isAxisModulusCustom = true\n\n        if (count < 0)\n        {\n            axisLabelModulus = 1\n        }\n        else\n        {\n            axisLabelModulus = count + 1\n        }\n    }\n    \n    /// Calling this will disable a custom number of labels to be skipped (set by `setLabelsToSkip(...)`) while drawing the x-axis. Instead, the number of values to skip will again be calculated automatically.\n    public func resetLabelsToSkip()\n    {\n        _isAxisModulusCustom = false\n    }\n    \n    /// - returns: true if a custom axis-modulus has been set that determines the number of labels to skip when drawing.\n    public var isAxisModulusCustom: Bool\n    {\n        return _isAxisModulusCustom\n    }\n    \n    public var valuesObjc: [NSObject]\n    {\n        get { return ChartUtils.bridgedObjCGetStringArray(swift: values); }\n        set { self.values = ChartUtils.bridgedObjCGetStringArray(objc: newValue); }\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Components/ChartYAxis.swift",
    "content": "//\n//  ChartYAxis.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n\n/// Class representing the y-axis labels settings and its entries.\n/// Be aware that not all features the YLabels class provides are suitable for the RadarChart.\n/// Customizations that affect the value range of the axis need to be applied before setting data for the chart.\npublic class ChartYAxis: ChartAxisBase\n{\n    @objc\n    public enum YAxisLabelPosition: Int\n    {\n        case OutsideChart\n        case InsideChart\n    }\n    \n    ///  Enum that specifies the axis a DataSet should be plotted against, either Left or Right.\n    @objc\n    public enum AxisDependency: Int\n    {\n        case Left\n        case Right\n    }\n    \n    public var entries = [Double]()\n    public var entryCount: Int { return entries.count; }\n    \n    /// the number of y-label entries the y-labels should have, default 6\n    private var _labelCount = Int(6)\n    \n    /// indicates if the top y-label entry is drawn or not\n    public var drawTopYLabelEntryEnabled = true\n    \n    /// if true, the y-labels show only the minimum and maximum value\n    public var showOnlyMinMaxEnabled = false\n    \n    /// flag that indicates if the axis is inverted or not\n    public var inverted = false\n    \n    /// This property is deprecated - Use `customAxisMin` instead.\n    public var startAtZeroEnabled: Bool\n    {\n        get\n        {\n            return isAxisMinCustom && _axisMinimum == 0.0\n        }\n        set\n        {\n            if newValue\n            {\n                axisMinValue = 0.0\n            }\n            else\n            {\n                resetCustomAxisMin()\n            }\n        }\n    }\n    \n    /// if true, the set number of y-labels will be forced\n    public var forceLabelsEnabled = false\n\n    /// flag that indicates if the zero-line should be drawn regardless of other grid lines\n    public var drawZeroLineEnabled = false\n    \n    /// Color of the zero line\n    public var zeroLineColor: NSUIColor? = NSUIColor.grayColor()\n    \n    /// Width of the zero line\n    public var zeroLineWidth: CGFloat = 1.0\n    \n    /// This is how much (in pixels) into the dash pattern are we starting from.\n    public var zeroLineDashPhase = CGFloat(0.0)\n    \n    /// This is the actual dash pattern.\n    /// I.e. [2, 3] will paint [--   --   ]\n    /// [1, 3, 4, 2] will paint [-   ----  -   ----  ]\n    public var zeroLineDashLengths: [CGFloat]?\n    \n    /// the formatter used to customly format the y-labels\n    public var valueFormatter: NSNumberFormatter?\n    \n    /// the formatter used to customly format the y-labels\n    internal var _defaultValueFormatter = NSNumberFormatter()\n\n    /// axis space from the largest value to the top in percent of the total axis range\n    public var spaceTop = CGFloat(0.1)\n\n    /// axis space from the smallest value to the bottom in percent of the total axis range\n    public var spaceBottom = CGFloat(0.1)\n    \n    /// the position of the y-labels relative to the chart\n    public var labelPosition = YAxisLabelPosition.OutsideChart\n    \n    /// the side this axis object represents\n    private var _axisDependency = AxisDependency.Left\n    \n    /// the minimum width that the axis should take\n    /// \n    /// **default**: 0.0\n    public var minWidth = CGFloat(0)\n    \n    /// the maximum width that the axis can take.\n    /// use Infinity for disabling the maximum.\n    /// \n    /// **default**: CGFloat.infinity\n    public var maxWidth = CGFloat(CGFloat.infinity)\n    \n    /// When true, axis labels are controlled by the `granularity` property.\n    /// When false, axis values could possibly be repeated.\n    /// This could happen if two adjacent axis values are rounded to same value.\n    /// If using granularity this could be avoided by having fewer axis values visible.\n    public var granularityEnabled = true\n    \n    /// The minimum interval between axis values.\n    /// This can be used to avoid label duplicating when zooming in.\n    ///\n    /// **default**: 1.0\n    public var granularity = Double(1.0)\n    \n    public override init()\n    {\n        super.init()\n        \n        _defaultValueFormatter.minimumIntegerDigits = 1\n        _defaultValueFormatter.maximumFractionDigits = 1\n        _defaultValueFormatter.minimumFractionDigits = 1\n        _defaultValueFormatter.usesGroupingSeparator = true\n        self.yOffset = 0.0\n    }\n    \n    public init(position: AxisDependency)\n    {\n        super.init()\n        \n        _axisDependency = position\n        \n        _defaultValueFormatter.minimumIntegerDigits = 1\n        _defaultValueFormatter.maximumFractionDigits = 1\n        _defaultValueFormatter.minimumFractionDigits = 1\n        _defaultValueFormatter.usesGroupingSeparator = true\n        self.yOffset = 0.0\n    }\n    \n    public var axisDependency: AxisDependency\n    {\n        return _axisDependency\n    }\n    \n    public func setLabelCount(count: Int, force: Bool)\n    {\n        _labelCount = count\n        \n        if (_labelCount > 25)\n        {\n            _labelCount = 25\n        }\n        if (_labelCount < 2)\n        {\n            _labelCount = 2\n        }\n    \n        forceLabelsEnabled = force\n    }\n    \n    /// the number of label entries the y-axis should have\n    /// max = 25,\n    /// min = 2,\n    /// default = 6,\n    /// be aware that this number is not fixed and can only be approximated\n    public var labelCount: Int\n    {\n        get\n        {\n            return _labelCount\n        }\n        set\n        {\n            setLabelCount(newValue, force: false);\n        }\n    }\n    \n    public func requiredSize() -> CGSize\n    {\n        let label = getLongestLabel() as NSString\n        var size = label.sizeWithAttributes([NSFontAttributeName: labelFont])\n        size.width += xOffset * 2.0\n        size.height += yOffset * 2.0\n        size.width = max(minWidth, min(size.width, maxWidth > 0.0 ? maxWidth : size.width))\n        return size\n    }\n    \n    public func getRequiredHeightSpace() -> CGFloat\n    {\n        return requiredSize().height\n    }\n\n    public override func getLongestLabel() -> String\n    {\n        var longest = \"\"\n        \n        for i in 0 ..< entries.count\n        {\n            let text = getFormattedLabel(i)\n            \n            if (longest.characters.count < text.characters.count)\n            {\n                longest = text\n            }\n        }\n        \n        return longest\n    }\n\n    /// - returns: the formatted y-label at the specified index. This will either use the auto-formatter or the custom formatter (if one is set).\n    public func getFormattedLabel(index: Int) -> String\n    {\n        if (index < 0 || index >= entries.count)\n        {\n            return \"\"\n        }\n        \n        return (valueFormatter ?? _defaultValueFormatter).stringFromNumber(entries[index])!\n    }\n    \n    /// - returns: true if this axis needs horizontal offset, false if no offset is needed.\n    public var needsOffset: Bool\n    {\n        if (isEnabled && isDrawLabelsEnabled && labelPosition == .OutsideChart)\n        {\n            return true\n        }\n        else\n        {\n            return false\n        }\n    }\n    \n    public var isInverted: Bool { return inverted; }\n    \n    /// This is deprecated now, use `customAxisMin`\n    @available(*, deprecated=1.0, message=\"Use customAxisMin instead.\")\n    public var isStartAtZeroEnabled: Bool { return startAtZeroEnabled }\n\n    /// - returns: true if focing the y-label count is enabled. Default: false\n    public var isForceLabelsEnabled: Bool { return forceLabelsEnabled }\n\n    public var isShowOnlyMinMaxEnabled: Bool { return showOnlyMinMaxEnabled; }\n    \n    public var isDrawTopYLabelEntryEnabled: Bool { return drawTopYLabelEntryEnabled; }\n    \n    /// Calculates the minimum, maximum and range values of the YAxis with the given minimum and maximum values from the chart data.\n    /// - parameter dataMin: the y-min value according to chart data\n    /// - parameter dataMax: the y-max value according to chart\n    public func calcMinMax(min dataMin: Double, max dataMax: Double)\n    {\n        // if custom, use value as is, else use data value\n        var min = _customAxisMin ? _axisMinimum : dataMin\n        var max = _customAxisMax ? _axisMaximum : dataMax\n\n        // temporary range (before calculations)\n        let range = abs(max - min)\n\n        // in case all values are equal\n        if range == 0.0\n        {\n            max = max + 1.0\n            min = min - 1.0\n        }\n\n        // bottom-space only effects non-custom min\n        if !_customAxisMin\n        {\n            let bottomSpace = range * Double(spaceBottom)\n            _axisMinimum = min - bottomSpace\n        }\n\n        // top-space only effects non-custom max\n        if !_customAxisMax\n        {\n            let topSpace = range * Double(spaceTop)\n            _axisMaximum = max + topSpace\n        }\n\n        // calc actual range\n        axisRange = abs(_axisMaximum - _axisMinimum)\n    }\n\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/ChartBaseDataSet.swift",
    "content": "//\n//  BaseDataSet.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 16/1/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n\npublic class ChartBaseDataSet: NSObject, IChartDataSet\n{\n    public required override init()\n    {\n        super.init()\n        \n        // default color\n        colors.append(NSUIColor(red: 140.0/255.0, green: 234.0/255.0, blue: 255.0/255.0, alpha: 1.0))\n        valueColors.append(NSUIColor.blackColor())\n    }\n    \n    public init(label: String?)\n    {\n        super.init()\n        \n        // default color\n        colors.append(NSUIColor(red: 140.0/255.0, green: 234.0/255.0, blue: 255.0/255.0, alpha: 1.0))\n        valueColors.append(NSUIColor.blackColor())\n        \n        self.label = label\n    }\n    \n    // MARK: - Data functions and accessors\n    \n    /// Use this method to tell the data set that the underlying data has changed\n    public func notifyDataSetChanged()\n    {\n        calcMinMax(start: 0, end: entryCount - 1)\n    }\n    \n    public func calcMinMax(start start: Int, end: Int)\n    {\n        fatalError(\"calcMinMax is not implemented in ChartBaseDataSet\")\n    }\n    \n    public var yMin: Double\n    {\n        fatalError(\"yMin is not implemented in ChartBaseDataSet\")\n    }\n    \n    public var yMax: Double\n    {\n        fatalError(\"yMax is not implemented in ChartBaseDataSet\")\n    }\n    \n    public var entryCount: Int\n    {\n        fatalError(\"entryCount is not implemented in ChartBaseDataSet\")\n    }\n    \n    public func yValForXIndex(x: Int) -> Double\n    {\n        fatalError(\"yValForXIndex is not implemented in ChartBaseDataSet\")\n    }\n    \n    public func entryForIndex(i: Int) -> ChartDataEntry?\n    {\n        fatalError(\"entryForIndex is not implemented in ChartBaseDataSet\")\n    }\n    \n    public func entryForXIndex(x: Int, rounding: ChartDataSetRounding) -> ChartDataEntry?\n    {\n        fatalError(\"entryForXIndex is not implemented in ChartBaseDataSet\")\n    }\n    \n    public func entryForXIndex(x: Int) -> ChartDataEntry?\n    {\n        fatalError(\"entryForXIndex is not implemented in ChartBaseDataSet\")\n    }\n    \n    public func entryIndex(xIndex x: Int, rounding: ChartDataSetRounding) -> Int\n    {\n        fatalError(\"entryIndex is not implemented in ChartBaseDataSet\")\n    }\n    \n    public func entryIndex(entry e: ChartDataEntry) -> Int\n    {\n        fatalError(\"entryIndex is not implemented in ChartBaseDataSet\")\n    }\n    \n    public func addEntry(e: ChartDataEntry) -> Bool\n    {\n        fatalError(\"addEntry is not implemented in ChartBaseDataSet\")\n    }\n    \n    public func addEntryOrdered(e: ChartDataEntry) -> Bool\n    {\n        fatalError(\"addEntryOrdered is not implemented in ChartBaseDataSet\")\n    }\n    \n    public func removeEntry(entry: ChartDataEntry) -> Bool\n    {\n        fatalError(\"removeEntry is not implemented in ChartBaseDataSet\")\n    }\n    \n    public func removeEntry(xIndex xIndex: Int) -> Bool\n    {\n        if let entry = entryForXIndex(xIndex)\n        {\n            return removeEntry(entry)\n        }\n        return false\n    }\n    \n    public func removeFirst() -> Bool\n    {\n        if let entry = entryForIndex(0)\n        {\n            return removeEntry(entry)\n        }\n        return false\n    }\n    \n    public func removeLast() -> Bool\n    {\n        if let entry = entryForIndex(entryCount - 1)\n        {\n            return removeEntry(entry)\n        }\n        return false\n    }\n    \n    public func contains(e: ChartDataEntry) -> Bool\n    {\n        fatalError(\"removeEntry is not implemented in ChartBaseDataSet\")\n    }\n    \n    public func clear()\n    {\n        fatalError(\"clear is not implemented in ChartBaseDataSet\")\n    }\n    \n    // MARK: - Styling functions and accessors\n    \n    /// All the colors that are used for this DataSet.\n    /// Colors are reused as soon as the number of Entries the DataSet represents is higher than the size of the colors array.\n    public var colors = [NSUIColor]()\n    \n    /// List representing all colors that are used for drawing the actual values for this DataSet\n    public var valueColors = [NSUIColor]()\n\n    /// The label string that describes the DataSet.\n    public var label: String? = \"DataSet\"\n    \n    /// The axis this DataSet should be plotted against.\n    public var axisDependency = ChartYAxis.AxisDependency.Left\n    \n    /// - returns: the color at the given index of the DataSet's color array.\n    /// This prevents out-of-bounds by performing a modulus on the color index, so colours will repeat themselves.\n    public func colorAt(index: Int) -> NSUIColor\n    {\n        var index = index\n        if (index < 0)\n        {\n            index = 0\n        }\n        return colors[index % colors.count]\n    }\n    \n    /// Resets all colors of this DataSet and recreates the colors array.\n    public func resetColors()\n    {\n        colors.removeAll(keepCapacity: false)\n    }\n    \n    /// Adds a new color to the colors array of the DataSet.\n    /// - parameter color: the color to add\n    public func addColor(color: NSUIColor)\n    {\n        colors.append(color)\n    }\n    \n    /// Sets the one and **only** color that should be used for this DataSet.\n    /// Internally, this recreates the colors array and adds the specified color.\n    /// - parameter color: the color to set\n    public func setColor(color: NSUIColor)\n    {\n        colors.removeAll(keepCapacity: false)\n        colors.append(color)\n    }\n    \n    /// Sets colors to a single color a specific alpha value.\n    /// - parameter color: the color to set\n    /// - parameter alpha: alpha to apply to the set `color`\n    public func setColor(color: NSUIColor, alpha: CGFloat)\n    {\n        setColor(color.colorWithAlphaComponent(alpha))\n    }\n    \n    /// Sets colors with a specific alpha value.\n    /// - parameter colors: the colors to set\n    /// - parameter alpha: alpha to apply to the set `colors`\n    public func setColors(colors: [NSUIColor], alpha: CGFloat)\n    {\n        var colorsWithAlpha = colors\n        \n        for i in 0 ..< colorsWithAlpha.count\n        {\n            colorsWithAlpha[i] = colorsWithAlpha[i] .colorWithAlphaComponent(alpha)\n        }\n        \n        self.colors = colorsWithAlpha\n    }\n    \n    /// if true, value highlighting is enabled\n    public var highlightEnabled = true\n    \n    /// - returns: true if value highlighting is enabled for this dataset\n    public var isHighlightEnabled: Bool { return highlightEnabled }\n    \n    /// the formatter used to customly format the values\n    internal var _valueFormatter: NSNumberFormatter? = ChartUtils.defaultValueFormatter()\n    \n    /// The formatter used to customly format the values\n    public var valueFormatter: NSNumberFormatter?\n    {\n        get\n        {\n            return _valueFormatter\n        }\n        set\n        {\n            if newValue == nil\n            {\n                _valueFormatter = ChartUtils.defaultValueFormatter()\n            }\n            else\n            {\n                _valueFormatter = newValue\n            }\n        }\n    }\n    \n    /// Sets/get a single color for value text.\n    /// Setting the color clears the colors array and adds a single color.\n    /// Getting will return the first color in the array.\n    public var valueTextColor: NSUIColor\n    {\n        get\n        {\n            return valueColors[0]\n        }\n        set\n        {\n            valueColors.removeAll(keepCapacity: false)\n            valueColors.append(newValue)\n        }\n    }\n    \n    /// - returns: the color at the specified index that is used for drawing the values inside the chart. Uses modulus internally.\n    public func valueTextColorAt(index: Int) -> NSUIColor\n    {\n        var index = index\n        if (index < 0)\n        {\n            index = 0\n        }\n        return valueColors[index % valueColors.count]\n    }\n    \n    /// the font for the value-text labels\n    public var valueFont: NSUIFont = NSUIFont.systemFontOfSize(7.0)\n    \n    /// Set this to true to draw y-values on the chart\n    public var drawValuesEnabled = true\n    \n    /// Returns true if y-value drawing is enabled, false if not\n    public var isDrawValuesEnabled: Bool\n    {\n        return drawValuesEnabled\n    }\n    \n    /// Set the visibility of this DataSet. If not visible, the DataSet will not be drawn to the chart upon refreshing it.\n    public var visible = true\n    \n    /// Returns true if this DataSet is visible inside the chart, or false if it is currently hidden.\n    public var isVisible: Bool\n    {\n        return visible\n    }\n    \n    // MARK: - NSObject\n    \n    public override var description: String\n    {\n        return String(format: \"%@, label: %@, %i entries\", arguments: [NSStringFromClass(self.dynamicType), self.label ?? \"\", self.entryCount])\n    }\n    \n    public override var debugDescription: String\n    {\n        var desc = description + \":\"\n        \n        for i in 0 ..< self.entryCount\n        {\n            desc += \"\\n\" + (self.entryForIndex(i)?.description ?? \"\")\n        }\n        \n        return desc\n    }\n    \n    // MARK: - NSCopying\n    \n    public func copyWithZone(zone: NSZone) -> AnyObject\n    {\n        let copy = self.dynamicType.init()\n        \n        copy.colors = colors\n        copy.valueColors = valueColors\n        copy.label = label\n        \n        return copy\n    }\n}\n\n\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/BarChartData.swift",
    "content": "//\n//  BarChartData.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\npublic class BarChartData: BarLineScatterCandleBubbleChartData\n{\n    public override init()\n    {\n        super.init()\n    }\n    \n    public override init(xVals: [String?]?, dataSets: [IChartDataSet]?)\n    {\n        super.init(xVals: xVals, dataSets: dataSets)\n    }\n    \n    public override init(xVals: [NSObject]?, dataSets: [IChartDataSet]?)\n    {\n        super.init(xVals: xVals, dataSets: dataSets)\n    }\n    \n    private var _groupSpace = CGFloat(0.8)\n    \n    /// The spacing is relative to a full bar width\n    public var groupSpace: CGFloat\n    {\n        get\n        {\n            if (_dataSets.count <= 1)\n            {\n                return 0.0\n            }\n            return _groupSpace\n        }\n        set\n        {\n            _groupSpace = newValue\n        }\n    }\n    \n    /// - returns: true if this BarData object contains grouped DataSets (more than 1 DataSet).\n    public var isGrouped: Bool\n    {\n        return _dataSets.count > 1 ? true : false\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/BarChartDataEntry.swift",
    "content": "//\n//  BarChartDataEntry.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\n\npublic class BarChartDataEntry: ChartDataEntry\n{\n    /// the values the stacked barchart holds\n    private var _values: [Double]?\n    \n    /// the sum of all negative values this entry (if stacked) contains\n    private var _negativeSum: Double = 0.0\n    \n    /// the sum of all positive values this entry (if stacked) contains\n    private var _positiveSum: Double = 0.0\n    \n    public required init()\n    {\n        super.init()\n    }\n    \n    /// Constructor for stacked bar entries.\n    public init(values: [Double], xIndex: Int)\n    {\n        super.init(value: BarChartDataEntry.calcSum(values), xIndex: xIndex)\n        self.values = values\n        calcPosNegSum()\n    }\n    \n    /// Constructor for normal bars (not stacked).\n    public override init(value: Double, xIndex: Int)\n    {\n        super.init(value: value, xIndex: xIndex)\n    }\n    \n    /// Constructor for stacked bar entries.\n    public init(values: [Double], xIndex: Int, label: String)\n    {\n        super.init(value: BarChartDataEntry.calcSum(values), xIndex: xIndex, data: label)\n        self.values = values\n    }\n    \n    /// Constructor for normal bars (not stacked).\n    public override init(value: Double, xIndex: Int, data: AnyObject?)\n    {\n        super.init(value: value, xIndex: xIndex, data: data)\n    }\n    \n    public func getBelowSum(stackIndex :Int) -> Double\n    {\n        if (values == nil)\n        {\n            return 0\n        }\n        \n        var remainder: Double = 0.0\n        var index = values!.count - 1\n        \n        while (index > stackIndex && index >= 0)\n        {\n            remainder += values![index]\n            index -= 1\n        }\n        \n        return remainder\n    }\n    \n    /// - returns: the sum of all negative values this entry (if stacked) contains. (this is a positive number)\n    public var negativeSum: Double\n    {\n        return _negativeSum\n    }\n    \n    /// - returns: the sum of all positive values this entry (if stacked) contains.\n    public var positiveSum: Double\n    {\n        return _positiveSum\n    }\n\n    public func calcPosNegSum()\n    {\n        if _values == nil\n        {\n            _positiveSum = 0.0\n            _negativeSum = 0.0\n            return\n        }\n        \n        var sumNeg: Double = 0.0\n        var sumPos: Double = 0.0\n        \n        for f in _values!\n        {\n            if f < 0.0\n            {\n                sumNeg += -f\n            }\n            else\n            {\n                sumPos += f\n            }\n        }\n        \n        _negativeSum = sumNeg\n        _positiveSum = sumPos\n    }\n\n    // MARK: Accessors\n    \n    /// the values the stacked barchart holds\n    public var isStacked: Bool { return _values != nil }\n    \n    /// the values the stacked barchart holds\n    public var values: [Double]?\n    {\n        get { return self._values }\n        set\n        {\n            self.value = BarChartDataEntry.calcSum(newValue)\n            self._values = newValue\n            calcPosNegSum()\n        }\n    }\n    \n    // MARK: NSCopying\n    \n    public override func copyWithZone(zone: NSZone) -> AnyObject\n    {\n        let copy = super.copyWithZone(zone) as! BarChartDataEntry\n        copy._values = _values\n        copy.value = value\n        copy._negativeSum = _negativeSum\n        return copy\n    }\n    \n    /// Calculates the sum across all values of the given stack.\n    ///\n    /// - parameter vals:\n    /// - returns:\n    private static func calcSum(vals: [Double]?) -> Double\n    {\n        if vals == nil\n        {\n            return 0.0\n        }\n        \n        var sum = 0.0\n        \n        for f in vals!\n        {\n            sum += f\n        }\n        \n        return sum\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/BarChartDataSet.swift",
    "content": "//\n//  BarChartDataSet.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n\npublic class BarChartDataSet: BarLineScatterCandleBubbleChartDataSet, IBarChartDataSet\n{\n    private func initialize()\n    {\n        self.highlightColor = NSUIColor.blackColor()\n        \n        self.calcStackSize(yVals as! [BarChartDataEntry])\n        self.calcEntryCountIncludingStacks(yVals as! [BarChartDataEntry])\n    }\n    \n    public required init()\n    {\n        super.init()\n        initialize()\n    }\n    \n    public override init(yVals: [ChartDataEntry]?, label: String?)\n    {\n        super.init(yVals: yVals, label: label)\n        initialize()\n    }\n\n    // MARK: - Data functions and accessors\n    \n    /// the maximum number of bars that are stacked upon each other, this value\n    /// is calculated from the Entries that are added to the DataSet\n    private var _stackSize = 1\n    \n    /// the overall entry count, including counting each stack-value individually\n    private var _entryCountStacks = 0\n    \n    /// Calculates the total number of entries this DataSet represents, including\n    /// stacks. All values belonging to a stack are calculated separately.\n    private func calcEntryCountIncludingStacks(yVals: [BarChartDataEntry]!)\n    {\n        _entryCountStacks = 0\n        \n        for i in 0 ..< yVals.count\n        {\n            let vals = yVals[i].values\n            \n            if (vals == nil)\n            {\n                _entryCountStacks += 1\n            }\n            else\n            {\n                _entryCountStacks += vals!.count\n            }\n        }\n    }\n    \n    /// calculates the maximum stacksize that occurs in the Entries array of this DataSet\n    private func calcStackSize(yVals: [BarChartDataEntry]!)\n    {\n        for i in 0 ..< yVals.count\n        {\n            if let vals = yVals[i].values\n            {\n                if vals.count > _stackSize\n                {\n                    _stackSize = vals.count\n                }\n            }\n        }\n    }\n    \n    public override func calcMinMax(start start : Int, end: Int)\n    {\n        let yValCount = _yVals.count\n        \n        if yValCount == 0\n        {\n            return\n        }\n        \n        var endValue : Int\n        \n        if end == 0 || end >= yValCount\n        {\n            endValue = yValCount - 1\n        }\n        else\n        {\n            endValue = end\n        }\n        \n        _lastStart = start\n        _lastEnd = endValue\n        \n        _yMin = DBL_MAX\n        _yMax = -DBL_MAX\n        \n        for i in start ... endValue\n        {\n            if let e = _yVals[i] as? BarChartDataEntry\n            {\n                if !e.value.isNaN\n                {\n                    if e.values == nil\n                    {\n                        if e.value < _yMin\n                        {\n                            _yMin = e.value\n                        }\n                        \n                        if e.value > _yMax\n                        {\n                            _yMax = e.value\n                        }\n                    }\n                    else\n                    {\n                        if -e.negativeSum < _yMin\n                        {\n                            _yMin = -e.negativeSum\n                        }\n                        \n                        if e.positiveSum > _yMax\n                        {\n                            _yMax = e.positiveSum\n                        }\n                    }\n                }\n            }\n        }\n        \n        if (_yMin == DBL_MAX)\n        {\n            _yMin = 0.0\n            _yMax = 0.0\n        }\n    }\n    \n    /// - returns: the maximum number of bars that can be stacked upon another in this DataSet.\n    public var stackSize: Int\n    {\n        return _stackSize\n    }\n    \n    /// - returns: true if this DataSet is stacked (stacksize > 1) or not.\n    public var isStacked: Bool\n    {\n        return _stackSize > 1 ? true : false\n    }\n    \n    /// - returns: the overall entry count, including counting each stack-value individually\n    public var entryCountStacks: Int\n    {\n        return _entryCountStacks\n    }\n    \n    /// array of labels used to describe the different values of the stacked bars\n    public var stackLabels: [String] = [\"Stack\"]\n    \n    // MARK: - Styling functions and accessors\n    \n    /// space indicator between the bars in percentage of the whole width of one value (0.15 == 15% of bar width)\n    public var barSpace: CGFloat = 0.15\n    \n    /// the color used for drawing the bar-shadows. The bar shadows is a surface behind the bar that indicates the maximum value\n    public var barShadowColor = NSUIColor(red: 215.0/255.0, green: 215.0/255.0, blue: 215.0/255.0, alpha: 1.0)\n    \n    /// the alpha value (transparency) that is used for drawing the highlight indicator bar. min = 0.0 (fully transparent), max = 1.0 (fully opaque)\n    public var highlightAlpha = CGFloat(120.0 / 255.0)\n    \n    // MARK: - NSCopying\n    \n    public override func copyWithZone(zone: NSZone) -> AnyObject\n    {\n        let copy = super.copyWithZone(zone) as! BarChartDataSet\n        copy._stackSize = _stackSize\n        copy._entryCountStacks = _entryCountStacks\n        copy.stackLabels = stackLabels\n        copy.barSpace = barSpace\n        copy.barShadowColor = barShadowColor\n        copy.highlightAlpha = highlightAlpha\n        return copy\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/BarLineScatterCandleBubbleChartData.swift",
    "content": "//\n//  BarLineScatterCandleBubbleChartData.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\n\npublic class BarLineScatterCandleBubbleChartData: ChartData\n{\n    public override init()\n    {\n        super.init()\n    }\n    \n    public override init(xVals: [String?]?, dataSets: [IChartDataSet]?)\n    {\n        super.init(xVals: xVals, dataSets: dataSets)\n    }\n    \n    public override init(xVals: [NSObject]?, dataSets: [IChartDataSet]?)\n    {\n        super.init(xVals: xVals, dataSets: dataSets)\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/BarLineScatterCandleBubbleChartDataSet.swift",
    "content": "//\n//  BarLineScatterCandleBubbleChartDataSet.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n\npublic class BarLineScatterCandleBubbleChartDataSet: ChartDataSet, IBarLineScatterCandleBubbleChartDataSet\n{\n    // MARK: - Data functions and accessors\n    \n    // MARK: - Styling functions and accessors\n    \n    public var highlightColor = NSUIColor(red: 255.0/255.0, green: 187.0/255.0, blue: 115.0/255.0, alpha: 1.0)\n    public var highlightLineWidth = CGFloat(0.5)\n    public var highlightLineDashPhase = CGFloat(0.0)\n    public var highlightLineDashLengths: [CGFloat]?\n    \n    // MARK: - NSCopying\n    \n    public override func copyWithZone(zone: NSZone) -> AnyObject\n    {\n        let copy = super.copyWithZone(zone) as! BarLineScatterCandleBubbleChartDataSet\n        copy.highlightColor = highlightColor\n        copy.highlightLineWidth = highlightLineWidth\n        copy.highlightLineDashPhase = highlightLineDashPhase\n        copy.highlightLineDashLengths = highlightLineDashLengths\n        return copy\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/BubbleChartData.swift",
    "content": "//\n//  BubbleChartData.swift\n//  Charts\n//\n//  Bubble chart implementation:\n//    Copyright 2015 Pierre-Marc Airoldi\n//    Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\npublic class BubbleChartData: BarLineScatterCandleBubbleChartData\n{\n    public override init()\n    {\n        super.init()\n    }\n    \n    public override init(xVals: [String?]?, dataSets: [IChartDataSet]?)\n    {\n        super.init(xVals: xVals, dataSets: dataSets)\n    }\n    \n    public override init(xVals: [NSObject]?, dataSets: [IChartDataSet]?)\n    {\n        super.init(xVals: xVals, dataSets: dataSets)\n    }\n    \n    /// Sets the width of the circle that surrounds the bubble when highlighted for all DataSet objects this data object contains\n    public func setHighlightCircleWidth(width: CGFloat)\n    {\n        for set in _dataSets as! [IBubbleChartDataSet]!\n        {\n            set.highlightCircleWidth = width\n        }\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/BubbleChartDataEntry.swift",
    "content": "//\n//  BubbleDataEntry.swift\n//  Charts\n//\n//  Bubble chart implementation: \n//    Copyright 2015 Pierre-Marc Airoldi\n//    Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\npublic class BubbleChartDataEntry: ChartDataEntry\n{\n    /// The size of the bubble.\n    public var size = CGFloat(0.0)\n    \n    public required init()\n    {\n        super.init()\n    }\n    \n    /// - parameter xIndex: The index on the x-axis.\n    /// - parameter val: The value on the y-axis.\n    /// - parameter size: The size of the bubble.\n    public init(xIndex: Int, value: Double, size: CGFloat)\n    {\n        super.init(value: value, xIndex: xIndex)\n        \n        self.size = size\n    }\n    \n    /// - parameter xIndex: The index on the x-axis.\n    /// - parameter val: The value on the y-axis.\n    /// - parameter size: The size of the bubble.\n    /// - parameter data: Spot for additional data this Entry represents.\n    public init(xIndex: Int, value: Double, size: CGFloat, data: AnyObject?)\n    {\n        super.init(value: value, xIndex: xIndex, data: data)\n      \n        self.size = size\n    }\n    \n    // MARK: NSCopying\n    \n    public override func copyWithZone(zone: NSZone) -> AnyObject\n    {\n        let copy = super.copyWithZone(zone) as! BubbleChartDataEntry\n        copy.size = size\n        return copy\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/BubbleChartDataSet.swift",
    "content": "//\n//  BubbleChartDataSet.swift\n//  Charts\n//\n//  Bubble chart implementation:\n//    Copyright 2015 Pierre-Marc Airoldi\n//    Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n\npublic class BubbleChartDataSet: BarLineScatterCandleBubbleChartDataSet, IBubbleChartDataSet\n{\n    // MARK: - Data functions and accessors\n    \n    internal var _xMax = Double(0.0)\n    internal var _xMin = Double(0.0)\n    internal var _maxSize = CGFloat(0.0)\n    \n    public var xMin: Double { return _xMin }\n    public var xMax: Double { return _xMax }\n    public var maxSize: CGFloat { return _maxSize }\n    \n    public override func calcMinMax(start start: Int, end: Int)\n    {\n        let yValCount = self.entryCount\n        \n        if yValCount == 0\n        {\n            return\n        }\n        \n        let entries = yVals as! [BubbleChartDataEntry]\n    \n        // need chart width to guess this properly\n        \n        var endValue : Int\n        \n        if end == 0 || end >= yValCount\n        {\n            endValue = yValCount - 1\n        }\n        else\n        {\n            endValue = end\n        }\n        \n        _lastStart = start\n        _lastEnd = end\n        \n        _yMin = yMin(entries[start])\n        _yMax = yMax(entries[start])\n        \n        for i in start ... endValue\n        {\n            let entry = entries[i]\n\n            let ymin = yMin(entry)\n            let ymax = yMax(entry)\n            \n            if (ymin < _yMin)\n            {\n                _yMin = ymin\n            }\n            \n            if (ymax > _yMax)\n            {\n                _yMax = ymax\n            }\n            \n            let xmin = xMin(entry)\n            let xmax = xMax(entry)\n            \n            if (xmin < _xMin)\n            {\n                _xMin = xmin\n            }\n            \n            if (xmax > _xMax)\n            {\n                _xMax = xmax\n            }\n\n            let size = largestSize(entry)\n            \n            if (size > _maxSize)\n            {\n                _maxSize = size\n            }\n        }\n    }\n    \n    private func yMin(entry: BubbleChartDataEntry) -> Double\n    {\n        return entry.value\n    }\n    \n    private func yMax(entry: BubbleChartDataEntry) -> Double\n    {\n        return entry.value\n    }\n    \n    private func xMin(entry: BubbleChartDataEntry) -> Double\n    {\n        return Double(entry.xIndex)\n    }\n    \n    private func xMax(entry: BubbleChartDataEntry) -> Double\n    {\n        return Double(entry.xIndex)\n    }\n    \n    private func largestSize(entry: BubbleChartDataEntry) -> CGFloat\n    {\n        return entry.size\n    }\n    \n    // MARK: - Styling functions and accessors\n    \n    /// Sets/gets the width of the circle that surrounds the bubble when highlighted\n    public var highlightCircleWidth: CGFloat = 2.5\n    \n    // MARK: - NSCopying\n    \n    public override func copyWithZone(zone: NSZone) -> AnyObject\n    {\n        let copy = super.copyWithZone(zone) as! BubbleChartDataSet\n        copy._xMin = _xMin\n        copy._xMax = _xMax\n        copy._maxSize = _maxSize\n        copy.highlightCircleWidth = highlightCircleWidth\n        return copy\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/CandleChartData.swift",
    "content": "//\n//  CandleChartData.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\n\npublic class CandleChartData: BarLineScatterCandleBubbleChartData\n{\n    public override init()\n    {\n        super.init()\n    }\n    \n    public override init(xVals: [String?]?, dataSets: [IChartDataSet]?)\n    {\n        super.init(xVals: xVals, dataSets: dataSets)\n    }\n    \n    public override init(xVals: [NSObject]?, dataSets: [IChartDataSet]?)\n    {\n        super.init(xVals: xVals, dataSets: dataSets)\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/CandleChartDataEntry.swift",
    "content": "//\n//  CandleChartDataEntry.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\n\npublic class CandleChartDataEntry: ChartDataEntry\n{\n    /// shadow-high value\n    public var high = Double(0.0)\n    \n    /// shadow-low value\n    public var low = Double(0.0)\n    \n    /// close value\n    public var close = Double(0.0)\n    \n    /// open value\n    public var open = Double(0.0)\n    \n    public required init()\n    {\n        super.init()\n    }\n    \n    public init(xIndex: Int, shadowH: Double, shadowL: Double, open: Double, close: Double)\n    {\n        super.init(value: (shadowH + shadowL) / 2.0, xIndex: xIndex)\n        \n        self.high = shadowH\n        self.low = shadowL\n        self.open = open\n        self.close = close\n    }\n    \n    public init(xIndex: Int, shadowH: Double, shadowL: Double, open: Double, close: Double, data: AnyObject?)\n    {\n        super.init(value: (shadowH + shadowL) / 2.0, xIndex: xIndex, data: data)\n        \n        self.high = shadowH\n        self.low = shadowL\n        self.open = open\n        self.close = close\n    }\n    \n    /// - returns: the overall range (difference) between shadow-high and shadow-low.\n    public var shadowRange: Double\n    {\n        return abs(high - low)\n    }\n    \n    /// - returns: the body size (difference between open and close).\n    public var bodyRange: Double\n    {\n        return abs(open - close)\n    }\n    \n    /// the center value of the candle. (Middle value between high and low)\n    public override var value: Double\n    {\n        get\n        {\n            return super.value\n        }\n        set\n        {\n            super.value = (high + low) / 2.0\n        }\n    }\n    \n    // MARK: NSCopying\n    \n    public override func copyWithZone(zone: NSZone) -> AnyObject\n    {\n        let copy = super.copyWithZone(zone) as! CandleChartDataEntry\n        copy.high = high\n        copy.high = low\n        copy.high = open\n        copy.high = close\n        return copy\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/CandleChartDataSet.swift",
    "content": "//\n//  CandleChartDataSet.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n\npublic class CandleChartDataSet: LineScatterCandleRadarChartDataSet, ICandleChartDataSet\n{\n    \n    public required init()\n    {\n        super.init()\n    }\n    \n    public override init(yVals: [ChartDataEntry]?, label: String?)\n    {\n        super.init(yVals: yVals, label: label)\n    }\n    \n    // MARK: - Data functions and accessors\n    \n    public override func calcMinMax(start start: Int, end: Int)\n    {\n        let yValCount = self.entryCount\n        \n        if yValCount == 0\n        {\n            return\n        }\n        \n        var entries = yVals as! [CandleChartDataEntry]\n        \n        var endValue : Int\n        \n        if end == 0 || end >= yValCount\n        {\n            endValue = yValCount - 1\n        }\n        else\n        {\n            endValue = end\n        }\n        \n        _lastStart = start\n        _lastEnd = end\n        \n        _yMin = DBL_MAX\n        _yMax = -DBL_MAX\n        \n        for i in start ... endValue\n        {\n            let e = entries[i]\n            \n            if (e.low < _yMin)\n            {\n                _yMin = e.low\n            }\n            \n            if (e.high > _yMax)\n            {\n                _yMax = e.high\n            }\n        }\n    }\n    \n    // MARK: - Styling functions and accessors\n    \n    /// the space between the candle entries\n    ///\n    /// **default**: 0.1 (10%)\n    private var _barSpace = CGFloat(0.1)\n    \n    /// the space that is left out on the left and right side of each candle,\n    /// **default**: 0.1 (10%), max 0.45, min 0.0\n    public var barSpace: CGFloat\n    {\n        set\n        {\n            if (newValue < 0.0)\n            {\n                _barSpace = 0.0\n            }\n            else if (newValue > 0.45)\n            {\n                _barSpace = 0.45\n            }\n            else\n            {\n                _barSpace = newValue\n            }\n        }\n        get\n        {\n            return _barSpace\n        }\n    }\n    \n    /// should the candle bars show?\n    /// when false, only \"ticks\" will show\n    ///\n    /// **default**: true\n    public var showCandleBar: Bool = true\n    \n    /// the width of the candle-shadow-line in pixels.\n    ///\n    /// **default**: 1.5\n    public var shadowWidth = CGFloat(1.5)\n    \n    /// the color of the shadow line\n    public var shadowColor: NSUIColor?\n    \n    /// use candle color for the shadow\n    public var shadowColorSameAsCandle = false\n    \n    /// Is the shadow color same as the candle color?\n    public var isShadowColorSameAsCandle: Bool { return shadowColorSameAsCandle }\n    \n    /// color for open == close\n    public var neutralColor: NSUIColor?\n    \n    /// color for open > close\n    public var increasingColor: NSUIColor?\n    \n    /// color for open < close\n    public var decreasingColor: NSUIColor?\n    \n    /// Are increasing values drawn as filled?\n    /// increasing candlesticks are traditionally hollow\n    public var increasingFilled = false\n    \n    /// Are increasing values drawn as filled?\n    public var isIncreasingFilled: Bool { return increasingFilled }\n    \n    /// Are decreasing values drawn as filled?\n    /// descreasing candlesticks are traditionally filled\n    public var decreasingFilled = true\n    \n    /// Are decreasing values drawn as filled?\n    public var isDecreasingFilled: Bool { return decreasingFilled }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/ChartData.swift",
    "content": "//\n//  ChartData.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\n\n\npublic class ChartData: NSObject\n{\n    internal var _yMax = Double(0.0)\n    internal var _yMin = Double(0.0)\n    internal var _leftAxisMax = Double(0.0)\n    internal var _leftAxisMin = Double(0.0)\n    internal var _rightAxisMax = Double(0.0)\n    internal var _rightAxisMin = Double(0.0)\n    private var _yValCount = Int(0)\n    \n    /// the last start value used for calcMinMax\n    internal var _lastStart: Int = 0\n    \n    /// the last end value used for calcMinMax\n    internal var _lastEnd: Int = 0\n    \n    /// the average length (in characters) across all x-value strings\n    private var _xValAverageLength = Double(0.0)\n    \n    internal var _xVals: [String?]!\n    internal var _dataSets: [IChartDataSet]!\n    \n    public override init()\n    {\n        super.init()\n        \n        _xVals = [String?]()\n        _dataSets = [IChartDataSet]()\n    }\n    \n    public init(xVals: [String?]?, dataSets: [IChartDataSet]?)\n    {\n        super.init()\n        \n        _xVals = xVals == nil ? [String?]() : xVals\n        _dataSets = dataSets == nil ? [IChartDataSet]() : dataSets\n        \n        self.initialize(_dataSets)\n    }\n    \n    public init(xVals: [NSObject]?, dataSets: [IChartDataSet]?)\n    {\n        super.init()\n        \n        _xVals = xVals == nil ? [String?]() : ChartUtils.bridgedObjCGetStringArray(objc: xVals!)\n        _dataSets = dataSets == nil ? [IChartDataSet]() : dataSets\n        \n        self.initialize(_dataSets)\n    }\n    \n    public convenience init(xVals: [String?]?)\n    {\n        self.init(xVals: xVals, dataSets: [IChartDataSet]())\n    }\n    \n    public convenience init(xVals: [NSObject]?)\n    {\n        self.init(xVals: xVals, dataSets: [IChartDataSet]())\n    }\n    \n    public convenience init(xVals: [String?]?, dataSet: IChartDataSet?)\n    {\n        self.init(xVals: xVals, dataSets: dataSet === nil ? nil : [dataSet!])\n    }\n    \n    public convenience init(xVals: [NSObject]?, dataSet: IChartDataSet?)\n    {\n        self.init(xVals: xVals, dataSets: dataSet === nil ? nil : [dataSet!])\n    }\n    \n    internal func initialize(dataSets: [IChartDataSet])\n    {\n        checkIsLegal(dataSets)\n        \n        calcMinMax(start: _lastStart, end: _lastEnd)\n        calcYValueCount()\n        \n        calcXValAverageLength()\n    }\n    \n    // calculates the average length (in characters) across all x-value strings\n    internal func calcXValAverageLength()\n    {\n        if (_xVals.count == 0)\n        {\n            _xValAverageLength = 1\n            return\n        }\n        \n        var sum = 1\n        \n        for i in 0 ..< _xVals.count\n        {\n            sum += _xVals[i] == nil ? 0 : (_xVals[i]!).characters.count\n        }\n        \n        _xValAverageLength = Double(sum) / Double(_xVals.count)\n    }\n    \n    // Checks if the combination of x-values array and DataSet array is legal or not.\n    // :param: dataSets\n    internal func checkIsLegal(dataSets: [IChartDataSet]!)\n    {\n        if (dataSets == nil)\n        {\n            return\n        }\n        \n        if self is ScatterChartData\n        { // In scatter chart it makes sense to have more than one y-value value for an x-index\n            return\n        }\n        \n        for i in 0 ..< dataSets.count\n        {\n            if (dataSets[i].entryCount > _xVals.count)\n            {\n                print(\"One or more of the DataSet Entry arrays are longer than the x-values array of this Data object.\", terminator: \"\\n\")\n                return\n            }\n        }\n    }\n    \n    /// Call this method to let the ChartData know that the underlying data has changed.\n    /// Calling this performs all necessary recalculations needed when the contained data has changed.\n    public func notifyDataChanged()\n    {\n        initialize(_dataSets)\n    }\n    \n    /// calc minimum and maximum y value over all datasets\n    internal func calcMinMax(start start: Int, end: Int)\n    {\n        \n        if (_dataSets == nil || _dataSets.count < 1)\n        {\n            _yMax = 0.0\n            _yMin = 0.0\n        }\n        else\n        {\n            _lastStart = start\n            _lastEnd = end\n            \n            _yMin = DBL_MAX\n            _yMax = -DBL_MAX\n            \n            for i in 0 ..< _dataSets.count\n            {\n                _dataSets[i].calcMinMax(start: start, end: end)\n                \n                if (_dataSets[i].yMin < _yMin)\n                {\n                    _yMin = _dataSets[i].yMin\n                }\n                \n                if (_dataSets[i].yMax > _yMax)\n                {\n                    _yMax = _dataSets[i].yMax\n                }\n            }\n            \n            if (_yMin == DBL_MAX)\n            {\n                _yMin = 0.0\n                _yMax = 0.0\n            }\n            \n            // left axis\n            let firstLeft = getFirstLeft()\n\n            if (firstLeft !== nil)\n            {\n                _leftAxisMax = firstLeft!.yMax\n                _leftAxisMin = firstLeft!.yMin\n\n                for dataSet in _dataSets\n                {\n                    if (dataSet.axisDependency == .Left)\n                    {\n                        if (dataSet.yMin < _leftAxisMin)\n                        {\n                            _leftAxisMin = dataSet.yMin\n                        }\n\n                        if (dataSet.yMax > _leftAxisMax)\n                        {\n                            _leftAxisMax = dataSet.yMax\n                        }\n                    }\n                }\n            }\n\n            // right axis\n            let firstRight = getFirstRight()\n\n            if (firstRight !== nil)\n            {\n                _rightAxisMax = firstRight!.yMax\n                _rightAxisMin = firstRight!.yMin\n                \n                for dataSet in _dataSets\n                {\n                    if (dataSet.axisDependency == .Right)\n                    {\n                        if (dataSet.yMin < _rightAxisMin)\n                        {\n                            _rightAxisMin = dataSet.yMin\n                        }\n\n                        if (dataSet.yMax > _rightAxisMax)\n                        {\n                            _rightAxisMax = dataSet.yMax\n                        }\n                    }\n                }\n            }\n\n            // in case there is only one axis, adjust the second axis\n            handleEmptyAxis(firstLeft, firstRight: firstRight)\n        }\n    }\n    \n    /// Calculates the total number of y-values across all ChartDataSets the ChartData represents.\n    internal func calcYValueCount()\n    {\n        _yValCount = 0\n        \n        if (_dataSets == nil)\n        {\n            return\n        }\n        \n        var count = 0\n        \n        for i in 0 ..< _dataSets.count\n        {\n            count += _dataSets[i].entryCount\n        }\n        \n        _yValCount = count\n    }\n    \n    /// - returns: the number of LineDataSets this object contains\n    public var dataSetCount: Int\n    {\n        if (_dataSets == nil)\n        {\n            return 0\n        }\n        return _dataSets.count\n    }\n    \n    /// - returns: the smallest y-value the data object contains.\n    public var yMin: Double\n    {\n        return _yMin\n    }\n    \n    public func getYMin() -> Double\n    {\n        return _yMin\n    }\n    \n    public func getYMin(axis: ChartYAxis.AxisDependency) -> Double\n    {\n        if (axis == .Left)\n        {\n            return _leftAxisMin\n        }\n        else\n        {\n            return _rightAxisMin\n        }\n    }\n    \n    /// - returns: the greatest y-value the data object contains.\n    public var yMax: Double\n    {\n        return _yMax\n    }\n    \n    public func getYMax() -> Double\n    {\n        return _yMax\n    }\n    \n    public func getYMax(axis: ChartYAxis.AxisDependency) -> Double\n    {\n        if (axis == .Left)\n        {\n            return _leftAxisMax\n        }\n        else\n        {\n            return _rightAxisMax\n        }\n    }\n    \n    /// - returns: the average length (in characters) across all values in the x-vals array\n    public var xValAverageLength: Double\n    {\n        return _xValAverageLength\n    }\n    \n    /// - returns: the total number of y-values across all DataSet objects the this object represents.\n    public var yValCount: Int\n    {\n        return _yValCount\n    }\n    \n    /// - returns: the x-values the chart represents\n    public var xVals: [String?]\n    {\n        return _xVals\n    }\n    \n    ///Adds a new x-value to the chart data.\n    public func addXValue(xVal: String?)\n    {\n        _xVals.append(xVal)\n    }\n    \n    /// Removes the x-value at the specified index.\n    public func removeXValue(index: Int)\n    {\n        _xVals.removeAtIndex(index)\n    }\n    \n    /// - returns: the array of ChartDataSets this object holds.\n    public var dataSets: [IChartDataSet]\n    {\n        get\n        {\n            return _dataSets\n        }\n        set\n        {\n            _dataSets = newValue\n            initialize(_dataSets)\n        }\n    }\n    \n    /// Retrieve the index of a ChartDataSet with a specific label from the ChartData. Search can be case sensitive or not.\n    /// \n    /// **IMPORTANT: This method does calculations at runtime, do not over-use in performance critical situations.**\n    ///\n    /// - parameter dataSets: the DataSet array to search\n    /// - parameter type:\n    /// - parameter ignorecase: if true, the search is not case-sensitive\n    /// - returns: the index of the DataSet Object with the given label. Sensitive or not.\n    internal func getDataSetIndexByLabel(label: String, ignorecase: Bool) -> Int\n    {\n        if (ignorecase)\n        {\n            for i in 0 ..< dataSets.count\n            {\n                if (dataSets[i].label == nil)\n                {\n                    continue\n                }\n                if (label.caseInsensitiveCompare(dataSets[i].label!) == NSComparisonResult.OrderedSame)\n                {\n                    return i\n                }\n            }\n        }\n        else\n        {\n            for i in 0 ..< dataSets.count\n            {\n                if (label == dataSets[i].label)\n                {\n                    return i\n                }\n            }\n        }\n        \n        return -1\n    }\n    \n    /// - returns: the total number of x-values this ChartData object represents (the size of the x-values array)\n    public var xValCount: Int\n    {\n        return _xVals.count\n    }\n    \n    /// - returns: the labels of all DataSets as a string array.\n    internal func dataSetLabels() -> [String]\n    {\n        var types = [String]()\n        \n        for i in 0 ..< _dataSets.count\n        {\n            if (dataSets[i].label == nil)\n            {\n                continue\n            }\n            \n            types[i] = _dataSets[i].label!\n        }\n        \n        return types\n    }\n    \n    /// Get the Entry for a corresponding highlight object\n    ///\n    /// - parameter highlight:\n    /// - returns: the entry that is highlighted\n    public func getEntryForHighlight(highlight: ChartHighlight) -> ChartDataEntry?\n    {\n        if highlight.dataSetIndex >= dataSets.count\n        {\n            return nil\n        }\n        else\n        {\n            return _dataSets[highlight.dataSetIndex].entryForXIndex(highlight.xIndex)\n        }\n    }\n    \n    /// **IMPORTANT: This method does calculations at runtime. Use with care in performance critical situations.**\n    ///\n    /// - parameter label:\n    /// - parameter ignorecase:\n    /// - returns: the DataSet Object with the given label. Sensitive or not.\n    public func getDataSetByLabel(label: String, ignorecase: Bool) -> IChartDataSet?\n    {\n        let index = getDataSetIndexByLabel(label, ignorecase: ignorecase)\n        \n        if (index < 0 || index >= _dataSets.count)\n        {\n            return nil\n        }\n        else\n        {\n            return _dataSets[index]\n        }\n    }\n    \n    public func getDataSetByIndex(index: Int) -> IChartDataSet!\n    {\n        if (_dataSets == nil || index < 0 || index >= _dataSets.count)\n        {\n            return nil\n        }\n        \n        return _dataSets[index]\n    }\n    \n    public func addDataSet(d: IChartDataSet!)\n    {\n        if (_dataSets == nil)\n        {\n            return\n        }\n        \n        _yValCount += d.entryCount\n        \n        if (_dataSets.count == 0)\n        {\n            _yMax = d.yMax\n            _yMin = d.yMin\n            \n            if (d.axisDependency == .Left)\n            {\n                _leftAxisMax = d.yMax\n                _leftAxisMin = d.yMin\n            }\n            else\n            {\n                _rightAxisMax = d.yMax\n                _rightAxisMin = d.yMin\n            }\n        }\n        else\n        {\n            if (_yMax < d.yMax)\n            {\n                _yMax = d.yMax\n            }\n            if (_yMin > d.yMin)\n            {\n                _yMin = d.yMin\n            }\n            \n            if (d.axisDependency == .Left)\n            {\n                if (_leftAxisMax < d.yMax)\n                {\n                    _leftAxisMax = d.yMax\n                }\n                if (_leftAxisMin > d.yMin)\n                {\n                    _leftAxisMin = d.yMin\n                }\n            }\n            else\n            {\n                if (_rightAxisMax < d.yMax)\n                {\n                    _rightAxisMax = d.yMax\n                }\n                if (_rightAxisMin > d.yMin)\n                {\n                    _rightAxisMin = d.yMin\n                }\n            }\n        }\n        \n        _dataSets.append(d)\n        \n        handleEmptyAxis(getFirstLeft(), firstRight: getFirstRight())\n    }\n    \n    public func handleEmptyAxis(firstLeft: IChartDataSet?, firstRight: IChartDataSet?)\n    {\n        // in case there is only one axis, adjust the second axis\n        if (firstLeft === nil)\n        {\n            _leftAxisMax = _rightAxisMax\n            _leftAxisMin = _rightAxisMin\n        }\n        else if (firstRight === nil)\n        {\n            _rightAxisMax = _leftAxisMax\n            _rightAxisMin = _leftAxisMin\n        }\n    }\n    \n    /// Removes the given DataSet from this data object.\n    /// Also recalculates all minimum and maximum values.\n    ///\n    /// - returns: true if a DataSet was removed, false if no DataSet could be removed.\n    public func removeDataSet(dataSet: IChartDataSet!) -> Bool\n    {\n        if (_dataSets == nil || dataSet === nil)\n        {\n            return false\n        }\n        \n        for i in 0 ..< _dataSets.count\n        {\n            if (_dataSets[i] === dataSet)\n            {\n                return removeDataSetByIndex(i)\n            }\n        }\n        \n        return false\n    }\n    \n    /// Removes the DataSet at the given index in the DataSet array from the data object. \n    /// Also recalculates all minimum and maximum values. \n    ///\n    /// - returns: true if a DataSet was removed, false if no DataSet could be removed.\n    public func removeDataSetByIndex(index: Int) -> Bool\n    {\n        if (_dataSets == nil || index >= _dataSets.count || index < 0)\n        {\n            return false\n        }\n        \n        let d = _dataSets.removeAtIndex(index)\n        _yValCount -= d.entryCount\n        \n        calcMinMax(start: _lastStart, end: _lastEnd)\n        \n        return true\n    }\n    \n    /// Adds an Entry to the DataSet at the specified index. Entries are added to the end of the list.\n    public func addEntry(e: ChartDataEntry, dataSetIndex: Int)\n    {\n        if _dataSets != nil && _dataSets.count > dataSetIndex && dataSetIndex >= 0\n        {\n            let val = e.value\n            let set = _dataSets[dataSetIndex]\n            \n            if !set.addEntry(e) { return }\n            \n            if (_yValCount == 0)\n            {\n                _yMin = val\n                _yMax = val\n                \n                if (set.axisDependency == .Left)\n                {\n                    _leftAxisMax = e.value\n                    _leftAxisMin = e.value\n                }\n                else\n                {\n                    _rightAxisMax = e.value\n                    _rightAxisMin = e.value\n                }\n            }\n            else\n            {\n                if (_yMax < val)\n                {\n                    _yMax = val\n                }\n                if (_yMin > val)\n                {\n                    _yMin = val\n                }\n                \n                if (set.axisDependency == .Left)\n                {\n                    if (_leftAxisMax < e.value)\n                    {\n                        _leftAxisMax = e.value\n                    }\n                    if (_leftAxisMin > e.value)\n                    {\n                        _leftAxisMin = e.value\n                    }\n                }\n                else\n                {\n                    if (_rightAxisMax < e.value)\n                    {\n                        _rightAxisMax = e.value\n                    }\n                    if (_rightAxisMin > e.value)\n                    {\n                        _rightAxisMin = e.value\n                    }\n                }\n            }\n            \n            _yValCount += 1\n            \n            handleEmptyAxis(getFirstLeft(), firstRight: getFirstRight())\n        }\n        else\n        {\n            print(\"ChartData.addEntry() - dataSetIndex our of range.\", terminator: \"\\n\")\n        }\n    }\n    \n    /// Removes the given Entry object from the DataSet at the specified index.\n    public func removeEntry(entry: ChartDataEntry!, dataSetIndex: Int) -> Bool\n    {\n        // entry null, outofbounds\n        if (entry === nil || dataSetIndex >= _dataSets.count)\n        {\n            return false\n        }\n        \n        // remove the entry from the dataset\n        let removed = _dataSets[dataSetIndex].removeEntry(entry)\n        \n        if (removed)\n        {\n            _yValCount -= 1\n            \n            calcMinMax(start: _lastStart, end: _lastEnd)\n        }\n        \n        return removed\n    }\n    \n    /// Removes the Entry object at the given xIndex from the ChartDataSet at the\n    /// specified index. \n    /// - returns: true if an entry was removed, false if no Entry was found that meets the specified requirements.\n    public func removeEntryByXIndex(xIndex: Int, dataSetIndex: Int) -> Bool\n    {\n        if (dataSetIndex >= _dataSets.count)\n        {\n            return false\n        }\n        \n        let entry = _dataSets[dataSetIndex].entryForXIndex(xIndex)\n        \n        if (entry?.xIndex != xIndex)\n        {\n            return false\n        }\n        \n        return removeEntry(entry, dataSetIndex: dataSetIndex)\n    }\n    \n    /// - returns: the DataSet that contains the provided Entry, or null, if no DataSet contains this entry.\n    public func getDataSetForEntry(e: ChartDataEntry!) -> IChartDataSet?\n    {\n        if (e == nil)\n        {\n            return nil\n        }\n        \n        for i in 0 ..< _dataSets.count\n        {\n            let set = _dataSets[i]\n            \n            if (e === set.entryForXIndex(e.xIndex))\n            {\n                return set\n            }\n        }\n        \n        return nil\n    }\n    \n    /// - returns: the index of the provided DataSet inside the DataSets array of this data object. -1 if the DataSet was not found.\n    public func indexOfDataSet(dataSet: IChartDataSet) -> Int\n    {\n        for i in 0 ..< _dataSets.count\n        {\n            if (_dataSets[i] === dataSet)\n            {\n                return i\n            }\n        }\n        \n        return -1\n    }\n    \n    /// - returns: the first DataSet from the datasets-array that has it's dependency on the left axis. Returns null if no DataSet with left dependency could be found.\n    public func getFirstLeft() -> IChartDataSet?\n    {\n        for dataSet in _dataSets\n        {\n            if (dataSet.axisDependency == .Left)\n            {\n                return dataSet\n            }\n        }\n        \n        return nil\n    }\n    \n    /// - returns: the first DataSet from the datasets-array that has it's dependency on the right axis. Returns null if no DataSet with right dependency could be found.\n    public func getFirstRight() -> IChartDataSet?\n    {\n        for dataSet in _dataSets\n        {\n            if (dataSet.axisDependency == .Right)\n            {\n                return dataSet\n            }\n        }\n        \n        return nil\n    }\n    \n    /// - returns: all colors used across all DataSet objects this object represents.\n    public func getColors() -> [NSUIColor]?\n    {\n        if (_dataSets == nil)\n        {\n            return nil\n        }\n        \n        var clrcnt = 0\n        \n        for i in 0 ..< _dataSets.count\n        {\n            clrcnt += _dataSets[i].colors.count\n        }\n        \n        var colors = [NSUIColor]()\n        \n        for i in 0 ..< _dataSets.count\n        {\n            let clrs = _dataSets[i].colors\n            \n            for clr in clrs\n            {\n                colors.append(clr)\n            }\n        }\n        \n        return colors\n    }\n    \n    /// Generates an x-values array filled with numbers in range specified by the parameters. Can be used for convenience.\n    public func generateXVals(from: Int, to: Int) -> [String]\n    {\n        var xvals = [String]()\n        \n        for i in from ..< to\n        {\n            xvals.append(String(i))\n        }\n        \n        return xvals\n    }\n    \n    /// Sets a custom ValueFormatter for all DataSets this data object contains.\n    public func setValueFormatter(formatter: NSNumberFormatter!)\n    {\n        for set in dataSets\n        {\n            set.valueFormatter = formatter\n        }\n    }\n    \n    /// Sets the color of the value-text (color in which the value-labels are drawn) for all DataSets this data object contains.\n    public func setValueTextColor(color: NSUIColor!)\n    {\n        for set in dataSets\n        {\n            set.valueTextColor = color ?? set.valueTextColor\n        }\n    }\n    \n    /// Sets the font for all value-labels for all DataSets this data object contains.\n    public func setValueFont(font: NSUIFont!)\n    {\n        for set in dataSets\n        {\n            set.valueFont = font ?? set.valueFont\n        }\n    }\n    \n    /// Enables / disables drawing values (value-text) for all DataSets this data object contains.\n    public func setDrawValues(enabled: Bool)\n    {\n        for set in dataSets\n        {\n            set.drawValuesEnabled = enabled\n        }\n    }\n    \n    /// Enables / disables highlighting values for all DataSets this data object contains.\n    /// If set to true, this means that values can be highlighted programmatically or by touch gesture.\n    public var highlightEnabled: Bool\n    {\n        get\n        {\n            for set in dataSets\n            {\n                if (!set.highlightEnabled)\n                {\n                    return false\n                }\n            }\n            \n            return true\n        }\n        set\n        {\n            for set in dataSets\n            {\n                set.highlightEnabled = newValue\n            }\n        }\n    }\n    \n    /// if true, value highlightning is enabled\n    public var isHighlightEnabled: Bool { return highlightEnabled }\n    \n    /// Clears this data object from all DataSets and removes all Entries.\n    /// Don't forget to invalidate the chart after this.\n    public func clearValues()\n    {\n        dataSets.removeAll(keepCapacity: false)\n        notifyDataChanged()\n    }\n    \n    /// Checks if this data object contains the specified Entry. \n    /// - returns: true if so, false if not.\n    public func contains(entry entry: ChartDataEntry) -> Bool\n    {\n        for set in dataSets\n        {\n            if set.contains(entry)\n            {\n                return true\n            }\n        }\n        \n        return false\n    }\n    \n    /// Checks if this data object contains the specified DataSet. \n    /// - returns: true if so, false if not.\n    public func contains(dataSet dataSet: IChartDataSet) -> Bool\n    {\n        for set in dataSets\n        {\n            if set === dataSet\n            {\n                return true\n            }\n        }\n        \n        return false\n    }\n    \n    /// MARK: - ObjC compatibility\n    \n    /// - returns: the average length (in characters) across all values in the x-vals array\n    public var xValsObjc: [NSObject] { return ChartUtils.bridgedObjCGetStringArray(swift: _xVals); }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/ChartDataEntry.swift",
    "content": "//\n//  ChartDataEntry.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\n\npublic class ChartDataEntry: NSObject\n{\n    /// the actual value (y axis)\n    public var value = Double(0.0)\n    \n    /// the index on the x-axis\n    public var xIndex = Int(0)\n    \n    /// optional spot for additional data this Entry represents\n    public var data: AnyObject?\n    \n    public override required init()\n    {\n        super.init()\n    }\n    \n    public init(value: Double, xIndex: Int)\n    {\n        super.init()\n        \n        self.value = value\n        self.xIndex = xIndex\n    }\n    \n    public init(value: Double, xIndex: Int, data: AnyObject?)\n    {\n        super.init()\n        \n        self.value = value\n        self.xIndex = xIndex\n        self.data = data\n    }\n    \n    // MARK: NSObject\n    \n    public override func isEqual(object: AnyObject?) -> Bool\n    {\n        if (object === nil)\n        {\n            return false\n        }\n        \n        if (!object!.isKindOfClass(self.dynamicType))\n        {\n            return false\n        }\n        \n        if (object!.data !== data && !object!.data.isEqual(self.data))\n        {\n            return false\n        }\n        \n        if (object!.xIndex != xIndex)\n        {\n            return false\n        }\n        \n        if (fabs(object!.value - value) > 0.00001)\n        {\n            return false\n        }\n        \n        return true\n    }\n    \n    // MARK: NSObject\n    \n    public override var description: String\n    {\n        return \"ChartDataEntry, xIndex: \\(xIndex), value \\(value)\"\n    }\n    \n    // MARK: NSCopying\n    \n    public func copyWithZone(zone: NSZone) -> AnyObject\n    {\n        let copy = self.dynamicType.init()\n        \n        copy.value = value\n        copy.xIndex = xIndex\n        copy.data = data\n        \n        return copy\n    }\n}\n\npublic func ==(lhs: ChartDataEntry, rhs: ChartDataEntry) -> Bool\n{\n    if (lhs === rhs)\n    {\n        return true\n    }\n    \n    if (!lhs.isKindOfClass(rhs.dynamicType))\n    {\n        return false\n    }\n    \n    if (lhs.data !== rhs.data && !lhs.data!.isEqual(rhs.data))\n    {\n        return false\n    }\n    \n    if (lhs.xIndex != rhs.xIndex)\n    {\n        return false\n    }\n    \n    if (fabs(lhs.value - rhs.value) > 0.00001)\n    {\n        return false\n    }\n    \n    return true\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/ChartDataSet.swift",
    "content": "//\n//  ChartDataSet.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\n\n@objc\npublic enum ChartDataSetRounding: Int\n{\n    case Up = 0\n    case Down = 1\n    case Closest = 2\n}\n\npublic class ChartDataSet: ChartBaseDataSet\n{\n    public required init()\n    {\n        super.init()\n        \n        _yVals = [ChartDataEntry]()\n    }\n    \n    public override init(label: String?)\n    {\n        super.init(label: label)\n        \n        _yVals = [ChartDataEntry]()\n    }\n    \n    public init(yVals: [ChartDataEntry]?, label: String?)\n    {\n        super.init(label: label)\n        \n        _yVals = yVals == nil ? [ChartDataEntry]() : yVals\n        \n        self.calcMinMax(start: _lastStart, end: _lastEnd)\n    }\n    \n    public convenience init(yVals: [ChartDataEntry]?)\n    {\n        self.init(yVals: yVals, label: \"DataSet\")\n    }\n    \n    // MARK: - Data functions and accessors\n    \n    internal var _yVals: [ChartDataEntry]!\n    internal var _yMax = Double(0.0)\n    internal var _yMin = Double(0.0)\n    \n    /// the last start value used for calcMinMax\n    internal var _lastStart: Int = 0\n    \n    /// the last end value used for calcMinMax\n    internal var _lastEnd: Int = 0\n    \n    public var yVals: [ChartDataEntry] { return _yVals }\n    \n    /// Use this method to tell the data set that the underlying data has changed\n    public override func notifyDataSetChanged()\n    {\n        calcMinMax(start: _lastStart, end: _lastEnd)\n    }\n    \n    public override func calcMinMax(start start: Int, end: Int)\n    {\n        let yValCount = _yVals.count\n        \n        if yValCount == 0\n        {\n            return\n        }\n        \n        var endValue : Int\n        \n        if end == 0 || end >= yValCount\n        {\n            endValue = yValCount - 1\n        }\n        else\n        {\n            endValue = end\n        }\n        \n        _lastStart = start\n        _lastEnd = endValue\n        \n        _yMin = DBL_MAX\n        _yMax = -DBL_MAX\n        \n        for i in start ... endValue\n        {\n            let e = _yVals[i]\n            \n            if (!e.value.isNaN)\n            {\n                if (e.value < _yMin)\n                {\n                    _yMin = e.value\n                }\n                if (e.value > _yMax)\n                {\n                    _yMax = e.value\n                }\n            }\n        }\n        \n        if (_yMin == DBL_MAX)\n        {\n            _yMin = 0.0\n            _yMax = 0.0\n        }\n    }\n    \n    /// - returns: the minimum y-value this DataSet holds\n    public override var yMin: Double { return _yMin }\n    \n    /// - returns: the maximum y-value this DataSet holds\n    public override var yMax: Double { return _yMax }\n    \n    /// - returns: the number of y-values this DataSet represents\n    public override var entryCount: Int { return _yVals?.count ?? 0 }\n    \n    /// - returns: the value of the Entry object at the given xIndex. Returns NaN if no value is at the given x-index.\n    public override func yValForXIndex(x: Int) -> Double\n    {\n        let e = self.entryForXIndex(x)\n        \n        if (e !== nil && e!.xIndex == x) { return e!.value }\n        else { return Double.NaN }\n    }\n    \n    /// - returns: the entry object found at the given index (not x-index!)\n    /// - throws: out of bounds\n    /// if `i` is out of bounds, it may throw an out-of-bounds exception\n    public override func entryForIndex(i: Int) -> ChartDataEntry?\n    {\n        return _yVals[i]\n    }\n    \n    /// - returns: the first Entry object found at the given xIndex with binary search.\n    /// If the no Entry at the specifed x-index is found, this method returns the Entry at the closest x-index.\n    /// nil if no Entry object at that index.\n    public override func entryForXIndex(x: Int, rounding: ChartDataSetRounding) -> ChartDataEntry?\n    {\n        let index = self.entryIndex(xIndex: x, rounding: rounding)\n        if (index > -1)\n        {\n            return _yVals[index]\n        }\n        return nil\n    }\n    \n    /// - returns: the first Entry object found at the given xIndex with binary search.\n    /// If the no Entry at the specifed x-index is found, this method returns the Entry at the closest x-index.\n    /// nil if no Entry object at that index.\n    public override func entryForXIndex(x: Int) -> ChartDataEntry?\n    {\n        return entryForXIndex(x, rounding: .Closest)\n    }\n    \n    public func entriesForXIndex(x: Int) -> [ChartDataEntry]\n    {\n        var entries = [ChartDataEntry]()\n        \n        var low = 0\n        var high = _yVals.count - 1\n        \n        while (low <= high)\n        {\n            var m = Int((high + low) / 2)\n            var entry = _yVals[m]\n            \n            if (x == entry.xIndex)\n            {\n                while (m > 0 && _yVals[m - 1].xIndex == x)\n                {\n                    m -= 1\n                }\n                \n                high = _yVals.count\n                while (m < high)\n                {\n                    entry = _yVals[m]\n                    if (entry.xIndex == x)\n                    {\n                        entries.append(entry)\n                    }\n                    else\n                    {\n                        break\n                    }\n                    \n                    m += 1\n                }\n            }\n            \n            if (x > _yVals[m].xIndex)\n            {\n                low = m + 1\n            }\n            else\n            {\n                high = m - 1\n            }\n        }\n        \n        return entries\n    }\n    \n    /// - returns: the array-index of the specified entry\n    ///\n    /// - parameter x: x-index of the entry to search for\n    /// - parameter rounding: x-index of the entry to search for\n    public override func entryIndex(xIndex x: Int, rounding: ChartDataSetRounding) -> Int\n    {\n        var low = 0\n        var high = _yVals.count - 1\n        var closest = -1\n        \n        while (low <= high)\n        {\n            var m = (high + low) / 2\n            let entry = _yVals[m]\n            \n            if (x == entry.xIndex)\n            {\n                while (m > 0 && _yVals[m - 1].xIndex == x)\n                {\n                    m -= 1\n                }\n                \n                return m\n            }\n            \n            if (x > entry.xIndex)\n            {\n                low = m + 1\n            }\n            else\n            {\n                high = m - 1\n            }\n            \n            closest = m\n        }\n        \n        if closest != -1\n        {\n            if rounding == .Up\n            {\n                let closestXIndex = _yVals[closest].xIndex\n                if closestXIndex < x && closest < _yVals.count - 1\n                {\n                    closest = closest + 1\n                }\n            }\n            else if rounding == .Down\n            {\n                let closestXIndex = _yVals[closest].xIndex\n                if closestXIndex > x && closest > 0\n                {\n                    closest = closest - 1\n                }\n            }\n        }\n        \n        return closest\n    }\n    \n    /// - returns: the array-index of the specified entry\n    ///\n    /// - parameter e: the entry to search for\n    public override func entryIndex(entry e: ChartDataEntry) -> Int\n    {\n        for i in 0 ..< _yVals.count\n        {\n            if _yVals[i] === e\n            {\n                return i\n            }\n        }\n        \n        return -1\n    }\n    \n    /// Adds an Entry to the DataSet dynamically.\n    /// Entries are added to the end of the list.\n    /// This will also recalculate the current minimum and maximum values of the DataSet and the value-sum.\n    /// - parameter e: the entry to add\n    /// - returns: true\n    public override func addEntry(e: ChartDataEntry) -> Bool\n    {\n        let val = e.value\n        \n        if (_yVals == nil)\n        {\n            _yVals = [ChartDataEntry]()\n        }\n        \n        if (_yVals.count == 0)\n        {\n            _yMax = val\n            _yMin = val\n        }\n        else\n        {\n            if (_yMax < val)\n            {\n                _yMax = val\n            }\n            if (_yMin > val)\n            {\n                _yMin = val\n            }\n        }\n        \n        _yVals.append(e)\n        \n        return true\n    }\n    \n    /// Adds an Entry to the DataSet dynamically.\n    /// Entries are added to their appropriate index respective to it's x-index.\n    /// This will also recalculate the current minimum and maximum values of the DataSet and the value-sum.\n    /// - parameter e: the entry to add\n    /// - returns: true\n    public override func addEntryOrdered(e: ChartDataEntry) -> Bool\n    {\n        let val = e.value\n        \n        if (_yVals == nil)\n        {\n            _yVals = [ChartDataEntry]()\n        }\n        \n        if (_yVals.count == 0)\n        {\n            _yMax = val\n            _yMin = val\n        }\n        else\n        {\n            if (_yMax < val)\n            {\n                _yMax = val\n            }\n            if (_yMin > val)\n            {\n                _yMin = val\n            }\n        }\n        \n        if _yVals.last?.xIndex > e.xIndex\n        {\n            var closestIndex = entryIndex(xIndex: e.xIndex, rounding: .Closest)\n            if _yVals[closestIndex].xIndex < e.xIndex\n            {\n                closestIndex += 1\n            }\n            _yVals.insert(e, atIndex: closestIndex)\n            \n            return true\n        }\n        \n        _yVals.append(e)\n        \n        return true\n    }\n    \n    /// Removes an Entry from the DataSet dynamically.\n    /// This will also recalculate the current minimum and maximum values of the DataSet and the value-sum.\n    /// - parameter entry: the entry to remove\n    /// - returns: true if the entry was removed successfully, else if the entry does not exist\n    public override func removeEntry(entry: ChartDataEntry) -> Bool\n    {\n        var removed = false\n        \n        for i in 0 ..< _yVals.count\n        {\n            if (_yVals[i] === entry)\n            {\n                _yVals.removeAtIndex(i)\n                removed = true\n                break\n            }\n        }\n        \n        if (removed)\n        {\n            calcMinMax(start: _lastStart, end: _lastEnd)\n        }\n        \n        return removed\n    }\n    \n    /// Removes the first Entry (at index 0) of this DataSet from the entries array.\n    ///\n    /// - returns: true if successful, false if not.\n    public override func removeFirst() -> Bool\n    {\n        let entry: ChartDataEntry? = _yVals.isEmpty ? nil : _yVals.removeFirst()\n        \n        let removed = entry != nil\n        \n        if (removed)\n        {\n            calcMinMax(start: _lastStart, end: _lastEnd)\n        }\n        \n        return removed;\n    }\n    \n    /// Removes the last Entry (at index size-1) of this DataSet from the entries array.\n    ///\n    /// - returns: true if successful, false if not.\n    public override func removeLast() -> Bool\n    {\n        let entry: ChartDataEntry? = _yVals.isEmpty ? nil : _yVals.removeLast()\n        \n        let removed = entry != nil\n        \n        if (removed)\n        {\n            calcMinMax(start: _lastStart, end: _lastEnd)\n        }\n        \n        return removed;\n    }\n    \n    /// Checks if this DataSet contains the specified Entry.\n    /// - returns: true if contains the entry, false if not.\n    public override func contains(e: ChartDataEntry) -> Bool\n    {\n        for entry in _yVals\n        {\n            if (entry.isEqual(e))\n            {\n                return true\n            }\n        }\n        \n        return false\n    }\n    \n    /// Removes all values from this DataSet and recalculates min and max value.\n    public override func clear()\n    {\n        _yVals.removeAll(keepCapacity: true)\n        _lastStart = 0\n        _lastEnd = 0\n        notifyDataSetChanged()\n    }\n    \n    // MARK: - Data functions and accessors\n    \n    /// - returns: the number of entries this DataSet holds.\n    public var valueCount: Int { return _yVals.count }\n\n    // MARK: - NSCopying\n    \n    public override func copyWithZone(zone: NSZone) -> AnyObject\n    {\n        let copy = super.copyWithZone(zone) as! ChartDataSet\n        \n        copy._yVals = _yVals\n        copy._yMax = _yMax\n        copy._yMin = _yMin\n        copy._lastStart = _lastStart\n        copy._lastEnd = _lastEnd\n\n        return copy\n    }\n}\n\n\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/CombinedChartData.swift",
    "content": "//\n//  CombinedChartData.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\n\npublic class CombinedChartData: BarLineScatterCandleBubbleChartData\n{\n    private var _lineData: LineChartData!\n    private var _barData: BarChartData!\n    private var _scatterData: ScatterChartData!\n    private var _candleData: CandleChartData!\n    private var _bubbleData: BubbleChartData!\n    \n    public override init()\n    {\n        super.init()\n    }\n    \n    public override init(xVals: [String?]?, dataSets: [IChartDataSet]?)\n    {\n        super.init(xVals: xVals, dataSets: dataSets)\n    }\n    \n    public override init(xVals: [NSObject]?, dataSets: [IChartDataSet]?)\n    {\n        super.init(xVals: xVals, dataSets: dataSets)\n    }\n    \n    public var lineData: LineChartData!\n    {\n        get\n        {\n            return _lineData\n        }\n        set\n        {\n            _lineData = newValue\n            for dataSet in newValue.dataSets\n            {\n                _dataSets.append(dataSet)\n            }\n            \n            checkIsLegal(newValue.dataSets)\n            \n            calcMinMax(start: _lastStart, end: _lastEnd)\n            calcYValueCount()\n            \n            calcXValAverageLength()\n        }\n    }\n    \n    public var barData: BarChartData!\n    {\n        get\n        {\n            return _barData\n        }\n        set\n        {\n            _barData = newValue\n            for dataSet in newValue.dataSets\n            {\n                _dataSets.append(dataSet)\n            }\n            \n            checkIsLegal(newValue.dataSets)\n            \n            calcMinMax(start: _lastStart, end: _lastEnd)\n            calcYValueCount()\n            \n            calcXValAverageLength()\n        }\n    }\n    \n    public var scatterData: ScatterChartData!\n    {\n        get\n        {\n            return _scatterData\n        }\n        set\n        {\n            _scatterData = newValue\n            for dataSet in newValue.dataSets\n            {\n                _dataSets.append(dataSet)\n            }\n            \n            checkIsLegal(newValue.dataSets)\n            \n            calcMinMax(start: _lastStart, end: _lastEnd)\n            calcYValueCount()\n        \n            calcXValAverageLength()\n        }\n    }\n    \n    public var candleData: CandleChartData!\n    {\n        get\n        {\n            return _candleData\n        }\n        set\n        {\n            _candleData = newValue\n            for dataSet in newValue.dataSets\n            {\n                _dataSets.append(dataSet)\n            }\n            \n            checkIsLegal(newValue.dataSets)\n            \n            calcMinMax(start: _lastStart, end: _lastEnd)\n            calcYValueCount()\n            \n            calcXValAverageLength()\n        }\n    }\n    \n    public var bubbleData: BubbleChartData!\n    {\n        get\n        {\n            return _bubbleData\n        }\n        set\n        {\n            _bubbleData = newValue\n            for dataSet in newValue.dataSets\n            {\n                _dataSets.append(dataSet)\n            }\n            \n            checkIsLegal(newValue.dataSets)\n            \n            calcMinMax(start: _lastStart, end: _lastEnd)\n            calcYValueCount()\n            \n            calcXValAverageLength()\n        }\n    }\n    \n    /// - returns: all data objects in row: line-bar-scatter-candle-bubble if not null.\n    public var allData: [ChartData]\n    {\n        var data = [ChartData]()\n        \n        if lineData !== nil\n        {\n            data.append(lineData)\n        }\n        if barData !== nil\n        {\n            data.append(barData)\n        }\n        if scatterData !== nil\n        {\n            data.append(scatterData)\n        }\n        if candleData !== nil\n        {\n            data.append(candleData)\n        }\n        if bubbleData !== nil\n        {\n            data.append(bubbleData)\n        }\n        \n        return data;\n    }\n    \n    public override func notifyDataChanged()\n    {\n        if (_lineData !== nil)\n        {\n            _lineData.notifyDataChanged()\n        }\n        if (_barData !== nil)\n        {\n            _barData.notifyDataChanged()\n        }\n        if (_scatterData !== nil)\n        {\n            _scatterData.notifyDataChanged()\n        }\n        if (_candleData !== nil)\n        {\n            _candleData.notifyDataChanged()\n        }\n        if (_bubbleData !== nil)\n        {\n            _bubbleData.notifyDataChanged()\n        }\n        \n        super.notifyDataChanged() // recalculate everything\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/LineChartData.swift",
    "content": "//\n//  LineChartData.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\n\n/// Data object that encapsulates all data associated with a LineChart.\npublic class LineChartData: ChartData\n{\n    public override init()\n    {\n        super.init()\n    }\n    \n    public override init(xVals: [String?]?, dataSets: [IChartDataSet]?)\n    {\n        super.init(xVals: xVals, dataSets: dataSets)\n    }\n    \n    public override init(xVals: [NSObject]?, dataSets: [IChartDataSet]?)\n    {\n        super.init(xVals: xVals, dataSets: dataSets)\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/LineChartDataSet.swift",
    "content": "//\n//  LineChartDataSet.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n\npublic class LineChartDataSet: LineRadarChartDataSet, ILineChartDataSet\n{\n    private func initialize()\n    {\n        // default color\n        circleColors.append(NSUIColor(red: 140.0/255.0, green: 234.0/255.0, blue: 255.0/255.0, alpha: 1.0))\n    }\n    \n    public required init()\n    {\n        super.init()\n        initialize()\n    }\n    \n    public override init(yVals: [ChartDataEntry]?, label: String?)\n    {\n        super.init(yVals: yVals, label: label)\n        initialize()\n    }\n    \n    // MARK: - Data functions and accessors\n    \n    // MARK: - Styling functions and accessors\n    \n    private var _cubicIntensity = CGFloat(0.2)\n    \n    /// Intensity for cubic lines (min = 0.05, max = 1)\n    ///\n    /// **default**: 0.2\n    public var cubicIntensity: CGFloat\n    {\n        get\n        {\n            return _cubicIntensity\n        }\n        set\n        {\n            _cubicIntensity = newValue\n            if (_cubicIntensity > 1.0)\n            {\n                _cubicIntensity = 1.0\n            }\n            if (_cubicIntensity < 0.05)\n            {\n                _cubicIntensity = 0.05\n            }\n        }\n    }\n    \n    /// If true, cubic lines are drawn instead of linear\n    public var drawCubicEnabled = false\n    \n    /// - returns: true if drawing cubic lines is enabled, false if not.\n    public var isDrawCubicEnabled: Bool { return drawCubicEnabled }\n    \n    /// If true, stepped lines are drawn instead of linear\n    public var drawSteppedEnabled = false\n\n    /// - returns: true if drawing stepped lines is enabled, false if not.\n    public var isDrawSteppedEnabled: Bool { return drawSteppedEnabled }\n    \n    /// The radius of the drawn circles.\n    public var circleRadius = CGFloat(8.0)\n    \n    public var circleColors = [NSUIColor]()\n    \n    /// - returns: the color at the given index of the DataSet's circle-color array.\n    /// Performs a IndexOutOfBounds check by modulus.\n    public func getCircleColor(index: Int) -> NSUIColor?\n    {\n        let size = circleColors.count\n        let index = index % size\n        if (index >= size)\n        {\n            return nil\n        }\n        return circleColors[index]\n    }\n    \n    /// Sets the one and ONLY color that should be used for this DataSet.\n    /// Internally, this recreates the colors array and adds the specified color.\n    public func setCircleColor(color: NSUIColor)\n    {\n        circleColors.removeAll(keepCapacity: false)\n        circleColors.append(color)\n    }\n    \n    /// Resets the circle-colors array and creates a new one\n    public func resetCircleColors(index: Int)\n    {\n        circleColors.removeAll(keepCapacity: false)\n    }\n    \n    /// If true, drawing circles is enabled\n    public var drawCirclesEnabled = true\n    \n    /// - returns: true if drawing circles for this DataSet is enabled, false if not\n    public var isDrawCirclesEnabled: Bool { return drawCirclesEnabled }\n    \n    /// The color of the inner circle (the circle-hole).\n    public var circleHoleColor = NSUIColor.whiteColor()\n    \n    /// True if drawing circles for this DataSet is enabled, false if not\n    public var drawCircleHoleEnabled = true\n    \n    /// - returns: true if drawing the circle-holes is enabled, false if not.\n    public var isDrawCircleHoleEnabled: Bool { return drawCircleHoleEnabled }\n    \n    /// This is how much (in pixels) into the dash pattern are we starting from.\n    public var lineDashPhase = CGFloat(0.0)\n    \n    /// This is the actual dash pattern.\n    /// I.e. [2, 3] will paint [--   --   ]\n    /// [1, 3, 4, 2] will paint [-   ----  -   ----  ]\n    public var lineDashLengths: [CGFloat]?\n    \n    /// Line cap type, default is CGLineCap.Butt\n    public var lineCapType = CGLineCap.Butt\n    \n    /// formatter for customizing the position of the fill-line\n    private var _fillFormatter: ChartFillFormatter = ChartDefaultFillFormatter()\n    \n    /// Sets a custom FillFormatter to the chart that handles the position of the filled-line for each DataSet. Set this to null to use the default logic.\n    public var fillFormatter: ChartFillFormatter?\n    {\n        get\n        {\n            return _fillFormatter\n        }\n        set\n        {\n            if newValue == nil\n            {\n                _fillFormatter = ChartDefaultFillFormatter()\n            }\n            else\n            {\n                _fillFormatter = newValue!\n            }\n        }\n    }\n    \n    // MARK: NSCopying\n    \n    public override func copyWithZone(zone: NSZone) -> AnyObject\n    {\n        let copy = super.copyWithZone(zone) as! LineChartDataSet\n        copy.circleColors = circleColors\n        copy.circleRadius = circleRadius\n        copy.cubicIntensity = cubicIntensity\n        copy.lineDashPhase = lineDashPhase\n        copy.lineDashLengths = lineDashLengths\n        copy.drawCirclesEnabled = drawCirclesEnabled\n        copy.drawCubicEnabled = drawCubicEnabled\n        copy.drawSteppedEnabled = drawSteppedEnabled\n        return copy\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/LineRadarChartDataSet.swift",
    "content": "//\n//  LineRadarChartDataSet.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n\npublic class LineRadarChartDataSet: LineScatterCandleRadarChartDataSet, ILineRadarChartDataSet\n{\n    // MARK: - Data functions and accessors\n    \n    // MARK: - Styling functions and accessors\n    \n    /// The color that is used for filling the line surface area.\n    private var _fillColor = NSUIColor(red: 140.0/255.0, green: 234.0/255.0, blue: 255.0/255.0, alpha: 1.0)\n    \n    /// The color that is used for filling the line surface area.\n    public var fillColor: NSUIColor\n    {\n        get { return _fillColor }\n        set\n        {\n            _fillColor = newValue\n            fill = nil\n        }\n    }\n    \n    /// The object that is used for filling the area below the line.\n    /// **default**: nil\n    public var fill: ChartFill?\n    \n    /// The alpha value that is used for filling the line surface,\n    /// **default**: 0.33\n    public var fillAlpha = CGFloat(0.33)\n    \n    private var _lineWidth = CGFloat(1.0)\n    \n    /// line width of the chart (min = 0.2, max = 10)\n    ///\n    /// **default**: 1\n    public var lineWidth: CGFloat\n    {\n        get\n        {\n            return _lineWidth\n        }\n        set\n        {\n            if (newValue < 0.2)\n            {\n                _lineWidth = 0.2\n            }\n            else if (newValue > 10.0)\n            {\n                _lineWidth = 10.0\n            }\n            else\n            {\n                _lineWidth = newValue\n            }\n        }\n    }\n    \n    /// Set to true if the DataSet should be drawn filled (surface), and not just as a line.\n    /// Disabling this will give great performance boost.\n    /// Please note that this method uses the path clipping for drawing the filled area (with images, gradients and layers).\n    public var drawFilledEnabled = false\n    \n    /// Returns true if filled drawing is enabled, false if not\n    public var isDrawFilledEnabled: Bool\n    {\n        return drawFilledEnabled\n    }\n    \n    // MARK: NSCopying\n    \n    public override func copyWithZone(zone: NSZone) -> AnyObject\n    {\n        let copy = super.copyWithZone(zone) as! LineRadarChartDataSet\n        copy.fillColor = fillColor\n        copy._lineWidth = _lineWidth\n        copy.drawFilledEnabled = drawFilledEnabled\n        return copy\n    }\n    \n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/LineScatterCandleRadarChartDataSet.swift",
    "content": "//\n//  LineScatterCandleRadarChartDataSet.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 29/7/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\n\n\npublic class LineScatterCandleRadarChartDataSet: BarLineScatterCandleBubbleChartDataSet, ILineScatterCandleRadarChartDataSet\n{\n    // MARK: - Data functions and accessors\n    \n    // MARK: - Styling functions and accessors\n    \n    /// Enables / disables the horizontal highlight-indicator. If disabled, the indicator is not drawn.\n    public var drawHorizontalHighlightIndicatorEnabled = true\n    \n    /// Enables / disables the vertical highlight-indicator. If disabled, the indicator is not drawn.\n    public var drawVerticalHighlightIndicatorEnabled = true\n    \n    /// - returns: true if horizontal highlight indicator lines are enabled (drawn)\n    public var isHorizontalHighlightIndicatorEnabled: Bool { return drawHorizontalHighlightIndicatorEnabled }\n    \n    /// - returns: true if vertical highlight indicator lines are enabled (drawn)\n    public var isVerticalHighlightIndicatorEnabled: Bool { return drawVerticalHighlightIndicatorEnabled }\n    \n    /// Enables / disables both vertical and horizontal highlight-indicators.\n    /// :param: enabled\n    public func setDrawHighlightIndicators(enabled: Bool)\n    {\n        drawHorizontalHighlightIndicatorEnabled = enabled\n        drawVerticalHighlightIndicatorEnabled = enabled\n    }\n    \n    // MARK: NSCopying\n    \n    public override func copyWithZone(zone: NSZone) -> AnyObject\n    {\n        let copy = super.copyWithZone(zone) as! LineScatterCandleRadarChartDataSet\n        copy.drawHorizontalHighlightIndicatorEnabled = drawHorizontalHighlightIndicatorEnabled\n        copy.drawVerticalHighlightIndicatorEnabled = drawVerticalHighlightIndicatorEnabled\n        return copy\n    }\n    \n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/PieChartData.swift",
    "content": "//\n//  PieData.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 24/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\n\npublic class PieChartData: ChartData\n{\n    public override init()\n    {\n        super.init()\n    }\n    \n    public override init(xVals: [String?]?, dataSets: [IChartDataSet]?)\n    {\n        super.init(xVals: xVals, dataSets: dataSets)\n    }\n\n    public override init(xVals: [NSObject]?, dataSets: [IChartDataSet]?)\n    {\n        super.init(xVals: xVals, dataSets: dataSets)\n    }\n\n    var dataSet: IPieChartDataSet?\n    {\n        get\n        {\n            return dataSets.count > 0 ? dataSets[0] as? IPieChartDataSet : nil\n        }\n        set\n        {\n            if (newValue != nil)\n            {\n                dataSets = [newValue!]\n            }\n            else\n            {\n                dataSets = []\n            }\n        }\n    }\n    \n    public override func getDataSetByIndex(index: Int) -> IChartDataSet?\n    {\n        if (index != 0)\n        {\n            return nil\n        }\n        return super.getDataSetByIndex(index)\n    }\n    \n    public override func getDataSetByLabel(label: String, ignorecase: Bool) -> IChartDataSet?\n    {\n        if (dataSets.count == 0 || dataSets[0].label == nil)\n        {\n            return nil\n        }\n        \n        if (ignorecase)\n        {\n            if (label.caseInsensitiveCompare(dataSets[0].label!) == NSComparisonResult.OrderedSame)\n            {\n                return dataSets[0]\n            }\n        }\n        else\n        {\n            if (label == dataSets[0].label)\n            {\n                return dataSets[0]\n            }\n        }\n        return nil\n    }\n    \n    public override func addDataSet(d: IChartDataSet!)\n    {\n        if (_dataSets == nil)\n        {\n            return\n        }\n        \n        super.addDataSet(d)\n    }\n    \n    /// Removes the DataSet at the given index in the DataSet array from the data object.\n    /// Also recalculates all minimum and maximum values.\n    ///\n    /// - returns: true if a DataSet was removed, false if no DataSet could be removed.\n    public override func removeDataSetByIndex(index: Int) -> Bool\n    {\n        if (_dataSets == nil || index >= _dataSets.count || index < 0)\n        {\n            return false\n        }\n        \n        return false\n    }\n    \n    /// - returns: the total y-value sum across all DataSet objects the this object represents.\n    public var yValueSum: Double\n    {\n        guard let dataSet = dataSet else { return 0.0 }\n        \n        var yValueSum: Double = 0.0\n        \n        for i in 0..<dataSet.entryCount\n        {\n            yValueSum += dataSet.entryForIndex(i)?.value ?? 0.0\n        }\n        \n        return yValueSum\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/PieChartDataSet.swift",
    "content": "//\n//  PieChartDataSet.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 24/2/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\npublic class PieChartDataSet: ChartDataSet, IPieChartDataSet\n{\n    private func initialize()\n    {\n        self.valueTextColor = NSUIColor.whiteColor()\n        self.valueFont = NSUIFont.systemFontOfSize(13.0)\n    }\n    \n    public required init()\n    {\n        super.init()\n        initialize()\n    }\n    \n    public override init(yVals: [ChartDataEntry]?, label: String?)\n    {\n        super.init(yVals: yVals, label: label)\n        initialize()\n    }\n    \n    // MARK: - Styling functions and accessors\n    \n    private var _sliceSpace = CGFloat(0.0)\n    \n    /// the space in pixels between the pie-slices\n    /// **default**: 0\n    /// **maximum**: 20\n    public var sliceSpace: CGFloat\n    {\n        get\n        {\n            return _sliceSpace\n        }\n        set\n        {\n            var space = newValue\n            if (space > 20.0)\n            {\n                space = 20.0\n            }\n            if (space < 0.0)\n            {\n                space = 0.0\n            }\n            _sliceSpace = space\n        }\n    }\n    \n    /// indicates the selection distance of a pie slice\n    public var selectionShift = CGFloat(18.0)\n    \n    // MARK: - NSCopying\n    \n    public override func copyWithZone(zone: NSZone) -> AnyObject\n    {\n        let copy = super.copyWithZone(zone) as! PieChartDataSet\n        copy._sliceSpace = _sliceSpace\n        copy.selectionShift = selectionShift\n        return copy\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/RadarChartData.swift",
    "content": "//\n//  RadarChartData.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n\npublic class RadarChartData: ChartData\n{\n    public var highlightColor = NSUIColor(red: 255.0/255.0, green: 187.0/255.0, blue: 115.0/255.0, alpha: 1.0)\n    public var highlightLineWidth = CGFloat(1.0)\n    public var highlightLineDashPhase = CGFloat(0.0)\n    public var highlightLineDashLengths: [CGFloat]?\n    \n    public override init()\n    {\n        super.init()\n    }\n    \n    public override init(xVals: [String?]?, dataSets: [IChartDataSet]?)\n    {\n        super.init(xVals: xVals, dataSets: dataSets)\n    }\n    \n    public override init(xVals: [NSObject]?, dataSets: [IChartDataSet]?)\n    {\n        super.init(xVals: xVals, dataSets: dataSets)\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/RadarChartDataSet.swift",
    "content": "//\n//  RadarChartDataSet.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 24/2/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\n\n\npublic class RadarChartDataSet: LineRadarChartDataSet, IRadarChartDataSet\n{\n    private func initialize()\n    {\n        self.valueFont = NSUIFont.systemFontOfSize(13.0)\n    }\n    \n    public required init()\n    {\n        super.init()\n        initialize()\n    }\n    \n    public override init(yVals: [ChartDataEntry]?, label: String?)\n    {\n        super.init(yVals: yVals, label: label)\n        initialize()\n    }\n    \n    // MARK: - Data functions and accessors\n    \n    // MARK: - Styling functions and accessors\n    \n    /// flag indicating whether highlight circle should be drawn or not\n    /// **default**: false\n    public var drawHighlightCircleEnabled: Bool = false\n    \n    /// - returns: true if highlight circle should be drawn, false if not\n    public var isDrawHighlightCircleEnabled: Bool { return drawHighlightCircleEnabled }\n    \n    public var highlightCircleFillColor: NSUIColor? = NSUIColor.whiteColor()\n    \n    /// The stroke color for highlight circle.\n    /// If `nil`, the color of the dataset is taken.\n    public var highlightCircleStrokeColor: NSUIColor?\n    \n    public var highlightCircleStrokeAlpha: CGFloat = 0.3\n    \n    public var highlightCircleInnerRadius: CGFloat = 3.0\n    \n    public var highlightCircleOuterRadius: CGFloat = 4.0\n    \n    public var highlightCircleStrokeWidth: CGFloat = 2.0\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/ScatterChartData.swift",
    "content": "//\n//  ScatterChartData.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\npublic class ScatterChartData: BarLineScatterCandleBubbleChartData\n{\n    public override init()\n    {\n        super.init()\n    }\n    \n    public override init(xVals: [String?]?, dataSets: [IChartDataSet]?)\n    {\n        super.init(xVals: xVals, dataSets: dataSets)\n    }\n    \n    public override init(xVals: [NSObject]?, dataSets: [IChartDataSet]?)\n    {\n        super.init(xVals: xVals, dataSets: dataSets)\n    }\n    \n    /// - returns: the maximum shape-size across all DataSets.\n    public func getGreatestShapeSize() -> CGFloat\n    {\n        var max = CGFloat(0.0)\n        \n        for set in _dataSets\n        {\n            let scatterDataSet = set as? IScatterChartDataSet\n            \n            if (scatterDataSet == nil)\n            {\n                print(\"ScatterChartData: Found a DataSet which is not a ScatterChartDataSet\", terminator: \"\\n\")\n            }\n            else\n            {\n                let size = scatterDataSet!.scatterShapeSize\n                \n                if (size > max)\n                {\n                    max = size\n                }\n            }\n        }\n        \n        return max\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Implementations/Standard/ScatterChartDataSet.swift",
    "content": "//\n//  ScatterChartDataSet.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\npublic class ScatterChartDataSet: LineScatterCandleRadarChartDataSet, IScatterChartDataSet\n{\n    @objc\n    public enum ScatterShape: Int\n    {\n        case Square\n        case Circle\n        case Triangle\n        case Cross\n        case X\n        case Custom\n    }\n    \n    // The size the scatter shape will have\n    public var scatterShapeSize = CGFloat(10.0)\n    \n    // The type of shape that is set to be drawn where the values are at\n    // **default**: .Square\n    public var scatterShape = ScatterChartDataSet.ScatterShape.Square\n    \n    // The radius of the hole in the shape (applies to Square, Circle and Triangle)\n    // **default**: 0.0\n    public var scatterShapeHoleRadius: CGFloat = 0.0\n    \n    // Color for the hole in the shape. Setting to `nil` will behave as transparent.\n    // **default**: nil\n    public var scatterShapeHoleColor: NSUIColor? = nil\n    \n    // Custom path object to draw where the values are at.\n    // This is used when shape is set to Custom.\n    public var customScatterShape: CGPath?\n    \n    // MARK: NSCopying\n    \n    public override func copyWithZone(zone: NSZone) -> AnyObject\n    {\n        let copy = super.copyWithZone(zone) as! ScatterChartDataSet\n        copy.scatterShapeSize = scatterShapeSize\n        copy.scatterShape = scatterShape\n        copy.customScatterShape = customScatterShape\n        return copy\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Interfaces/IBarChartDataSet.swift",
    "content": "//\n//  IBarChartDataSet.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n@objc\npublic protocol IBarChartDataSet: IBarLineScatterCandleBubbleChartDataSet\n{\n    // MARK: - Data functions and accessors\n    \n    // MARK: - Styling functions and accessors\n    \n    /// space indicator between the bars in percentage of the whole width of one value (0.15 == 15% of bar width)\n    var barSpace: CGFloat { get set }\n    \n    /// - returns: true if this DataSet is stacked (stacksize > 1) or not.\n    var isStacked: Bool { get }\n    \n    /// - returns: the maximum number of bars that can be stacked upon another in this DataSet.\n    var stackSize: Int { get }\n    \n    /// the color used for drawing the bar-shadows. The bar shadows is a surface behind the bar that indicates the maximum value\n    var barShadowColor: NSUIColor { get set }\n    \n    /// the alpha value (transparency) that is used for drawing the highlight indicator bar. min = 0.0 (fully transparent), max = 1.0 (fully opaque)\n    var highlightAlpha: CGFloat { get set }\n    \n    /// array of labels used to describe the different values of the stacked bars\n    var stackLabels: [String] { get set }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Interfaces/IBarLineScatterCandleBubbleChartDataSet.swift",
    "content": "//\n//  IBarLineScatterCandleBubbleChartDataSet.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n@objc\npublic protocol IBarLineScatterCandleBubbleChartDataSet: IChartDataSet\n{\n    // MARK: - Data functions and accessors\n    \n    // MARK: - Styling functions and accessors\n    \n    var highlightColor: NSUIColor { get set }\n    var highlightLineWidth: CGFloat { get set }\n    var highlightLineDashPhase: CGFloat { get set }\n    var highlightLineDashLengths: [CGFloat]? { get set }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Interfaces/IBubbleChartDataSet.swift",
    "content": "//\n//  IBubbleChartDataSet.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n@objc\npublic protocol IBubbleChartDataSet: IBarLineScatterCandleBubbleChartDataSet\n{\n    // MARK: - Data functions and accessors\n    \n    var xMin: Double { get }\n    var xMax: Double { get }\n    var maxSize: CGFloat { get }\n    \n    // MARK: - Styling functions and accessors\n    \n    /// Sets/gets the width of the circle that surrounds the bubble when highlighted\n    var highlightCircleWidth: CGFloat { get set }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Interfaces/ICandleChartDataSet.swift",
    "content": "//\n//  ICandleChartDataSet.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n@objc\npublic protocol ICandleChartDataSet: ILineScatterCandleRadarChartDataSet\n{\n    // MARK: - Data functions and accessors\n    \n    // MARK: - Styling functions and accessors\n    \n    /// the space that is left out on the left and right side of each candle,\n    /// **default**: 0.1 (10%), max 0.45, min 0.0\n    var barSpace: CGFloat { get set }\n    \n    /// should the candle bars show?\n    /// when false, only \"ticks\" will show\n    ///\n    /// **default**: true\n    var showCandleBar: Bool { get set }\n    \n    /// the width of the candle-shadow-line in pixels.\n    ///\n    /// **default**: 3.0\n    var shadowWidth: CGFloat { get set }\n    \n    /// the color of the shadow line\n    var shadowColor: NSUIColor? { get set }\n    \n    /// use candle color for the shadow\n    var shadowColorSameAsCandle: Bool { get set }\n    \n    /// Is the shadow color same as the candle color?\n    var isShadowColorSameAsCandle: Bool { get }\n    \n    /// color for open == close\n    var neutralColor: NSUIColor? { get set }\n    \n    /// color for open > close\n    var increasingColor: NSUIColor? { get set }\n    \n    /// color for open < close\n    var decreasingColor: NSUIColor? { get set }\n    \n    /// Are increasing values drawn as filled?\n    var increasingFilled: Bool { get set }\n    \n    /// Are increasing values drawn as filled?\n    var isIncreasingFilled: Bool { get }\n    \n    /// Are decreasing values drawn as filled?\n    var decreasingFilled: Bool { get set }\n    \n    /// Are decreasing values drawn as filled?\n    var isDecreasingFilled: Bool { get }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Interfaces/IChartDataSet.swift",
    "content": "//\n//  IChartDataSet.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\n\n@objc\npublic protocol IChartDataSet\n{\n    // MARK: - Data functions and accessors\n    \n    /// Use this method to tell the data set that the underlying data has changed\n    func notifyDataSetChanged()\n    \n    /// This is an opportunity to calculate the minimum and maximum y value in the specified range.\n    /// If your data is in an array, you might loop over them to find the values.\n    /// If your data is in a database, you might query for the min/max and put them in variables.\n    /// - parameter start: the index of the first y entry to calculate\n    /// - parameter end: the index of the last y entry to calculate\n    func calcMinMax(start start: Int, end: Int)\n    \n    /// - returns: the minimum y-value this DataSet holds\n    var yMin: Double { get }\n    \n    /// - returns: the maximum y-value this DataSet holds\n    var yMax: Double { get }\n    \n    /// - returns: the number of y-values this DataSet represents\n    var entryCount: Int { get }\n    \n    /// - returns: the value of the Entry object at the given xIndex. Returns NaN if no value is at the given x-index.\n    func yValForXIndex(x: Int) -> Double\n    \n    /// - returns: the entry object found at the given index (not x-index!)\n    /// - throws: out of bounds\n    /// if `i` is out of bounds, it may throw an out-of-bounds exception\n    func entryForIndex(i: Int) -> ChartDataEntry?\n    \n    /// - returns: the first Entry object found at the given xIndex with binary search.\n    /// If the no Entry at the specifed x-index is found, this method returns the Entry at the closest x-index.\n    /// nil if no Entry object at that index.\n    func entryForXIndex(x: Int, rounding: ChartDataSetRounding) -> ChartDataEntry?\n    \n    /// - returns: the first Entry object found at the given xIndex with binary search.\n    /// If the no Entry at the specifed x-index is found, this method returns the Entry at the closest x-index.\n    /// nil if no Entry object at that index.\n    func entryForXIndex(x: Int) -> ChartDataEntry?\n    \n    /// - returns: the array-index of the specified entry\n    ///\n    /// - parameter x: x-index of the entry to search for\n    /// - parameter rounding: x-index of the entry to search for\n    func entryIndex(xIndex x: Int, rounding: ChartDataSetRounding) -> Int\n    \n    /// - returns: the array-index of the specified entry\n    ///\n    /// - parameter e: the entry to search for\n    func entryIndex(entry e: ChartDataEntry) -> Int\n    \n    /// Adds an Entry to the DataSet dynamically.\n    ///\n    /// *optional feature, can return false if not implemented*\n    ///\n    /// Entries are added to the end of the list.\n    /// - parameter e: the entry to add\n    /// - returns: true if the entry was added successfully, false if this feature is not supported\n    func addEntry(e: ChartDataEntry) -> Bool\n    \n    /// Adds an Entry to the DataSet dynamically.\n    /// Entries are added to their appropriate index respective to it's x-index.\n    /// This will also recalculate the current minimum and maximum values of the DataSet and the value-sum.\n    ///\n    /// *optional feature, can return false if not implemented*\n    ///\n    /// Entries are added to the end of the list.\n    /// - parameter e: the entry to add\n    /// - returns: true if the entry was added successfully, false if this feature is not supported\n    func addEntryOrdered(e: ChartDataEntry) -> Bool\n    \n    /// Removes an Entry from the DataSet dynamically.\n    ///\n    /// *optional feature, can return false if not implemented*\n    ///\n    /// - parameter entry: the entry to remove\n    /// - returns: true if the entry was removed successfully, false if the entry does not exist or if this feature is not supported\n    func removeEntry(entry: ChartDataEntry) -> Bool\n    \n    /// Removes the Entry object that has the given xIndex from the DataSet.\n    ///\n    /// *optional feature, can return false if not implemented*\n    ///\n    /// - parameter xIndex: the xIndex to remove\n    /// - returns: true if the entry was removed successfully, false if the entry does not exist or if this feature is not supported\n    func removeEntry(xIndex xIndex: Int) -> Bool\n    \n    /// Removes the first Entry (at index 0) of this DataSet from the entries array.\n    ///\n    /// *optional feature, can return false if not implemented*\n    ///\n    /// - returns: true if the entry was removed successfully, false if the entry does not exist or if this feature is not supported\n    func removeFirst() -> Bool\n    \n    /// Removes the last Entry (at index 0) of this DataSet from the entries array.\n    ///\n    /// *optional feature, can return false if not implemented*\n    ///\n    /// - returns: true if the entry was removed successfully, false if the entry does not exist or if this feature is not supported\n    func removeLast() -> Bool\n    \n    /// Checks if this DataSet contains the specified Entry.\n    ///\n    /// - returns: true if contains the entry, false if not.\n    func contains(e: ChartDataEntry) -> Bool\n    \n    /// Removes all values from this DataSet and does all necessary recalculations.\n    ///\n    /// *optional feature, could throw if not implemented*\n    func clear()\n    \n    // MARK: - Styling functions and accessors\n    \n    /// The label string that describes the DataSet.\n    var label: String? { get }\n    \n    /// The axis this DataSet should be plotted against.\n    var axisDependency: ChartYAxis.AxisDependency { get }\n    \n    /// List representing all colors that are used for drawing the actual values for this DataSet\n    var valueColors: [NSUIColor] { get }\n    \n    /// All the colors that are used for this DataSet.\n    /// Colors are reused as soon as the number of Entries the DataSet represents is higher than the size of the colors array.\n    var colors: [NSUIColor] { get }\n    \n    /// - returns: the color at the given index of the DataSet's color array.\n    /// This prevents out-of-bounds by performing a modulus on the color index, so colours will repeat themselves.\n    func colorAt(index: Int) -> NSUIColor\n    \n    func resetColors()\n    \n    func addColor(color: NSUIColor)\n    \n    func setColor(color: NSUIColor)\n    \n    /// if true, value highlighting is enabled\n    var highlightEnabled: Bool { get set }\n    \n    /// - returns: true if value highlighting is enabled for this dataset\n    var isHighlightEnabled: Bool { get }\n    \n    /// The formatter used to customly format the values\n    var valueFormatter: NSNumberFormatter? { get set }\n    \n    /// Sets/get a single color for value text.\n    /// Setting the color clears the colors array and adds a single color.\n    /// Getting will return the first color in the array.\n    var valueTextColor: NSUIColor { get set }\n    \n    /// - returns: the color at the specified index that is used for drawing the values inside the chart. Uses modulus internally.\n    func valueTextColorAt(index: Int) -> NSUIColor\n    \n    /// the font for the value-text labels\n    var valueFont: NSUIFont { get set }\n    \n    /// Set this to true to draw y-values on the chart\n    var drawValuesEnabled: Bool { get set }\n    \n    /// Returns true if y-value drawing is enabled, false if not\n    var isDrawValuesEnabled: Bool { get }\n    \n    /// Set the visibility of this DataSet. If not visible, the DataSet will not be drawn to the chart upon refreshing it.\n    var visible: Bool { get set }\n    \n    /// Returns true if this DataSet is visible inside the chart, or false if it is currently hidden.\n    var isVisible: Bool { get }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Interfaces/ILineChartDataSet.swift",
    "content": "//\n//  ILineChartDataSet.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n@objc\npublic protocol ILineChartDataSet: ILineRadarChartDataSet\n{\n    // MARK: - Data functions and accessors\n    \n    // MARK: - Styling functions and accessors\n    \n    /// Intensity for cubic lines (min = 0.05, max = 1)\n    ///\n    /// **default**: 0.2\n    var cubicIntensity: CGFloat { get set }\n    \n    /// If true, cubic lines are drawn instead of linear\n    var drawCubicEnabled: Bool { get set }\n    \n    /// - returns: true if drawing cubic lines is enabled, false if not.\n    var isDrawCubicEnabled: Bool { get }\n    \n    /// If true, stepped lines are drawn instead of linear\n    var drawSteppedEnabled: Bool { get set }\n    \n    /// - returns: true if drawing stepped lines is enabled, false if not.\n    var isDrawSteppedEnabled: Bool { get }\n\n    /// The radius of the drawn circles.\n    var circleRadius: CGFloat { get set }\n    \n    var circleColors: [NSUIColor] { get set }\n    \n    /// - returns: the color at the given index of the DataSet's circle-color array.\n    /// Performs a IndexOutOfBounds check by modulus.\n    func getCircleColor(index: Int) -> NSUIColor?\n    \n    /// Sets the one and ONLY color that should be used for this DataSet.\n    /// Internally, this recreates the colors array and adds the specified color.\n    func setCircleColor(color: NSUIColor)\n    \n    /// Resets the circle-colors array and creates a new one\n    func resetCircleColors(index: Int)\n    \n    /// If true, drawing circles is enabled\n    var drawCirclesEnabled: Bool { get set }\n    \n    /// - returns: true if drawing circles for this DataSet is enabled, false if not\n    var isDrawCirclesEnabled: Bool { get }\n    \n    /// The color of the inner circle (the circle-hole).\n    var circleHoleColor: NSUIColor { get set }\n    \n    /// True if drawing circles for this DataSet is enabled, false if not\n    var drawCircleHoleEnabled: Bool { get set }\n    \n    /// - returns: true if drawing the circle-holes is enabled, false if not.\n    var isDrawCircleHoleEnabled: Bool { get }\n    \n    /// This is how much (in pixels) into the dash pattern are we starting from.\n    var lineDashPhase: CGFloat { get }\n    \n    /// This is the actual dash pattern.\n    /// I.e. [2, 3] will paint [--   --   ]\n    /// [1, 3, 4, 2] will paint [-   ----  -   ----  ]\n    var lineDashLengths: [CGFloat]? { get set }\n    \n    /// Line cap type, default is CGLineCap.Butt\n    var lineCapType: CGLineCap { get set }\n    \n    /// Sets a custom FillFormatter to the chart that handles the position of the filled-line for each DataSet. Set this to null to use the default logic.\n    var fillFormatter: ChartFillFormatter? { get set }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Interfaces/ILineRadarChartDataSet.swift",
    "content": "//\n//  ILineRadarChartDataSet.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n@objc\npublic protocol ILineRadarChartDataSet: ILineScatterCandleRadarChartDataSet\n{\n    // MARK: - Data functions and accessors\n    \n    // MARK: - Styling functions and accessors\n    \n    /// The color that is used for filling the line surface area.\n    var fillColor: NSUIColor { get set }\n\n    /// Returns the object that is used for filling the area below the line.\n    /// **default**: nil\n    var fill: ChartFill? { get set }\n    \n    /// The alpha value that is used for filling the line surface.\n    /// **default**: 0.33\n    var fillAlpha: CGFloat { get set }\n    \n    /// line width of the chart (min = 0.2, max = 10)\n    ///\n    /// **default**: 1\n    var lineWidth: CGFloat { get set }\n    \n    /// Set to true if the DataSet should be drawn filled (surface), and not just as a line.\n    /// Disabling this will give great performance boost.\n    /// Please note that this method uses the path clipping for drawing the filled area (with images, gradients and layers).\n    var drawFilledEnabled: Bool { get set }\n    \n    /// Returns true if filled drawing is enabled, false if not\n    var isDrawFilledEnabled: Bool { get }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Interfaces/ILineScatterCandleRadarChartDataSet.swift",
    "content": "//\n//  ILineScatterCandleRadarChartDataSet.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\n\n@objc\npublic protocol ILineScatterCandleRadarChartDataSet: IBarLineScatterCandleBubbleChartDataSet\n{\n    // MARK: - Data functions and accessors\n    \n    // MARK: - Styling functions and accessors\n    \n    /// Enables / disables the horizontal highlight-indicator. If disabled, the indicator is not drawn.\n    var drawHorizontalHighlightIndicatorEnabled: Bool { get set }\n    \n    /// Enables / disables the vertical highlight-indicator. If disabled, the indicator is not drawn.\n    var drawVerticalHighlightIndicatorEnabled: Bool { get set }\n    \n    /// - returns: true if horizontal highlight indicator lines are enabled (drawn)\n    var isHorizontalHighlightIndicatorEnabled: Bool { get }\n    \n    /// - returns: true if vertical highlight indicator lines are enabled (drawn)\n    var isVerticalHighlightIndicatorEnabled: Bool { get }\n    \n    /// Enables / disables both vertical and horizontal highlight-indicators.\n    /// :param: enabled\n    func setDrawHighlightIndicators(enabled: Bool)\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Interfaces/IPieChartDataSet.swift",
    "content": "//\n//  IPieChartDataSet.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n@objc\npublic protocol IPieChartDataSet: IChartDataSet\n{\n    // MARK: - Styling functions and accessors\n    \n    /// the space in pixels between the pie-slices\n    /// **default**: 0\n    /// **maximum**: 20\n    var sliceSpace: CGFloat { get set }\n    \n    /// indicates the selection distance of a pie slice\n    var selectionShift: CGFloat { get set }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Interfaces/IRadarChartDataSet.swift",
    "content": "//\n//  IRadarChartDataSet.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\n\n@objc\npublic protocol IRadarChartDataSet: ILineRadarChartDataSet\n{\n    // MARK: - Data functions and accessors\n    \n    // MARK: - Styling functions and accessors\n    \n    /// flag indicating whether highlight circle should be drawn or not\n    var drawHighlightCircleEnabled: Bool { get set }\n    \n    var isDrawHighlightCircleEnabled: Bool { get }\n    \n    var highlightCircleFillColor: NSUIColor? { get set }\n    \n    /// The stroke color for highlight circle.\n    /// If `nil`, the color of the dataset is taken.\n    var highlightCircleStrokeColor: NSUIColor? { get set }\n    \n    var highlightCircleStrokeAlpha: CGFloat { get set }\n    \n    var highlightCircleInnerRadius: CGFloat { get set }\n    \n    var highlightCircleOuterRadius: CGFloat { get set }\n    \n    var highlightCircleStrokeWidth: CGFloat { get set }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Data/Interfaces/IScatterChartDataSet.swift",
    "content": "//\n//  IScatterChartDataSet.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n@objc\npublic protocol IScatterChartDataSet: ILineScatterCandleRadarChartDataSet\n{\n    // MARK: - Data functions and accessors\n    \n    // MARK: - Styling functions and accessors\n    \n    // The size the scatter shape will have\n    var scatterShapeSize: CGFloat { get set }\n    \n    // The type of shape that is set to be drawn where the values are at\n    // **default**: .Square\n    var scatterShape: ScatterChartDataSet.ScatterShape { get set }\n    \n    // The radius of the hole in the shape (applies to Square, Circle and Triangle)\n    // Set this to <= 0 to remove holes.\n    // **default**: 0.0\n    var scatterShapeHoleRadius: CGFloat { get set }\n    \n    // Color for the hole in the shape. Setting to `nil` will behave as transparent.\n    // **default**: nil\n    var scatterShapeHoleColor: NSUIColor? { get set }\n    \n    // Custom path object to draw where the values are at.\n    // This is used when shape is set to Custom.\n    var customScatterShape: CGPath? { get set }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Filters/ChartDataApproximatorFilter.swift",
    "content": "//\n//  ChartDataApproximator.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\n\npublic class ChartDataApproximatorFilter: ChartDataBaseFilter\n{\n    @objc\n    public enum ApproximatorType: Int\n    {\n        case None\n        case RamerDouglasPeucker\n    }\n    \n    /// the type of filtering algorithm to use\n    public var type = ApproximatorType.None\n    \n    /// the tolerance to be filtered with\n    /// When using the Douglas-Peucker-Algorithm, the tolerance is an angle in degrees, that will trigger the filtering\n    public var tolerance = Double(0.0)\n    \n    public var scaleRatio = Double(1.0)\n    public var deltaRatio = Double(1.0)\n    \n    public override init()\n    {\n        super.init()\n    }\n    \n    /// Initializes the approximator with the given type and tolerance. \n    /// If toleranec <= 0, no filtering will be done.\n    public init(type: ApproximatorType, tolerance: Double)\n    {\n        super.init()\n        \n        setup(type, tolerance: tolerance)\n    }\n    \n    /// Sets type and tolerance.\n    /// If tolerance <= 0, no filtering will be done.\n    public func setup(type: ApproximatorType, tolerance: Double)\n    {\n        self.type = type\n        self.tolerance = tolerance\n    }\n    \n    /// Sets the ratios for x- and y-axis, as well as the ratio of the scale levels\n    public func setRatios(deltaRatio: Double, scaleRatio: Double)\n    {\n        self.deltaRatio = deltaRatio\n        self.scaleRatio = scaleRatio\n    }\n    \n    /// Filters according to type. Uses the pre set set tolerance\n    ///\n    /// - parameter points: the points to filter\n    public override func filter(points: [ChartDataEntry]) -> [ChartDataEntry]\n    {\n        return filter(points, tolerance: tolerance)\n    }\n    \n    /// Filters according to type.\n    ///\n    /// - parameter points: the points to filter\n    /// - parameter tolerance: the angle in degrees that will trigger the filtering\n    public func filter(points: [ChartDataEntry], tolerance: Double) -> [ChartDataEntry]\n    {\n        if (tolerance <= 0)\n        {\n            return points\n        }\n        \n        switch (type)\n        {\n        case .RamerDouglasPeucker:\n            return reduceWithDouglasPeuker(points, epsilon: tolerance)\n        case .None:\n            return points\n        }\n    }\n    \n    /// uses the douglas peuker algorithm to reduce the given arraylist of entries\n    private func reduceWithDouglasPeuker(entries: [ChartDataEntry], epsilon: Double) -> [ChartDataEntry]\n    {\n        // if a shape has 2 or less points it cannot be reduced\n        if (epsilon <= 0 || entries.count < 3)\n        {\n            return entries\n        }\n        \n        var keep = [Bool](count: entries.count, repeatedValue: false)\n        \n        // first and last always stay\n        keep[0] = true\n        keep[entries.count - 1] = true\n        \n        // first and last entry are entry point to recursion\n        algorithmDouglasPeucker(entries, epsilon: epsilon, start: 0, end: entries.count - 1, keep: &keep)\n        \n        // create a new array with series, only take the kept ones\n        var reducedEntries = [ChartDataEntry]()\n        for i in 0 ..< entries.count\n        {\n            if (keep[i])\n            {\n                let curEntry = entries[i]\n                reducedEntries.append(ChartDataEntry(value: curEntry.value, xIndex: curEntry.xIndex))\n            }\n        }\n        \n        return reducedEntries\n    }\n    \n    /// apply the Douglas-Peucker-Reduction to an ArrayList of Entry with a given epsilon (tolerance)\n    ///\n    /// - parameter entries:\n    /// - parameter epsilon: as y-value\n    /// - parameter start:\n    /// - parameter end:\n    private func algorithmDouglasPeucker(entries: [ChartDataEntry], epsilon: Double, start: Int, end: Int, inout keep: [Bool])\n    {\n        if (end <= start + 1)\n        {\n            // recursion finished\n            return\n        }\n        \n        // find the greatest distance between start and endpoint\n        var maxDistIndex = Int(0)\n        var distMax = Double(0.0)\n        \n        let firstEntry = entries[start]\n        let lastEntry = entries[end]\n        \n        for i in start + 1 ..< end\n        {\n            let dist = calcAngleBetweenLines(firstEntry, end1: lastEntry, start2: firstEntry, end2: entries[i])\n            \n            // keep the point with the greatest distance\n            if (dist > distMax)\n            {\n                distMax = dist\n                maxDistIndex = i\n            }\n        }\n        \n        if (distMax > epsilon)\n        {\n            // keep max dist point\n            keep[maxDistIndex] = true\n            \n            // recursive call\n            algorithmDouglasPeucker(entries, epsilon: epsilon, start: start, end: maxDistIndex, keep: &keep)\n            algorithmDouglasPeucker(entries, epsilon: epsilon, start: maxDistIndex, end: end, keep: &keep)\n        } // else don't keep the point...\n    }\n    \n    /// calculate the distance between a line between two entries and an entry (point)\n    ///\n    /// - parameter startEntry: line startpoint\n    /// - parameter endEntry: line endpoint\n    /// - parameter entryPoint: the point to which the distance is measured from the line\n    private func calcPointToLineDistance(startEntry: ChartDataEntry, endEntry: ChartDataEntry, entryPoint: ChartDataEntry) -> Double\n    {\n        let xDiffEndStart = Double(endEntry.xIndex) - Double(startEntry.xIndex)\n        let xDiffEntryStart = Double(entryPoint.xIndex) - Double(startEntry.xIndex)\n        \n        let normalLength = sqrt((xDiffEndStart)\n            * (xDiffEndStart)\n            + (endEntry.value - startEntry.value)\n            * (endEntry.value - startEntry.value))\n        \n        return Double(fabs((xDiffEntryStart)\n            * (endEntry.value - startEntry.value)\n            - (entryPoint.value - startEntry.value)\n            * (xDiffEndStart))) / Double(normalLength)\n    }\n    \n    /// Calculates the angle between two given lines. The provided entries mark the starting and end points of the lines.\n    private func calcAngleBetweenLines(start1: ChartDataEntry, end1: ChartDataEntry, start2: ChartDataEntry, end2: ChartDataEntry) -> Double\n    {\n        let angle1 = calcAngleWithRatios(start1, p2: end1)\n        let angle2 = calcAngleWithRatios(start2, p2: end2)\n        \n        return fabs(angle1 - angle2)\n    }\n    \n    /// calculates the angle between two entries (points) in the chart taking ratios into consideration\n    private func calcAngleWithRatios(p1: ChartDataEntry, p2: ChartDataEntry) -> Double\n    {\n        let dx = Double(p2.xIndex) * Double(deltaRatio) - Double(p1.xIndex) * Double(deltaRatio)\n        let dy = p2.value * scaleRatio - p1.value * scaleRatio\n        return atan2(Double(dy), dx) * ChartUtils.Math.RAD2DEG\n    }\n    \n    // calculates the angle between two entries (points) in the chart\n    private func calcAngle(p1: ChartDataEntry, p2: ChartDataEntry) -> Double\n    {\n        let dx = p2.xIndex - p1.xIndex\n        let dy = p2.value - p1.value\n        return atan2(Double(dy), Double(dx)) * ChartUtils.Math.RAD2DEG\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Filters/ChartDataBaseFilter.swift",
    "content": "//\n//  ChartDataFilter.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\n\npublic class ChartDataBaseFilter: NSObject\n{\n    public override init()\n    {\n        super.init()\n    }\n    \n    public func filter(points: [ChartDataEntry]) -> [ChartDataEntry]\n    {\n        fatalError(\"filter() cannot be called on ChartDataBaseFilter\")\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Formatters/ChartDefaultFillFormatter.swift",
    "content": "//\n//  ChartDefaultFillFormatter.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 04/02/2016.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n/// Default formatter that calculates the position of the filled line.\npublic class ChartDefaultFillFormatter: NSObject, ChartFillFormatter\n{\n    public override init()\n    {\n    }\n    \n    public func getFillLinePosition(dataSet dataSet: ILineChartDataSet, dataProvider: LineChartDataProvider) -> CGFloat\n    {\n        var fillMin = CGFloat(0.0)\n        \n        if (dataSet.yMax > 0.0 && dataSet.yMin < 0.0)\n        {\n            fillMin = 0.0\n        }\n        else\n        {\n            if let data = dataProvider.data\n            {\n                var max: Double, min: Double\n                \n                if (data.yMax > 0.0)\n                {\n                    max = 0.0\n                }\n                else\n                {\n                    max = dataProvider.chartYMax\n                }\n                \n                if (data.yMin < 0.0)\n                {\n                    min = 0.0\n                }\n                else\n                {\n                    min = dataProvider.chartYMin\n                }\n                \n                fillMin = CGFloat(dataSet.yMin >= 0.0 ? min : max)\n            }\n        }\n        \n        return fillMin\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Formatters/ChartDefaultXAxisValueFormatter.swift",
    "content": "//\n//  ChartDefaultXAxisValueFormatter.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 27/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\n\n/// An interface for providing custom x-axis Strings.\npublic class ChartDefaultXAxisValueFormatter: NSObject, ChartXAxisValueFormatter\n{\n    \n    public func stringForXValue(index: Int, original: String, viewPortHandler: ChartViewPortHandler) -> String\n    {\n        return original // just return original, no adjustments\n    }\n    \n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Formatters/ChartFillFormatter.swift",
    "content": "//\n//  ChartFillFormatter.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 6/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n/// Protocol for providing a custom logic to where the filling line of a LineDataSet should end. This of course only works if setFillEnabled(...) is set to true.\n@objc\npublic protocol ChartFillFormatter\n{\n    /// - returns: the vertical (y-axis) position where the filled-line of the LineDataSet should end.\n    func getFillLinePosition(dataSet dataSet: ILineChartDataSet, dataProvider: LineChartDataProvider) -> CGFloat\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Formatters/ChartXAxisValueFormatter.swift",
    "content": "//\n//  ChartXAxisValueFormatter.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 27/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\n\n/// An interface for providing custom x-axis Strings.\n@objc\npublic protocol ChartXAxisValueFormatter\n{\n\n    /// For performance reasons, avoid excessive calculations and memory allocations inside this method.\n    ///\n    /// - returns: the customized label that is drawn on the x-axis.\n    /// - parameter index:           the x-index that is currently being drawn\n    /// - parameter original:        the original x-axis label to be drawn\n    /// - parameter viewPortHandler: provides information about the current chart state (scale, translation, ...)\n    ///\n    func stringForXValue(index: Int, original: String, viewPortHandler: ChartViewPortHandler) -> String\n\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Highlight/BarChartHighlighter.swift",
    "content": "//\n//  ChartBarHighlighter.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/7/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\npublic class BarChartHighlighter: ChartHighlighter\n{\n    public override func getHighlight(x x: Double, y: Double) -> ChartHighlight?\n    {\n        let h = super.getHighlight(x: x, y: y)\n        \n        if h === nil\n        {\n            return h\n        }\n        else\n        {\n            if let set = self.chart?.data?.getDataSetByIndex(h!.dataSetIndex) as? BarChartDataSet\n            {\n                if set.isStacked\n                {\n                    // create an array of the touch-point\n                    var pt = CGPoint()\n                    pt.y = CGFloat(y)\n                    \n                    // take any transformer to determine the x-axis value\n                    self.chart?.getTransformer(set.axisDependency).pixelToValue(&pt)\n                    \n                    return getStackedHighlight(old: h, set: set, xIndex: h!.xIndex, dataSetIndex: h!.dataSetIndex, yValue: Double(pt.y))\n                }\n            }\n            \n            return h\n        }\n    }\n    \n    public override func getXIndex(x: Double) -> Int\n    {\n        if let barChartData = self.chart?.data as? BarChartData\n        {\n            if !barChartData.isGrouped\n            {\n                return super.getXIndex(x)\n            }\n            else\n            {\n                let baseNoSpace = getBase(x)\n                \n                let setCount = barChartData.dataSetCount\n                var xIndex = Int(baseNoSpace) / setCount\n                \n                let valCount = barChartData.xValCount\n                \n                if xIndex < 0\n                {\n                    xIndex = 0\n                }\n                else if xIndex >= valCount\n                {\n                    xIndex = valCount - 1\n                }\n                \n                return xIndex\n            }\n        }\n        else\n        {\n            return 0\n        }\n    }\n    \n    public override func getDataSetIndex(xIndex xIndex: Int, x: Double, y: Double) -> Int\n    {\n        if let barChartData = self.chart?.data as? BarChartData\n        {\n            if !barChartData.isGrouped\n            {\n                return 0\n            }\n            else\n            {\n                let baseNoSpace = getBase(x)\n                \n                let setCount = barChartData.dataSetCount\n                var dataSetIndex = Int(baseNoSpace) % setCount\n                \n                if dataSetIndex < 0\n                {\n                    dataSetIndex = 0\n                }\n                else if dataSetIndex >= setCount\n                {\n                    dataSetIndex = setCount - 1\n                }\n                \n                return dataSetIndex\n            }\n        }\n        else\n        {\n            return 0\n        }\n    }\n    \n    /// This method creates the Highlight object that also indicates which value of a stacked BarEntry has been selected.\n    /// - parameter old: the old highlight object before looking for stacked values\n    /// - parameter set:\n    /// - parameter xIndex:\n    /// - parameter dataSetIndex:\n    /// - parameter yValue:\n    /// - returns:\n    public func getStackedHighlight(old old: ChartHighlight?, set: BarChartDataSet, xIndex: Int, dataSetIndex: Int, yValue: Double) -> ChartHighlight?\n    {\n        let entry = set.entryForXIndex(xIndex) as? BarChartDataEntry\n        \n        if entry?.values === nil\n        {\n            return old\n        }\n\n        if let ranges = getRanges(entry: entry!)\n            where ranges.count > 0\n        {\n            let stackIndex = getClosestStackIndex(ranges: ranges, value: yValue)\n            let h = ChartHighlight(xIndex: xIndex, dataSetIndex: dataSetIndex, stackIndex: stackIndex, range: ranges[stackIndex])\n            return h\n        }\n        return nil\n    }\n    \n    /// Returns the index of the closest value inside the values array / ranges (stacked barchart) to the value given as a parameter.\n    /// - parameter entry:\n    /// - parameter value:\n    /// - returns:\n    public func getClosestStackIndex(ranges ranges: [ChartRange]?, value: Double) -> Int\n    {\n        if ranges == nil\n        {\n            return 0\n        }\n\n        var stackIndex = 0\n        \n        for range in ranges!\n        {\n            if range.contains(value)\n            {\n                return stackIndex\n            }\n            else\n            {\n                stackIndex += 1\n            }\n        }\n        \n        let length = max(ranges!.count - 1, 0)\n        \n        return (value > ranges![length].to) ? length : 0\n    }\n    \n    /// Returns the base x-value to the corresponding x-touch value in pixels.\n    /// - parameter x:\n    /// - returns:\n    public func getBase(x: Double) -> Double\n    {\n        if let barChartData = self.chart?.data as? BarChartData\n        {\n            // create an array of the touch-point\n            var pt = CGPoint()\n            pt.x = CGFloat(x)\n            \n            // take any transformer to determine the x-axis value\n            self.chart?.getTransformer(ChartYAxis.AxisDependency.Left).pixelToValue(&pt)\n            let xVal = Double(pt.x)\n            \n            let setCount = barChartData.dataSetCount ?? 0\n            \n            // calculate how often the group-space appears\n            let steps = Int(xVal / (Double(setCount) + Double(barChartData.groupSpace)))\n            \n            let groupSpaceSum = Double(barChartData.groupSpace) * Double(steps)\n            \n            let baseNoSpace = xVal - groupSpaceSum\n            \n            return baseNoSpace\n        }\n        else\n        {\n            return 0.0\n        }\n    }\n\n    /// Splits up the stack-values of the given bar-entry into Range objects.\n    /// - parameter entry:\n    /// - returns:\n    public func getRanges(entry entry: BarChartDataEntry) -> [ChartRange]?\n    {\n        let values = entry.values\n        if (values == nil)\n        {\n            return nil\n        }\n        \n        var negRemain = -entry.negativeSum\n        var posRemain: Double = 0.0\n        \n        var ranges = [ChartRange]()\n        ranges.reserveCapacity(values!.count)\n        \n        for i in 0 ..< values!.count\n        {\n            let value = values![i]\n            \n            if value < 0\n            {\n                ranges.append(ChartRange(from: negRemain, to: negRemain + abs(value)))\n                negRemain += abs(value)\n            }\n            else\n            {\n                ranges.append(ChartRange(from: posRemain, to: posRemain+value))\n                posRemain += value\n            }\n        }\n        \n        return ranges\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Highlight/ChartHighlight.swift",
    "content": "//\n//  ChartHighlight.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\n\npublic class ChartHighlight: NSObject\n{\n    /// the x-index of the highlighted value\n    private var _xIndex = Int(0)\n    \n    /// the index of the dataset the highlighted value is in\n    private var _dataSetIndex = Int(0)\n    \n    /// index which value of a stacked bar entry is highlighted\n    /// \n    /// **default**: -1\n    private var _stackIndex = Int(-1)\n    \n    /// the range of the bar that is selected (only for stacked-barchart)\n    private var _range: ChartRange?\n\n    public override init()\n    {\n        super.init()\n    }\n    \n    public init(xIndex x: Int, dataSetIndex: Int)\n    {\n        super.init()\n        \n        _xIndex = x\n        _dataSetIndex = dataSetIndex\n    }\n    \n    public init(xIndex x: Int, dataSetIndex: Int, stackIndex: Int)\n    {\n        super.init()\n        \n        _xIndex = x\n        _dataSetIndex = dataSetIndex\n        _stackIndex = stackIndex\n    }\n    \n    /// Constructor, only used for stacked-barchart.\n    ///\n    /// - parameter x: the index of the highlighted value on the x-axis\n    /// - parameter dataSet: the index of the DataSet the highlighted value belongs to\n    /// - parameter stackIndex: references which value of a stacked-bar entry has been selected\n    /// - parameter range: the range the selected stack-value is in\n    public convenience init(xIndex x: Int, dataSetIndex: Int, stackIndex: Int, range: ChartRange)\n    {\n        self.init(xIndex: x, dataSetIndex: dataSetIndex, stackIndex: stackIndex)\n        \n        _range = range\n    }\n\n    public var dataSetIndex: Int { return _dataSetIndex; }\n    public var xIndex: Int { return _xIndex; }\n    public var stackIndex: Int { return _stackIndex; }\n    \n    /// - returns: the range of values the selected value of a stacked bar is in. (this is only relevant for stacked-barchart)\n    public var range: ChartRange? { return _range }\n\n    // MARK: NSObject\n    \n    public override var description: String\n    {\n        return \"Highlight, xIndex: \\(_xIndex), dataSetIndex: \\(_dataSetIndex), stackIndex (only stacked barentry): \\(_stackIndex)\"\n    }\n    \n    public override func isEqual(object: AnyObject?) -> Bool\n    {\n        if (object === nil)\n        {\n            return false\n        }\n        \n        if (!object!.isKindOfClass(self.dynamicType))\n        {\n            return false\n        }\n        \n        if (object!.xIndex != _xIndex)\n        {\n            return false\n        }\n        \n        if (object!.dataSetIndex != _dataSetIndex)\n        {\n            return false\n        }\n        \n        if (object!.stackIndex != _stackIndex)\n        {\n            return false\n        }\n        \n        return true\n    }\n}\n\nfunc ==(lhs: ChartHighlight, rhs: ChartHighlight) -> Bool\n{\n    if (lhs === rhs)\n    {\n        return true\n    }\n    \n    if (!lhs.isKindOfClass(rhs.dynamicType))\n    {\n        return false\n    }\n    \n    if (lhs._xIndex != rhs._xIndex)\n    {\n        return false\n    }\n    \n    if (lhs._dataSetIndex != rhs._dataSetIndex)\n    {\n        return false\n    }\n    \n    if (lhs._stackIndex != rhs._stackIndex)\n    {\n        return false\n    }\n    \n    return true\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Highlight/ChartHighlighter.swift",
    "content": "//\n//  ChartHighlighter.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/7/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\npublic class ChartHighlighter : NSObject\n{\n    /// instance of the data-provider\n    public weak var chart: BarLineChartViewBase?\n    \n    public init(chart: BarLineChartViewBase)\n    {\n        self.chart = chart\n    }\n    \n    /// Returns a Highlight object corresponding to the given x- and y- touch positions in pixels.\n    /// - parameter x:\n    /// - parameter y:\n    /// - returns:\n    public func getHighlight(x x: Double, y: Double) -> ChartHighlight?\n    {\n        let xIndex = getXIndex(x)\n        if (xIndex == -Int.max)\n        {\n            return nil\n        }\n        \n        let dataSetIndex = getDataSetIndex(xIndex: xIndex, x: x, y: y)\n        if (dataSetIndex == -Int.max)\n        {\n            return nil\n        }\n        \n        return ChartHighlight(xIndex: xIndex, dataSetIndex: dataSetIndex)\n    }\n    \n    /// Returns the corresponding x-index for a given touch-position in pixels.\n    /// - parameter x:\n    /// - returns:\n    public func getXIndex(x: Double) -> Int\n    {\n        // create an array of the touch-point\n        var pt = CGPoint(x: x, y: 0.0)\n        \n        // take any transformer to determine the x-axis value\n        self.chart?.getTransformer(ChartYAxis.AxisDependency.Left).pixelToValue(&pt)\n        \n        return Int(round(pt.x))\n    }\n    \n    /// Returns the corresponding dataset-index for a given xIndex and xy-touch position in pixels.\n    /// - parameter xIndex:\n    /// - parameter x:\n    /// - parameter y:\n    /// - returns:\n    public func getDataSetIndex(xIndex xIndex: Int, x: Double, y: Double) -> Int\n    {\n        let valsAtIndex = getSelectionDetailsAtIndex(xIndex)\n        \n        let leftdist = ChartUtils.getMinimumDistance(valsAtIndex, val: y, axis: ChartYAxis.AxisDependency.Left)\n        let rightdist = ChartUtils.getMinimumDistance(valsAtIndex, val: y, axis: ChartYAxis.AxisDependency.Right)\n        \n        let axis = leftdist < rightdist ? ChartYAxis.AxisDependency.Left : ChartYAxis.AxisDependency.Right\n        \n        let dataSetIndex = ChartUtils.closestDataSetIndex(valsAtIndex, value: y, axis: axis)\n        \n        return dataSetIndex\n    }\n    \n    /// Returns a list of SelectionDetail object corresponding to the given xIndex.\n    /// - parameter xIndex:\n    /// - returns:\n    public func getSelectionDetailsAtIndex(xIndex: Int) -> [ChartSelectionDetail]\n    {\n        var vals = [ChartSelectionDetail]()\n        var pt = CGPoint()\n        \n        for i in 0 ..< (self.chart?.data?.dataSetCount ?? 0)\n        {\n            let dataSet = self.chart!.data!.getDataSetByIndex(i)\n            \n            // dont include datasets that cannot be highlighted\n            if !dataSet.isHighlightEnabled\n            {\n                continue\n            }\n            \n            // extract all y-values from all DataSets at the given x-index\n            let yVal: Double = dataSet.yValForXIndex(xIndex)\n            if yVal.isNaN\n            {\n                continue\n            }\n            \n            pt.y = CGFloat(yVal)\n            \n            self.chart!.getTransformer(dataSet.axisDependency).pointValueToPixel(&pt)\n            \n            if !pt.y.isNaN\n            {\n                vals.append(ChartSelectionDetail(value: Double(pt.y), dataSetIndex: i, dataSet: dataSet))\n            }\n        }\n        \n        return vals\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Highlight/ChartRange.swift",
    "content": "//\n//  ChartRange.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/7/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\n\npublic class ChartRange: NSObject\n{\n    public var from: Double\n    public var to: Double\n    \n    public init(from: Double, to: Double)\n    {\n        self.from = from\n        self.to = to\n        \n        super.init()\n    }\n\n    /// Returns true if this range contains (if the value is in between) the given value, false if not.\n    /// - parameter value:\n    public func contains(value: Double) -> Bool\n    {\n        if value > from && value <= to\n        {\n            return true\n        }\n        else\n        {\n            return false\n        }\n    }\n    \n    public func isLarger(value: Double) -> Bool\n    {\n        return value > to\n    }\n    \n    public func isSmaller(value: Double) -> Bool\n    {\n        return value < from\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Highlight/CombinedHighlighter.swift",
    "content": "//\n//  CombinedHighlighter.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/7/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\npublic class CombinedHighlighter: ChartHighlighter\n{\n    /// Returns a list of SelectionDetail object corresponding to the given xIndex.\n    /// - parameter xIndex:\n    /// - returns:\n    public override func getSelectionDetailsAtIndex(xIndex: Int) -> [ChartSelectionDetail]\n    {\n        var vals = [ChartSelectionDetail]()\n        \n        if let data = self.chart?.data as? CombinedChartData\n        {\n            // get all chartdata objects\n            var dataObjects = data.allData\n            \n            var pt = CGPoint()\n            \n            for i in 0 ..< dataObjects.count\n            {\n                for j in 0 ..< dataObjects[i].dataSetCount\n                {\n                    let dataSet = dataObjects[i].getDataSetByIndex(j)\n                    \n                    // dont include datasets that cannot be highlighted\n                    if !dataSet.isHighlightEnabled\n                    {\n                        continue\n                    }\n                    \n                    // extract all y-values from all DataSets at the given x-index\n                    let yVal = dataSet.yValForXIndex(xIndex)\n                    if yVal.isNaN\n                    {\n                        continue\n                    }\n                    \n                    pt.y = CGFloat(yVal)\n                    \n                    self.chart!.getTransformer(dataSet.axisDependency).pointValueToPixel(&pt)\n                    \n                    if !pt.y.isNaN\n                    {\n                        vals.append(ChartSelectionDetail(value: Double(pt.y), dataSetIndex: j, dataSet: dataSet))\n                    }\n                }\n            }\n        }\n        \n        return vals\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Highlight/HorizontalBarChartHighlighter.swift",
    "content": "//\n//  HorizontalBarChartHighlighter.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 26/7/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\npublic class HorizontalBarChartHighlighter: BarChartHighlighter\n{\n    public override func getHighlight(x x: Double, y: Double) -> ChartHighlight?\n    {\n        let h = super.getHighlight(x: x, y: y)\n        \n        if h === nil\n        {\n            return h\n        }\n        else\n        {\n            if let set = self.chart?.data?.getDataSetByIndex(h!.dataSetIndex) as? BarChartDataSet\n            {\n                if set.isStacked\n                {\n                    // create an array of the touch-point\n                    var pt = CGPoint()\n                    pt.x = CGFloat(y)\n                    \n                    // take any transformer to determine the x-axis value\n                    self.chart?.getTransformer(set.axisDependency).pixelToValue(&pt)\n                    \n                    return getStackedHighlight(old: h, set: set, xIndex: h!.xIndex, dataSetIndex: h!.dataSetIndex, yValue: Double(pt.x))\n                }\n            }\n            \n            return h\n        }\n    }\n    \n    public override func getXIndex(x: Double) -> Int\n    {\n        if let barChartData = self.chart?.data as? BarChartData\n        {\n            if !barChartData.isGrouped\n            {\n                // create an array of the touch-point\n                var pt = CGPoint(x: 0.0, y: x)\n                \n                // take any transformer to determine the x-axis value\n                self.chart?.getTransformer(ChartYAxis.AxisDependency.Left).pixelToValue(&pt)\n                \n                return Int(round(pt.y))\n            }\n            else\n            {\n                let baseNoSpace = getBase(x)\n                \n                let setCount = barChartData.dataSetCount\n                var xIndex = Int(baseNoSpace) / setCount\n                \n                let valCount = barChartData.xValCount\n                \n                if xIndex < 0\n                {\n                    xIndex = 0\n                }\n                else if xIndex >= valCount\n                {\n                    xIndex = valCount - 1\n                }\n                \n                return xIndex\n            }\n        }\n        else\n        {\n            return 0\n        }\n    }\n    \n    /// Returns the base y-value to the corresponding x-touch value in pixels.\n    /// - parameter y:\n    /// - returns:\n    public override func getBase(y: Double) -> Double\n    {\n        if let barChartData = self.chart?.data as? BarChartData\n        {\n            // create an array of the touch-point\n            var pt = CGPoint()\n            pt.y = CGFloat(y)\n            \n            // take any transformer to determine the x-axis value\n            self.chart?.getTransformer(ChartYAxis.AxisDependency.Left).pixelToValue(&pt)\n            let yVal = Double(pt.y)\n            \n            let setCount = barChartData.dataSetCount ?? 0\n            \n            // calculate how often the group-space appears\n            let steps = Int(yVal / (Double(setCount) + Double(barChartData.groupSpace)))\n            \n            let groupSpaceSum = Double(barChartData.groupSpace) * Double(steps)\n            \n            let baseNoSpace = yVal - groupSpaceSum\n            \n            return baseNoSpace\n        }\n        else\n        {\n            return 0.0\n        }\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Interfaces/BarChartDataProvider.swift",
    "content": "//\n//  BarChartDataProvider.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 27/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n@objc\npublic protocol BarChartDataProvider: BarLineScatterCandleBubbleChartDataProvider\n{\n    var barData: BarChartData? { get }\n    \n    var isDrawBarShadowEnabled: Bool { get }\n    var isDrawValueAboveBarEnabled: Bool { get }\n    var isDrawHighlightArrowEnabled: Bool { get }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Interfaces/BarLineScatterCandleBubbleChartDataProvider.swift",
    "content": "//\n//  BarLineScatterCandleBubbleChartDataProvider.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 27/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n@objc\npublic protocol BarLineScatterCandleBubbleChartDataProvider: ChartDataProvider\n{\n    func getTransformer(which: ChartYAxis.AxisDependency) -> ChartTransformer\n    var maxVisibleValueCount: Int { get }\n    func isInverted(axis: ChartYAxis.AxisDependency) -> Bool\n    \n    var lowestVisibleXIndex: Int { get }\n    var highestVisibleXIndex: Int { get }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Interfaces/BubbleChartDataProvider.swift",
    "content": "//\n//  BubbleChartDataProvider.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 27/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n@objc\npublic protocol BubbleChartDataProvider: BarLineScatterCandleBubbleChartDataProvider\n{\n    var bubbleData: BubbleChartData? { get }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Interfaces/CandleChartDataProvider.swift",
    "content": "//\n//  CandleChartDataProvider.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 27/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n@objc\npublic protocol CandleChartDataProvider: BarLineScatterCandleBubbleChartDataProvider\n{\n    var candleData: CandleChartData? { get }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Interfaces/ChartDataProvider.swift",
    "content": "//\n//  ChartDataProvider.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 27/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n@objc\npublic protocol ChartDataProvider\n{\n    /// - returns: the minimum x-value of the chart, regardless of zoom or translation.\n    var chartXMin: Double { get }\n    \n    /// - returns: the maximum x-value of the chart, regardless of zoom or translation.\n    var chartXMax: Double { get }\n    \n    /// - returns: the minimum y-value of the chart, regardless of zoom or translation.\n    var chartYMin: Double { get }\n    \n    /// - returns: the maximum y-value of the chart, regardless of zoom or translation.\n    var chartYMax: Double { get }\n    \n    var xValCount: Int { get }\n    \n    var centerOffsets: CGPoint { get }\n    \n    var data: ChartData? { get }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Interfaces/LineChartDataProvider.swift",
    "content": "//\n//  LineChartDataProvider.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 27/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n@objc\npublic protocol LineChartDataProvider: BarLineScatterCandleBubbleChartDataProvider\n{\n    var lineData: LineChartData? { get }\n    \n    func getAxis(axis: ChartYAxis.AxisDependency) -> ChartYAxis\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Interfaces/ScatterChartDataProvider.swift",
    "content": "//\n//  ScatterChartDataProvider.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 27/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n@objc\npublic protocol ScatterChartDataProvider: BarLineScatterCandleBubbleChartDataProvider\n{\n    var scatterData: ScatterChartData? { get }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Jobs/AnimatedMoveViewJob.swift",
    "content": "//\n//  AnimatedMoveChartViewJob.swift\n//  Charts\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\npublic class AnimatedMoveChartViewJob: AnimatedViewPortJob\n{\n    public override init(\n        viewPortHandler: ChartViewPortHandler,\n        xIndex: CGFloat,\n        yValue: Double,\n        transformer: ChartTransformer,\n        view: ChartViewBase,\n        xOrigin: CGFloat,\n        yOrigin: CGFloat,\n        duration: NSTimeInterval,\n        easing: ChartEasingFunctionBlock?)\n    {\n        super.init(viewPortHandler: viewPortHandler,\n            xIndex: xIndex,\n            yValue: yValue,\n            transformer: transformer,\n            view: view,\n            xOrigin: xOrigin,\n            yOrigin: yOrigin,\n            duration: duration,\n            easing: easing)\n    }\n    \n    internal override func animationUpdate()\n    {\n        guard let\n            viewPortHandler = viewPortHandler,\n            transformer = transformer,\n            view = view\n            else { return }\n        \n        var pt = CGPoint(\n            x: xOrigin + (xIndex - xOrigin) * phase,\n            y: yOrigin + (CGFloat(yValue) - yOrigin) * phase\n        );\n        \n        transformer.pointValueToPixel(&pt)\n        viewPortHandler.centerViewPort(pt: pt, chart: view)\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Jobs/AnimatedViewPortJob.swift",
    "content": "//\n//  AnimatedViewPortJob.swift\n//  Charts\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\npublic class AnimatedViewPortJob: ChartViewPortJob\n{\n    internal var phase: CGFloat = 1.0\n    internal var xOrigin: CGFloat = 0.0\n    internal var yOrigin: CGFloat = 0.0\n    \n    private var _startTime: NSTimeInterval = 0.0\n    private var _displayLink: NSUIDisplayLink!\n    private var _duration: NSTimeInterval = 0.0\n    private var _endTime: NSTimeInterval = 0.0\n    \n    private var _easing: ChartEasingFunctionBlock?\n    \n    public init(\n        viewPortHandler: ChartViewPortHandler,\n        xIndex: CGFloat,\n        yValue: Double,\n        transformer: ChartTransformer,\n        view: ChartViewBase,\n        xOrigin: CGFloat,\n        yOrigin: CGFloat,\n        duration: NSTimeInterval,\n        easing: ChartEasingFunctionBlock?)\n    {\n        super.init(viewPortHandler: viewPortHandler,\n            xIndex: xIndex,\n            yValue: yValue,\n            transformer: transformer,\n            view: view)\n        \n        self.xOrigin = xOrigin\n        self.yOrigin = yOrigin\n        self._duration = duration\n        self._easing = easing\n    }\n    \n    deinit\n    {\n        stop(finish: false)\n    }\n    \n    public override func doJob()\n    {\n        start()\n    }\n    \n    public func start()\n    {\n        _startTime = CACurrentMediaTime()\n        _endTime = _startTime + _duration\n        _endTime = _endTime > _endTime ? _endTime : _endTime\n        \n        updateAnimationPhase(_startTime)\n        \n        _displayLink = NSUIDisplayLink(target: self, selector: #selector(AnimatedViewPortJob.animationLoop))\n        _displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)\n    }\n    \n    public func stop(finish finish: Bool)\n    {\n        if (_displayLink != nil)\n        {\n            _displayLink.removeFromRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)\n            _displayLink = nil\n            \n            if finish\n            {\n                if phase != 1.0\n                {\n                    phase = 1.0\n                    phase = 1.0\n                    \n                    animationUpdate()\n                }\n                \n                animationEnd()\n            }\n        }\n    }\n    \n    private func updateAnimationPhase(currentTime: NSTimeInterval)\n    {\n        let elapsedTime: NSTimeInterval = currentTime - _startTime\n        let duration: NSTimeInterval = _duration\n        var elapsed: NSTimeInterval = elapsedTime\n        if elapsed > duration\n        {\n            elapsed = duration\n        }\n        \n        if _easing != nil\n        {\n            phase = _easing!(elapsed: elapsed, duration: duration)\n        }\n        else\n        {\n            phase = CGFloat(elapsed / duration)\n        }\n    }\n    \n    @objc private func animationLoop()\n    {\n        let currentTime: NSTimeInterval = CACurrentMediaTime()\n        \n        updateAnimationPhase(currentTime)\n        \n        animationUpdate()\n        \n        if (currentTime >= _endTime)\n        {\n            stop(finish: true)\n        }\n    }\n    \n    internal func animationUpdate()\n    {\n        // Override this\n    }\n    \n    internal func animationEnd()\n    {\n        // Override this\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Jobs/AnimatedZoomViewJob.swift",
    "content": "//\n//  AnimatedZoomChartViewJob.swift\n//  Charts\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\npublic class AnimatedZoomChartViewJob: AnimatedViewPortJob\n{\n    internal var yAxis: ChartYAxis?\n    internal var xValCount: Int = 0\n    internal var scaleX: CGFloat = 0.0\n    internal var scaleY: CGFloat = 0.0\n    internal var zoomOriginX: CGFloat = 0.0\n    internal var zoomOriginY: CGFloat = 0.0\n    internal var zoomCenterX: CGFloat = 0.0\n    internal var zoomCenterY: CGFloat = 0.0\n\n    public init(\n        viewPortHandler: ChartViewPortHandler,\n        transformer: ChartTransformer,\n        view: ChartViewBase,\n        yAxis: ChartYAxis,\n        xValCount: Int,\n        scaleX: CGFloat,\n        scaleY: CGFloat,\n        xOrigin: CGFloat,\n        yOrigin: CGFloat,\n        zoomCenterX: CGFloat,\n        zoomCenterY: CGFloat,\n        zoomOriginX: CGFloat,\n        zoomOriginY: CGFloat,\n        duration: NSTimeInterval,\n        easing: ChartEasingFunctionBlock?)\n    {\n        super.init(viewPortHandler: viewPortHandler,\n            xIndex: 0.0,\n            yValue: 0.0,\n            transformer: transformer,\n            view: view,\n            xOrigin: xOrigin,\n            yOrigin: yOrigin,\n            duration: duration,\n            easing: easing)\n        \n        self.yAxis = yAxis\n        self.xValCount = xValCount\n        self.scaleX = scaleX\n        self.scaleY = scaleY\n        self.zoomCenterX = zoomCenterX\n        self.zoomCenterY = zoomCenterY\n        self.zoomOriginX = zoomOriginX\n        self.zoomOriginY = zoomOriginY\n    }\n    \n    internal override func animationUpdate()\n    {\n        guard let\n            viewPortHandler = viewPortHandler,\n            transformer = transformer,\n            view = view\n            else { return }\n        \n        let scaleX = xOrigin + (self.scaleX - xOrigin) * phase\n        let scaleY = yOrigin + (self.scaleY - yOrigin) * phase\n        \n        var matrix = viewPortHandler.setZoom(scaleX: scaleX, scaleY: scaleY)\n        viewPortHandler.refresh(newMatrix: matrix, chart: view, invalidate: false)\n        \n        let valsInView = CGFloat(yAxis?.axisRange ?? 0.0) / viewPortHandler.scaleY\n        let xsInView = CGFloat(xValCount) / viewPortHandler.scaleX\n        \n        var pt = CGPoint(\n            x: zoomOriginX + ((zoomCenterX - xsInView / 2.0) - zoomOriginX) * phase,\n            y: zoomOriginY + ((zoomCenterY + valsInView / 2.0) - zoomOriginY) * phase\n        )\n        \n        transformer.pointValueToPixel(&pt)\n        \n        matrix = viewPortHandler.translate(pt: pt)\n        viewPortHandler.refresh(newMatrix: matrix, chart: view, invalidate: true)\n    }\n    \n    internal override func animationEnd()\n    {\n        (view as? BarLineChartViewBase)?.calculateOffsets()\n        view?.setNeedsDisplay()\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Jobs/ChartViewPortJob.swift",
    "content": "//\n//  ChartViewPortJob.swift\n//  Charts\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n// This defines a viewport modification job, used for delaying or animating viewport changes\npublic class ChartViewPortJob\n{\n    internal var point: CGPoint = CGPoint()\n    internal weak var viewPortHandler: ChartViewPortHandler?\n    internal var xIndex: CGFloat = 0.0\n    internal var yValue: Double = 0.0\n    internal weak var transformer: ChartTransformer?\n    internal weak var view: ChartViewBase?\n    \n    public init(\n        viewPortHandler: ChartViewPortHandler,\n        xIndex: CGFloat,\n        yValue: Double,\n        transformer: ChartTransformer,\n        view: ChartViewBase)\n    {\n        self.viewPortHandler = viewPortHandler\n        self.xIndex = xIndex\n        self.yValue = yValue\n        self.transformer = transformer\n        self.view = view\n    }\n    \n    public func doJob()\n    {\n        // Override this\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Jobs/MoveChartViewJob.swift",
    "content": "//\n//  MoveChartViewJob.swift\n//  Charts\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\npublic class MoveChartViewJob: ChartViewPortJob\n{\n    public override init(\n        viewPortHandler: ChartViewPortHandler,\n        xIndex: CGFloat,\n        yValue: Double,\n        transformer: ChartTransformer,\n        view: ChartViewBase)\n    {\n        super.init(\n            viewPortHandler: viewPortHandler,\n            xIndex: xIndex,\n            yValue: yValue,\n            transformer: transformer,\n            view: view)\n    }\n    \n    public override func doJob()\n    {\n        guard let\n            viewPortHandler = viewPortHandler,\n            transformer = transformer,\n            view = view\n            else { return }\n        \n        var pt = CGPoint(\n            x: xIndex,\n            y: CGFloat(yValue)\n        );\n        \n        transformer.pointValueToPixel(&pt)\n        viewPortHandler.centerViewPort(pt: pt, chart: view)\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Jobs/ZoomChartViewJob.swift",
    "content": "//\n//  ZoomChartViewJob.swift\n//  Charts\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\npublic class ZoomChartViewJob: ChartViewPortJob\n{\n    internal var scaleX: CGFloat = 0.0\n    internal var scaleY: CGFloat = 0.0\n    internal var axisDependency: ChartYAxis.AxisDependency = ChartYAxis.AxisDependency.Left\n    \n    public init(\n        viewPortHandler: ChartViewPortHandler,\n        scaleX: CGFloat,\n        scaleY: CGFloat,\n        xIndex: CGFloat,\n        yValue: Double,\n        transformer: ChartTransformer,\n        axis: ChartYAxis.AxisDependency,\n        view: ChartViewBase)\n    {\n        super.init(\n            viewPortHandler: viewPortHandler,\n            xIndex: xIndex,\n            yValue: yValue,\n            transformer: transformer,\n            view: view)\n        \n        self.scaleX = scaleX\n        self.scaleY = scaleY\n        self.axisDependency = axis\n    }\n    \n    public override func doJob()\n    {\n        guard let\n            viewPortHandler = viewPortHandler,\n            transformer = transformer,\n            view = view\n            else { return }\n        \n        var matrix = viewPortHandler.setZoom(scaleX: scaleX, scaleY: scaleY)\n        viewPortHandler.refresh(newMatrix: matrix, chart: view, invalidate: false)\n        \n        let valsInView = (view as! BarLineChartViewBase).getDeltaY(axisDependency) / viewPortHandler.scaleY\n        let xsInView = CGFloat((view as! BarLineChartViewBase).xAxis.values.count) / viewPortHandler.scaleX\n        \n        var pt = CGPoint(\n            x: xIndex - xsInView / 2.0,\n            y: CGFloat(yValue) + valsInView / 2.0\n        )\n        \n        transformer.pointValueToPixel(&pt)\n        \n        matrix = viewPortHandler.translate(pt: pt)\n        viewPortHandler.refresh(newMatrix: matrix, chart: view, invalidate: false)\n        \n        (view as! BarLineChartViewBase).calculateOffsets()\n        view.setNeedsDisplay()\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Renderers/BarChartRenderer.swift",
    "content": "//\n//  BarChartRenderer.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\npublic class BarChartRenderer: ChartDataRendererBase\n{\n    public weak var dataProvider: BarChartDataProvider?\n    \n    public init(dataProvider: BarChartDataProvider?, animator: ChartAnimator?, viewPortHandler: ChartViewPortHandler)\n    {\n        super.init(animator: animator, viewPortHandler: viewPortHandler)\n        \n        self.dataProvider = dataProvider\n    }\n    \n    public override func drawData(context context: CGContext)\n    {\n        guard let dataProvider = dataProvider, barData = dataProvider.barData else { return }\n        \n        for i in 0 ..< barData.dataSetCount\n        {\n            guard let set = barData.getDataSetByIndex(i) else { continue }\n            \n            if set.isVisible && set.entryCount > 0\n            {\n                if !(set is IBarChartDataSet)\n                {\n                    fatalError(\"Datasets for BarChartRenderer must conform to IBarChartDataset\")\n                }\n                \n                drawDataSet(context: context, dataSet: set as! IBarChartDataSet, index: i)\n            }\n        }\n    }\n    \n    public func drawDataSet(context context: CGContext, dataSet: IBarChartDataSet, index: Int)\n    {\n        guard let\n            dataProvider = dataProvider,\n            barData = dataProvider.barData,\n            animator = animator\n            else { return }\n        \n        CGContextSaveGState(context)\n        \n        let trans = dataProvider.getTransformer(dataSet.axisDependency)\n        \n        let drawBarShadowEnabled: Bool = dataProvider.isDrawBarShadowEnabled\n        let dataSetOffset = (barData.dataSetCount - 1)\n        let groupSpace = barData.groupSpace\n        let groupSpaceHalf = groupSpace / 2.0\n        let barSpace = dataSet.barSpace\n        let barSpaceHalf = barSpace / 2.0\n        let containsStacks = dataSet.isStacked\n        let isInverted = dataProvider.isInverted(dataSet.axisDependency)\n        let barWidth: CGFloat = 0.5\n        let phaseY = animator.phaseY\n        var barRect = CGRect()\n        var barShadow = CGRect()\n        var y: Double\n        \n        // do the drawing\n        for j in 0 ..< Int(ceil(CGFloat(dataSet.entryCount) * animator.phaseX))\n        {\n            guard let e = dataSet.entryForIndex(j) as? BarChartDataEntry else { continue }\n            \n            // calculate the x-position, depending on datasetcount\n            let x = CGFloat(e.xIndex + e.xIndex * dataSetOffset) + CGFloat(index)\n                + groupSpace * CGFloat(e.xIndex) + groupSpaceHalf\n            var vals = e.values\n            \n            if (!containsStacks || vals == nil)\n            {\n                y = e.value\n                \n                let left = x - barWidth + barSpaceHalf\n                let right = x + barWidth - barSpaceHalf\n                var top = isInverted ? (y <= 0.0 ? CGFloat(y) : 0) : (y >= 0.0 ? CGFloat(y) : 0)\n                var bottom = isInverted ? (y >= 0.0 ? CGFloat(y) : 0) : (y <= 0.0 ? CGFloat(y) : 0)\n                \n                // multiply the height of the rect with the phase\n                if (top > 0)\n                {\n                    top *= phaseY\n                }\n                else\n                {\n                    bottom *= phaseY\n                }\n                \n                barRect.origin.x = left\n                barRect.size.width = right - left\n                barRect.origin.y = top\n                barRect.size.height = bottom - top\n                \n                trans.rectValueToPixel(&barRect)\n                \n                if (!viewPortHandler.isInBoundsLeft(barRect.origin.x + barRect.size.width))\n                {\n                    continue\n                }\n                \n                if (!viewPortHandler.isInBoundsRight(barRect.origin.x))\n                {\n                    break\n                }\n                \n                // if drawing the bar shadow is enabled\n                if (drawBarShadowEnabled)\n                {\n                    barShadow.origin.x = barRect.origin.x\n                    barShadow.origin.y = viewPortHandler.contentTop\n                    barShadow.size.width = barRect.size.width\n                    barShadow.size.height = viewPortHandler.contentHeight\n                    \n                    CGContextSetFillColorWithColor(context, dataSet.barShadowColor.CGColor)\n                    CGContextFillRect(context, barShadow)\n                }\n                \n                // Set the color for the currently drawn value. If the index is out of bounds, reuse colors.\n                CGContextSetFillColorWithColor(context, dataSet.colorAt(j).CGColor)\n                CGContextFillRect(context, barRect)\n            }\n            else\n            {\n                var posY = 0.0\n                var negY = -e.negativeSum\n                var yStart = 0.0\n                \n                // if drawing the bar shadow is enabled\n                if (drawBarShadowEnabled)\n                {\n                    y = e.value\n                    \n                    let left = x - barWidth + barSpaceHalf\n                    let right = x + barWidth - barSpaceHalf\n                    var top = isInverted ? (y <= 0.0 ? CGFloat(y) : 0) : (y >= 0.0 ? CGFloat(y) : 0)\n                    var bottom = isInverted ? (y >= 0.0 ? CGFloat(y) : 0) : (y <= 0.0 ? CGFloat(y) : 0)\n                    \n                    // multiply the height of the rect with the phase\n                    if (top > 0)\n                    {\n                        top *= phaseY\n                    }\n                    else\n                    {\n                        bottom *= phaseY\n                    }\n                    \n                    barRect.origin.x = left\n                    barRect.size.width = right - left\n                    barRect.origin.y = top\n                    barRect.size.height = bottom - top\n                    \n                    trans.rectValueToPixel(&barRect)\n                    \n                    barShadow.origin.x = barRect.origin.x\n                    barShadow.origin.y = viewPortHandler.contentTop\n                    barShadow.size.width = barRect.size.width\n                    barShadow.size.height = viewPortHandler.contentHeight\n                    \n                    CGContextSetFillColorWithColor(context, dataSet.barShadowColor.CGColor)\n                    CGContextFillRect(context, barShadow)\n                }\n                \n                // fill the stack\n                for k in 0 ..< vals!.count\n                {\n                    let value = vals![k]\n                    \n                    if value >= 0.0\n                    {\n                        y = posY\n                        yStart = posY + value\n                        posY = yStart\n                    }\n                    else\n                    {\n                        y = negY\n                        yStart = negY + abs(value)\n                        negY += abs(value)\n                    }\n                    \n                    let left = x - barWidth + barSpaceHalf\n                    let right = x + barWidth - barSpaceHalf\n                    var top: CGFloat, bottom: CGFloat\n                    if isInverted\n                    {\n                        bottom = y >= yStart ? CGFloat(y) : CGFloat(yStart)\n                        top = y <= yStart ? CGFloat(y) : CGFloat(yStart)\n                    }\n                    else\n                    {\n                        top = y >= yStart ? CGFloat(y) : CGFloat(yStart)\n                        bottom = y <= yStart ? CGFloat(y) : CGFloat(yStart)\n                    }\n                    \n                    // multiply the height of the rect with the phase\n                    top *= phaseY\n                    bottom *= phaseY\n                    \n                    barRect.origin.x = left\n                    barRect.size.width = right - left\n                    barRect.origin.y = top\n                    barRect.size.height = bottom - top\n                    \n                    trans.rectValueToPixel(&barRect)\n                    \n                    if (k == 0 && !viewPortHandler.isInBoundsLeft(barRect.origin.x + barRect.size.width))\n                    {\n                        // Skip to next bar\n                        break\n                    }\n                    \n                    // avoid drawing outofbounds values\n                    if (!viewPortHandler.isInBoundsRight(barRect.origin.x))\n                    {\n                        break\n                    }\n                    \n                    // Set the color for the currently drawn value. If the index is out of bounds, reuse colors.\n                    CGContextSetFillColorWithColor(context, dataSet.colorAt(k).CGColor)\n                    CGContextFillRect(context, barRect)\n                }\n            }\n        }\n        \n        CGContextRestoreGState(context)\n    }\n    \n    /// Prepares a bar for being highlighted.\n    public func prepareBarHighlight(x x: CGFloat, y1: Double, y2: Double, barspacehalf: CGFloat, trans: ChartTransformer, inout rect: CGRect)\n    {\n        let barWidth: CGFloat = 0.5\n        \n        let left = x - barWidth + barspacehalf\n        let right = x + barWidth - barspacehalf\n        let top = CGFloat(y1)\n        let bottom = CGFloat(y2)\n        \n        rect.origin.x = left\n        rect.origin.y = top\n        rect.size.width = right - left\n        rect.size.height = bottom - top\n        \n        trans.rectValueToPixel(&rect, phaseY: animator?.phaseY ?? 1.0)\n    }\n    \n    public override func drawValues(context context: CGContext)\n    {\n        // if values are drawn\n        if (passesCheck())\n        {\n            guard let\n                dataProvider = dataProvider,\n                barData = dataProvider.barData,\n                animator = animator\n                else { return }\n            \n            var dataSets = barData.dataSets\n            \n            let drawValueAboveBar = dataProvider.isDrawValueAboveBarEnabled\n\n            var posOffset: CGFloat\n            var negOffset: CGFloat\n            \n            for dataSetIndex in 0 ..< barData.dataSetCount\n            {\n                guard let dataSet = dataSets[dataSetIndex] as? IBarChartDataSet else { continue }\n                \n                if !dataSet.isDrawValuesEnabled || dataSet.entryCount == 0\n                {\n                    continue\n                }\n                \n                let isInverted = dataProvider.isInverted(dataSet.axisDependency)\n                \n                // calculate the correct offset depending on the draw position of the value\n                let valueOffsetPlus: CGFloat = 4.5\n                let valueFont = dataSet.valueFont\n                let valueTextHeight = valueFont.lineHeight\n                posOffset = (drawValueAboveBar ? -(valueTextHeight + valueOffsetPlus) : valueOffsetPlus)\n                negOffset = (drawValueAboveBar ? valueOffsetPlus : -(valueTextHeight + valueOffsetPlus))\n                \n                if (isInverted)\n                {\n                    posOffset = -posOffset - valueTextHeight\n                    negOffset = -negOffset - valueTextHeight\n                }\n                \n                guard let formatter = dataSet.valueFormatter else { continue }\n                \n                let trans = dataProvider.getTransformer(dataSet.axisDependency)\n                \n                let phaseY = animator.phaseY\n                let dataSetCount = barData.dataSetCount\n                let groupSpace = barData.groupSpace\n                \n                // if only single values are drawn (sum)\n                if (!dataSet.isStacked)\n                {\n                    for j in 0 ..< Int(ceil(CGFloat(dataSet.entryCount) * animator.phaseX))\n                    {\n                        guard let e = dataSet.entryForIndex(j) as? BarChartDataEntry else { continue }\n                        \n                        let valuePoint = trans.getTransformedValueBarChart(\n                            entry: e,\n                            xIndex: e.xIndex,\n                            dataSetIndex: dataSetIndex,\n                            phaseY: phaseY,\n                            dataSetCount: dataSetCount,\n                            groupSpace: groupSpace\n                        )\n                        \n                        if (!viewPortHandler.isInBoundsRight(valuePoint.x))\n                        {\n                            break\n                        }\n                        \n                        if (!viewPortHandler.isInBoundsY(valuePoint.y)\n                            || !viewPortHandler.isInBoundsLeft(valuePoint.x))\n                        {\n                            continue\n                        }\n                        \n                        let val = e.value\n\n                        drawValue(context: context,\n                            value: formatter.stringFromNumber(val)!,\n                            xPos: valuePoint.x,\n                            yPos: valuePoint.y + (val >= 0.0 ? posOffset : negOffset),\n                            font: valueFont,\n                            align: .Center,\n                            color: dataSet.valueTextColorAt(j))\n                    }\n                }\n                else\n                {\n                    // if we have stacks\n                    \n                    for j in 0 ..< Int(ceil(CGFloat(dataSet.entryCount) * animator.phaseX))\n                    {\n                        guard let e = dataSet.entryForIndex(j) as? BarChartDataEntry else { continue }\n                        \n                        let values = e.values\n                        \n                        let valuePoint = trans.getTransformedValueBarChart(entry: e, xIndex: e.xIndex, dataSetIndex: dataSetIndex, phaseY: phaseY, dataSetCount: dataSetCount, groupSpace: groupSpace)\n                        \n                        // we still draw stacked bars, but there is one non-stacked in between\n                        if (values == nil)\n                        {\n                            if (!viewPortHandler.isInBoundsRight(valuePoint.x))\n                            {\n                                break\n                            }\n                            \n                            if (!viewPortHandler.isInBoundsY(valuePoint.y)\n                                || !viewPortHandler.isInBoundsLeft(valuePoint.x))\n                            {\n                                continue\n                            }\n                            \n                            drawValue(context: context,\n                                value: formatter.stringFromNumber(e.value)!,\n                                xPos: valuePoint.x,\n                                yPos: valuePoint.y + (e.value >= 0.0 ? posOffset : negOffset),\n                                font: valueFont,\n                                align: .Center,\n                                color: dataSet.valueTextColorAt(j))\n                        }\n                        else\n                        {\n                            // draw stack values\n                            \n                            let vals = values!\n                            var transformed = [CGPoint]()\n                            \n                            var posY = 0.0\n                            var negY = -e.negativeSum\n                            \n                            for k in 0 ..< vals.count\n                            {\n                                let value = vals[k]\n                                var y: Double\n                                \n                                if value >= 0.0\n                                {\n                                    posY += value\n                                    y = posY\n                                }\n                                else\n                                {\n                                    y = negY\n                                    negY -= value\n                                }\n                                \n                                transformed.append(CGPoint(x: 0.0, y: CGFloat(y) * animator.phaseY))\n                            }\n                            \n                            trans.pointValuesToPixel(&transformed)\n                            \n                            for k in 0 ..< transformed.count\n                            {\n                                let x = valuePoint.x\n                                let y = transformed[k].y + (vals[k] >= 0 ? posOffset : negOffset)\n                                \n                                if (!viewPortHandler.isInBoundsRight(x))\n                                {\n                                    break\n                                }\n                                \n                                if (!viewPortHandler.isInBoundsY(y) || !viewPortHandler.isInBoundsLeft(x))\n                                {\n                                    continue\n                                }\n                                \n                                drawValue(context: context,\n                                    value: formatter.stringFromNumber(vals[k])!,\n                                    xPos: x,\n                                    yPos: y,\n                                    font: valueFont,\n                                    align: .Center,\n                                    color: dataSet.valueTextColorAt(j))\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n    \n    /// Draws a value at the specified x and y position.\n    public func drawValue(context context: CGContext, value: String, xPos: CGFloat, yPos: CGFloat, font: NSUIFont, align: NSTextAlignment, color: NSUIColor)\n    {\n        ChartUtils.drawText(context: context, text: value, point: CGPoint(x: xPos, y: yPos), align: align, attributes: [NSFontAttributeName: font, NSForegroundColorAttributeName: color])\n    }\n    \n    public override func drawExtras(context context: CGContext)\n    {\n        \n    }\n    \n    private var _highlightArrowPtsBuffer = [CGPoint](count: 3, repeatedValue: CGPoint())\n    \n    public override func drawHighlighted(context context: CGContext, indices: [ChartHighlight])\n    {\n        guard let\n            dataProvider = dataProvider,\n            barData = dataProvider.barData,\n            animator = animator\n            else { return }\n        \n        CGContextSaveGState(context)\n        \n        let setCount = barData.dataSetCount\n        let drawHighlightArrowEnabled = dataProvider.isDrawHighlightArrowEnabled\n        var barRect = CGRect()\n        \n        for i in 0 ..< indices.count\n        {\n            let h = indices[i]\n            let index = h.xIndex\n            \n            let dataSetIndex = h.dataSetIndex\n            \n            guard let set = barData.getDataSetByIndex(dataSetIndex) as? IBarChartDataSet else { continue }\n            \n            if (!set.isHighlightEnabled)\n            {\n                continue\n            }\n            \n            let barspaceHalf = set.barSpace / 2.0\n            \n            let trans = dataProvider.getTransformer(set.axisDependency)\n            \n            CGContextSetFillColorWithColor(context, set.highlightColor.CGColor)\n            CGContextSetAlpha(context, set.highlightAlpha)\n            \n            // check outofbounds\n            if (CGFloat(index) < (CGFloat(dataProvider.chartXMax) * animator.phaseX) / CGFloat(setCount))\n            {\n                let e = set.entryForXIndex(index) as! BarChartDataEntry!\n                \n                if (e === nil || e.xIndex != index)\n                {\n                    continue\n                }\n                \n                let groupspace = barData.groupSpace\n                let isStack = h.stackIndex < 0 ? false : true\n\n                // calculate the correct x-position\n                let x = CGFloat(index * setCount + dataSetIndex) + groupspace / 2.0 + groupspace * CGFloat(index)\n                \n                let y1: Double\n                let y2: Double\n                \n                if (isStack)\n                {\n                    y1 = h.range?.from ?? 0.0\n                    y2 = h.range?.to ?? 0.0\n                }\n                else\n                {\n                    y1 = e.value\n                    y2 = 0.0\n                }\n\n                prepareBarHighlight(x: x, y1: y1, y2: y2, barspacehalf: barspaceHalf, trans: trans, rect: &barRect)\n                \n                CGContextFillRect(context, barRect)\n                \n                if (drawHighlightArrowEnabled)\n                {\n                    CGContextSetAlpha(context, 1.0)\n                    \n                    // distance between highlight arrow and bar\n                    let offsetY = animator.phaseY * 0.07\n                    \n                    CGContextSaveGState(context)\n                    \n                    let pixelToValueMatrix = trans.pixelToValueMatrix\n                    let xToYRel = abs(sqrt(pixelToValueMatrix.b * pixelToValueMatrix.b + pixelToValueMatrix.d * pixelToValueMatrix.d) / sqrt(pixelToValueMatrix.a * pixelToValueMatrix.a + pixelToValueMatrix.c * pixelToValueMatrix.c))\n                    \n                    let arrowWidth = set.barSpace / 2.0\n                    let arrowHeight = arrowWidth * xToYRel\n                    \n                    let yArrow = (y1 > -y2 ? y1 : y1) * Double(animator.phaseY)\n                    \n                    _highlightArrowPtsBuffer[0].x = CGFloat(x) + 0.4\n                    _highlightArrowPtsBuffer[0].y = CGFloat(yArrow) + offsetY\n                    _highlightArrowPtsBuffer[1].x = CGFloat(x) + 0.4 + arrowWidth\n                    _highlightArrowPtsBuffer[1].y = CGFloat(yArrow) + offsetY - arrowHeight\n                    _highlightArrowPtsBuffer[2].x = CGFloat(x) + 0.4 + arrowWidth\n                    _highlightArrowPtsBuffer[2].y = CGFloat(yArrow) + offsetY + arrowHeight\n                    \n                    trans.pointValuesToPixel(&_highlightArrowPtsBuffer)\n                    \n                    CGContextBeginPath(context)\n                    CGContextMoveToPoint(context, _highlightArrowPtsBuffer[0].x, _highlightArrowPtsBuffer[0].y)\n                    CGContextAddLineToPoint(context, _highlightArrowPtsBuffer[1].x, _highlightArrowPtsBuffer[1].y)\n                    CGContextAddLineToPoint(context, _highlightArrowPtsBuffer[2].x, _highlightArrowPtsBuffer[2].y)\n                    CGContextClosePath(context)\n                    \n                    CGContextFillPath(context)\n                    \n                    CGContextRestoreGState(context)\n                }\n            }\n        }\n        \n        CGContextRestoreGState(context)\n    }\n    \n    internal func passesCheck() -> Bool\n    {\n        guard let dataProvider = dataProvider, barData = dataProvider.barData else { return false }\n        \n        return CGFloat(barData.yValCount) < CGFloat(dataProvider.maxVisibleValueCount) * viewPortHandler.scaleX\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Renderers/BubbleChartRenderer.swift",
    "content": "//\n//  BubbleChartRenderer.swift\n//  Charts\n//\n//  Bubble chart implementation:\n//    Copyright 2015 Pierre-Marc Airoldi\n//    Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n\npublic class BubbleChartRenderer: ChartDataRendererBase\n{\n    public weak var dataProvider: BubbleChartDataProvider?\n    \n    public init(dataProvider: BubbleChartDataProvider?, animator: ChartAnimator?, viewPortHandler: ChartViewPortHandler)\n    {\n        super.init(animator: animator, viewPortHandler: viewPortHandler)\n        \n        self.dataProvider = dataProvider\n    }\n    \n    public override func drawData(context context: CGContext)\n    {\n        guard let dataProvider = dataProvider, bubbleData = dataProvider.bubbleData else { return }\n        \n        for set in bubbleData.dataSets as! [IBubbleChartDataSet]\n        {\n            if set.isVisible && set.entryCount > 0\n            {\n                drawDataSet(context: context, dataSet: set)\n            }\n        }\n    }\n    \n    private func getShapeSize(entrySize entrySize: CGFloat, maxSize: CGFloat, reference: CGFloat) -> CGFloat\n    {\n        let factor: CGFloat = (maxSize == 0.0) ? 1.0 : sqrt(entrySize / maxSize)\n        let shapeSize: CGFloat = reference * factor\n        return shapeSize\n    }\n    \n    private var _pointBuffer = CGPoint()\n    private var _sizeBuffer = [CGPoint](count: 2, repeatedValue: CGPoint())\n    \n    public func drawDataSet(context context: CGContext, dataSet: IBubbleChartDataSet)\n    {\n        guard let\n            dataProvider = dataProvider,\n            animator = animator\n            else { return }\n        \n        let trans = dataProvider.getTransformer(dataSet.axisDependency)\n        \n        let phaseX = animator.phaseX\n        let phaseY = animator.phaseY\n        \n        let entryCount = dataSet.entryCount\n        \n        let valueToPixelMatrix = trans.valueToPixelMatrix\n        \n        guard let\n            entryFrom = dataSet.entryForXIndex(self.minX),\n            entryTo = dataSet.entryForXIndex(self.maxX)\n            else { return }\n        \n        let minx = max(dataSet.entryIndex(entry: entryFrom), 0)\n        let maxx = min(dataSet.entryIndex(entry: entryTo) + 1, entryCount)\n        \n        _sizeBuffer[0].x = 0.0\n        _sizeBuffer[0].y = 0.0\n        _sizeBuffer[1].x = 1.0\n        _sizeBuffer[1].y = 0.0\n        \n        trans.pointValuesToPixel(&_sizeBuffer)\n        \n        CGContextSaveGState(context)\n        \n        // calcualte the full width of 1 step on the x-axis\n        let maxBubbleWidth: CGFloat = abs(_sizeBuffer[1].x - _sizeBuffer[0].x)\n        let maxBubbleHeight: CGFloat = abs(viewPortHandler.contentBottom - viewPortHandler.contentTop)\n        let referenceSize: CGFloat = min(maxBubbleHeight, maxBubbleWidth)\n        \n        for j in minx ..< maxx\n        {\n            guard let entry = dataSet.entryForIndex(j) as? BubbleChartDataEntry else { continue }\n            \n            _pointBuffer.x = CGFloat(entry.xIndex - minx) * phaseX + CGFloat(minx)\n            _pointBuffer.y = CGFloat(entry.value) * phaseY\n            _pointBuffer = CGPointApplyAffineTransform(_pointBuffer, valueToPixelMatrix)\n            \n            let shapeSize = getShapeSize(entrySize: entry.size, maxSize: dataSet.maxSize, reference: referenceSize)\n            let shapeHalf = shapeSize / 2.0\n            \n            if (!viewPortHandler.isInBoundsTop(_pointBuffer.y + shapeHalf)\n                || !viewPortHandler.isInBoundsBottom(_pointBuffer.y - shapeHalf))\n            {\n                continue\n            }\n            \n            if (!viewPortHandler.isInBoundsLeft(_pointBuffer.x + shapeHalf))\n            {\n                continue\n            }\n            \n            if (!viewPortHandler.isInBoundsRight(_pointBuffer.x - shapeHalf))\n            {\n                break\n            }\n            \n            let color = dataSet.colorAt(entry.xIndex)\n            \n            let rect = CGRect(\n                x: _pointBuffer.x - shapeHalf,\n                y: _pointBuffer.y - shapeHalf,\n                width: shapeSize,\n                height: shapeSize\n            )\n\n            CGContextSetFillColorWithColor(context, color.CGColor)\n            CGContextFillEllipseInRect(context, rect)\n        }\n        \n        CGContextRestoreGState(context)\n    }\n    \n    public override func drawValues(context context: CGContext)\n    {\n        guard let\n            dataProvider = dataProvider,\n            bubbleData = dataProvider.bubbleData,\n            animator = animator\n            else { return }\n        \n        // if values are drawn\n        if (bubbleData.yValCount < Int(ceil(CGFloat(dataProvider.maxVisibleValueCount) * viewPortHandler.scaleX)))\n        {\n            guard let dataSets = bubbleData.dataSets as? [IBubbleChartDataSet] else { return }\n            \n            let phaseX = animator.phaseX\n            let phaseY = animator.phaseY\n            \n            var pt = CGPoint()\n            \n            for dataSet in dataSets\n            {\n                if !dataSet.isDrawValuesEnabled || dataSet.entryCount == 0\n                {\n                    continue\n                }\n                \n                let alpha = phaseX == 1 ? phaseY : phaseX\n                \n                guard let formatter = dataSet.valueFormatter else { continue }\n                \n                let trans = dataProvider.getTransformer(dataSet.axisDependency)\n                let valueToPixelMatrix = trans.valueToPixelMatrix\n                \n                let entryCount = dataSet.entryCount\n                \n                guard let\n                    entryFrom = dataSet.entryForXIndex(self.minX),\n                    entryTo = dataSet.entryForXIndex(self.maxX)\n                    else { continue }\n                \n                let minx = max(dataSet.entryIndex(entry: entryFrom), 0)\n                let maxx = min(dataSet.entryIndex(entry: entryTo) + 1, entryCount)\n                \n                for j in minx ..< maxx\n                {\n                    guard let e = dataSet.entryForIndex(j) as? BubbleChartDataEntry else { break }\n                    \n                    let valueTextColor = dataSet.valueTextColorAt(j).colorWithAlphaComponent(alpha)\n                    \n                    pt.x = CGFloat(e.xIndex - minx) * phaseX + CGFloat(minx)\n                    pt.y = CGFloat(e.value) * phaseY\n                    pt = CGPointApplyAffineTransform(pt, valueToPixelMatrix)\n                    \n                    if (!viewPortHandler.isInBoundsRight(pt.x))\n                    {\n                        break\n                    }\n                    \n                    if ((!viewPortHandler.isInBoundsLeft(pt.x) || !viewPortHandler.isInBoundsY(pt.y)))\n                    {\n                        continue\n                    }\n                    \n                    let text = formatter.stringFromNumber(e.size)\n                    \n                    // Larger font for larger bubbles?\n                    let valueFont = dataSet.valueFont\n                    let lineHeight = valueFont.lineHeight\n\n                    ChartUtils.drawText(\n                        context: context,\n                        text: text!,\n                        point: CGPoint(\n                            x: pt.x,\n                            y: pt.y - (0.5 * lineHeight)),\n                        align: .Center,\n                        attributes: [NSFontAttributeName: valueFont, NSForegroundColorAttributeName: valueTextColor])\n                }\n            }\n        }\n    }\n    \n    public override func drawExtras(context context: CGContext)\n    {\n        \n    }\n    \n    public override func drawHighlighted(context context: CGContext, indices: [ChartHighlight])\n    {\n        guard let\n            dataProvider = dataProvider,\n            bubbleData = dataProvider.bubbleData,\n            animator = animator\n            else { return }\n        \n        CGContextSaveGState(context)\n        \n        let phaseX = animator.phaseX\n        let phaseY = animator.phaseY\n        \n        for indice in indices\n        {\n            guard let dataSet = bubbleData.getDataSetByIndex(indice.dataSetIndex) as? IBubbleChartDataSet else { continue }\n            \n            if (!dataSet.isHighlightEnabled)\n            {\n                continue\n            }\n            \n            let entryFrom = dataSet.entryForXIndex(self.minX)\n            let entryTo = dataSet.entryForXIndex(self.maxX)\n            \n            let minx = max(dataSet.entryIndex(entry: entryFrom!), 0)\n            let maxx = min(dataSet.entryIndex(entry: entryTo!) + 1, dataSet.entryCount)\n            \n            let entry: BubbleChartDataEntry! = bubbleData.getEntryForHighlight(indice) as! BubbleChartDataEntry\n            if (entry === nil || entry.xIndex != indice.xIndex)\n            {\n                continue\n            }\n            \n            let trans = dataProvider.getTransformer(dataSet.axisDependency)\n            \n            _sizeBuffer[0].x = 0.0\n            _sizeBuffer[0].y = 0.0\n            _sizeBuffer[1].x = 1.0\n            _sizeBuffer[1].y = 0.0\n            \n            trans.pointValuesToPixel(&_sizeBuffer)\n            \n            // calcualte the full width of 1 step on the x-axis\n            let maxBubbleWidth: CGFloat = abs(_sizeBuffer[1].x - _sizeBuffer[0].x)\n            let maxBubbleHeight: CGFloat = abs(viewPortHandler.contentBottom - viewPortHandler.contentTop)\n            let referenceSize: CGFloat = min(maxBubbleHeight, maxBubbleWidth)\n\n            _pointBuffer.x = CGFloat(entry.xIndex - minx) * phaseX + CGFloat(minx)\n            _pointBuffer.y = CGFloat(entry.value) * phaseY\n            trans.pointValueToPixel(&_pointBuffer)\n            \n            let shapeSize = getShapeSize(entrySize: entry.size, maxSize: dataSet.maxSize, reference: referenceSize)\n            let shapeHalf = shapeSize / 2.0\n            \n            if (!viewPortHandler.isInBoundsTop(_pointBuffer.y + shapeHalf)\n                || !viewPortHandler.isInBoundsBottom(_pointBuffer.y - shapeHalf))\n            {\n                continue\n            }\n            \n            if (!viewPortHandler.isInBoundsLeft(_pointBuffer.x + shapeHalf))\n            {\n                continue\n            }\n            \n            if (!viewPortHandler.isInBoundsRight(_pointBuffer.x - shapeHalf))\n            {\n                break\n            }\n            \n            if (indice.xIndex < minx || indice.xIndex >= maxx)\n            {\n                continue\n            }\n            \n            let originalColor = dataSet.colorAt(entry.xIndex)\n            \n            var h: CGFloat = 0.0\n            var s: CGFloat = 0.0\n            var b: CGFloat = 0.0\n            var a: CGFloat = 0.0\n            \n            originalColor.getHue(&h, saturation: &s, brightness: &b, alpha: &a)\n            \n            let color = NSUIColor(hue: h, saturation: s, brightness: b * 0.5, alpha: a)\n            let rect = CGRect(\n                x: _pointBuffer.x - shapeHalf,\n                y: _pointBuffer.y - shapeHalf,\n                width: shapeSize,\n                height: shapeSize)\n\n            CGContextSetLineWidth(context, dataSet.highlightCircleWidth)\n            CGContextSetStrokeColorWithColor(context, color.CGColor)\n            CGContextStrokeEllipseInRect(context, rect)\n        }\n        \n        CGContextRestoreGState(context)\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Renderers/CandleStickChartRenderer.swift",
    "content": "//\n//  CandleStickChartRenderer.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n\npublic class CandleStickChartRenderer: LineScatterCandleRadarChartRenderer\n{\n    public weak var dataProvider: CandleChartDataProvider?\n    \n    public init(dataProvider: CandleChartDataProvider?, animator: ChartAnimator?, viewPortHandler: ChartViewPortHandler)\n    {\n        super.init(animator: animator, viewPortHandler: viewPortHandler)\n        \n        self.dataProvider = dataProvider\n    }\n    \n    public override func drawData(context context: CGContext)\n    {\n        guard let dataProvider = dataProvider, candleData = dataProvider.candleData else { return }\n\n        for set in candleData.dataSets as! [ICandleChartDataSet]\n        {\n            if set.isVisible && set.entryCount > 0\n            {\n                drawDataSet(context: context, dataSet: set)\n            }\n        }\n    }\n    \n    private var _shadowPoints = [CGPoint](count: 4, repeatedValue: CGPoint())\n    private var _rangePoints = [CGPoint](count: 2, repeatedValue: CGPoint())\n    private var _openPoints = [CGPoint](count: 2, repeatedValue: CGPoint())\n    private var _closePoints = [CGPoint](count: 2, repeatedValue: CGPoint())\n    private var _bodyRect = CGRect()\n    private var _lineSegments = [CGPoint](count: 2, repeatedValue: CGPoint())\n    \n    public func drawDataSet(context context: CGContext, dataSet: ICandleChartDataSet)\n    {\n        guard let\n            trans = dataProvider?.getTransformer(dataSet.axisDependency),\n            animator = animator\n            else { return }\n        \n        let phaseX = animator.phaseX\n        let phaseY = animator.phaseY\n        let barSpace = dataSet.barSpace\n        let showCandleBar = dataSet.showCandleBar\n        \n        let entryCount = dataSet.entryCount\n        \n        let minx = max(self.minX, 0)\n        let maxx = min(self.maxX + 1, entryCount)\n        \n        CGContextSaveGState(context)\n        \n        CGContextSetLineWidth(context, dataSet.shadowWidth)\n        \n        for j in minx ..< Int(ceil(CGFloat(maxx - minx) * phaseX + CGFloat(minx)))\n        {\n            // get the entry\n            guard let e = dataSet.entryForIndex(j) as? CandleChartDataEntry else { continue }\n            \n            let xIndex = e.xIndex\n            \n            if (xIndex < minx || xIndex >= maxx)\n            {\n                continue\n            }\n            \n            let open = e.open\n            let close = e.close\n            let high = e.high\n            let low = e.low\n            \n            if (showCandleBar)\n            {\n                // calculate the shadow\n                \n                _shadowPoints[0].x = CGFloat(xIndex)\n                _shadowPoints[1].x = CGFloat(xIndex)\n                _shadowPoints[2].x = CGFloat(xIndex)\n                _shadowPoints[3].x = CGFloat(xIndex)\n                \n                if (open > close)\n                {\n                    _shadowPoints[0].y = CGFloat(high) * phaseY\n                    _shadowPoints[1].y = CGFloat(open) * phaseY\n                    _shadowPoints[2].y = CGFloat(low) * phaseY\n                    _shadowPoints[3].y = CGFloat(close) * phaseY\n                }\n                else if (open < close)\n                {\n                    _shadowPoints[0].y = CGFloat(high) * phaseY\n                    _shadowPoints[1].y = CGFloat(close) * phaseY\n                    _shadowPoints[2].y = CGFloat(low) * phaseY\n                    _shadowPoints[3].y = CGFloat(open) * phaseY\n                }\n                else\n                {\n                    _shadowPoints[0].y = CGFloat(high) * phaseY\n                    _shadowPoints[1].y = CGFloat(open) * phaseY\n                    _shadowPoints[2].y = CGFloat(low) * phaseY\n                    _shadowPoints[3].y = _shadowPoints[1].y\n                }\n                \n                trans.pointValuesToPixel(&_shadowPoints)\n                \n                // draw the shadows\n                \n                var shadowColor: NSUIColor! = nil\n                if (dataSet.shadowColorSameAsCandle)\n                {\n                    if (open > close)\n                    {\n                        shadowColor = dataSet.decreasingColor ?? dataSet.colorAt(j)\n                    }\n                    else if (open < close)\n                    {\n                        shadowColor = dataSet.increasingColor ?? dataSet.colorAt(j)\n                    }\n                    else\n                    {\n                        shadowColor = dataSet.neutralColor ?? dataSet.colorAt(j)\n                    }\n                }\n                \n                if (shadowColor === nil)\n                {\n                    shadowColor = dataSet.shadowColor ?? dataSet.colorAt(j);\n                }\n                \n                CGContextSetStrokeColorWithColor(context, shadowColor.CGColor)\n                CGContextStrokeLineSegments(context, _shadowPoints, 4)\n                \n                // calculate the body\n                \n                _bodyRect.origin.x = CGFloat(xIndex) - 0.5 + barSpace\n                _bodyRect.origin.y = CGFloat(close) * phaseY\n                _bodyRect.size.width = (CGFloat(xIndex) + 0.5 - barSpace) - _bodyRect.origin.x\n                _bodyRect.size.height = (CGFloat(open) * phaseY) - _bodyRect.origin.y\n                \n                trans.rectValueToPixel(&_bodyRect)\n                \n                // draw body differently for increasing and decreasing entry\n                \n                if (open > close)\n                {\n                    let color = dataSet.decreasingColor ?? dataSet.colorAt(j)\n                    \n                    if (dataSet.isDecreasingFilled)\n                    {\n                        CGContextSetFillColorWithColor(context, color.CGColor)\n                        CGContextFillRect(context, _bodyRect)\n                    }\n                    else\n                    {\n                        CGContextSetStrokeColorWithColor(context, color.CGColor)\n                        CGContextStrokeRect(context, _bodyRect)\n                    }\n                }\n                else if (open < close)\n                {\n                    let color = dataSet.increasingColor ?? dataSet.colorAt(j)\n                    \n                    if (dataSet.isIncreasingFilled)\n                    {\n                        CGContextSetFillColorWithColor(context, color.CGColor)\n                        CGContextFillRect(context, _bodyRect)\n                    }\n                    else\n                    {\n                        CGContextSetStrokeColorWithColor(context, color.CGColor)\n                        CGContextStrokeRect(context, _bodyRect)\n                    }\n                }\n                else\n                {\n                    let color = dataSet.neutralColor ?? dataSet.colorAt(j)\n                    \n                    CGContextSetStrokeColorWithColor(context, color.CGColor)\n                    CGContextStrokeRect(context, _bodyRect)\n                }\n            }\n            else\n            {\n                _rangePoints[0].x = CGFloat(xIndex)\n                _rangePoints[0].y = CGFloat(high) * phaseY\n                _rangePoints[1].x = CGFloat(xIndex)\n                _rangePoints[1].y = CGFloat(low) * phaseY\n\n                _openPoints[0].x = CGFloat(xIndex) - 0.5 + barSpace\n                _openPoints[0].y = CGFloat(open) * phaseY\n                _openPoints[1].x = CGFloat(xIndex)\n                _openPoints[1].y = CGFloat(open) * phaseY\n\n                _closePoints[0].x = CGFloat(xIndex) + 0.5 - barSpace\n                _closePoints[0].y = CGFloat(close) * phaseY\n                _closePoints[1].x = CGFloat(xIndex)\n                _closePoints[1].y = CGFloat(close) * phaseY\n                \n                trans.pointValuesToPixel(&_rangePoints)\n                trans.pointValuesToPixel(&_openPoints)\n                trans.pointValuesToPixel(&_closePoints)\n                \n                // draw the ranges\n                var barColor: NSUIColor! = nil\n                \n                if (open > close)\n                {\n                    barColor = dataSet.decreasingColor ?? dataSet.colorAt(j)\n                }\n                else if (open < close)\n                {\n                    barColor = dataSet.increasingColor ?? dataSet.colorAt(j)\n                }\n                else\n                {\n                    barColor = dataSet.neutralColor ?? dataSet.colorAt(j)\n                }\n                \n                CGContextSetStrokeColorWithColor(context, barColor.CGColor)\n                CGContextStrokeLineSegments(context, _rangePoints, 2)\n                CGContextStrokeLineSegments(context, _openPoints, 2)\n                CGContextStrokeLineSegments(context, _closePoints, 2)\n            }\n        }\n        \n        CGContextRestoreGState(context)\n    }\n    \n    public override func drawValues(context context: CGContext)\n    {\n        guard let\n            dataProvider = dataProvider,\n            candleData = dataProvider.candleData,\n            animator = animator\n            else { return }\n        \n        // if values are drawn\n        if (candleData.yValCount < Int(ceil(CGFloat(dataProvider.maxVisibleValueCount) * viewPortHandler.scaleX)))\n        {\n            var dataSets = candleData.dataSets\n            \n            let phaseX = animator.phaseX\n            let phaseY = animator.phaseY\n            \n            var pt = CGPoint()\n            \n            for i in 0 ..< dataSets.count\n            {\n                let dataSet = dataSets[i]\n                \n                if !dataSet.isDrawValuesEnabled || dataSet.entryCount == 0\n                {\n                    continue\n                }\n                \n                let valueFont = dataSet.valueFont\n                \n                guard let formatter = dataSet.valueFormatter else { continue }\n                \n                let trans = dataProvider.getTransformer(dataSet.axisDependency)\n                let valueToPixelMatrix = trans.valueToPixelMatrix\n                \n                let entryCount = dataSet.entryCount\n                \n                let minx = max(self.minX, 0)\n                let maxx = min(self.maxX + 1, entryCount)\n                \n                let lineHeight = valueFont.lineHeight\n                let yOffset: CGFloat = lineHeight + 5.0\n                \n                for j in minx ..< Int(ceil(CGFloat(maxx - minx) * phaseX + CGFloat(minx)))\n                {\n                    guard let e = dataSet.entryForIndex(j) as? CandleChartDataEntry else { break }\n                    \n                    pt.x = CGFloat(e.xIndex)\n                    pt.y = CGFloat(e.high) * phaseY\n                    pt = CGPointApplyAffineTransform(pt, valueToPixelMatrix)\n                    \n                    if (!viewPortHandler.isInBoundsRight(pt.x))\n                    {\n                        break\n                    }\n                    \n                    if (!viewPortHandler.isInBoundsLeft(pt.x) || !viewPortHandler.isInBoundsY(pt.y))\n                    {\n                        continue\n                    }\n                    \n                    ChartUtils.drawText(\n                        context: context,\n                        text: formatter.stringFromNumber(e.high)!,\n                        point: CGPoint(\n                            x: pt.x,\n                            y: pt.y - yOffset),\n                        align: .Center,\n                        attributes: [NSFontAttributeName: valueFont, NSForegroundColorAttributeName: dataSet.valueTextColorAt(j)])\n                }\n            }\n        }\n    }\n    \n    public override func drawExtras(context context: CGContext)\n    {\n    }\n    \n    private var _highlightPointBuffer = CGPoint()\n    \n    public override func drawHighlighted(context context: CGContext, indices: [ChartHighlight])\n    {\n        guard let\n            dataProvider = dataProvider,\n            candleData = dataProvider.candleData,\n            animator = animator\n            else { return }\n        \n        CGContextSaveGState(context)\n        \n        for i in 0 ..< indices.count\n        {\n            let xIndex = indices[i].xIndex; // get the x-position\n            \n            guard let set = candleData.getDataSetByIndex(indices[i].dataSetIndex) as? ICandleChartDataSet else { continue }\n            \n            if (!set.isHighlightEnabled)\n            {\n                continue\n            }\n            \n            guard let e = set.entryForXIndex(xIndex) as? CandleChartDataEntry else { continue }\n            \n            if e.xIndex != xIndex\n            {\n                continue\n            }\n            \n            let trans = dataProvider.getTransformer(set.axisDependency)\n            \n            CGContextSetStrokeColorWithColor(context, set.highlightColor.CGColor)\n            CGContextSetLineWidth(context, set.highlightLineWidth)\n            if (set.highlightLineDashLengths != nil)\n            {\n                CGContextSetLineDash(context, set.highlightLineDashPhase, set.highlightLineDashLengths!, set.highlightLineDashLengths!.count)\n            }\n            else\n            {\n                CGContextSetLineDash(context, 0.0, nil, 0)\n            }\n            \n            let low = CGFloat(e.low) * animator.phaseY\n            let high = CGFloat(e.high) * animator.phaseY\n            let y = (low + high) / 2.0\n            \n            _highlightPointBuffer.x = CGFloat(xIndex)\n            _highlightPointBuffer.y = y\n            \n            trans.pointValueToPixel(&_highlightPointBuffer)\n            \n            // draw the lines\n            drawHighlightLines(context: context, point: _highlightPointBuffer, set: set)\n        }\n        \n        CGContextRestoreGState(context)\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ChartAxisRendererBase.swift",
    "content": "//\n//  ChartAxisRendererBase.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 3/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n\npublic class ChartAxisRendererBase: ChartRendererBase\n{\n    public var transformer: ChartTransformer!\n    \n    public override init()\n    {\n        super.init()\n    }\n    \n    public init(viewPortHandler: ChartViewPortHandler, transformer: ChartTransformer!)\n    {\n        super.init(viewPortHandler: viewPortHandler)\n        \n        self.transformer = transformer\n    }\n    \n    /// Draws the axis labels on the specified context\n    public func renderAxisLabels(context context: CGContext)\n    {\n        fatalError(\"renderAxisLabels() cannot be called on ChartAxisRendererBase\")\n    }\n    \n    /// Draws the grid lines belonging to the axis.\n    public func renderGridLines(context context: CGContext)\n    {\n        fatalError(\"renderGridLines() cannot be called on ChartAxisRendererBase\")\n    }\n    \n    /// Draws the line that goes alongside the axis.\n    public func renderAxisLine(context context: CGContext)\n    {\n        fatalError(\"renderAxisLine() cannot be called on ChartAxisRendererBase\")\n    }\n    \n    /// Draws the LimitLines associated with this axis to the screen.\n    public func renderLimitLines(context context: CGContext)\n    {\n        fatalError(\"renderLimitLines() cannot be called on ChartAxisRendererBase\")\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ChartDataRendererBase.swift",
    "content": "//\n//  ChartDataRendererBase.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\npublic class ChartDataRendererBase: ChartRendererBase\n{\n    public var animator: ChartAnimator?\n    \n    public init(animator: ChartAnimator?, viewPortHandler: ChartViewPortHandler)\n    {\n        super.init(viewPortHandler: viewPortHandler)\n        \n        self.animator = animator\n    }\n\n    public func drawData(context context: CGContext)\n    {\n        fatalError(\"drawData() cannot be called on ChartDataRendererBase\")\n    }\n    \n    public func drawValues(context context: CGContext)\n    {\n        fatalError(\"drawValues() cannot be called on ChartDataRendererBase\")\n    }\n    \n    public func drawExtras(context context: CGContext)\n    {\n        fatalError(\"drawExtras() cannot be called on ChartDataRendererBase\")\n    }\n    \n    /// Draws all highlight indicators for the values that are currently highlighted.\n    ///\n    /// - parameter indices: the highlighted values\n    public func drawHighlighted(context context: CGContext, indices: [ChartHighlight])\n    {\n        fatalError(\"drawHighlighted() cannot be called on ChartDataRendererBase\")\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ChartLegendRenderer.swift",
    "content": "//\n//  ChartLegendRenderer.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n\npublic class ChartLegendRenderer: ChartRendererBase\n{\n    /// the legend object this renderer renders\n    public var legend: ChartLegend?\n\n    public init(viewPortHandler: ChartViewPortHandler, legend: ChartLegend?)\n    {\n        super.init(viewPortHandler: viewPortHandler)\n        \n        self.legend = legend\n    }\n\n    /// Prepares the legend and calculates all needed forms, labels and colors.\n    public func computeLegend(data: ChartData)\n    {\n        guard let legend = legend else { return }\n        \n        if (!legend.isLegendCustom)\n        {\n            var labels = [String?]()\n            var colors = [NSUIColor?]()\n            \n            // loop for building up the colors and labels used in the legend\n            for i in 0..<data.dataSetCount\n            {\n                let dataSet = data.getDataSetByIndex(i)!\n                \n                var clrs: [NSUIColor] = dataSet.colors\n                let entryCount = dataSet.entryCount\n                \n                // if we have a barchart with stacked bars\n                if (dataSet is IBarChartDataSet && (dataSet as! IBarChartDataSet).isStacked)\n                {\n                    let bds = dataSet as! IBarChartDataSet\n                    var sLabels = bds.stackLabels\n                    \n                    for j in 0..<min(clrs.count, bds.stackSize)\n                    {\n                        labels.append(sLabels[j % sLabels.count])\n                        colors.append(clrs[j])\n                    }\n                    \n                    if (bds.label != nil)\n                    {\n                        // add the legend description label\n                        colors.append(nil)\n                        labels.append(bds.label)\n                    }\n                }\n                else if (dataSet is IPieChartDataSet)\n                {\n                    var xVals = data.xVals\n                    let pds = dataSet as! IPieChartDataSet\n                    \n                    for j in 0..<min(clrs.count, entryCount, xVals.count)\n                    {\n                        labels.append(xVals[j])\n                        colors.append(clrs[j])\n                    }\n                    \n                    if (pds.label != nil)\n                    {\n                        // add the legend description label\n                        colors.append(nil)\n                        labels.append(pds.label)\n                    }\n                }\n                else if (dataSet is ICandleChartDataSet\n                    && (dataSet as! ICandleChartDataSet).decreasingColor != nil)\n                {\n                    colors.append((dataSet as! ICandleChartDataSet).decreasingColor)\n                    colors.append((dataSet as! ICandleChartDataSet).increasingColor)\n                    labels.append(nil)\n                    labels.append(dataSet.label)\n                }\n                else\n                { // all others\n                    \n                    for j in 0..<min(clrs.count, entryCount)\n                    {\n                        // if multiple colors are set for a DataSet, group them\n                        if (j < clrs.count - 1 && j < entryCount - 1)\n                        {\n                            labels.append(nil)\n                        }\n                        else\n                        { // add label to the last entry\n                            labels.append(dataSet.label)\n                        }\n                        \n                        colors.append(clrs[j])\n                    }\n                }\n            }\n            \n            legend.colors = colors + legend._extraColors\n            legend.labels = labels + legend._extraLabels\n        }\n        \n        // calculate all dimensions of the legend\n        legend.calculateDimensions(labelFont: legend.font, viewPortHandler: viewPortHandler)\n    }\n    \n    public func renderLegend(context context: CGContext)\n    {\n        guard let legend = legend else { return }\n        \n        if !legend.enabled\n        {\n            return\n        }\n        \n        let labelFont = legend.font\n        let labelTextColor = legend.textColor\n        let labelLineHeight = labelFont.lineHeight\n        let formYOffset = labelLineHeight / 2.0\n\n        var labels = legend.labels\n        var colors = legend.colors\n        \n        let formSize = legend.formSize\n        let formToTextSpace = legend.formToTextSpace\n        let xEntrySpace = legend.xEntrySpace\n        let direction = legend.direction\n\n        // space between the entries\n        let stackSpace = legend.stackSpace\n\n        let yoffset = legend.yOffset\n        let xoffset = legend.xOffset\n        \n        let legendPosition = legend.position\n        \n        switch (legendPosition)\n        {\n        case\n        .BelowChartLeft,\n        .BelowChartRight,\n        .BelowChartCenter,\n        .AboveChartLeft,\n        .AboveChartRight,\n        .AboveChartCenter:\n            \n            let contentWidth: CGFloat = viewPortHandler.contentWidth\n            \n            var originPosX: CGFloat\n            \n            if (legendPosition == .BelowChartLeft || legendPosition == .AboveChartLeft)\n            {\n                originPosX = viewPortHandler.contentLeft + xoffset\n                \n                if (direction == .RightToLeft)\n                {\n                    originPosX += legend.neededWidth\n                }\n            }\n            else if (legendPosition == .BelowChartRight || legendPosition == .AboveChartRight)\n            {\n                originPosX = viewPortHandler.contentRight - xoffset\n                \n                if (direction == .LeftToRight)\n                {\n                    originPosX -= legend.neededWidth\n                }\n            }\n            else // .BelowChartCenter || .AboveChartCenter\n            {\n                originPosX = viewPortHandler.contentLeft + contentWidth / 2.0\n            }\n            \n            var calculatedLineSizes = legend.calculatedLineSizes\n            var calculatedLabelSizes = legend.calculatedLabelSizes\n            var calculatedLabelBreakPoints = legend.calculatedLabelBreakPoints\n            \n            var posX: CGFloat = originPosX\n            var posY: CGFloat\n            \n            if (legendPosition == .AboveChartLeft\n                || legendPosition == .AboveChartRight\n                || legendPosition == .AboveChartCenter)\n            {\n                posY = 0\n            }\n            else\n            {\n                posY = viewPortHandler.chartHeight - yoffset - legend.neededHeight\n            }\n            \n            var lineIndex: Int = 0\n            \n            \n            for i in 0..<labels.count\n            {\n                if (i < calculatedLabelBreakPoints.count && calculatedLabelBreakPoints[i])\n                {\n                    posX = originPosX\n                    posY += labelLineHeight\n                }\n                \n                if (posX == originPosX &&\n                    (legendPosition == .BelowChartCenter ||\n                    legendPosition == .AboveChartCenter) &&\n                    lineIndex < calculatedLineSizes.count)\n                {\n                    posX += (direction == .RightToLeft ? calculatedLineSizes[lineIndex].width : -calculatedLineSizes[lineIndex].width) / 2.0\n                    lineIndex += 1\n                }\n                \n                let drawingForm = colors[i] != nil\n                let isStacked = labels[i] == nil // grouped forms have null labels\n                \n                if (drawingForm)\n                {\n                    if (direction == .RightToLeft)\n                    {\n                        posX -= formSize\n                    }\n                    \n                    drawForm(context: context, x: posX, y: posY + formYOffset, colorIndex: i, legend: legend)\n                    \n                    if (direction == .LeftToRight)\n                    {\n                        posX += formSize\n                    }\n                }\n                \n                if (!isStacked)\n                {\n                    if (drawingForm)\n                    {\n                        posX += direction == .RightToLeft ? -formToTextSpace : formToTextSpace\n                    }\n                    \n                    if (direction == .RightToLeft)\n                    {\n                        posX -= calculatedLabelSizes[i].width\n                    }\n                    \n                    drawLabel(context: context, x: posX, y: posY, label: labels[i]!, font: labelFont, textColor: labelTextColor)\n                    \n                    if (direction == .LeftToRight)\n                    {\n                        posX += calculatedLabelSizes[i].width\n                    }\n                    \n                    posX += direction == .RightToLeft ? -xEntrySpace : xEntrySpace\n                }\n                else\n                {\n                    posX += direction == .RightToLeft ? -stackSpace : stackSpace\n                }\n            }\n            \n        case\n        .PiechartCenter,\n        .RightOfChart,\n        .RightOfChartCenter,\n        .RightOfChartInside,\n        .LeftOfChart,\n        .LeftOfChartCenter,\n        .LeftOfChartInside:\n            \n            // contains the stacked legend size in pixels\n            var stack = CGFloat(0.0)\n            var wasStacked = false\n            var posX: CGFloat = 0.0, posY: CGFloat = 0.0\n            \n            if (legendPosition == .PiechartCenter)\n            {\n                posX = viewPortHandler.chartWidth / 2.0 + (direction == .LeftToRight ? -legend.textWidthMax / 2.0 : legend.textWidthMax / 2.0)\n                posY = viewPortHandler.chartHeight / 2.0 - legend.neededHeight / 2.0 + legend.yOffset\n            }\n            else\n            {\n                let isRightAligned = legendPosition == .RightOfChart ||\n                    legendPosition == .RightOfChartCenter ||\n                    legendPosition == .RightOfChartInside\n                \n                if (isRightAligned)\n                {\n                    posX = viewPortHandler.chartWidth - xoffset\n                    if (direction == .LeftToRight)\n                    {\n                        posX -= legend.textWidthMax\n                    }\n                }\n                else\n                {\n                    posX = xoffset\n                    if (direction == .RightToLeft)\n                    {\n                        posX += legend.textWidthMax\n                    }\n                }\n                \n                switch legendPosition\n                {\n                case .RightOfChart, .LeftOfChart:\n                    posY = viewPortHandler.contentTop + yoffset\n                case .RightOfChartCenter, .LeftOfChartCenter:\n                    posY = viewPortHandler.chartHeight / 2.0 - legend.neededHeight / 2.0\n                default: // case .RightOfChartInside, .LeftOfChartInside\n                    posY = viewPortHandler.contentTop + yoffset\n                }\n            }\n            \n            for i in 0..<labels.count\n            {\n                let drawingForm = colors[i] != nil\n                var x = posX\n                \n                if (drawingForm)\n                {\n                    if (direction == .LeftToRight)\n                    {\n                        x += stack\n                    }\n                    else\n                    {\n                        x -= formSize - stack\n                    }\n                    \n                    drawForm(context: context, x: x, y: posY + formYOffset, colorIndex: i, legend: legend)\n                    \n                    if (direction == .LeftToRight)\n                    {\n                        x += formSize\n                    }\n                }\n                \n                if (labels[i] != nil)\n                {\n                    if (drawingForm && !wasStacked)\n                    {\n                        x += direction == .LeftToRight ? formToTextSpace : -formToTextSpace\n                    }\n                    else if (wasStacked)\n                    {\n                        x = posX\n                    }\n                    \n                    if (direction == .RightToLeft)\n                    {\n                        x -= (labels[i] as NSString!).sizeWithAttributes([NSFontAttributeName: labelFont]).width\n                    }\n                    \n                    if (!wasStacked)\n                    {\n                        drawLabel(context: context, x: x, y: posY, label: labels[i]!, font: labelFont, textColor: labelTextColor)\n                    }\n                    else\n                    {\n                        posY += labelLineHeight\n                        drawLabel(context: context, x: x, y: posY, label: labels[i]!, font: labelFont, textColor: labelTextColor)\n                    }\n                    \n                    // make a step down\n                    posY += labelLineHeight\n                    stack = 0.0\n                }\n                else\n                {\n                    stack += formSize + stackSpace\n                    wasStacked = true\n                }\n            }\n            \n        }\n    }\n\n    private var _formLineSegmentsBuffer = [CGPoint](count: 2, repeatedValue: CGPoint())\n    \n    /// Draws the Legend-form at the given position with the color at the given index.\n    public func drawForm(context context: CGContext, x: CGFloat, y: CGFloat, colorIndex: Int, legend: ChartLegend)\n    {\n        guard let formColor = legend.colors[colorIndex] where formColor != NSUIColor.clearColor() else {\n            return\n        }\n        \n        let formsize = legend.formSize\n        \n        CGContextSaveGState(context)\n        defer { CGContextRestoreGState(context) }\n        \n        switch (legend.form)\n        {\n        case .Circle:\n            CGContextSetFillColorWithColor(context, formColor.CGColor)\n            CGContextFillEllipseInRect(context, CGRect(x: x, y: y - formsize / 2.0, width: formsize, height: formsize))\n        case .Square:\n            CGContextSetFillColorWithColor(context, formColor.CGColor)\n            CGContextFillRect(context, CGRect(x: x, y: y - formsize / 2.0, width: formsize, height: formsize))\n        case .Line:\n            \n            CGContextSetLineWidth(context, legend.formLineWidth)\n            CGContextSetStrokeColorWithColor(context, formColor.CGColor)\n            \n            _formLineSegmentsBuffer[0].x = x\n            _formLineSegmentsBuffer[0].y = y\n            _formLineSegmentsBuffer[1].x = x + formsize\n            _formLineSegmentsBuffer[1].y = y\n            CGContextStrokeLineSegments(context, _formLineSegmentsBuffer, 2)\n        }\n    }\n\n    /// Draws the provided label at the given position.\n    public func drawLabel(context context: CGContext, x: CGFloat, y: CGFloat, label: String, font: NSUIFont, textColor: NSUIColor)\n    {\n        ChartUtils.drawText(context: context, text: label, point: CGPoint(x: x, y: y), align: .Left, attributes: [NSFontAttributeName: font, NSForegroundColorAttributeName: textColor])\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ChartRendererBase.swift",
    "content": "//\n//  ChartRendererBase.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 3/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\npublic class ChartRendererBase: NSObject\n{\n    /// the component that handles the drawing area of the chart and it's offsets\n    public var viewPortHandler: ChartViewPortHandler!\n    \n    /// the minimum value on the x-axis that should be plotted\n    public var minX: Int = 0\n    \n    /// the maximum value on the x-axis that should be plotted\n    public var maxX: Int = 0\n    \n    public override init()\n    {\n        super.init()\n    }\n    \n    public init(viewPortHandler: ChartViewPortHandler)\n    {\n        super.init()\n        self.viewPortHandler = viewPortHandler\n    }\n    \n    /// Calculates the minimum and maximum x-value the chart can currently display (with the given zoom level).\n    public func calcXBounds(chart chart: BarLineChartViewBase, xAxisModulus: Int)\n    {\n        let low = chart.lowestVisibleXIndex\n        let high = chart.highestVisibleXIndex\n        \n        let subLow = (low % xAxisModulus == 0) ? xAxisModulus : 0\n        \n        minX = max((low / xAxisModulus) * (xAxisModulus) - subLow, 0)\n        maxX = min((high / xAxisModulus) * (xAxisModulus) + xAxisModulus, Int(chart.chartXMax))\n    }\n}\n        "
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ChartXAxisRenderer.swift",
    "content": "//\n//  ChartXAxisRenderer.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 3/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n\npublic class ChartXAxisRenderer: ChartAxisRendererBase\n{\n    public var xAxis: ChartXAxis?\n  \n    public init(viewPortHandler: ChartViewPortHandler, xAxis: ChartXAxis, transformer: ChartTransformer!)\n    {\n        super.init(viewPortHandler: viewPortHandler, transformer: transformer)\n        \n        self.xAxis = xAxis\n    }\n    \n    public func computeAxis(xValAverageLength xValAverageLength: Double, xValues: [String?])\n    {\n        guard let xAxis = xAxis else { return }\n        \n        var a = \"\"\n        \n        let max = Int(round(xValAverageLength + Double(xAxis.spaceBetweenLabels)))\n        \n        for _ in 0 ..< max\n        {\n            a += \"h\"\n        }\n        \n        let widthText = a as NSString\n        \n        let labelSize = widthText.sizeWithAttributes([NSFontAttributeName: xAxis.labelFont])\n        \n        let labelWidth = labelSize.width\n        let labelHeight = labelSize.height\n        \n        let labelRotatedSize = ChartUtils.sizeOfRotatedRectangle(labelSize, degrees: xAxis.labelRotationAngle)\n        \n        xAxis.labelWidth = labelWidth\n        xAxis.labelHeight = labelHeight\n        xAxis.labelRotatedWidth = labelRotatedSize.width\n        xAxis.labelRotatedHeight = labelRotatedSize.height\n        \n        xAxis.values = xValues\n    }\n    \n    public override func renderAxisLabels(context context: CGContext)\n    {\n        guard let xAxis = xAxis else { return }\n        \n        if (!xAxis.isEnabled || !xAxis.isDrawLabelsEnabled)\n        {\n            return\n        }\n        \n        let yOffset = xAxis.yOffset\n        \n        if (xAxis.labelPosition == .Top)\n        {\n            drawLabels(context: context, pos: viewPortHandler.contentTop - yOffset, anchor: CGPoint(x: 0.5, y: 1.0))\n        }\n        else if (xAxis.labelPosition == .TopInside)\n        {\n            drawLabels(context: context, pos: viewPortHandler.contentTop + yOffset + xAxis.labelRotatedHeight, anchor: CGPoint(x: 0.5, y: 1.0))\n        }\n        else if (xAxis.labelPosition == .Bottom)\n        {\n            drawLabels(context: context, pos: viewPortHandler.contentBottom + yOffset, anchor: CGPoint(x: 0.5, y: 0.0))\n        }\n        else if (xAxis.labelPosition == .BottomInside)\n        {\n            drawLabels(context: context, pos: viewPortHandler.contentBottom - yOffset - xAxis.labelRotatedHeight, anchor: CGPoint(x: 0.5, y: 0.0))\n        }\n        else\n        { // BOTH SIDED\n            drawLabels(context: context, pos: viewPortHandler.contentTop - yOffset, anchor: CGPoint(x: 0.5, y: 1.0))\n            drawLabels(context: context, pos: viewPortHandler.contentBottom + yOffset, anchor: CGPoint(x: 0.5, y: 0.0))\n        }\n    }\n    \n    private var _axisLineSegmentsBuffer = [CGPoint](count: 2, repeatedValue: CGPoint())\n    \n    public override func renderAxisLine(context context: CGContext)\n    {\n        guard let xAxis = xAxis else { return }\n        \n        if (!xAxis.isEnabled || !xAxis.isDrawAxisLineEnabled)\n        {\n            return\n        }\n        \n        CGContextSaveGState(context)\n        \n        CGContextSetStrokeColorWithColor(context, xAxis.axisLineColor.CGColor)\n        CGContextSetLineWidth(context, xAxis.axisLineWidth)\n        if (xAxis.axisLineDashLengths != nil)\n        {\n            CGContextSetLineDash(context, xAxis.axisLineDashPhase, xAxis.axisLineDashLengths, xAxis.axisLineDashLengths.count)\n        }\n        else\n        {\n            CGContextSetLineDash(context, 0.0, nil, 0)\n        }\n\n        if (xAxis.labelPosition == .Top\n                || xAxis.labelPosition == .TopInside\n                || xAxis.labelPosition == .BothSided)\n        {\n            _axisLineSegmentsBuffer[0].x = viewPortHandler.contentLeft\n            _axisLineSegmentsBuffer[0].y = viewPortHandler.contentTop\n            _axisLineSegmentsBuffer[1].x = viewPortHandler.contentRight\n            _axisLineSegmentsBuffer[1].y = viewPortHandler.contentTop\n            CGContextStrokeLineSegments(context, _axisLineSegmentsBuffer, 2)\n        }\n\n        if (xAxis.labelPosition == .Bottom\n                || xAxis.labelPosition == .BottomInside\n                || xAxis.labelPosition == .BothSided)\n        {\n            _axisLineSegmentsBuffer[0].x = viewPortHandler.contentLeft\n            _axisLineSegmentsBuffer[0].y = viewPortHandler.contentBottom\n            _axisLineSegmentsBuffer[1].x = viewPortHandler.contentRight\n            _axisLineSegmentsBuffer[1].y = viewPortHandler.contentBottom\n            CGContextStrokeLineSegments(context, _axisLineSegmentsBuffer, 2)\n        }\n        \n        CGContextRestoreGState(context)\n    }\n    \n    /// draws the x-labels on the specified y-position\n    public func drawLabels(context context: CGContext, pos: CGFloat, anchor: CGPoint)\n    {\n        guard let xAxis = xAxis else { return }\n        \n        let paraStyle = NSParagraphStyle.defaultParagraphStyle().mutableCopy() as! NSMutableParagraphStyle\n        paraStyle.alignment = .Center\n        \n        let labelAttrs = [NSFontAttributeName: xAxis.labelFont,\n            NSForegroundColorAttributeName: xAxis.labelTextColor,\n            NSParagraphStyleAttributeName: paraStyle]\n        let labelRotationAngleRadians = xAxis.labelRotationAngle * ChartUtils.Math.FDEG2RAD\n        \n        let valueToPixelMatrix = transformer.valueToPixelMatrix\n        \n        var position = CGPoint(x: 0.0, y: 0.0)\n        \n        var labelMaxSize = CGSize()\n        \n        if (xAxis.isWordWrapEnabled)\n        {\n            labelMaxSize.width = xAxis.wordWrapWidthPercent * valueToPixelMatrix.a\n        }\n        \n        for i in self.minX.stride(to: min(self.maxX + 1, xAxis.values.count), by: xAxis.axisLabelModulus)\n        {\n            let label = xAxis.values[i]\n            if (label == nil)\n            {\n                continue\n            }\n            \n            position.x = CGFloat(i)\n            position.y = 0.0\n            position = CGPointApplyAffineTransform(position, valueToPixelMatrix)\n            \n            if (viewPortHandler.isInBoundsX(position.x))\n            {\n                let labelns = label! as NSString\n                \n                if (xAxis.isAvoidFirstLastClippingEnabled)\n                {\n                    // avoid clipping of the last\n                    if (i == xAxis.values.count - 1 && xAxis.values.count > 1)\n                    {\n                        let width = labelns.boundingRectWithSize(labelMaxSize, options: .UsesLineFragmentOrigin, attributes: labelAttrs, context: nil).size.width\n                        \n                        if (width > viewPortHandler.offsetRight * 2.0\n                            && position.x + width > viewPortHandler.chartWidth)\n                        {\n                            position.x -= width / 2.0\n                        }\n                    }\n                    else if (i == 0)\n                    { // avoid clipping of the first\n                        let width = labelns.boundingRectWithSize(labelMaxSize, options: .UsesLineFragmentOrigin, attributes: labelAttrs, context: nil).size.width\n                        position.x += width / 2.0\n                    }\n                }\n                \n                drawLabel(context: context, label: label!, xIndex: i, x: position.x, y: pos, attributes: labelAttrs, constrainedToSize: labelMaxSize, anchor: anchor, angleRadians: labelRotationAngleRadians)\n            }\n        }\n    }\n    \n    public func drawLabel(context context: CGContext, label: String, xIndex: Int, x: CGFloat, y: CGFloat, attributes: [String: NSObject], constrainedToSize: CGSize, anchor: CGPoint, angleRadians: CGFloat)\n    {\n        guard let xAxis = xAxis else { return }\n        \n        let formattedLabel = xAxis.valueFormatter?.stringForXValue(xIndex, original: label, viewPortHandler: viewPortHandler) ?? label\n        ChartUtils.drawMultilineText(context: context, text: formattedLabel, point: CGPoint(x: x, y: y), attributes: attributes, constrainedToSize: constrainedToSize, anchor: anchor, angleRadians: angleRadians)\n    }\n    \n    private var _gridLineSegmentsBuffer = [CGPoint](count: 2, repeatedValue: CGPoint())\n    \n    public override func renderGridLines(context context: CGContext)\n    {\n        guard let xAxis = xAxis else { return }\n        \n        if (!xAxis.isDrawGridLinesEnabled || !xAxis.isEnabled)\n        {\n            return\n        }\n        \n        CGContextSaveGState(context)\n        \n        CGContextSetShouldAntialias(context, xAxis.gridAntialiasEnabled)\n        CGContextSetStrokeColorWithColor(context, xAxis.gridColor.CGColor)\n        CGContextSetLineWidth(context, xAxis.gridLineWidth)\n        CGContextSetLineCap(context, xAxis.gridLineCap)\n        \n        if (xAxis.gridLineDashLengths != nil)\n        {\n            CGContextSetLineDash(context, xAxis.gridLineDashPhase, xAxis.gridLineDashLengths, xAxis.gridLineDashLengths.count)\n        }\n        else\n        {\n            CGContextSetLineDash(context, 0.0, nil, 0)\n        }\n        \n        let valueToPixelMatrix = transformer.valueToPixelMatrix\n        \n        var position = CGPoint(x: 0.0, y: 0.0)\n        \n        for i in self.minX.stride(to: self.maxX, by: xAxis.axisLabelModulus)\n        {\n            position.x = CGFloat(i)\n            position.y = 0.0\n            position = CGPointApplyAffineTransform(position, valueToPixelMatrix)\n            \n            if (position.x >= viewPortHandler.offsetLeft\n                && position.x <= viewPortHandler.chartWidth)\n            {\n                _gridLineSegmentsBuffer[0].x = position.x\n                _gridLineSegmentsBuffer[0].y = viewPortHandler.contentTop\n                _gridLineSegmentsBuffer[1].x = position.x\n                _gridLineSegmentsBuffer[1].y = viewPortHandler.contentBottom\n                CGContextStrokeLineSegments(context, _gridLineSegmentsBuffer, 2)\n            }\n        }\n        \n        CGContextRestoreGState(context)\n    }\n    \n    public override func renderLimitLines(context context: CGContext)\n    {\n        guard let xAxis = xAxis else { return }\n        \n        var limitLines = xAxis.limitLines\n        \n        if (limitLines.count == 0)\n        {\n            return\n        }\n        \n        CGContextSaveGState(context)\n        \n        let trans = transformer.valueToPixelMatrix\n        \n        var position = CGPoint(x: 0.0, y: 0.0)\n        \n        for i in 0 ..< limitLines.count\n        {\n            let l = limitLines[i]\n            \n            if !l.isEnabled\n            {\n                continue\n            }\n\n            position.x = CGFloat(l.limit)\n            position.y = 0.0\n            position = CGPointApplyAffineTransform(position, trans)\n            \n            renderLimitLineLine(context: context, limitLine: l, position: position)\n            renderLimitLineLabel(context: context, limitLine: l, position: position, yOffset: 2.0 + l.yOffset)\n        }\n        \n        CGContextRestoreGState(context)\n    }\n    \n    private var _limitLineSegmentsBuffer = [CGPoint](count: 2, repeatedValue: CGPoint())\n    \n    public func renderLimitLineLine(context context: CGContext, limitLine: ChartLimitLine, position: CGPoint)\n    {\n        _limitLineSegmentsBuffer[0].x = position.x\n        _limitLineSegmentsBuffer[0].y = viewPortHandler.contentTop\n        _limitLineSegmentsBuffer[1].x = position.x\n        _limitLineSegmentsBuffer[1].y = viewPortHandler.contentBottom\n        \n        CGContextSetStrokeColorWithColor(context, limitLine.lineColor.CGColor)\n        CGContextSetLineWidth(context, limitLine.lineWidth)\n        if (limitLine.lineDashLengths != nil)\n        {\n            CGContextSetLineDash(context, limitLine.lineDashPhase, limitLine.lineDashLengths!, limitLine.lineDashLengths!.count)\n        }\n        else\n        {\n            CGContextSetLineDash(context, 0.0, nil, 0)\n        }\n        \n        CGContextStrokeLineSegments(context, _limitLineSegmentsBuffer, 2)\n    }\n    \n    public func renderLimitLineLabel(context context: CGContext, limitLine: ChartLimitLine, position: CGPoint, yOffset: CGFloat)\n    {\n        let label = limitLine.label\n        \n        // if drawing the limit-value label is enabled\n        if (label.characters.count > 0)\n        {\n            let labelLineHeight = limitLine.valueFont.lineHeight\n            \n            let xOffset: CGFloat = limitLine.lineWidth + limitLine.xOffset\n            \n            if (limitLine.labelPosition == .RightTop)\n            {\n                ChartUtils.drawText(context: context,\n                    text: label,\n                    point: CGPoint(\n                        x: position.x + xOffset,\n                        y: viewPortHandler.contentTop + yOffset),\n                    align: .Left,\n                    attributes: [NSFontAttributeName: limitLine.valueFont, NSForegroundColorAttributeName: limitLine.valueTextColor])\n            }\n            else if (limitLine.labelPosition == .RightBottom)\n            {\n                ChartUtils.drawText(context: context,\n                    text: label,\n                    point: CGPoint(\n                        x: position.x + xOffset,\n                        y: viewPortHandler.contentBottom - labelLineHeight - yOffset),\n                    align: .Left,\n                    attributes: [NSFontAttributeName: limitLine.valueFont, NSForegroundColorAttributeName: limitLine.valueTextColor])\n            }\n            else if (limitLine.labelPosition == .LeftTop)\n            {\n                ChartUtils.drawText(context: context,\n                    text: label,\n                    point: CGPoint(\n                        x: position.x - xOffset,\n                        y: viewPortHandler.contentTop + yOffset),\n                    align: .Right,\n                    attributes: [NSFontAttributeName: limitLine.valueFont, NSForegroundColorAttributeName: limitLine.valueTextColor])\n            }\n            else\n            {\n                ChartUtils.drawText(context: context,\n                    text: label,\n                    point: CGPoint(\n                        x: position.x - xOffset,\n                        y: viewPortHandler.contentBottom - labelLineHeight - yOffset),\n                    align: .Right,\n                    attributes: [NSFontAttributeName: limitLine.valueFont, NSForegroundColorAttributeName: limitLine.valueTextColor])\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ChartXAxisRendererBarChart.swift",
    "content": "//\n//  ChartXAxisRendererBarChart.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 3/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n\npublic class ChartXAxisRendererBarChart: ChartXAxisRenderer\n{\n    public weak var chart: BarChartView?\n    \n    public init(viewPortHandler: ChartViewPortHandler, xAxis: ChartXAxis, transformer: ChartTransformer!, chart: BarChartView)\n    {\n        super.init(viewPortHandler: viewPortHandler, xAxis: xAxis, transformer: transformer)\n        \n        self.chart = chart\n    }\n    \n    /// draws the x-labels on the specified y-position\n    public override func drawLabels(context context: CGContext, pos: CGFloat, anchor: CGPoint)\n    {\n        guard let\n            xAxis = xAxis,\n            barData = chart?.data as? BarChartData\n            else { return }\n        \n        let paraStyle = NSParagraphStyle.defaultParagraphStyle().mutableCopy() as! NSMutableParagraphStyle\n        paraStyle.alignment = .Center\n        \n        let labelAttrs = [NSFontAttributeName: xAxis.labelFont,\n            NSForegroundColorAttributeName: xAxis.labelTextColor,\n            NSParagraphStyleAttributeName: paraStyle]\n        let labelRotationAngleRadians = xAxis.labelRotationAngle * ChartUtils.Math.FDEG2RAD\n        \n        let step = barData.dataSetCount\n        \n        let valueToPixelMatrix = transformer.valueToPixelMatrix\n        \n        var position = CGPoint(x: 0.0, y: 0.0)\n        \n        var labelMaxSize = CGSize()\n        \n        if (xAxis.isWordWrapEnabled)\n        {\n            labelMaxSize.width = xAxis.wordWrapWidthPercent * valueToPixelMatrix.a\n        }\n        \n        for i in self.minX.stride(to: min(self.maxX + 1, xAxis.values.count), by: xAxis.axisLabelModulus)\n        {\n            let label = i >= 0 && i < xAxis.values.count ? xAxis.values[i] : nil\n            if (label == nil)\n            {\n                continue\n            }\n            \n            position.x = CGFloat(i * step) + CGFloat(i) * barData.groupSpace + barData.groupSpace / 2.0\n            position.y = 0.0\n            \n            // consider groups (center label for each group)\n            if (step > 1)\n            {\n                position.x += (CGFloat(step) - 1.0) / 2.0\n            }\n            \n            position = CGPointApplyAffineTransform(position, valueToPixelMatrix)\n            \n            if (viewPortHandler.isInBoundsX(position.x))\n            {\n                if (xAxis.isAvoidFirstLastClippingEnabled)\n                {\n                    // avoid clipping of the last\n                    if (i == xAxis.values.count - 1)\n                    {\n                        let width = label!.sizeWithAttributes(labelAttrs).width\n                        \n                        if (position.x + width / 2.0 > viewPortHandler.contentRight)\n                        {\n                            position.x = viewPortHandler.contentRight - (width / 2.0)\n                        }\n                    }\n                    else if (i == 0)\n                    { // avoid clipping of the first\n                        let width = label!.sizeWithAttributes(labelAttrs).width\n                        \n                        if (position.x - width / 2.0 < viewPortHandler.contentLeft)\n                        {\n                            position.x = viewPortHandler.contentLeft + (width / 2.0)\n                        }\n                    }\n                }\n                \n                drawLabel(context: context, label: label!, xIndex: i, x: position.x, y: pos, attributes: labelAttrs, constrainedToSize: labelMaxSize, anchor: anchor, angleRadians: labelRotationAngleRadians)\n            }\n        }\n    }\n    \n    private var _gridLineSegmentsBuffer = [CGPoint](count: 2, repeatedValue: CGPoint())\n    \n    public override func renderGridLines(context context: CGContext)\n    {\n        guard let\n            xAxis = xAxis,\n            barData = chart?.data as? BarChartData\n            else { return }\n        \n        if (!xAxis.isDrawGridLinesEnabled || !xAxis.isEnabled)\n        {\n            return\n        }\n        \n        let step = barData.dataSetCount\n        \n        CGContextSaveGState(context)\n        \n        CGContextSetShouldAntialias(context, xAxis.gridAntialiasEnabled)\n        CGContextSetStrokeColorWithColor(context, xAxis.gridColor.CGColor)\n        CGContextSetLineWidth(context, xAxis.gridLineWidth)\n        CGContextSetLineCap(context, xAxis.gridLineCap)\n        \n        if (xAxis.gridLineDashLengths != nil)\n        {\n            CGContextSetLineDash(context, xAxis.gridLineDashPhase, xAxis.gridLineDashLengths, xAxis.gridLineDashLengths.count)\n        }\n        else\n        {\n            CGContextSetLineDash(context, 0.0, nil, 0)\n        }\n        \n        let valueToPixelMatrix = transformer.valueToPixelMatrix\n        \n        var position = CGPoint(x: 0.0, y: 0.0)\n        \n        for i in self.minX.stride(to: self.maxX, by: xAxis.axisLabelModulus)\n        {\n            position.x = CGFloat(i * step) + CGFloat(i) * barData.groupSpace - 0.5\n            position.y = 0.0\n            position = CGPointApplyAffineTransform(position, valueToPixelMatrix)\n            \n            if (viewPortHandler.isInBoundsX(position.x))\n            {\n                _gridLineSegmentsBuffer[0].x = position.x\n                _gridLineSegmentsBuffer[0].y = viewPortHandler.contentTop\n                _gridLineSegmentsBuffer[1].x = position.x\n                _gridLineSegmentsBuffer[1].y = viewPortHandler.contentBottom\n                CGContextStrokeLineSegments(context, _gridLineSegmentsBuffer, 2)\n            }\n        }\n        \n        CGContextRestoreGState(context)\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ChartXAxisRendererHorizontalBarChart.swift",
    "content": "//\n//  ChartXAxisRendererHorizontalBarChart.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 3/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n\npublic class ChartXAxisRendererHorizontalBarChart: ChartXAxisRendererBarChart\n{\n    public override init(viewPortHandler: ChartViewPortHandler, xAxis: ChartXAxis, transformer: ChartTransformer!, chart: BarChartView)\n    {\n        super.init(viewPortHandler: viewPortHandler, xAxis: xAxis, transformer: transformer, chart: chart)\n    }\n    \n    public override func computeAxis(xValAverageLength xValAverageLength: Double, xValues: [String?])\n    {\n        guard let xAxis = xAxis else { return }\n        \n        xAxis.values = xValues\n       \n        let longest = xAxis.getLongestLabel() as NSString\n        \n        let labelSize = longest.sizeWithAttributes([NSFontAttributeName: xAxis.labelFont])\n        \n        let labelWidth = floor(labelSize.width + xAxis.xOffset * 3.5)\n        let labelHeight = labelSize.height\n        \n        let labelRotatedSize = ChartUtils.sizeOfRotatedRectangle(rectangleWidth: labelSize.width, rectangleHeight:  labelHeight, degrees: xAxis.labelRotationAngle)\n        \n        xAxis.labelWidth = labelWidth\n        xAxis.labelHeight = labelHeight\n        xAxis.labelRotatedWidth = round(labelRotatedSize.width + xAxis.xOffset * 3.5)\n        xAxis.labelRotatedHeight = round(labelRotatedSize.height)\n    }\n\n    public override func renderAxisLabels(context context: CGContext)\n    {\n        guard let xAxis = xAxis else { return }\n        \n        if !xAxis.isEnabled || !xAxis.isDrawLabelsEnabled || chart?.data === nil\n        {\n            return\n        }\n        \n        let xoffset = xAxis.xOffset\n        \n        if (xAxis.labelPosition == .Top)\n        {\n            drawLabels(context: context, pos: viewPortHandler.contentRight + xoffset, anchor: CGPoint(x: 0.0, y: 0.5))\n        }\n        else if (xAxis.labelPosition == .TopInside)\n        {\n            drawLabels(context: context, pos: viewPortHandler.contentRight - xoffset, anchor: CGPoint(x: 1.0, y: 0.5))\n        }\n        else if (xAxis.labelPosition == .Bottom)\n        {\n            drawLabels(context: context, pos: viewPortHandler.contentLeft - xoffset, anchor: CGPoint(x: 1.0, y: 0.5))\n        }\n        else if (xAxis.labelPosition == .BottomInside)\n        {\n            drawLabels(context: context, pos: viewPortHandler.contentLeft + xoffset, anchor: CGPoint(x: 0.0, y: 0.5))\n        }\n        else\n        { // BOTH SIDED\n            drawLabels(context: context, pos: viewPortHandler.contentRight + xoffset, anchor: CGPoint(x: 0.0, y: 0.5))\n            drawLabels(context: context, pos: viewPortHandler.contentLeft - xoffset, anchor: CGPoint(x: 1.0, y: 0.5))\n        }\n    }\n\n    /// draws the x-labels on the specified y-position\n    public override func drawLabels(context context: CGContext, pos: CGFloat, anchor: CGPoint)\n    {\n        guard let\n            xAxis = xAxis,\n            bd = chart?.data as? BarChartData\n            else { return }\n        \n        let labelFont = xAxis.labelFont\n        let labelTextColor = xAxis.labelTextColor\n        let labelRotationAngleRadians = xAxis.labelRotationAngle * ChartUtils.Math.FDEG2RAD\n        \n        // pre allocate to save performance (dont allocate in loop)\n        var position = CGPoint(x: 0.0, y: 0.0)\n        \n        let step = bd.dataSetCount\n        \n        for i in self.minX.stride(to: min(self.maxX + 1, xAxis.values.count), by: xAxis.axisLabelModulus)\n        {\n            let label = xAxis.values[i]\n            \n            if (label == nil)\n            {\n                continue\n            }\n            \n            position.x = 0.0\n            position.y = CGFloat(i * step) + CGFloat(i) * bd.groupSpace + bd.groupSpace / 2.0\n            \n            // consider groups (center label for each group)\n            if (step > 1)\n            {\n                position.y += (CGFloat(step) - 1.0) / 2.0\n            }\n            \n            transformer.pointValueToPixel(&position)\n            \n            if (viewPortHandler.isInBoundsY(position.y))\n            {\n                drawLabel(context: context, label: label!, xIndex: i, x: pos, y: position.y, attributes: [NSFontAttributeName: labelFont, NSForegroundColorAttributeName: labelTextColor], anchor: anchor, angleRadians: labelRotationAngleRadians)\n            }\n        }\n    }\n    \n    public func drawLabel(context context: CGContext, label: String, xIndex: Int, x: CGFloat, y: CGFloat, attributes: [String: NSObject], anchor: CGPoint, angleRadians: CGFloat)\n    {\n        guard let xAxis = xAxis else { return }\n        \n        let formattedLabel = xAxis.valueFormatter?.stringForXValue(xIndex, original: label, viewPortHandler: viewPortHandler) ?? label\n        ChartUtils.drawText(context: context, text: formattedLabel, point: CGPoint(x: x, y: y), attributes: attributes, anchor: anchor, angleRadians: angleRadians)\n    }\n    \n    private var _gridLineSegmentsBuffer = [CGPoint](count: 2, repeatedValue: CGPoint())\n    \n    public override func renderGridLines(context context: CGContext)\n    {\n        guard let\n            xAxis = xAxis,\n            bd = chart?.data as? BarChartData\n            else { return }\n        \n        if !xAxis.isEnabled || !xAxis.isDrawGridLinesEnabled\n        {\n            return\n        }\n        \n        CGContextSaveGState(context)\n        \n        CGContextSetShouldAntialias(context, xAxis.gridAntialiasEnabled)\n        CGContextSetStrokeColorWithColor(context, xAxis.gridColor.CGColor)\n        CGContextSetLineWidth(context, xAxis.gridLineWidth)\n        CGContextSetLineCap(context, xAxis.gridLineCap)\n        \n        if (xAxis.gridLineDashLengths != nil)\n        {\n            CGContextSetLineDash(context, xAxis.gridLineDashPhase, xAxis.gridLineDashLengths, xAxis.gridLineDashLengths.count)\n        }\n        else\n        {\n            CGContextSetLineDash(context, 0.0, nil, 0)\n        }\n        \n        var position = CGPoint(x: 0.0, y: 0.0)\n        \n        // take into consideration that multiple DataSets increase _deltaX\n        let step = bd.dataSetCount\n        \n        for i in self.minX.stride(to: min(self.maxX + 1, xAxis.values.count), by: xAxis.axisLabelModulus)\n        {\n            position.x = 0.0\n            position.y = CGFloat(i * step) + CGFloat(i) * bd.groupSpace - 0.5\n            \n            transformer.pointValueToPixel(&position)\n            \n            if (viewPortHandler.isInBoundsY(position.y))\n            {\n                _gridLineSegmentsBuffer[0].x = viewPortHandler.contentLeft\n                _gridLineSegmentsBuffer[0].y = position.y\n                _gridLineSegmentsBuffer[1].x = viewPortHandler.contentRight\n                _gridLineSegmentsBuffer[1].y = position.y\n                CGContextStrokeLineSegments(context, _gridLineSegmentsBuffer, 2)\n            }\n        }\n        \n        CGContextRestoreGState(context)\n    }\n    \n    private var _axisLineSegmentsBuffer = [CGPoint](count: 2, repeatedValue: CGPoint())\n    \n    public override func renderAxisLine(context context: CGContext)\n    {\n        guard let xAxis = xAxis else { return }\n        \n        if (!xAxis.isEnabled || !xAxis.isDrawAxisLineEnabled)\n        {\n            return\n        }\n        \n        CGContextSaveGState(context)\n        \n        CGContextSetStrokeColorWithColor(context, xAxis.axisLineColor.CGColor)\n        CGContextSetLineWidth(context, xAxis.axisLineWidth)\n        if (xAxis.axisLineDashLengths != nil)\n        {\n            CGContextSetLineDash(context, xAxis.axisLineDashPhase, xAxis.axisLineDashLengths, xAxis.axisLineDashLengths.count)\n        }\n        else\n        {\n            CGContextSetLineDash(context, 0.0, nil, 0)\n        }\n        \n        if (xAxis.labelPosition == .Top\n            || xAxis.labelPosition == .TopInside\n            || xAxis.labelPosition == .BothSided)\n        {\n            _axisLineSegmentsBuffer[0].x = viewPortHandler.contentRight\n            _axisLineSegmentsBuffer[0].y = viewPortHandler.contentTop\n            _axisLineSegmentsBuffer[1].x = viewPortHandler.contentRight\n            _axisLineSegmentsBuffer[1].y = viewPortHandler.contentBottom\n            CGContextStrokeLineSegments(context, _axisLineSegmentsBuffer, 2)\n        }\n        \n        if (xAxis.labelPosition == .Bottom\n            || xAxis.labelPosition == .BottomInside\n            || xAxis.labelPosition == .BothSided)\n        {\n            _axisLineSegmentsBuffer[0].x = viewPortHandler.contentLeft\n            _axisLineSegmentsBuffer[0].y = viewPortHandler.contentTop\n            _axisLineSegmentsBuffer[1].x = viewPortHandler.contentLeft\n            _axisLineSegmentsBuffer[1].y = viewPortHandler.contentBottom\n            CGContextStrokeLineSegments(context, _axisLineSegmentsBuffer, 2)\n        }\n        \n        CGContextRestoreGState(context)\n    }\n    \n    private var _limitLineSegmentsBuffer = [CGPoint](count: 2, repeatedValue: CGPoint())\n    \n    public override func renderLimitLines(context context: CGContext)\n    {\n        guard let xAxis = xAxis else { return }\n        \n        var limitLines = xAxis.limitLines\n        \n        if (limitLines.count == 0)\n        {\n            return\n        }\n        \n        CGContextSaveGState(context)\n        \n        let trans = transformer.valueToPixelMatrix\n        \n        var position = CGPoint(x: 0.0, y: 0.0)\n        \n        for i in 0 ..< limitLines.count\n        {\n            let l = limitLines[i]\n            \n            if !l.isEnabled\n            {\n                continue\n            }\n\n            position.x = 0.0\n            position.y = CGFloat(l.limit)\n            position = CGPointApplyAffineTransform(position, trans)\n            \n            _limitLineSegmentsBuffer[0].x = viewPortHandler.contentLeft\n            _limitLineSegmentsBuffer[0].y = position.y\n            _limitLineSegmentsBuffer[1].x = viewPortHandler.contentRight\n            _limitLineSegmentsBuffer[1].y = position.y\n            \n            CGContextSetStrokeColorWithColor(context, l.lineColor.CGColor)\n            CGContextSetLineWidth(context, l.lineWidth)\n            if (l.lineDashLengths != nil)\n            {\n                CGContextSetLineDash(context, l.lineDashPhase, l.lineDashLengths!, l.lineDashLengths!.count)\n            }\n            else\n            {\n                CGContextSetLineDash(context, 0.0, nil, 0)\n            }\n            \n            CGContextStrokeLineSegments(context, _limitLineSegmentsBuffer, 2)\n            \n            let label = l.label\n            \n            // if drawing the limit-value label is enabled\n            if (label.characters.count > 0)\n            {\n                let labelLineHeight = l.valueFont.lineHeight\n                \n                let xOffset: CGFloat = 4.0 + l.xOffset\n                let yOffset: CGFloat = l.lineWidth + labelLineHeight + l.yOffset\n                \n                if (l.labelPosition == .RightTop)\n                {\n                    ChartUtils.drawText(context: context,\n                        text: label,\n                        point: CGPoint(\n                            x: viewPortHandler.contentRight - xOffset,\n                            y: position.y - yOffset),\n                        align: .Right,\n                        attributes: [NSFontAttributeName: l.valueFont, NSForegroundColorAttributeName: l.valueTextColor])\n                }\n                else if (l.labelPosition == .RightBottom)\n                {\n                    ChartUtils.drawText(context: context,\n                        text: label,\n                        point: CGPoint(\n                            x: viewPortHandler.contentRight - xOffset,\n                            y: position.y + yOffset - labelLineHeight),\n                        align: .Right,\n                        attributes: [NSFontAttributeName: l.valueFont, NSForegroundColorAttributeName: l.valueTextColor])\n                }\n                else if (l.labelPosition == .LeftTop)\n                {\n                    ChartUtils.drawText(context: context,\n                        text: label,\n                        point: CGPoint(\n                            x: viewPortHandler.contentLeft + xOffset,\n                            y: position.y - yOffset),\n                        align: .Left,\n                        attributes: [NSFontAttributeName: l.valueFont, NSForegroundColorAttributeName: l.valueTextColor])\n                }\n                else\n                {\n                    ChartUtils.drawText(context: context,\n                        text: label,\n                        point: CGPoint(\n                            x: viewPortHandler.contentLeft + xOffset,\n                            y: position.y + yOffset - labelLineHeight),\n                        align: .Left,\n                        attributes: [NSFontAttributeName: l.valueFont, NSForegroundColorAttributeName: l.valueTextColor])\n                }\n            }\n        }\n        \n        CGContextRestoreGState(context)\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ChartXAxisRendererRadarChart.swift",
    "content": "//\n//  ChartXAxisRendererRadarChart.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 3/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n\npublic class ChartXAxisRendererRadarChart: ChartXAxisRenderer\n{\n    public weak var chart: RadarChartView?\n    \n    public init(viewPortHandler: ChartViewPortHandler, xAxis: ChartXAxis, chart: RadarChartView)\n    {\n        super.init(viewPortHandler: viewPortHandler, xAxis: xAxis, transformer: nil)\n        \n        self.chart = chart\n    }\n    \n    public override func renderAxisLabels(context context: CGContext)\n    {\n        guard let\n            xAxis = xAxis,\n            chart = chart\n            else { return }\n        \n        if (!xAxis.isEnabled || !xAxis.isDrawLabelsEnabled)\n        {\n            return\n        }\n        \n        let labelFont = xAxis.labelFont\n        let labelTextColor = xAxis.labelTextColor\n        let labelRotationAngleRadians = xAxis.labelRotationAngle * ChartUtils.Math.FDEG2RAD\n        let drawLabelAnchor = CGPoint(x: 0.5, y: 0.0)\n        \n        let sliceangle = chart.sliceAngle\n        \n        // calculate the factor that is needed for transforming the value to pixels\n        let factor = chart.factor\n        \n        let center = chart.centerOffsets\n        \n        let modulus = xAxis.axisLabelModulus\n        for i in 0.stride(to: xAxis.values.count, by: modulus)\n        {\n            let label = xAxis.values[i]\n            \n            if (label == nil)\n            {\n                continue\n            }\n            \n            let angle = (sliceangle * CGFloat(i) + chart.rotationAngle) % 360.0\n            \n            let p = ChartUtils.getPosition(center: center, dist: CGFloat(chart.yRange) * factor + xAxis.labelRotatedWidth / 2.0, angle: angle)\n            \n            drawLabel(context: context, label: label!, xIndex: i, x: p.x, y: p.y - xAxis.labelRotatedHeight / 2.0, attributes: [NSFontAttributeName: labelFont, NSForegroundColorAttributeName: labelTextColor], anchor: drawLabelAnchor, angleRadians: labelRotationAngleRadians)\n        }\n    }\n    \n    public func drawLabel(context context: CGContext, label: String, xIndex: Int, x: CGFloat, y: CGFloat, attributes: [String: NSObject], anchor: CGPoint, angleRadians: CGFloat)\n    {\n        guard let xAxis = xAxis else { return }\n        \n        let formattedLabel = xAxis.valueFormatter?.stringForXValue(xIndex, original: label, viewPortHandler: viewPortHandler) ?? label\n        ChartUtils.drawText(context: context, text: formattedLabel, point: CGPoint(x: x, y: y), attributes: attributes, anchor: anchor, angleRadians: angleRadians)\n    }\n    \n    public override func renderLimitLines(context context: CGContext)\n    {\n        /// XAxis LimitLines on RadarChart not yet supported.\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ChartYAxisRenderer.swift",
    "content": "//\n//  ChartYAxisRenderer.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 3/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n\npublic class ChartYAxisRenderer: ChartAxisRendererBase\n{\n    public var yAxis: ChartYAxis?\n    \n    public init(viewPortHandler: ChartViewPortHandler, yAxis: ChartYAxis, transformer: ChartTransformer!)\n    {\n        super.init(viewPortHandler: viewPortHandler, transformer: transformer)\n        \n        self.yAxis = yAxis\n    }\n    \n    /// Computes the axis values.\n    public func computeAxis(yMin yMin: Double, yMax: Double)\n    {\n        guard let yAxis = yAxis else { return }\n        var yMin = yMin, yMax = yMax\n        \n        // calculate the starting and entry point of the y-labels (depending on\n        // zoom / contentrect bounds)\n        if (viewPortHandler.contentWidth > 10.0 && !viewPortHandler.isFullyZoomedOutY)\n        {\n            let p1 = transformer.getValueByTouchPoint(CGPoint(x: viewPortHandler.contentLeft, y: viewPortHandler.contentTop))\n            let p2 = transformer.getValueByTouchPoint(CGPoint(x: viewPortHandler.contentLeft, y: viewPortHandler.contentBottom))\n            \n            if (!yAxis.isInverted)\n            {\n                yMin = Double(p2.y)\n                yMax = Double(p1.y)\n            }\n            else\n            {\n                yMin = Double(p1.y)\n                yMax = Double(p2.y)\n            }\n        }\n        \n        computeAxisValues(min: yMin, max: yMax)\n    }\n    \n    /// Sets up the y-axis labels. Computes the desired number of labels between\n    /// the two given extremes. Unlike the papareXLabels() method, this method\n    /// needs to be called upon every refresh of the view.\n    public func computeAxisValues(min min: Double, max: Double)\n    {\n        guard let yAxis = yAxis else { return }\n        \n        let yMin = min\n        let yMax = max\n        \n        let labelCount = yAxis.labelCount\n        let range = abs(yMax - yMin)\n    \n        if (labelCount == 0 || range <= 0)\n        {\n            yAxis.entries = [Double]()\n            return\n        }\n        \n        // Find out how much spacing (in y value space) between axis values\n        let rawInterval = range / Double(labelCount)\n        var interval = ChartUtils.roundToNextSignificant(number: Double(rawInterval))\n        \n        // If granularity is enabled, then do not allow the interval to go below specified granularity.\n        // This is used to avoid repeated values when rounding values for display.\n        if yAxis.granularityEnabled\n        {\n            interval = interval < yAxis.granularity ? yAxis.granularity : interval\n        }\n        \n        // Normalize interval\n        let intervalMagnitude = ChartUtils.roundToNextSignificant(number: pow(10.0, floor(log10(interval))))\n        let intervalSigDigit = (interval / intervalMagnitude)\n        if (intervalSigDigit > 5)\n        {\n            // Use one order of magnitude higher, to avoid intervals like 0.9 or 90\n            interval = floor(10.0 * intervalMagnitude)\n        }\n        \n        // force label count\n        if yAxis.isForceLabelsEnabled\n        {\n            let step = Double(range) / Double(labelCount - 1)\n            \n            if yAxis.entries.count < labelCount\n            {\n                // Ensure stops contains at least numStops elements.\n                yAxis.entries.removeAll(keepCapacity: true)\n            }\n            else\n            {\n                yAxis.entries = [Double]()\n                yAxis.entries.reserveCapacity(labelCount)\n            }\n            \n            var v = yMin\n            \n            for _ in 0 ..< labelCount\n            {\n                yAxis.entries.append(v)\n                v += step\n            }\n            \n        }\n        else\n        {\n            // no forced count\n            \n            // if the labels should only show min and max\n            if (yAxis.isShowOnlyMinMaxEnabled)\n            {\n                yAxis.entries = [yMin, yMax]\n            }\n            else\n            {\n                let first = ceil(Double(yMin) / interval) * interval\n                let last = ChartUtils.nextUp(floor(Double(yMax) / interval) * interval)\n                \n                var n = 0\n                for _ in first.stride(through: last, by: interval)\n                {\n                    n += 1\n                }\n                \n                if (yAxis.entries.count < n)\n                {\n                    // Ensure stops contains at least numStops elements.\n                    yAxis.entries = [Double](count: n, repeatedValue: 0.0)\n                }\n                else if (yAxis.entries.count > n)\n                {\n                    yAxis.entries.removeRange(n..<yAxis.entries.count)\n                }\n                \n                var f = first\n                var i = 0\n                while (i < n)\n                {\n                    if (f == 0.0)\n                    { // Fix for IEEE negative zero case (Where value == -0.0, and 0.0 == -0.0)\n                        f = 0.0\n                    }\n                    \n                    yAxis.entries[i] = Double(f)\n                    \n                    f += interval\n                    i += 1\n                }\n            }\n        }\n    }\n    \n    /// draws the y-axis labels to the screen\n    public override func renderAxisLabels(context context: CGContext)\n    {\n        guard let yAxis = yAxis else { return }\n        \n        if (!yAxis.isEnabled || !yAxis.isDrawLabelsEnabled)\n        {\n            return\n        }\n        \n        let xoffset = yAxis.xOffset\n        let yoffset = yAxis.labelFont.lineHeight / 2.5 + yAxis.yOffset\n        \n        let dependency = yAxis.axisDependency\n        let labelPosition = yAxis.labelPosition\n        \n        var xPos = CGFloat(0.0)\n        \n        var textAlign: NSTextAlignment\n        \n        if (dependency == .Left)\n        {\n            if (labelPosition == .OutsideChart)\n            {\n                textAlign = .Right\n                xPos = viewPortHandler.offsetLeft - xoffset\n            }\n            else\n            {\n                textAlign = .Left\n                xPos = viewPortHandler.offsetLeft + xoffset\n            }\n            \n        }\n        else\n        {\n            if (labelPosition == .OutsideChart)\n            {\n                textAlign = .Left\n                xPos = viewPortHandler.contentRight + xoffset\n            }\n            else\n            {\n                textAlign = .Right\n                xPos = viewPortHandler.contentRight - xoffset\n            }\n        }\n        \n        drawYLabels(context: context, fixedPosition: xPos, offset: yoffset - yAxis.labelFont.lineHeight, textAlign: textAlign)\n    }\n    \n    private var _axisLineSegmentsBuffer = [CGPoint](count: 2, repeatedValue: CGPoint())\n    \n    public override func renderAxisLine(context context: CGContext)\n    {\n        guard let yAxis = yAxis else { return }\n        \n        if (!yAxis.isEnabled || !yAxis.drawAxisLineEnabled)\n        {\n            return\n        }\n        \n        CGContextSaveGState(context)\n        \n        CGContextSetStrokeColorWithColor(context, yAxis.axisLineColor.CGColor)\n        CGContextSetLineWidth(context, yAxis.axisLineWidth)\n        if (yAxis.axisLineDashLengths != nil)\n        {\n            CGContextSetLineDash(context, yAxis.axisLineDashPhase, yAxis.axisLineDashLengths, yAxis.axisLineDashLengths.count)\n        }\n        else\n        {\n            CGContextSetLineDash(context, 0.0, nil, 0)\n        }\n        \n        if (yAxis.axisDependency == .Left)\n        {\n            _axisLineSegmentsBuffer[0].x = viewPortHandler.contentLeft\n            _axisLineSegmentsBuffer[0].y = viewPortHandler.contentTop\n            _axisLineSegmentsBuffer[1].x = viewPortHandler.contentLeft\n            _axisLineSegmentsBuffer[1].y = viewPortHandler.contentBottom\n            CGContextStrokeLineSegments(context, _axisLineSegmentsBuffer, 2)\n        }\n        else\n        {\n            _axisLineSegmentsBuffer[0].x = viewPortHandler.contentRight\n            _axisLineSegmentsBuffer[0].y = viewPortHandler.contentTop\n            _axisLineSegmentsBuffer[1].x = viewPortHandler.contentRight\n            _axisLineSegmentsBuffer[1].y = viewPortHandler.contentBottom\n            CGContextStrokeLineSegments(context, _axisLineSegmentsBuffer, 2)\n        }\n        \n        CGContextRestoreGState(context)\n    }\n    \n    /// draws the y-labels on the specified x-position\n    internal func drawYLabels(context context: CGContext, fixedPosition: CGFloat, offset: CGFloat, textAlign: NSTextAlignment)\n    {\n        guard let yAxis = yAxis else { return }\n        \n        let labelFont = yAxis.labelFont\n        let labelTextColor = yAxis.labelTextColor\n        \n        let valueToPixelMatrix = transformer.valueToPixelMatrix\n        \n        var pt = CGPoint()\n        \n        for i in 0 ..< yAxis.entryCount\n        {\n            let text = yAxis.getFormattedLabel(i)\n            \n            if (!yAxis.isDrawTopYLabelEntryEnabled && i >= yAxis.entryCount - 1)\n            {\n                break\n            }\n            \n            pt.x = 0\n            pt.y = CGFloat(yAxis.entries[i])\n            pt = CGPointApplyAffineTransform(pt, valueToPixelMatrix)\n            \n            pt.x = fixedPosition\n            pt.y += offset\n            \n            ChartUtils.drawText(context: context, text: text, point: pt, align: textAlign, attributes: [NSFontAttributeName: labelFont, NSForegroundColorAttributeName: labelTextColor])\n        }\n    }\n    \n    private var _gridLineBuffer = [CGPoint](count: 2, repeatedValue: CGPoint())\n    \n    public override func renderGridLines(context context: CGContext)\n    {\n        guard let yAxis = yAxis else { return }\n        \n        if !yAxis.isEnabled\n        {\n            return\n        }\n        \n        if yAxis.drawGridLinesEnabled\n        {\n            CGContextSaveGState(context)\n            \n            CGContextSetShouldAntialias(context, yAxis.gridAntialiasEnabled)\n            CGContextSetStrokeColorWithColor(context, yAxis.gridColor.CGColor)\n            CGContextSetLineWidth(context, yAxis.gridLineWidth)\n            CGContextSetLineCap(context, yAxis.gridLineCap)\n            \n            if (yAxis.gridLineDashLengths != nil)\n            {\n                CGContextSetLineDash(context, yAxis.gridLineDashPhase, yAxis.gridLineDashLengths, yAxis.gridLineDashLengths.count)\n            }\n            else\n            {\n                CGContextSetLineDash(context, 0.0, nil, 0)\n            }\n            \n            let valueToPixelMatrix = transformer.valueToPixelMatrix\n            \n            var position = CGPoint(x: 0.0, y: 0.0)\n            \n            // draw the horizontal grid\n            for i in 0 ..< yAxis.entryCount\n            {\n                position.x = 0.0\n                position.y = CGFloat(yAxis.entries[i])\n                position = CGPointApplyAffineTransform(position, valueToPixelMatrix)\n                \n                _gridLineBuffer[0].x = viewPortHandler.contentLeft\n                _gridLineBuffer[0].y = position.y\n                _gridLineBuffer[1].x = viewPortHandler.contentRight\n                _gridLineBuffer[1].y = position.y\n                CGContextStrokeLineSegments(context, _gridLineBuffer, 2)\n            }\n            \n            CGContextRestoreGState(context)\n        }\n\n        if yAxis.drawZeroLineEnabled\n        {\n            // draw zero line\n            \n            var position = CGPoint(x: 0.0, y: 0.0)\n            transformer.pointValueToPixel(&position)\n                \n            drawZeroLine(context: context,\n                x1: viewPortHandler.contentLeft,\n                x2: viewPortHandler.contentRight,\n                y1: position.y,\n                y2: position.y);\n        }\n    }\n    \n    /// Draws the zero line at the specified position.\n    public func drawZeroLine(\n        context context: CGContext,\n        x1: CGFloat,\n        x2: CGFloat,\n        y1: CGFloat,\n        y2: CGFloat)\n    {\n        guard let\n            yAxis = yAxis,\n            zeroLineColor = yAxis.zeroLineColor\n            else { return }\n        \n        CGContextSaveGState(context)\n        \n        CGContextSetStrokeColorWithColor(context, zeroLineColor.CGColor)\n        CGContextSetLineWidth(context, yAxis.zeroLineWidth)\n        \n        if (yAxis.zeroLineDashLengths != nil)\n        {\n            CGContextSetLineDash(context, yAxis.zeroLineDashPhase, yAxis.zeroLineDashLengths!, yAxis.zeroLineDashLengths!.count)\n        }\n        else\n        {\n            CGContextSetLineDash(context, 0.0, nil, 0)\n        }\n        \n        CGContextMoveToPoint(context, x1, y1)\n        CGContextAddLineToPoint(context, x2, y2)\n        CGContextDrawPath(context, CGPathDrawingMode.Stroke)\n        \n        CGContextRestoreGState(context)\n    }\n    \n    private var _limitLineSegmentsBuffer = [CGPoint](count: 2, repeatedValue: CGPoint())\n    \n    public override func renderLimitLines(context context: CGContext)\n    {\n        guard let yAxis = yAxis else { return }\n        \n        var limitLines = yAxis.limitLines\n        \n        if (limitLines.count == 0)\n        {\n            return\n        }\n        \n        CGContextSaveGState(context)\n        \n        let trans = transformer.valueToPixelMatrix\n        \n        var position = CGPoint(x: 0.0, y: 0.0)\n        \n        for i in 0 ..< limitLines.count\n        {\n            let l = limitLines[i]\n            \n            if !l.isEnabled\n            {\n                continue\n            }\n            \n            position.x = 0.0\n            position.y = CGFloat(l.limit)\n            position = CGPointApplyAffineTransform(position, trans)\n            \n            _limitLineSegmentsBuffer[0].x = viewPortHandler.contentLeft\n            _limitLineSegmentsBuffer[0].y = position.y\n            _limitLineSegmentsBuffer[1].x = viewPortHandler.contentRight\n            _limitLineSegmentsBuffer[1].y = position.y\n            \n            CGContextSetStrokeColorWithColor(context, l.lineColor.CGColor)\n            CGContextSetLineWidth(context, l.lineWidth)\n            if (l.lineDashLengths != nil)\n            {\n                CGContextSetLineDash(context, l.lineDashPhase, l.lineDashLengths!, l.lineDashLengths!.count)\n            }\n            else\n            {\n                CGContextSetLineDash(context, 0.0, nil, 0)\n            }\n            \n            CGContextStrokeLineSegments(context, _limitLineSegmentsBuffer, 2)\n            \n            let label = l.label\n            \n            // if drawing the limit-value label is enabled\n            if (label.characters.count > 0)\n            {\n                let labelLineHeight = l.valueFont.lineHeight\n                \n                let xOffset: CGFloat = 4.0 + l.xOffset\n                let yOffset: CGFloat = l.lineWidth + labelLineHeight + l.yOffset\n                \n                if (l.labelPosition == .RightTop)\n                {\n                    ChartUtils.drawText(context: context,\n                        text: label,\n                        point: CGPoint(\n                            x: viewPortHandler.contentRight - xOffset,\n                            y: position.y - yOffset),\n                        align: .Right,\n                        attributes: [NSFontAttributeName: l.valueFont, NSForegroundColorAttributeName: l.valueTextColor])\n                }\n                else if (l.labelPosition == .RightBottom)\n                {\n                    ChartUtils.drawText(context: context,\n                        text: label,\n                        point: CGPoint(\n                            x: viewPortHandler.contentRight - xOffset,\n                            y: position.y + yOffset - labelLineHeight),\n                        align: .Right,\n                        attributes: [NSFontAttributeName: l.valueFont, NSForegroundColorAttributeName: l.valueTextColor])\n                }\n                else if (l.labelPosition == .LeftTop)\n                {\n                    ChartUtils.drawText(context: context,\n                        text: label,\n                        point: CGPoint(\n                            x: viewPortHandler.contentLeft + xOffset,\n                            y: position.y - yOffset),\n                        align: .Left,\n                        attributes: [NSFontAttributeName: l.valueFont, NSForegroundColorAttributeName: l.valueTextColor])\n                }\n                else\n                {\n                    ChartUtils.drawText(context: context,\n                        text: label,\n                        point: CGPoint(\n                            x: viewPortHandler.contentLeft + xOffset,\n                            y: position.y + yOffset - labelLineHeight),\n                        align: .Left,\n                        attributes: [NSFontAttributeName: l.valueFont, NSForegroundColorAttributeName: l.valueTextColor])\n                }\n            }\n        }\n        \n        CGContextRestoreGState(context)\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ChartYAxisRendererHorizontalBarChart.swift",
    "content": "//\n//  ChartYAxisRendererHorizontalBarChart.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 3/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n\npublic class ChartYAxisRendererHorizontalBarChart: ChartYAxisRenderer\n{\n    public override init(viewPortHandler: ChartViewPortHandler, yAxis: ChartYAxis, transformer: ChartTransformer!)\n    {\n        super.init(viewPortHandler: viewPortHandler, yAxis: yAxis, transformer: transformer)\n    }\n\n    /// Computes the axis values.\n    public override func computeAxis(yMin yMin: Double, yMax: Double)\n    {\n        guard let yAxis = yAxis else { return }\n        \n        var yMin = yMin, yMax = yMax\n        \n        // calculate the starting and entry point of the y-labels (depending on zoom / contentrect bounds)\n        if (viewPortHandler.contentHeight > 10.0 && !viewPortHandler.isFullyZoomedOutX)\n        {\n            let p1 = transformer.getValueByTouchPoint(CGPoint(x: viewPortHandler.contentLeft, y: viewPortHandler.contentTop))\n            let p2 = transformer.getValueByTouchPoint(CGPoint(x: viewPortHandler.contentRight, y: viewPortHandler.contentTop))\n            \n            if (!yAxis.isInverted)\n            {\n                yMin = Double(p1.x)\n                yMax = Double(p2.x)\n            }\n            else\n            {\n                yMin = Double(p2.x)\n                yMax = Double(p1.x)\n            }\n        }\n        \n        computeAxisValues(min: yMin, max: yMax)\n    }\n\n    /// draws the y-axis labels to the screen\n    public override func renderAxisLabels(context context: CGContext)\n    {\n        guard let yAxis = yAxis else { return }\n        \n        if (!yAxis.isEnabled || !yAxis.isDrawLabelsEnabled)\n        {\n            return\n        }\n        \n        var positions = [CGPoint]()\n        positions.reserveCapacity(yAxis.entries.count)\n        \n        for i in 0 ..< yAxis.entries.count\n        {\n            positions.append(CGPoint(x: CGFloat(yAxis.entries[i]), y: 0.0))\n        }\n        \n        transformer.pointValuesToPixel(&positions)\n        \n        let lineHeight = yAxis.labelFont.lineHeight\n        let baseYOffset: CGFloat = 2.5\n        \n        let dependency = yAxis.axisDependency\n        let labelPosition = yAxis.labelPosition\n        \n        var yPos: CGFloat = 0.0\n        \n        if (dependency == .Left)\n        {\n            if (labelPosition == .OutsideChart)\n            {\n                yPos = viewPortHandler.contentTop - baseYOffset\n            }\n            else\n            {\n                yPos = viewPortHandler.contentTop - baseYOffset\n            }\n        }\n        else\n        {\n            if (labelPosition == .OutsideChart)\n            {\n                yPos = viewPortHandler.contentBottom + lineHeight + baseYOffset\n            }\n            else\n            {\n                yPos = viewPortHandler.contentBottom + lineHeight + baseYOffset\n            }\n        }\n        \n        // For compatibility with Android code, we keep above calculation the same,\n        // And here we pull the line back up\n        yPos -= lineHeight\n        \n        drawYLabels(context: context, fixedPosition: yPos, positions: positions, offset: yAxis.yOffset)\n    }\n    \n    private var _axisLineSegmentsBuffer = [CGPoint](count: 2, repeatedValue: CGPoint())\n    \n    public override func renderAxisLine(context context: CGContext)\n    {\n        guard let yAxis = yAxis else { return }\n        \n        if (!yAxis.isEnabled || !yAxis.drawAxisLineEnabled)\n        {\n            return\n        }\n        \n        CGContextSaveGState(context)\n        \n        CGContextSetStrokeColorWithColor(context, yAxis.axisLineColor.CGColor)\n        CGContextSetLineWidth(context, yAxis.axisLineWidth)\n        if (yAxis.axisLineDashLengths != nil)\n        {\n            CGContextSetLineDash(context, yAxis.axisLineDashPhase, yAxis.axisLineDashLengths, yAxis.axisLineDashLengths.count)\n        }\n        else\n        {\n            CGContextSetLineDash(context, 0.0, nil, 0)\n        }\n\n        if (yAxis.axisDependency == .Left)\n        {\n            _axisLineSegmentsBuffer[0].x = viewPortHandler.contentLeft\n            _axisLineSegmentsBuffer[0].y = viewPortHandler.contentTop\n            _axisLineSegmentsBuffer[1].x = viewPortHandler.contentRight\n            _axisLineSegmentsBuffer[1].y = viewPortHandler.contentTop\n            CGContextStrokeLineSegments(context, _axisLineSegmentsBuffer, 2)\n        }\n        else\n        {\n            _axisLineSegmentsBuffer[0].x = viewPortHandler.contentLeft\n            _axisLineSegmentsBuffer[0].y = viewPortHandler.contentBottom\n            _axisLineSegmentsBuffer[1].x = viewPortHandler.contentRight\n            _axisLineSegmentsBuffer[1].y = viewPortHandler.contentBottom\n            CGContextStrokeLineSegments(context, _axisLineSegmentsBuffer, 2)\n        }\n        \n        CGContextRestoreGState(context)\n    }\n\n    /// draws the y-labels on the specified x-position\n    public func drawYLabels(context context: CGContext, fixedPosition: CGFloat, positions: [CGPoint], offset: CGFloat)\n    {\n        guard let yAxis = yAxis else { return }\n        \n        let labelFont = yAxis.labelFont\n        let labelTextColor = yAxis.labelTextColor\n        \n        for i in 0 ..< yAxis.entryCount\n        {\n            let text = yAxis.getFormattedLabel(i)\n            \n            if (!yAxis.isDrawTopYLabelEntryEnabled && i >= yAxis.entryCount - 1)\n            {\n                return\n            }\n            \n            ChartUtils.drawText(context: context, text: text, point: CGPoint(x: positions[i].x, y: fixedPosition - offset), align: .Center, attributes: [NSFontAttributeName: labelFont, NSForegroundColorAttributeName: labelTextColor])\n        }\n    }\n\n    public override func renderGridLines(context context: CGContext)\n    {\n        guard let yAxis = yAxis else { return }\n        \n        if !yAxis.isEnabled\n        {\n            return\n        }\n        \n        if yAxis.isDrawGridLinesEnabled\n        {\n            CGContextSaveGState(context)\n            \n            // pre alloc\n            var position = CGPoint()\n            \n            CGContextSetShouldAntialias(context, yAxis.gridAntialiasEnabled)\n            CGContextSetStrokeColorWithColor(context, yAxis.gridColor.CGColor)\n            CGContextSetLineWidth(context, yAxis.gridLineWidth)\n            CGContextSetLineCap(context, yAxis.gridLineCap)\n\n            if (yAxis.gridLineDashLengths != nil)\n            {\n                CGContextSetLineDash(context, yAxis.gridLineDashPhase, yAxis.gridLineDashLengths, yAxis.gridLineDashLengths.count)\n            }\n            else\n            {\n                CGContextSetLineDash(context, 0.0, nil, 0)\n            }\n            \n            // draw the horizontal grid\n            for i in 0 ..< yAxis.entryCount\n            {\n                position.x = CGFloat(yAxis.entries[i])\n                position.y = 0.0\n                transformer.pointValueToPixel(&position)\n                \n                CGContextBeginPath(context)\n                CGContextMoveToPoint(context, position.x, viewPortHandler.contentTop)\n                CGContextAddLineToPoint(context, position.x, viewPortHandler.contentBottom)\n                CGContextStrokePath(context)\n            }\n            \n            CGContextRestoreGState(context)\n        }\n        \n        if yAxis.drawZeroLineEnabled\n        {\n            // draw zero line\n            \n            var position = CGPoint(x: 0.0, y: 0.0)\n            transformer.pointValueToPixel(&position)\n            \n            drawZeroLine(context: context,\n                x1: position.x,\n                x2: position.x,\n                y1: viewPortHandler.contentTop,\n                y2: viewPortHandler.contentBottom);\n        }\n    }\n    \n    private var _limitLineSegmentsBuffer = [CGPoint](count: 2, repeatedValue: CGPoint())\n    \n    public override func renderLimitLines(context context: CGContext)\n    {\n        guard let yAxis = yAxis else { return }\n        \n        var limitLines = yAxis.limitLines\n\n        if (limitLines.count <= 0)\n        {\n            return\n        }\n        \n        CGContextSaveGState(context)\n        \n        let trans = transformer.valueToPixelMatrix\n        \n        var position = CGPoint(x: 0.0, y: 0.0)\n        \n        for i in 0 ..< limitLines.count\n        {\n            let l = limitLines[i]\n            \n            if !l.isEnabled\n            {\n                continue\n            }\n            \n            position.x = CGFloat(l.limit)\n            position.y = 0.0\n            position = CGPointApplyAffineTransform(position, trans)\n            \n            _limitLineSegmentsBuffer[0].x = position.x\n            _limitLineSegmentsBuffer[0].y = viewPortHandler.contentTop\n            _limitLineSegmentsBuffer[1].x = position.x\n            _limitLineSegmentsBuffer[1].y = viewPortHandler.contentBottom\n            \n            CGContextSetStrokeColorWithColor(context, l.lineColor.CGColor)\n            CGContextSetLineWidth(context, l.lineWidth)\n            if (l.lineDashLengths != nil)\n            {\n                CGContextSetLineDash(context, l.lineDashPhase, l.lineDashLengths!, l.lineDashLengths!.count)\n            }\n            else\n            {\n                CGContextSetLineDash(context, 0.0, nil, 0)\n            }\n            \n            CGContextStrokeLineSegments(context, _limitLineSegmentsBuffer, 2)\n\n            let label = l.label\n\n            // if drawing the limit-value label is enabled\n            if (label.characters.count > 0)\n            {\n                let labelLineHeight = l.valueFont.lineHeight\n                \n                let xOffset: CGFloat = l.lineWidth + l.xOffset\n                let yOffset: CGFloat = 2.0 + l.yOffset\n\n                if (l.labelPosition == .RightTop)\n                {\n                    ChartUtils.drawText(context: context,\n                        text: label,\n                        point: CGPoint(\n                            x: position.x + xOffset,\n                            y: viewPortHandler.contentTop + yOffset),\n                        align: .Left,\n                        attributes: [NSFontAttributeName: l.valueFont, NSForegroundColorAttributeName: l.valueTextColor])\n                }\n                else if (l.labelPosition == .RightBottom)\n                {\n                    ChartUtils.drawText(context: context,\n                        text: label,\n                        point: CGPoint(\n                            x: position.x + xOffset,\n                            y: viewPortHandler.contentBottom - labelLineHeight - yOffset),\n                        align: .Left,\n                        attributes: [NSFontAttributeName: l.valueFont, NSForegroundColorAttributeName: l.valueTextColor])\n                }\n                else if (l.labelPosition == .LeftTop)\n                {\n                    ChartUtils.drawText(context: context,\n                        text: label,\n                        point: CGPoint(\n                            x: position.x - xOffset,\n                            y: viewPortHandler.contentTop + yOffset),\n                        align: .Right,\n                        attributes: [NSFontAttributeName: l.valueFont, NSForegroundColorAttributeName: l.valueTextColor])\n                }\n                else\n                {\n                    ChartUtils.drawText(context: context,\n                        text: label,\n                        point: CGPoint(\n                            x: position.x - xOffset,\n                            y: viewPortHandler.contentBottom - labelLineHeight - yOffset),\n                        align: .Right,\n                        attributes: [NSFontAttributeName: l.valueFont, NSForegroundColorAttributeName: l.valueTextColor])\n                }\n            }\n        }\n        \n        CGContextRestoreGState(context)\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ChartYAxisRendererRadarChart.swift",
    "content": "//\n//  ChartYAxisRendererRadarChart.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 3/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n\npublic class ChartYAxisRendererRadarChart: ChartYAxisRenderer\n{\n    private weak var chart: RadarChartView?\n    \n    public init(viewPortHandler: ChartViewPortHandler, yAxis: ChartYAxis, chart: RadarChartView)\n    {\n        super.init(viewPortHandler: viewPortHandler, yAxis: yAxis, transformer: nil)\n        \n        self.chart = chart\n    }\n    \n    public override func computeAxis(yMin yMin: Double, yMax: Double)\n    {\n        computeAxisValues(min: yMin, max: yMax)\n    }\n    \n    public override func computeAxisValues(min yMin: Double, max yMax: Double)\n    {\n        guard let yAxis = yAxis else { return }\n        \n        let labelCount = yAxis.labelCount\n        let range = abs(yMax - yMin)\n        \n        if (labelCount == 0 || range <= 0)\n        {\n            yAxis.entries = [Double]()\n            return\n        }\n        \n        let rawInterval = range / Double(labelCount)\n        var interval = ChartUtils.roundToNextSignificant(number: Double(rawInterval))\n        let intervalMagnitude = pow(10.0, round(log10(interval)))\n        let intervalSigDigit = Int(interval / intervalMagnitude)\n        \n        if (intervalSigDigit > 5)\n        {\n            // Use one order of magnitude higher, to avoid intervals like 0.9 or\n            // 90\n            interval = floor(10 * intervalMagnitude)\n        }\n        \n        // force label count\n        if yAxis.isForceLabelsEnabled\n        {\n            let step = Double(range) / Double(labelCount - 1)\n            \n            if yAxis.entries.count < labelCount\n            {\n                // Ensure stops contains at least numStops elements.\n                yAxis.entries.removeAll(keepCapacity: true)\n            }\n            else\n            {\n                yAxis.entries = [Double]()\n                yAxis.entries.reserveCapacity(labelCount)\n            }\n            \n            var v = yMin\n            \n            for _ in 0 ..< labelCount\n            {\n                yAxis.entries.append(v)\n                v += step\n            }\n            \n        }\n        else\n        {\n            // no forced count\n            \n            // clean old values\n            if (yAxis.entries.count > 0)\n            {\n                yAxis.entries.removeAll(keepCapacity: false)\n            }\n            \n            // if the labels should only show min and max\n            if (yAxis.isShowOnlyMinMaxEnabled)\n            {\n                yAxis.entries = [Double]()\n                yAxis.entries.append(yMin)\n                yAxis.entries.append(yMax)\n            }\n            else\n            {\n                let rawCount = Double(yMin) / interval\n                var first = rawCount < 0.0 ? floor(rawCount) * interval : ceil(rawCount) * interval;\n                \n                if (first == 0.0)\n                { // Fix for IEEE negative zero case (Where value == -0.0, and 0.0 == -0.0)\n                    first = 0.0\n                }\n                \n                let last = ChartUtils.nextUp(floor(Double(yMax) / interval) * interval)\n                \n                var n = 0\n                for _ in first.stride(through: last, by: interval)\n                {\n                    n += 1\n                }\n                \n                if !yAxis.isAxisMaxCustom\n                {\n                    n += 1\n                }\n                \n                if (yAxis.entries.count < n)\n                {\n                    // Ensure stops contains at least numStops elements.\n                    yAxis.entries = [Double](count: n, repeatedValue: 0.0)\n                }\n                \n                var f = first\n                var i = 0\n                while (i < n)\n                {\n                    yAxis.entries[i] = Double(f)\n                    \n                    f += interval\n                    i += 1\n                }\n            }\n        }\n        \n        if yAxis.entries[0] < yMin\n        {\n            // If startAtZero is disabled, and the first label is lower that the axis minimum,\n            // Then adjust the axis minimum\n            yAxis._axisMinimum = yAxis.entries[0]\n        }\n        yAxis._axisMaximum = yAxis.entries[yAxis.entryCount - 1]\n        yAxis.axisRange = abs(yAxis._axisMaximum - yAxis._axisMinimum)\n    }\n    \n    public override func renderAxisLabels(context context: CGContext)\n    {\n        guard let\n            yAxis = yAxis,\n            chart = chart\n            else { return }\n        \n        if (!yAxis.isEnabled || !yAxis.isDrawLabelsEnabled)\n        {\n            return\n        }\n        \n        let labelFont = yAxis.labelFont\n        let labelTextColor = yAxis.labelTextColor\n        \n        let center = chart.centerOffsets\n        let factor = chart.factor\n        \n        let labelCount = yAxis.entryCount\n        \n        let labelLineHeight = yAxis.labelFont.lineHeight\n        \n        for j in 0 ..< labelCount\n        {\n            if (j == labelCount - 1 && yAxis.isDrawTopYLabelEntryEnabled == false)\n            {\n                break\n            }\n            \n            let r = CGFloat(yAxis.entries[j] - yAxis._axisMinimum) * factor\n            \n            let p = ChartUtils.getPosition(center: center, dist: r, angle: chart.rotationAngle)\n            \n            let label = yAxis.getFormattedLabel(j)\n            \n            ChartUtils.drawText(context: context, text: label, point: CGPoint(x: p.x + 10.0, y: p.y - labelLineHeight), align: .Left, attributes: [NSFontAttributeName: labelFont, NSForegroundColorAttributeName: labelTextColor])\n        }\n    }\n    \n    public override func renderLimitLines(context context: CGContext)\n    {\n        guard let\n            yAxis = yAxis,\n            chart = chart\n            else { return }\n        \n        var limitLines = yAxis.limitLines\n        \n        if (limitLines.count == 0)\n        {\n            return\n        }\n        \n        CGContextSaveGState(context)\n        \n        let sliceangle = chart.sliceAngle\n        \n        // calculate the factor that is needed for transforming the value to pixels\n        let factor = chart.factor\n        \n        let center = chart.centerOffsets\n        \n        for i in 0 ..< limitLines.count\n        {\n            let l = limitLines[i]\n            \n            if !l.isEnabled\n            {\n                continue\n            }\n            \n            CGContextSetStrokeColorWithColor(context, l.lineColor.CGColor)\n            CGContextSetLineWidth(context, l.lineWidth)\n            if (l.lineDashLengths != nil)\n            {\n                CGContextSetLineDash(context, l.lineDashPhase, l.lineDashLengths!, l.lineDashLengths!.count)\n            }\n            else\n            {\n                CGContextSetLineDash(context, 0.0, nil, 0)\n            }\n            \n            let r = CGFloat(l.limit - chart.chartYMin) * factor\n            \n            CGContextBeginPath(context)\n            \n            for j in 0 ..< chart.data!.xValCount\n            {\n                let p = ChartUtils.getPosition(center: center, dist: r, angle: sliceangle * CGFloat(j) + chart.rotationAngle)\n                \n                if (j == 0)\n                {\n                    CGContextMoveToPoint(context, p.x, p.y)\n                }\n                else\n                {\n                    CGContextAddLineToPoint(context, p.x, p.y)\n                }\n            }\n            \n            CGContextClosePath(context)\n            \n            CGContextStrokePath(context)\n        }\n        \n        CGContextRestoreGState(context)\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Renderers/CombinedChartRenderer.swift",
    "content": "//\n//  CombinedChartRenderer.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\npublic class CombinedChartRenderer: ChartDataRendererBase\n{\n    public weak var chart: CombinedChartView?\n    \n    /// flag that enables or disables the highlighting arrow\n    public var drawHighlightArrowEnabled = false\n    \n    /// if set to true, all values are drawn above their bars, instead of below their top\n    public var drawValueAboveBarEnabled = true\n    \n    /// if set to true, a grey area is drawn behind each bar that indicates the maximum value\n    public var drawBarShadowEnabled = true\n    \n    internal var _renderers = [ChartDataRendererBase]()\n    \n    internal var _drawOrder: [CombinedChartView.CombinedChartDrawOrder] = [.Bar, .Bubble, .Line, .Candle, .Scatter]\n    \n    public init(chart: CombinedChartView, animator: ChartAnimator, viewPortHandler: ChartViewPortHandler)\n    {\n        super.init(animator: animator, viewPortHandler: viewPortHandler)\n        \n        self.chart = chart\n        \n        createRenderers()\n    }\n    \n    /// Creates the renderers needed for this combined-renderer in the required order. Also takes the DrawOrder into consideration.\n    internal func createRenderers()\n    {\n        _renderers = [ChartDataRendererBase]()\n        \n        guard let\n            chart = chart,\n            animator = animator\n            else { return }\n\n        for order in drawOrder\n        {\n            switch (order)\n            {\n            case .Bar:\n                if (chart.barData !== nil)\n                {\n                    _renderers.append(BarChartRenderer(dataProvider: chart, animator: animator, viewPortHandler: viewPortHandler))\n                }\n                break\n                \n            case .Line:\n                if (chart.lineData !== nil)\n                {\n                    _renderers.append(LineChartRenderer(dataProvider: chart, animator: animator, viewPortHandler: viewPortHandler))\n                }\n                break\n                \n            case .Candle:\n                if (chart.candleData !== nil)\n                {\n                    _renderers.append(CandleStickChartRenderer(dataProvider: chart, animator: animator, viewPortHandler: viewPortHandler))\n                }\n                break\n                \n            case .Scatter:\n                if (chart.scatterData !== nil)\n                {\n                    _renderers.append(ScatterChartRenderer(dataProvider: chart, animator: animator, viewPortHandler: viewPortHandler))\n                }\n                break\n                \n            case .Bubble:\n                if (chart.bubbleData !== nil)\n                {\n                    _renderers.append(BubbleChartRenderer(dataProvider: chart, animator: animator, viewPortHandler: viewPortHandler))\n                }\n                break\n            }\n        }\n\n    }\n    \n    public override func drawData(context context: CGContext)\n    {\n        for renderer in _renderers\n        {\n            renderer.drawData(context: context)\n        }\n    }\n    \n    public override func drawValues(context context: CGContext)\n    {\n        for renderer in _renderers\n        {\n            renderer.drawValues(context: context)\n        }\n    }\n    \n    public override func drawExtras(context context: CGContext)\n    {\n        for renderer in _renderers\n        {\n            renderer.drawExtras(context: context)\n        }\n    }\n    \n    public override func drawHighlighted(context context: CGContext, indices: [ChartHighlight])\n    {\n        for renderer in _renderers\n        {\n            renderer.drawHighlighted(context: context, indices: indices)\n        }\n    }\n    \n    public override func calcXBounds(chart chart: BarLineChartViewBase, xAxisModulus: Int)\n    {\n        for renderer in _renderers\n        {\n            renderer.calcXBounds(chart: chart, xAxisModulus: xAxisModulus)\n        }\n    }\n\n    /// - returns: the sub-renderer object at the specified index.\n    public func getSubRenderer(index index: Int) -> ChartDataRendererBase?\n    {\n        if (index >= _renderers.count || index < 0)\n        {\n            return nil\n        }\n        else\n        {\n            return _renderers[index]\n        }\n    }\n\n    /// Returns all sub-renderers.\n    public var subRenderers: [ChartDataRendererBase]\n    {\n        get { return _renderers }\n        set { _renderers = newValue }\n    }\n    \n    // MARK: Accessors\n    \n    /// - returns: true if drawing the highlighting arrow is enabled, false if not\n    public var isDrawHighlightArrowEnabled: Bool { return drawHighlightArrowEnabled; }\n    \n    /// - returns: true if drawing values above bars is enabled, false if not\n    public var isDrawValueAboveBarEnabled: Bool { return drawValueAboveBarEnabled; }\n    \n    /// - returns: true if drawing shadows (maxvalue) for each bar is enabled, false if not\n    public var isDrawBarShadowEnabled: Bool { return drawBarShadowEnabled; }\n    \n    /// the order in which the provided data objects should be drawn.\n    /// The earlier you place them in the provided array, the further they will be in the background.\n    /// e.g. if you provide [DrawOrder.Bar, DrawOrder.Line], the bars will be drawn behind the lines.\n    public var drawOrder: [CombinedChartView.CombinedChartDrawOrder]\n    {\n        get\n        {\n            return _drawOrder\n        }\n        set\n        {\n            if (newValue.count > 0)\n            {\n                _drawOrder = newValue\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Renderers/HorizontalBarChartRenderer.swift",
    "content": "//\n//  HorizontalBarChartRenderer.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n\npublic class HorizontalBarChartRenderer: BarChartRenderer\n{\n    public override init(dataProvider: BarChartDataProvider?, animator: ChartAnimator?, viewPortHandler: ChartViewPortHandler)\n    {\n        super.init(dataProvider: dataProvider, animator: animator, viewPortHandler: viewPortHandler)\n    }\n    \n    public override func drawDataSet(context context: CGContext, dataSet: IBarChartDataSet, index: Int)\n    {\n        guard let\n            dataProvider = dataProvider,\n            barData = dataProvider.barData,\n            animator = animator\n            else { return }\n        \n        CGContextSaveGState(context)\n        \n        let trans = dataProvider.getTransformer(dataSet.axisDependency)\n        \n        let drawBarShadowEnabled: Bool = dataProvider.isDrawBarShadowEnabled\n        let dataSetOffset = (barData.dataSetCount - 1)\n        let groupSpace = barData.groupSpace\n        let groupSpaceHalf = groupSpace / 2.0\n        let barSpace = dataSet.barSpace\n        let barSpaceHalf = barSpace / 2.0\n        let containsStacks = dataSet.isStacked\n        let isInverted = dataProvider.isInverted(dataSet.axisDependency)\n        let barWidth: CGFloat = 0.5\n        let phaseY = animator.phaseY\n        var barRect = CGRect()\n        var barShadow = CGRect()\n        var y: Double\n        \n        // do the drawing\n        for j in 0 ..< Int(ceil(CGFloat(dataSet.entryCount) * animator.phaseX))\n        {\n            guard let e = dataSet.entryForIndex(j) as? BarChartDataEntry else { continue }\n            \n            // calculate the x-position, depending on datasetcount\n            let x = CGFloat(e.xIndex + e.xIndex * dataSetOffset) + CGFloat(index)\n                + groupSpace * CGFloat(e.xIndex) + groupSpaceHalf\n            let values = e.values\n            \n            if (!containsStacks || values == nil)\n            {\n                y = e.value\n                \n                let bottom = x - barWidth + barSpaceHalf\n                let top = x + barWidth - barSpaceHalf\n                var right = isInverted ? (y <= 0.0 ? CGFloat(y) : 0) : (y >= 0.0 ? CGFloat(y) : 0)\n                var left = isInverted ? (y >= 0.0 ? CGFloat(y) : 0) : (y <= 0.0 ? CGFloat(y) : 0)\n                \n                // multiply the height of the rect with the phase\n                if (right > 0)\n                {\n                    right *= phaseY\n                }\n                else\n                {\n                    left *= phaseY\n                }\n                \n                barRect.origin.x = left\n                barRect.size.width = right - left\n                barRect.origin.y = top\n                barRect.size.height = bottom - top\n                \n                trans.rectValueToPixel(&barRect)\n                \n                if (!viewPortHandler.isInBoundsLeft(barRect.origin.x + barRect.size.width))\n                {\n                    continue\n                }\n                \n                if (!viewPortHandler.isInBoundsRight(barRect.origin.x))\n                {\n                    break\n                }\n                \n                // if drawing the bar shadow is enabled\n                if (drawBarShadowEnabled)\n                {\n                    barShadow.origin.x = viewPortHandler.contentLeft\n                    barShadow.origin.y = barRect.origin.y\n                    barShadow.size.width = viewPortHandler.contentWidth\n                    barShadow.size.height = barRect.size.height\n                    \n                    CGContextSetFillColorWithColor(context, dataSet.barShadowColor.CGColor)\n                    CGContextFillRect(context, barShadow)\n                }\n                \n                // Set the color for the currently drawn value. If the index is out of bounds, reuse colors.\n                CGContextSetFillColorWithColor(context, dataSet.colorAt(j).CGColor)\n                CGContextFillRect(context, barRect)\n            }\n            else\n            {\n                let vals = values!\n                var posY = 0.0\n                var negY = -e.negativeSum\n                var yStart = 0.0\n                \n                // if drawing the bar shadow is enabled\n                if (drawBarShadowEnabled)\n                {\n                    y = e.value\n                    \n                    let bottom = x - barWidth + barSpaceHalf\n                    let top = x + barWidth - barSpaceHalf\n                    var right = isInverted ? (y <= 0.0 ? CGFloat(y) : 0) : (y >= 0.0 ? CGFloat(y) : 0)\n                    var left = isInverted ? (y >= 0.0 ? CGFloat(y) : 0) : (y <= 0.0 ? CGFloat(y) : 0)\n                    \n                    // multiply the height of the rect with the phase\n                    if (right > 0)\n                    {\n                        right *= phaseY\n                    }\n                    else\n                    {\n                        left *= phaseY\n                    }\n                    \n                    barRect.origin.x = left\n                    barRect.size.width = right - left\n                    barRect.origin.y = top\n                    barRect.size.height = bottom - top\n                    \n                    trans.rectValueToPixel(&barRect)\n                    \n                    barShadow.origin.x = viewPortHandler.contentLeft\n                    barShadow.origin.y = barRect.origin.y\n                    barShadow.size.width = viewPortHandler.contentWidth\n                    barShadow.size.height = barRect.size.height\n                    \n                    CGContextSetFillColorWithColor(context, dataSet.barShadowColor.CGColor)\n                    CGContextFillRect(context, barShadow)\n                }\n                \n                // fill the stack\n                for k in 0 ..< vals.count\n                {\n                    let value = vals[k]\n                    \n                    if value >= 0.0\n                    {\n                        y = posY\n                        yStart = posY + value\n                        posY = yStart\n                    }\n                    else\n                    {\n                        y = negY\n                        yStart = negY + abs(value)\n                        negY += abs(value)\n                    }\n                    \n                    let bottom = x - barWidth + barSpaceHalf\n                    let top = x + barWidth - barSpaceHalf\n                    var right: CGFloat, left: CGFloat\n                    if isInverted\n                    {\n                        left = y >= yStart ? CGFloat(y) : CGFloat(yStart)\n                        right = y <= yStart ? CGFloat(y) : CGFloat(yStart)\n                    }\n                    else\n                    {\n                        right = y >= yStart ? CGFloat(y) : CGFloat(yStart)\n                        left = y <= yStart ? CGFloat(y) : CGFloat(yStart)\n                    }\n                    \n                    // multiply the height of the rect with the phase\n                    right *= phaseY\n                    left *= phaseY\n                    \n                    barRect.origin.x = left\n                    barRect.size.width = right - left\n                    barRect.origin.y = top\n                    barRect.size.height = bottom - top\n                    \n                    trans.rectValueToPixel(&barRect)\n                    \n                    if (k == 0 && !viewPortHandler.isInBoundsTop(barRect.origin.y + barRect.size.height))\n                    {\n                        // Skip to next bar\n                        break\n                    }\n                    \n                    // avoid drawing outofbounds values\n                    if (!viewPortHandler.isInBoundsBottom(barRect.origin.y))\n                    {\n                        break\n                    }\n                    \n                    // Set the color for the currently drawn value. If the index is out of bounds, reuse colors.\n                    CGContextSetFillColorWithColor(context, dataSet.colorAt(k).CGColor)\n                    CGContextFillRect(context, barRect)\n                }\n            }\n        }\n        \n        CGContextRestoreGState(context)\n    }\n    \n    public override func prepareBarHighlight(x x: CGFloat, y1: Double, y2: Double, barspacehalf: CGFloat, trans: ChartTransformer, inout rect: CGRect)\n    {\n        let barWidth: CGFloat = 0.5\n        \n        let top = x - barWidth + barspacehalf\n        let bottom = x + barWidth - barspacehalf\n        let left = CGFloat(y1)\n        let right = CGFloat(y2)\n        \n        rect.origin.x = left\n        rect.origin.y = top\n        rect.size.width = right - left\n        rect.size.height = bottom - top\n        \n        trans.rectValueToPixelHorizontal(&rect, phaseY: animator?.phaseY ?? 1.0)\n    }\n    \n    public override func drawValues(context context: CGContext)\n    {\n        // if values are drawn\n        if (passesCheck())\n        {\n            guard let\n                dataProvider = dataProvider,\n                barData = dataProvider.barData,\n                animator = animator\n                else { return }\n            \n            var dataSets = barData.dataSets\n            \n            let drawValueAboveBar = dataProvider.isDrawValueAboveBarEnabled\n            \n            let textAlign = NSTextAlignment.Left\n            \n            let valueOffsetPlus: CGFloat = 5.0\n            var posOffset: CGFloat\n            var negOffset: CGFloat\n            \n            for dataSetIndex in 0 ..< barData.dataSetCount\n            {\n                guard let dataSet = dataSets[dataSetIndex] as? IBarChartDataSet else { continue }\n                \n                if !dataSet.isDrawValuesEnabled || dataSet.entryCount == 0\n                {\n                    continue\n                }\n                \n                let isInverted = dataProvider.isInverted(dataSet.axisDependency)\n                \n                let valueFont = dataSet.valueFont\n                let yOffset = -valueFont.lineHeight / 2.0\n                \n                guard let formatter = dataSet.valueFormatter else { continue }\n                \n                let trans = dataProvider.getTransformer(dataSet.axisDependency)\n                \n                let phaseY = animator.phaseY\n                let dataSetCount = barData.dataSetCount\n                let groupSpace = barData.groupSpace\n                \n                // if only single values are drawn (sum)\n                if (!dataSet.isStacked)\n                {\n                    for j in 0 ..< Int(ceil(CGFloat(dataSet.entryCount) * animator.phaseX))\n                    {\n                        guard let e = dataSet.entryForIndex(j) as? BarChartDataEntry else { continue }\n                        \n                        let valuePoint = trans.getTransformedValueHorizontalBarChart(entry: e, xIndex: e.xIndex, dataSetIndex: dataSetIndex, phaseY: phaseY, dataSetCount: dataSetCount, groupSpace: groupSpace)\n                        \n                        if (!viewPortHandler.isInBoundsTop(valuePoint.y))\n                        {\n                            break\n                        }\n                        \n                        if (!viewPortHandler.isInBoundsX(valuePoint.x))\n                        {\n                            continue\n                        }\n                        \n                        if (!viewPortHandler.isInBoundsBottom(valuePoint.y))\n                        {\n                            continue\n                        }\n                        \n                        let val = e.value\n                        let valueText = formatter.stringFromNumber(val)!\n                        \n                        // calculate the correct offset depending on the draw position of the value\n                        let valueTextWidth = valueText.sizeWithAttributes([NSFontAttributeName: valueFont]).width\n                        posOffset = (drawValueAboveBar ? valueOffsetPlus : -(valueTextWidth + valueOffsetPlus))\n                        negOffset = (drawValueAboveBar ? -(valueTextWidth + valueOffsetPlus) : valueOffsetPlus)\n                        \n                        if (isInverted)\n                        {\n                            posOffset = -posOffset - valueTextWidth\n                            negOffset = -negOffset - valueTextWidth\n                        }\n                        \n                        drawValue(\n                            context: context,\n                            value: valueText,\n                            xPos: valuePoint.x + (val >= 0.0 ? posOffset : negOffset),\n                            yPos: valuePoint.y + yOffset,\n                            font: valueFont,\n                            align: textAlign,\n                            color: dataSet.valueTextColorAt(j))\n                    }\n                }\n                else\n                {\n                    // if each value of a potential stack should be drawn\n                    \n                    for j in 0 ..< Int(ceil(CGFloat(dataSet.entryCount) * animator.phaseX))\n                    {\n                        guard let e = dataSet.entryForIndex(j) as? BarChartDataEntry else { continue }\n                        \n                        let valuePoint = trans.getTransformedValueHorizontalBarChart(entry: e, xIndex: e.xIndex, dataSetIndex: dataSetIndex, phaseY: phaseY, dataSetCount: dataSetCount, groupSpace: groupSpace)\n                        \n                        let values = e.values\n                        \n                        // we still draw stacked bars, but there is one non-stacked in between\n                        if (values == nil)\n                        {\n                            if (!viewPortHandler.isInBoundsTop(valuePoint.y))\n                            {\n                                break\n                            }\n                            \n                            if (!viewPortHandler.isInBoundsX(valuePoint.x))\n                            {\n                                continue\n                            }\n                            \n                            if (!viewPortHandler.isInBoundsBottom(valuePoint.y))\n                            {\n                                continue\n                            }\n                            \n                            let val = e.value\n                            let valueText = formatter.stringFromNumber(val)!\n                            \n                            // calculate the correct offset depending on the draw position of the value\n                            let valueTextWidth = valueText.sizeWithAttributes([NSFontAttributeName: valueFont]).width\n                            posOffset = (drawValueAboveBar ? valueOffsetPlus : -(valueTextWidth + valueOffsetPlus))\n                            negOffset = (drawValueAboveBar ? -(valueTextWidth + valueOffsetPlus) : valueOffsetPlus)\n                            \n                            if (isInverted)\n                            {\n                                posOffset = -posOffset - valueTextWidth\n                                negOffset = -negOffset - valueTextWidth\n                            }\n                            \n                            drawValue(\n                                context: context,\n                                value: valueText,\n                                xPos: valuePoint.x + (val >= 0.0 ? posOffset : negOffset),\n                                yPos: valuePoint.y + yOffset,\n                                font: valueFont,\n                                align: textAlign,\n                                color: dataSet.valueTextColorAt(j))\n                        }\n                        else\n                        {\n                            let vals = values!\n                            var transformed = [CGPoint]()\n                            \n                            var posY = 0.0\n                            var negY = -e.negativeSum\n                            \n                            for k in 0 ..< vals.count\n                            {\n                                let value = vals[k]\n                                var y: Double\n                                \n                                if value >= 0.0\n                                {\n                                    posY += value\n                                    y = posY\n                                }\n                                else\n                                {\n                                    y = negY\n                                    negY -= value\n                                }\n                                \n                                transformed.append(CGPoint(x: CGFloat(y) * animator.phaseY, y: 0.0))\n                            }\n                            \n                            trans.pointValuesToPixel(&transformed)\n                            \n                            for k in 0 ..< transformed.count\n                            {\n                                let val = vals[k]\n                                let valueText = formatter.stringFromNumber(val)!\n                                \n                                // calculate the correct offset depending on the draw position of the value\n                                let valueTextWidth = valueText.sizeWithAttributes([NSFontAttributeName: valueFont]).width\n                                posOffset = (drawValueAboveBar ? valueOffsetPlus : -(valueTextWidth + valueOffsetPlus))\n                                negOffset = (drawValueAboveBar ? -(valueTextWidth + valueOffsetPlus) : valueOffsetPlus)\n                                \n                                if (isInverted)\n                                {\n                                    posOffset = -posOffset - valueTextWidth\n                                    negOffset = -negOffset - valueTextWidth\n                                }\n                                \n                                let x = transformed[k].x + (val >= 0 ? posOffset : negOffset)\n                                let y = valuePoint.y\n                                \n                                if (!viewPortHandler.isInBoundsTop(y))\n                                {\n                                    break\n                                }\n                                \n                                if (!viewPortHandler.isInBoundsX(x))\n                                {\n                                    continue\n                                }\n                                \n                                if (!viewPortHandler.isInBoundsBottom(y))\n                                {\n                                    continue\n                                }\n                                \n                                drawValue(context: context,\n                                    value: valueText,\n                                    xPos: x,\n                                    yPos: y + yOffset,\n                                    font: valueFont,\n                                    align: textAlign,\n                                    color: dataSet.valueTextColorAt(j))\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n    \n    internal override func passesCheck() -> Bool\n    {\n        guard let dataProvider = dataProvider, barData = dataProvider.barData else { return false }\n        \n        return CGFloat(barData.yValCount) < CGFloat(dataProvider.maxVisibleValueCount) * viewPortHandler.scaleY\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Renderers/LineChartRenderer.swift",
    "content": "//\n//  LineChartRenderer.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n\npublic class LineChartRenderer: LineRadarChartRenderer\n{\n    public weak var dataProvider: LineChartDataProvider?\n    \n    public init(dataProvider: LineChartDataProvider?, animator: ChartAnimator?, viewPortHandler: ChartViewPortHandler)\n    {\n        super.init(animator: animator, viewPortHandler: viewPortHandler)\n        \n        self.dataProvider = dataProvider\n    }\n    \n    public override func drawData(context context: CGContext)\n    {\n        guard let lineData = dataProvider?.lineData else { return }\n        \n        for i in 0 ..< lineData.dataSetCount\n        {\n            guard let set = lineData.getDataSetByIndex(i) else { continue }\n            \n            if set.isVisible\n            {\n                if !(set is ILineChartDataSet)\n                {\n                    fatalError(\"Datasets for LineChartRenderer must conform to ILineChartDataSet\")\n                }\n                \n                drawDataSet(context: context, dataSet: set as! ILineChartDataSet)\n            }\n        }\n    }\n    \n    public func drawDataSet(context context: CGContext, dataSet: ILineChartDataSet)\n    {\n        let entryCount = dataSet.entryCount\n        \n        if (entryCount < 1)\n        {\n            return\n        }\n        \n        CGContextSaveGState(context)\n        \n        CGContextSetLineWidth(context, dataSet.lineWidth)\n        if (dataSet.lineDashLengths != nil)\n        {\n            CGContextSetLineDash(context, dataSet.lineDashPhase, dataSet.lineDashLengths!, dataSet.lineDashLengths!.count)\n        }\n        else\n        {\n            CGContextSetLineDash(context, 0.0, nil, 0)\n        }\n        \n        // if drawing cubic lines is enabled\n        if (dataSet.isDrawCubicEnabled)\n        {\n            drawCubic(context: context, dataSet: dataSet)\n        }\n        else\n        { // draw normal (straight) lines\n            drawLinear(context: context, dataSet: dataSet)\n        }\n        \n        CGContextRestoreGState(context)\n    }\n    \n    public func drawCubic(context context: CGContext, dataSet: ILineChartDataSet)\n    {\n        guard let\n            trans = dataProvider?.getTransformer(dataSet.axisDependency),\n            animator = animator\n            else { return }\n        \n        let entryCount = dataSet.entryCount\n        \n        guard let\n            entryFrom = dataSet.entryForXIndex(self.minX < 0 ? self.minX : 0, rounding: .Down),\n            entryTo = dataSet.entryForXIndex(self.maxX, rounding: .Up)\n            else { return }\n        \n        let diff = (entryFrom == entryTo) ? 1 : 0\n        let minx = max(dataSet.entryIndex(entry: entryFrom) - diff - 1, 0)\n        let maxx = min(max(minx + 2, dataSet.entryIndex(entry: entryTo) + 1), entryCount)\n        \n        let phaseX = animator.phaseX\n        let phaseY = animator.phaseY\n        \n        // get the color that is specified for this position from the DataSet\n        let drawingColor = dataSet.colors.first!\n        \n        let intensity = dataSet.cubicIntensity\n        \n        // the path for the cubic-spline\n        let cubicPath = CGPathCreateMutable()\n        \n        var valueToPixelMatrix = trans.valueToPixelMatrix\n        \n        let size = Int(ceil(CGFloat(maxx - minx) * phaseX + CGFloat(minx)))\n        \n        if (size - minx >= 2)\n        {\n            var prevDx: CGFloat = 0.0\n            var prevDy: CGFloat = 0.0\n            var curDx: CGFloat = 0.0\n            var curDy: CGFloat = 0.0\n            \n            var prevPrev: ChartDataEntry! = dataSet.entryForIndex(minx)\n            var prev: ChartDataEntry! = prevPrev\n            var cur: ChartDataEntry! = prev\n            var next: ChartDataEntry! = dataSet.entryForIndex(minx + 1)\n            \n            if cur == nil || next == nil { return }\n            \n            // let the spline start\n            CGPathMoveToPoint(cubicPath, &valueToPixelMatrix, CGFloat(cur.xIndex), CGFloat(cur.value) * phaseY)\n            \n            for j in minx + 1 ..< min(size, entryCount - 1)\n            {\n                prevPrev = prev\n                prev = cur\n                cur = next\n                next = dataSet.entryForIndex(j + 1)\n                \n                if next == nil { break }\n                \n                prevDx = CGFloat(cur.xIndex - prevPrev.xIndex) * intensity\n                prevDy = CGFloat(cur.value - prevPrev.value) * intensity\n                curDx = CGFloat(next.xIndex - prev.xIndex) * intensity\n                curDy = CGFloat(next.value - prev.value) * intensity\n                \n                CGPathAddCurveToPoint(cubicPath, &valueToPixelMatrix, CGFloat(prev.xIndex) + prevDx, (CGFloat(prev.value) + prevDy) * phaseY,\n                    CGFloat(cur.xIndex) - curDx,\n                    (CGFloat(cur.value) - curDy) * phaseY, CGFloat(cur.xIndex), CGFloat(cur.value) * phaseY)\n            }\n            \n            if (size > entryCount - 1)\n            {\n                prevPrev = dataSet.entryForIndex(entryCount - (entryCount >= 3 ? 3 : 2))\n                prev = dataSet.entryForIndex(entryCount - 2)\n                cur = dataSet.entryForIndex(entryCount - 1)\n                next = cur\n                \n                if prevPrev == nil || prev == nil || cur == nil { return }\n                \n                prevDx = CGFloat(cur.xIndex - prevPrev.xIndex) * intensity\n                prevDy = CGFloat(cur.value - prevPrev.value) * intensity\n                curDx = CGFloat(next.xIndex - prev.xIndex) * intensity\n                curDy = CGFloat(next.value - prev.value) * intensity\n                \n                // the last cubic\n                CGPathAddCurveToPoint(cubicPath, &valueToPixelMatrix, CGFloat(prev.xIndex) + prevDx, (CGFloat(prev.value) + prevDy) * phaseY,\n                    CGFloat(cur.xIndex) - curDx,\n                    (CGFloat(cur.value) - curDy) * phaseY, CGFloat(cur.xIndex), CGFloat(cur.value) * phaseY)\n            }\n        }\n        \n        CGContextSaveGState(context)\n        \n        if (dataSet.isDrawFilledEnabled)\n        {\n            // Copy this path because we make changes to it\n            let fillPath = CGPathCreateMutableCopy(cubicPath)\n            \n            drawCubicFill(context: context, dataSet: dataSet, spline: fillPath!, matrix: valueToPixelMatrix, from: minx, to: size)\n        }\n        \n        CGContextBeginPath(context)\n        CGContextAddPath(context, cubicPath)\n        CGContextSetStrokeColorWithColor(context, drawingColor.CGColor)\n        CGContextStrokePath(context)\n        \n        CGContextRestoreGState(context)\n    }\n    \n    public func drawCubicFill(context context: CGContext, dataSet: ILineChartDataSet, spline: CGMutablePath, matrix: CGAffineTransform, from: Int, to: Int)\n    {\n        guard let dataProvider = dataProvider else { return }\n        \n        if to - from <= 1\n        {\n            return\n        }\n        \n        let fillMin = dataSet.fillFormatter?.getFillLinePosition(dataSet: dataSet, dataProvider: dataProvider) ?? 0.0\n        \n        // Take the from/to xIndex from the entries themselves,\n        // so missing entries won't screw up the filling.\n        // What we need to draw is line from points of the xIndexes - not arbitrary entry indexes!\n        let xTo = dataSet.entryForIndex(to - 1)?.xIndex ?? 0\n        let xFrom = dataSet.entryForIndex(from)?.xIndex ?? 0\n\n        var pt1 = CGPoint(x: CGFloat(xTo), y: fillMin)\n        var pt2 = CGPoint(x: CGFloat(xFrom), y: fillMin)\n        pt1 = CGPointApplyAffineTransform(pt1, matrix)\n        pt2 = CGPointApplyAffineTransform(pt2, matrix)\n        \n        CGPathAddLineToPoint(spline, nil, pt1.x, pt1.y)\n        CGPathAddLineToPoint(spline, nil, pt2.x, pt2.y)\n        CGPathCloseSubpath(spline)\n        \n        if dataSet.fill != nil\n        {\n            drawFilledPath(context: context, path: spline, fill: dataSet.fill!, fillAlpha: dataSet.fillAlpha)\n        }\n        else\n        {\n            drawFilledPath(context: context, path: spline, fillColor: dataSet.fillColor, fillAlpha: dataSet.fillAlpha)\n        }\n    }\n    \n    private var _lineSegments = [CGPoint](count: 2, repeatedValue: CGPoint())\n    \n    public func drawLinear(context context: CGContext, dataSet: ILineChartDataSet)\n    {\n        guard let\n            trans = dataProvider?.getTransformer(dataSet.axisDependency),\n            animator = animator\n            else { return }\n        \n        let valueToPixelMatrix = trans.valueToPixelMatrix\n        \n        let entryCount = dataSet.entryCount\n        let isDrawSteppedEnabled = dataSet.isDrawSteppedEnabled\n        let pointsPerEntryPair = isDrawSteppedEnabled ? 4 : 2\n        \n        let phaseX = animator.phaseX\n        let phaseY = animator.phaseY\n\n        guard let\n            entryFrom = dataSet.entryForXIndex(self.minX < 0 ? self.minX : 0, rounding: .Down),\n            entryTo = dataSet.entryForXIndex(self.maxX, rounding: .Up)\n            else { return }\n        \n        let diff = (entryFrom == entryTo) ? 1 : 0\n        let minx = max(dataSet.entryIndex(entry: entryFrom) - diff, 0)\n        let maxx = min(max(minx + 2, dataSet.entryIndex(entry: entryTo) + 1), entryCount)\n        \n        CGContextSaveGState(context)\n        \n        CGContextSetLineCap(context, dataSet.lineCapType)\n\n        // more than 1 color\n        if (dataSet.colors.count > 1)\n        {\n            if (_lineSegments.count != pointsPerEntryPair)\n            {\n                _lineSegments = [CGPoint](count: pointsPerEntryPair, repeatedValue: CGPoint())\n            }\n            \n            let count = Int(ceil(CGFloat(maxx - minx) * phaseX + CGFloat(minx)))\n            for j in minx ..< count\n            {\n                if (count > 1 && j == count - 1)\n                { // Last point, we have already drawn a line to this point\n                    break\n                }\n                \n                var e: ChartDataEntry! = dataSet.entryForIndex(j)\n                \n                if e == nil { continue }\n                \n                _lineSegments[0].x = CGFloat(e.xIndex)\n                _lineSegments[0].y = CGFloat(e.value) * phaseY\n                \n                if (j + 1 < count)\n                {\n                    e = dataSet.entryForIndex(j + 1)\n                    \n                    if e == nil { break }\n                    \n                    if isDrawSteppedEnabled\n                    {\n                        _lineSegments[1] = CGPoint(x: CGFloat(e.xIndex), y: _lineSegments[0].y)\n                        _lineSegments[2] = _lineSegments[1]\n                        _lineSegments[3] = CGPoint(x: CGFloat(e.xIndex), y: CGFloat(e.value) * phaseY)\n                    }\n                    else\n                    {\n                        _lineSegments[1] = CGPoint(x: CGFloat(e.xIndex), y: CGFloat(e.value) * phaseY)\n                    }\n                }\n                else\n                {\n                    _lineSegments[1] = _lineSegments[0]\n                }\n\n                for i in 0..<_lineSegments.count\n                {\n                    _lineSegments[i] = CGPointApplyAffineTransform(_lineSegments[i], valueToPixelMatrix)\n                }\n                \n                if (!viewPortHandler.isInBoundsRight(_lineSegments[0].x))\n                {\n                    break\n                }\n                \n                // make sure the lines don't do shitty things outside bounds\n                if (!viewPortHandler.isInBoundsLeft(_lineSegments[1].x)\n                    || (!viewPortHandler.isInBoundsTop(_lineSegments[0].y) && !viewPortHandler.isInBoundsBottom(_lineSegments[1].y))\n                    || (!viewPortHandler.isInBoundsTop(_lineSegments[0].y) && !viewPortHandler.isInBoundsBottom(_lineSegments[1].y)))\n                {\n                    continue\n                }\n                \n                // get the color that is set for this line-segment\n                CGContextSetStrokeColorWithColor(context, dataSet.colorAt(j).CGColor)\n                CGContextStrokeLineSegments(context, _lineSegments, pointsPerEntryPair)\n            }\n        }\n        else\n        { // only one color per dataset\n            \n            var e1: ChartDataEntry!\n            var e2: ChartDataEntry!\n            \n            if (_lineSegments.count != max((entryCount - 1) * pointsPerEntryPair, pointsPerEntryPair))\n            {\n                _lineSegments = [CGPoint](count: max((entryCount - 1) * pointsPerEntryPair, pointsPerEntryPair), repeatedValue: CGPoint())\n            }\n            \n            e1 = dataSet.entryForIndex(minx)\n            \n            if e1 != nil\n            {\n                let count = Int(ceil(CGFloat(maxx - minx) * phaseX + CGFloat(minx)))\n                \n                var j = 0\n                for x in (count > 1 ? minx + 1 : minx) ..< count\n                {\n                    e1 = dataSet.entryForIndex(x == 0 ? 0 : (x - 1))\n                    e2 = dataSet.entryForIndex(x)\n                    \n                    if e1 == nil || e2 == nil { continue }\n                    \n                    _lineSegments[j] = CGPointApplyAffineTransform(\n                        CGPoint(\n                            x: CGFloat(e1.xIndex),\n                            y: CGFloat(e1.value) * phaseY\n                        ), valueToPixelMatrix)\n                    j += 1\n                    \n                    if isDrawSteppedEnabled\n                    {\n                        _lineSegments[j] = CGPointApplyAffineTransform(\n                            CGPoint(\n                                x: CGFloat(e2.xIndex),\n                                y: CGFloat(e1.value) * phaseY\n                            ), valueToPixelMatrix)\n                        j += 1\n                        \n                        _lineSegments[j] = CGPointApplyAffineTransform(\n                            CGPoint(\n                                x: CGFloat(e2.xIndex),\n                                y: CGFloat(e1.value) * phaseY\n                            ), valueToPixelMatrix)\n                        j += 1\n                    }\n                    \n                    _lineSegments[j] = CGPointApplyAffineTransform(\n                        CGPoint(\n                            x: CGFloat(e2.xIndex),\n                            y: CGFloat(e2.value) * phaseY\n                        ), valueToPixelMatrix)\n                    j += 1\n                }\n                \n                let size = max((count - minx - 1) * pointsPerEntryPair, pointsPerEntryPair)\n                CGContextSetStrokeColorWithColor(context, dataSet.colorAt(0).CGColor)\n                CGContextStrokeLineSegments(context, _lineSegments, size)\n            }\n        }\n        \n        CGContextRestoreGState(context)\n        \n        // if drawing filled is enabled\n        if (dataSet.isDrawFilledEnabled && entryCount > 0)\n        {\n            drawLinearFill(context: context, dataSet: dataSet, minx: minx, maxx: maxx, trans: trans)\n        }\n    }\n    \n    public func drawLinearFill(context context: CGContext, dataSet: ILineChartDataSet, minx: Int, maxx: Int, trans: ChartTransformer)\n    {\n        guard let dataProvider = dataProvider else { return }\n        \n        let filled = generateFilledPath(\n            dataSet: dataSet,\n            fillMin: dataSet.fillFormatter?.getFillLinePosition(dataSet: dataSet, dataProvider: dataProvider) ?? 0.0,\n            from: minx,\n            to: maxx,\n            matrix: trans.valueToPixelMatrix)\n        \n        if dataSet.fill != nil\n        {\n            drawFilledPath(context: context, path: filled, fill: dataSet.fill!, fillAlpha: dataSet.fillAlpha)\n        }\n        else\n        {\n            drawFilledPath(context: context, path: filled, fillColor: dataSet.fillColor, fillAlpha: dataSet.fillAlpha)\n        }\n    }\n    \n    /// Generates the path that is used for filled drawing.\n    private func generateFilledPath(dataSet dataSet: ILineChartDataSet, fillMin: CGFloat, from: Int, to: Int, matrix: CGAffineTransform) -> CGPath\n    {\n        let phaseX = animator?.phaseX ?? 1.0\n        let phaseY = animator?.phaseY ?? 1.0\n        let isDrawSteppedEnabled = dataSet.isDrawSteppedEnabled\n        var matrix = matrix\n        \n        var e: ChartDataEntry!\n        \n        let filled = CGPathCreateMutable()\n        \n        e = dataSet.entryForIndex(from)\n        if e != nil\n        {\n            CGPathMoveToPoint(filled, &matrix, CGFloat(e.xIndex), fillMin)\n            CGPathAddLineToPoint(filled, &matrix, CGFloat(e.xIndex), CGFloat(e.value) * phaseY)\n        }\n        \n        // create a new path\n        for x in (from + 1).stride(to: Int(ceil(CGFloat(to - from) * phaseX + CGFloat(from))), by: 1)\n        {\n            guard let e = dataSet.entryForIndex(x) else { continue }\n            \n            if isDrawSteppedEnabled\n            {\n                guard let ePrev = dataSet.entryForIndex(x-1) else { continue }\n                CGPathAddLineToPoint(filled, &matrix, CGFloat(e.xIndex), CGFloat(ePrev.value) * phaseY)\n            }\n            \n            CGPathAddLineToPoint(filled, &matrix, CGFloat(e.xIndex), CGFloat(e.value) * phaseY)\n        }\n        \n        // close up\n        e = dataSet.entryForIndex(max(min(Int(ceil(CGFloat(to - from) * phaseX + CGFloat(from))) - 1, dataSet.entryCount - 1), 0))\n        if e != nil\n        {\n            CGPathAddLineToPoint(filled, &matrix, CGFloat(e.xIndex), fillMin)\n        }\n        CGPathCloseSubpath(filled)\n        \n        return filled\n    }\n    \n    public override func drawValues(context context: CGContext)\n    {\n        guard let\n            dataProvider = dataProvider,\n            lineData = dataProvider.lineData,\n            animator = animator\n            else { return }\n        \n        if (CGFloat(lineData.yValCount) < CGFloat(dataProvider.maxVisibleValueCount) * viewPortHandler.scaleX)\n        {\n            var dataSets = lineData.dataSets\n            \n            let phaseX = animator.phaseX\n            let phaseY = animator.phaseY\n            \n            var pt = CGPoint()\n            \n            for i in 0 ..< dataSets.count\n            {\n                guard let dataSet = dataSets[i] as? ILineChartDataSet else { continue }\n                \n                if !dataSet.isDrawValuesEnabled || dataSet.entryCount == 0\n                {\n                    continue\n                }\n                \n                let valueFont = dataSet.valueFont\n                \n                guard let formatter = dataSet.valueFormatter else { continue }\n                \n                let trans = dataProvider.getTransformer(dataSet.axisDependency)\n                let valueToPixelMatrix = trans.valueToPixelMatrix\n                \n                // make sure the values do not interfear with the circles\n                var valOffset = Int(dataSet.circleRadius * 1.75)\n                \n                if (!dataSet.isDrawCirclesEnabled)\n                {\n                    valOffset = valOffset / 2\n                }\n                \n                let entryCount = dataSet.entryCount\n                \n                guard let\n                    entryFrom = dataSet.entryForXIndex(self.minX < 0 ? self.minX : 0, rounding: .Down),\n                    entryTo = dataSet.entryForXIndex(self.maxX, rounding: .Up)\n                    else { continue }\n                \n                let diff = (entryFrom == entryTo) ? 1 : 0\n                let minx = max(dataSet.entryIndex(entry: entryFrom) - diff, 0)\n                let maxx = min(max(minx + 2, dataSet.entryIndex(entry: entryTo) + 1), entryCount)\n                \n                for j in minx ..< Int(ceil(CGFloat(maxx - minx) * phaseX + CGFloat(minx)))\n                {\n                    guard let e = dataSet.entryForIndex(j) else { break }\n                    \n                    pt.x = CGFloat(e.xIndex)\n                    pt.y = CGFloat(e.value) * phaseY\n                    pt = CGPointApplyAffineTransform(pt, valueToPixelMatrix)\n                    \n                    if (!viewPortHandler.isInBoundsRight(pt.x))\n                    {\n                        break\n                    }\n                    \n                    if (!viewPortHandler.isInBoundsLeft(pt.x) || !viewPortHandler.isInBoundsY(pt.y))\n                    {\n                        continue\n                    }\n                    \n                    ChartUtils.drawText(context: context,\n                        text: formatter.stringFromNumber(e.value)!,\n                        point: CGPoint(\n                            x: pt.x,\n                            y: pt.y - CGFloat(valOffset) - valueFont.lineHeight),\n                        align: .Center,\n                        attributes: [NSFontAttributeName: valueFont, NSForegroundColorAttributeName: dataSet.valueTextColorAt(j)])\n                }\n            }\n        }\n    }\n    \n    public override func drawExtras(context context: CGContext)\n    {\n        drawCircles(context: context)\n    }\n    \n    private func drawCircles(context context: CGContext)\n    {\n        guard let\n            dataProvider = dataProvider,\n            lineData = dataProvider.lineData,\n            animator = animator\n            else { return }\n        \n        let phaseX = animator.phaseX\n        let phaseY = animator.phaseY\n        \n        let dataSets = lineData.dataSets\n        \n        var pt = CGPoint()\n        var rect = CGRect()\n        \n        CGContextSaveGState(context)\n        \n        for i in 0 ..< dataSets.count\n        {\n            guard let dataSet = lineData.getDataSetByIndex(i) as? ILineChartDataSet else { continue }\n            \n            if !dataSet.isVisible || !dataSet.isDrawCirclesEnabled || dataSet.entryCount == 0\n            {\n                continue\n            }\n            \n            let trans = dataProvider.getTransformer(dataSet.axisDependency)\n            let valueToPixelMatrix = trans.valueToPixelMatrix\n            \n            let entryCount = dataSet.entryCount\n            \n            let circleRadius = dataSet.circleRadius\n            let circleDiameter = circleRadius * 2.0\n            let circleHoleDiameter = circleRadius\n            let circleHoleRadius = circleHoleDiameter / 2.0\n            let isDrawCircleHoleEnabled = dataSet.isDrawCircleHoleEnabled\n            \n            guard let\n                entryFrom = dataSet.entryForXIndex(self.minX < 0 ? self.minX : 0, rounding: .Down),\n                entryTo = dataSet.entryForXIndex(self.maxX, rounding: .Up)\n                else { continue }\n            \n            let diff = (entryFrom == entryTo) ? 1 : 0\n            let minx = max(dataSet.entryIndex(entry: entryFrom) - diff, 0)\n            let maxx = min(max(minx + 2, dataSet.entryIndex(entry: entryTo) + 1), entryCount)\n            \n            for j in minx ..< Int(ceil(CGFloat(maxx - minx) * phaseX + CGFloat(minx)))\n            {\n                guard let e = dataSet.entryForIndex(j) else { break }\n\n                pt.x = CGFloat(e.xIndex)\n                pt.y = CGFloat(e.value) * phaseY\n                pt = CGPointApplyAffineTransform(pt, valueToPixelMatrix)\n                \n                if (!viewPortHandler.isInBoundsRight(pt.x))\n                {\n                    break\n                }\n                \n                // make sure the circles don't do shitty things outside bounds\n                if (!viewPortHandler.isInBoundsLeft(pt.x) || !viewPortHandler.isInBoundsY(pt.y))\n                {\n                    continue\n                }\n                \n                CGContextSetFillColorWithColor(context, dataSet.getCircleColor(j)!.CGColor)\n                \n                rect.origin.x = pt.x - circleRadius\n                rect.origin.y = pt.y - circleRadius\n                rect.size.width = circleDiameter\n                rect.size.height = circleDiameter\n                CGContextFillEllipseInRect(context, rect)\n                \n                if (isDrawCircleHoleEnabled)\n                {\n                    CGContextSetFillColorWithColor(context, dataSet.circleHoleColor.CGColor)\n                    \n                    rect.origin.x = pt.x - circleHoleRadius\n                    rect.origin.y = pt.y - circleHoleRadius\n                    rect.size.width = circleHoleDiameter\n                    rect.size.height = circleHoleDiameter\n                    CGContextFillEllipseInRect(context, rect)\n                }\n            }\n        }\n        \n        CGContextRestoreGState(context)\n    }\n    \n    private var _highlightPointBuffer = CGPoint()\n    \n    public override func drawHighlighted(context context: CGContext, indices: [ChartHighlight])\n    {\n        guard let\n            lineData = dataProvider?.lineData,\n            chartXMax = dataProvider?.chartXMax,\n            animator = animator\n            else { return }\n        \n        CGContextSaveGState(context)\n        \n        for i in 0 ..< indices.count\n        {\n            guard let set = lineData.getDataSetByIndex(indices[i].dataSetIndex) as? ILineChartDataSet else { continue }\n            \n            if !set.isHighlightEnabled\n            {\n                continue\n            }\n            \n            CGContextSetStrokeColorWithColor(context, set.highlightColor.CGColor)\n            CGContextSetLineWidth(context, set.highlightLineWidth)\n            if (set.highlightLineDashLengths != nil)\n            {\n                CGContextSetLineDash(context, set.highlightLineDashPhase, set.highlightLineDashLengths!, set.highlightLineDashLengths!.count)\n            }\n            else\n            {\n                CGContextSetLineDash(context, 0.0, nil, 0)\n            }\n            \n            let xIndex = indices[i].xIndex; // get the x-position\n            \n            if (CGFloat(xIndex) > CGFloat(chartXMax) * animator.phaseX)\n            {\n                continue\n            }\n            \n            let yValue = set.yValForXIndex(xIndex)\n            if (yValue.isNaN)\n            {\n                continue\n            }\n            \n            let y = CGFloat(yValue) * animator.phaseY; // get the y-position\n            \n            _highlightPointBuffer.x = CGFloat(xIndex)\n            _highlightPointBuffer.y = y\n            \n            let trans = dataProvider?.getTransformer(set.axisDependency)\n            \n            trans?.pointValueToPixel(&_highlightPointBuffer)\n            \n            // draw the lines\n            drawHighlightLines(context: context, point: _highlightPointBuffer, set: set)\n        }\n        \n        CGContextRestoreGState(context)\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Renderers/LineRadarChartRenderer.swift",
    "content": "//\n//  LineRadarChartRenderer.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 27/01/2016.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n\npublic class LineRadarChartRenderer: LineScatterCandleRadarChartRenderer\n{\n    public override init(animator: ChartAnimator?, viewPortHandler: ChartViewPortHandler)\n    {\n        super.init(animator: animator, viewPortHandler: viewPortHandler)\n    }\n    \n    /// Draws the provided path in filled mode with the provided drawable.\n    public func drawFilledPath(context context: CGContext, path: CGPath, fill: ChartFill, fillAlpha: CGFloat)\n    {\n        CGContextSaveGState(context)\n        CGContextBeginPath(context)\n        CGContextAddPath(context, path)\n        \n        // filled is usually drawn with less alpha\n        CGContextSetAlpha(context, fillAlpha)\n        \n        fill.fillPath(context: context, rect: viewPortHandler.contentRect)\n        \n        CGContextRestoreGState(context)\n    }\n    \n    /// Draws the provided path in filled mode with the provided color and alpha.\n    public func drawFilledPath(context context: CGContext, path: CGPath, fillColor: NSUIColor, fillAlpha: CGFloat)\n    {\n        CGContextSaveGState(context)\n        CGContextBeginPath(context)\n        CGContextAddPath(context, path)\n        \n        // filled is usually drawn with less alpha\n        CGContextSetAlpha(context, fillAlpha)\n        \n        CGContextSetFillColorWithColor(context, fillColor.CGColor)\n        CGContextFillPath(context)\n        \n        CGContextRestoreGState(context)\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Renderers/LineScatterCandleRadarChartRenderer.swift",
    "content": "//\n//  LineScatterCandleRadarChartRenderer.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 29/7/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n\npublic class LineScatterCandleRadarChartRenderer: ChartDataRendererBase\n{\n    public override init(animator: ChartAnimator?, viewPortHandler: ChartViewPortHandler)\n    {\n        super.init(animator: animator, viewPortHandler: viewPortHandler)\n    }\n    \n    /// Draws vertical & horizontal highlight-lines if enabled.\n    /// :param: context\n    /// :param: points\n    /// :param: horizontal\n    /// :param: vertical\n    public func drawHighlightLines(context context: CGContext, point: CGPoint, set: ILineScatterCandleRadarChartDataSet)\n    {\n        // draw vertical highlight lines\n        if set.isVerticalHighlightIndicatorEnabled\n        {\n            CGContextBeginPath(context)\n            CGContextMoveToPoint(context, point.x, viewPortHandler.contentTop)\n            CGContextAddLineToPoint(context, point.x, viewPortHandler.contentBottom)\n            CGContextStrokePath(context)\n        }\n        \n        // draw horizontal highlight lines\n        if set.isHorizontalHighlightIndicatorEnabled\n        {\n            CGContextBeginPath(context)\n            CGContextMoveToPoint(context, viewPortHandler.contentLeft, point.y)\n            CGContextAddLineToPoint(context, viewPortHandler.contentRight, point.y)\n            CGContextStrokePath(context)\n        }\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Renderers/PieChartRenderer.swift",
    "content": "//\n//  PieChartRenderer.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n\npublic class PieChartRenderer: ChartDataRendererBase\n{\n    public weak var chart: PieChartView?\n    \n    public init(chart: PieChartView, animator: ChartAnimator?, viewPortHandler: ChartViewPortHandler)\n    {\n        super.init(animator: animator, viewPortHandler: viewPortHandler)\n        \n        self.chart = chart\n    }\n    \n    public override func drawData(context context: CGContext)\n    {\n        guard let chart = chart else { return }\n        \n        let pieData = chart.data\n        \n        if (pieData != nil)\n        {\n            for set in pieData!.dataSets as! [IPieChartDataSet]\n            {\n                if set.isVisible && set.entryCount > 0\n                {\n                    drawDataSet(context: context, dataSet: set)\n                }\n            }\n        }\n    }\n    \n    public func calculateMinimumRadiusForSpacedSlice(\n        center center: CGPoint,\n        radius: CGFloat,\n        angle: CGFloat,\n        arcStartPointX: CGFloat,\n        arcStartPointY: CGFloat,\n        startAngle: CGFloat,\n        sweepAngle: CGFloat) -> CGFloat\n    {\n        let angleMiddle = startAngle + sweepAngle / 2.0\n        \n        // Other point of the arc\n        let arcEndPointX = center.x + radius * cos((startAngle + sweepAngle) * ChartUtils.Math.FDEG2RAD)\n        let arcEndPointY = center.y + radius * sin((startAngle + sweepAngle) * ChartUtils.Math.FDEG2RAD)\n        \n        // Middle point on the arc\n        let arcMidPointX = center.x + radius * cos(angleMiddle * ChartUtils.Math.FDEG2RAD)\n        let arcMidPointY = center.y + radius * sin(angleMiddle * ChartUtils.Math.FDEG2RAD)\n        \n        // This is the base of the contained triangle\n        let basePointsDistance = sqrt(\n            pow(arcEndPointX - arcStartPointX, 2) +\n                pow(arcEndPointY - arcStartPointY, 2))\n        \n        // After reducing space from both sides of the \"slice\",\n        //   the angle of the contained triangle should stay the same.\n        // So let's find out the height of that triangle.\n        let containedTriangleHeight = (basePointsDistance / 2.0 *\n            tan((180.0 - angle) / 2.0 * ChartUtils.Math.FDEG2RAD))\n        \n        // Now we subtract that from the radius\n        var spacedRadius = radius - containedTriangleHeight\n        \n        // And now subtract the height of the arc that's between the triangle and the outer circle\n        spacedRadius -= sqrt(\n            pow(arcMidPointX - (arcEndPointX + arcStartPointX) / 2.0, 2) +\n                pow(arcMidPointY - (arcEndPointY + arcStartPointY) / 2.0, 2))\n        \n        return spacedRadius\n    }\n    \n    public func drawDataSet(context context: CGContext, dataSet: IPieChartDataSet)\n    {\n        guard let\n            chart = chart,\n            data = chart.data,\n            animator = animator\n            else {return }\n        \n        var angle: CGFloat = 0.0\n        let rotationAngle = chart.rotationAngle\n        \n        let phaseX = animator.phaseX\n        let phaseY = animator.phaseY\n        \n        let entryCount = dataSet.entryCount\n        var drawAngles = chart.drawAngles\n        let center = chart.centerCircleBox\n        let radius = chart.radius\n        let drawInnerArc = chart.drawHoleEnabled && !chart.drawSlicesUnderHoleEnabled\n        let userInnerRadius = drawInnerArc ? radius * chart.holeRadiusPercent : 0.0\n        \n        var visibleAngleCount = 0\n        for j in 0 ..< entryCount\n        {\n            guard let e = dataSet.entryForIndex(j) else { continue }\n            if ((abs(e.value) > 0.000001))\n            {\n                visibleAngleCount += 1\n            }\n        }\n        \n        let sliceSpace = visibleAngleCount <= 1 ? 0.0 : dataSet.sliceSpace\n\n        CGContextSaveGState(context)\n        \n        for j in 0 ..< entryCount\n        {\n            let sliceAngle = drawAngles[j]\n            var innerRadius = userInnerRadius\n            \n            guard let e = dataSet.entryForIndex(j) else { continue }\n            \n            // draw only if the value is greater than zero\n            if ((abs(e.value) > 0.000001))\n            {\n                if (!chart.needsHighlight(xIndex: e.xIndex,\n                    dataSetIndex: data.indexOfDataSet(dataSet)))\n                {\n                    let accountForSliceSpacing = sliceSpace > 0.0 && sliceAngle <= 180.0\n                    \n                    CGContextSetFillColorWithColor(context, dataSet.colorAt(j).CGColor)\n                    \n                    let sliceSpaceAngleOuter = visibleAngleCount == 1 ?\n                        0.0 :\n                        sliceSpace / (ChartUtils.Math.FDEG2RAD * radius)\n                    let startAngleOuter = rotationAngle + (angle + sliceSpaceAngleOuter / 2.0) * phaseY\n                    var sweepAngleOuter = (sliceAngle - sliceSpaceAngleOuter) * phaseY\n                    if (sweepAngleOuter < 0.0)\n                    {\n                        sweepAngleOuter = 0.0\n                    }\n                    \n                    let arcStartPointX = center.x + radius * cos(startAngleOuter * ChartUtils.Math.FDEG2RAD)\n                    let arcStartPointY = center.y + radius * sin(startAngleOuter * ChartUtils.Math.FDEG2RAD)\n\n                    let path = CGPathCreateMutable()\n                    \n                    CGPathMoveToPoint(\n                        path,\n                        nil,\n                        arcStartPointX,\n                        arcStartPointY)\n                    CGPathAddRelativeArc(\n                        path,\n                        nil,\n                        center.x,\n                        center.y,\n                        radius,\n                        startAngleOuter * ChartUtils.Math.FDEG2RAD,\n                        sweepAngleOuter * ChartUtils.Math.FDEG2RAD)\n\n                    if drawInnerArc &&\n                        (innerRadius > 0.0 || accountForSliceSpacing)\n                    {\n                        if accountForSliceSpacing\n                        {\n                            var minSpacedRadius = calculateMinimumRadiusForSpacedSlice(\n                                center: center,\n                                radius: radius,\n                                angle: sliceAngle * phaseY,\n                                arcStartPointX: arcStartPointX,\n                                arcStartPointY: arcStartPointY,\n                                startAngle: startAngleOuter,\n                                sweepAngle: sweepAngleOuter)\n                            if minSpacedRadius < 0.0\n                            {\n                                minSpacedRadius = -minSpacedRadius\n                            }\n                            innerRadius = min(max(innerRadius, minSpacedRadius), radius)\n                        }\n                        \n                        let sliceSpaceAngleInner = visibleAngleCount == 1 || innerRadius == 0.0 ?\n                            0.0 :\n                            sliceSpace / (ChartUtils.Math.FDEG2RAD * innerRadius)\n                        let startAngleInner = rotationAngle + (angle + sliceSpaceAngleInner / 2.0) * phaseY\n                        var sweepAngleInner = (sliceAngle - sliceSpaceAngleInner) * phaseY\n                        if (sweepAngleInner < 0.0)\n                        {\n                            sweepAngleInner = 0.0\n                        }\n                        let endAngleInner = startAngleInner + sweepAngleInner\n                        \n                        CGPathAddLineToPoint(\n                            path,\n                            nil,\n                            center.x + innerRadius * cos(endAngleInner * ChartUtils.Math.FDEG2RAD),\n                            center.y + innerRadius * sin(endAngleInner * ChartUtils.Math.FDEG2RAD))\n                        CGPathAddRelativeArc(\n                            path,\n                            nil,\n                            center.x,\n                            center.y,\n                            innerRadius,\n                            endAngleInner * ChartUtils.Math.FDEG2RAD,\n                            -sweepAngleInner * ChartUtils.Math.FDEG2RAD)\n                    }\n                    else\n                    {\n                        if accountForSliceSpacing\n                        {\n                            let angleMiddle = startAngleOuter + sweepAngleOuter / 2.0\n                            \n                            let sliceSpaceOffset =\n                                calculateMinimumRadiusForSpacedSlice(\n                                    center: center,\n                                    radius: radius,\n                                    angle: sliceAngle * phaseY,\n                                    arcStartPointX: arcStartPointX,\n                                    arcStartPointY: arcStartPointY,\n                                    startAngle: startAngleOuter,\n                                    sweepAngle: sweepAngleOuter)\n\n                            let arcEndPointX = center.x + sliceSpaceOffset * cos(angleMiddle * ChartUtils.Math.FDEG2RAD)\n                            let arcEndPointY = center.y + sliceSpaceOffset * sin(angleMiddle * ChartUtils.Math.FDEG2RAD)\n                            \n                            CGPathAddLineToPoint(\n                                path,\n                                nil,\n                                arcEndPointX,\n                                arcEndPointY)\n                        }\n                        else\n                        {\n                            CGPathAddLineToPoint(\n                                path,\n                                nil,\n                                center.x,\n                                center.y)\n                        }\n                    }\n                    \n                    CGPathCloseSubpath(path)\n                    \n                    CGContextBeginPath(context)\n                    CGContextAddPath(context, path)\n                    CGContextEOFillPath(context)\n                }\n            }\n            \n            angle += sliceAngle * phaseX\n        }\n        \n        CGContextRestoreGState(context)\n    }\n    \n    public override func drawValues(context context: CGContext)\n    {\n        guard let\n            chart = chart,\n            data = chart.data,\n            animator = animator\n            else { return }\n        \n        let center = chart.centerCircleBox\n        \n        // get whole the radius\n        var r = chart.radius\n        let rotationAngle = chart.rotationAngle\n        var drawAngles = chart.drawAngles\n        var absoluteAngles = chart.absoluteAngles\n        \n        let phaseX = animator.phaseX\n        let phaseY = animator.phaseY\n        \n        var off = r / 10.0 * 3.0\n        \n        if chart.drawHoleEnabled\n        {\n            off = (r - (r * chart.holeRadiusPercent)) / 2.0\n        }\n        \n        r -= off; // offset to keep things inside the chart\n        \n        var dataSets = data.dataSets\n        \n        let yValueSum = (data as! PieChartData).yValueSum\n        \n        let drawXVals = chart.isDrawSliceTextEnabled\n        let usePercentValuesEnabled = chart.usePercentValuesEnabled\n        \n        var angle: CGFloat = 0.0\n        var xIndex = 0\n        \n        for i in 0 ..< dataSets.count\n        {\n            guard let dataSet = dataSets[i] as? IPieChartDataSet else { continue }\n            \n            let drawYVals = dataSet.isDrawValuesEnabled\n            \n            if (!drawYVals && !drawXVals)\n            {\n                continue\n            }\n            \n            let valueFont = dataSet.valueFont\n            \n            guard let formatter = dataSet.valueFormatter else { continue }\n            \n            for j in 0 ..< dataSet.entryCount\n            {\n                if (drawXVals && !drawYVals && (j >= data.xValCount || data.xVals[j] == nil))\n                {\n                    continue\n                }\n                \n                guard let e = dataSet.entryForIndex(j) else { continue }\n                \n                if (xIndex == 0)\n                {\n                    angle = 0.0\n                }\n                else\n                {\n                    angle = absoluteAngles[xIndex - 1] * phaseX\n                }\n                \n                let sliceAngle = drawAngles[xIndex]\n                let sliceSpace = dataSet.sliceSpace\n                let sliceSpaceMiddleAngle = sliceSpace / (ChartUtils.Math.FDEG2RAD * r)\n                \n                // offset needed to center the drawn text in the slice\n                let offset = (sliceAngle - sliceSpaceMiddleAngle / 2.0) / 2.0\n\n                angle = angle + offset\n                \n                // calculate the text position\n                let x = r\n                    * cos((rotationAngle + angle * phaseY) * ChartUtils.Math.FDEG2RAD)\n                    + center.x\n                var y = r\n                    * sin((rotationAngle + angle * phaseY) * ChartUtils.Math.FDEG2RAD)\n                    + center.y\n\n                let value = usePercentValuesEnabled ? e.value / yValueSum * 100.0 : e.value\n                \n                let val = formatter.stringFromNumber(value)!\n                \n                let lineHeight = valueFont.lineHeight\n                y -= lineHeight\n                \n                // draw everything, depending on settings\n                if (drawXVals && drawYVals)\n                {\n                    ChartUtils.drawText(\n                        context: context,\n                        text: val,\n                        point: CGPoint(x: x, y: y),\n                        align: .Center,\n                        attributes: [NSFontAttributeName: valueFont, NSForegroundColorAttributeName: dataSet.valueTextColorAt(j)]\n                    )\n                    \n                    if (j < data.xValCount && data.xVals[j] != nil)\n                    {\n                        ChartUtils.drawText(\n                            context: context,\n                            text: data.xVals[j]!,\n                            point: CGPoint(x: x, y: y + lineHeight),\n                            align: .Center,\n                            attributes: [NSFontAttributeName: valueFont, NSForegroundColorAttributeName: dataSet.valueTextColorAt(j)]\n                        )\n                    }\n                }\n                else if (drawXVals)\n                {\n                    ChartUtils.drawText(\n                        context: context,\n                        text: data.xVals[j]!,\n                        point: CGPoint(x: x, y: y + lineHeight / 2.0),\n                        align: .Center,\n                        attributes: [NSFontAttributeName: valueFont, NSForegroundColorAttributeName: dataSet.valueTextColorAt(j)]\n                    )\n                }\n                else if (drawYVals)\n                {\n                    ChartUtils.drawText(\n                        context: context,\n                        text: val,\n                        point: CGPoint(x: x, y: y + lineHeight / 2.0),\n                        align: .Center,\n                        attributes: [NSFontAttributeName: valueFont, NSForegroundColorAttributeName: dataSet.valueTextColorAt(j)]\n                    )\n                }\n                \n                xIndex += 1\n            }\n        }\n    }\n    \n    public override func drawExtras(context context: CGContext)\n    {\n        drawHole(context: context)\n        drawCenterText(context: context)\n    }\n    \n    /// draws the hole in the center of the chart and the transparent circle / hole\n    private func drawHole(context context: CGContext)\n    {\n        guard let\n            chart = chart,\n            animator = animator\n            else { return }\n        \n        if (chart.drawHoleEnabled)\n        {\n            CGContextSaveGState(context)\n            \n            let radius = chart.radius\n            let holeRadius = radius * chart.holeRadiusPercent\n            let center = chart.centerCircleBox\n            \n            if let holeColor = chart.holeColor\n            {\n                if holeColor != NSUIColor.clearColor()\n                {\n                    // draw the hole-circle\n                    CGContextSetFillColorWithColor(context, chart.holeColor!.CGColor)\n                    CGContextFillEllipseInRect(context, CGRect(x: center.x - holeRadius, y: center.y - holeRadius, width: holeRadius * 2.0, height: holeRadius * 2.0))\n                }\n            }\n            \n            // only draw the circle if it can be seen (not covered by the hole)\n            if let transparentCircleColor = chart.transparentCircleColor\n            {\n                if transparentCircleColor != NSUIColor.clearColor() &&\n                    chart.transparentCircleRadiusPercent > chart.holeRadiusPercent\n                {\n                    let alpha = animator.phaseX * animator.phaseY\n                    let secondHoleRadius = radius * chart.transparentCircleRadiusPercent\n                    \n                    // make transparent\n                    CGContextSetAlpha(context, alpha);\n                    CGContextSetFillColorWithColor(context, transparentCircleColor.CGColor)\n                    \n                    // draw the transparent-circle\n                    CGContextBeginPath(context)\n                    CGContextAddEllipseInRect(context, CGRect(\n                        x: center.x - secondHoleRadius,\n                        y: center.y - secondHoleRadius,\n                        width: secondHoleRadius * 2.0,\n                        height: secondHoleRadius * 2.0))\n                    CGContextAddEllipseInRect(context, CGRect(\n                        x: center.x - holeRadius,\n                        y: center.y - holeRadius,\n                        width: holeRadius * 2.0,\n                        height: holeRadius * 2.0))\n                    CGContextEOFillPath(context)\n                }\n            }\n            \n            CGContextRestoreGState(context)\n        }\n    }\n    \n    /// draws the description text in the center of the pie chart makes most sense when center-hole is enabled\n    private func drawCenterText(context context: CGContext)\n    {\n        guard let\n            chart = chart,\n            centerAttributedText = chart.centerAttributedText\n            else { return }\n        \n        if chart.drawCenterTextEnabled && centerAttributedText.length > 0\n        {\n            let center = chart.centerCircleBox\n            let innerRadius = chart.drawHoleEnabled && !chart.drawSlicesUnderHoleEnabled ? chart.radius * chart.holeRadiusPercent : chart.radius\n            let holeRect = CGRect(x: center.x - innerRadius, y: center.y - innerRadius, width: innerRadius * 2.0, height: innerRadius * 2.0)\n            var boundingRect = holeRect\n            \n            if (chart.centerTextRadiusPercent > 0.0)\n            {\n                boundingRect = CGRectInset(boundingRect, (boundingRect.width - boundingRect.width * chart.centerTextRadiusPercent) / 2.0, (boundingRect.height - boundingRect.height * chart.centerTextRadiusPercent) / 2.0)\n            }\n            \n            let textBounds = centerAttributedText.boundingRectWithSize(boundingRect.size, options: [.UsesLineFragmentOrigin, .UsesFontLeading, .TruncatesLastVisibleLine], context: nil)\n            \n            var drawingRect = boundingRect\n            drawingRect.origin.x += (boundingRect.size.width - textBounds.size.width) / 2.0\n            drawingRect.origin.y += (boundingRect.size.height - textBounds.size.height) / 2.0\n            drawingRect.size = textBounds.size\n            \n            CGContextSaveGState(context)\n\n            let clippingPath = CGPathCreateWithEllipseInRect(holeRect, nil)\n            CGContextBeginPath(context)\n            CGContextAddPath(context, clippingPath)\n            CGContextClip(context)\n            \n            centerAttributedText.drawWithRect(drawingRect, options: [.UsesLineFragmentOrigin, .UsesFontLeading, .TruncatesLastVisibleLine], context: nil)\n            \n            CGContextRestoreGState(context)\n        }\n    }\n    \n    public override func drawHighlighted(context context: CGContext, indices: [ChartHighlight])\n    {\n        guard let\n            chart = chart,\n            data = chart.data,\n            animator = animator\n            else { return }\n        \n        CGContextSaveGState(context)\n        \n        let phaseX = animator.phaseX\n        let phaseY = animator.phaseY\n        \n        var angle: CGFloat = 0.0\n        let rotationAngle = chart.rotationAngle\n        \n        var drawAngles = chart.drawAngles\n        var absoluteAngles = chart.absoluteAngles\n        let center = chart.centerCircleBox\n        let radius = chart.radius\n        let drawInnerArc = chart.drawHoleEnabled && !chart.drawSlicesUnderHoleEnabled\n        let userInnerRadius = drawInnerArc ? radius * chart.holeRadiusPercent : 0.0\n        \n        for i in 0 ..< indices.count\n        {\n            // get the index to highlight\n            let xIndex = indices[i].xIndex\n            if (xIndex >= drawAngles.count)\n            {\n                continue\n            }\n            \n            guard let set = data.getDataSetByIndex(indices[i].dataSetIndex) as? IPieChartDataSet else { continue }\n            \n            if !set.isHighlightEnabled\n            {\n                continue\n            }\n            \n            let entryCount = set.entryCount\n            var visibleAngleCount = 0\n            for j in 0 ..< entryCount\n            {\n                guard let e = set.entryForIndex(j) else { continue }\n                if ((abs(e.value) > 0.000001))\n                {\n                    visibleAngleCount += 1\n                }\n            }\n            \n            if (xIndex == 0)\n            {\n                angle = 0.0\n            }\n            else\n            {\n                angle = absoluteAngles[xIndex - 1] * phaseX\n            }\n            \n            let sliceSpace = visibleAngleCount <= 1 ? 0.0 : set.sliceSpace\n            \n            let sliceAngle = drawAngles[xIndex]\n            var innerRadius = userInnerRadius\n            \n            let shift = set.selectionShift\n            let highlightedRadius = radius + shift\n            \n            let accountForSliceSpacing = sliceSpace > 0.0 && sliceAngle <= 180.0\n            \n            CGContextSetFillColorWithColor(context, set.colorAt(xIndex).CGColor)\n            \n            let sliceSpaceAngleOuter = visibleAngleCount == 1 ?\n                0.0 :\n                sliceSpace / (ChartUtils.Math.FDEG2RAD * radius)\n            \n            let sliceSpaceAngleShifted = visibleAngleCount == 1 ?\n                0.0 :\n                sliceSpace / (ChartUtils.Math.FDEG2RAD * highlightedRadius)\n            \n            let startAngleOuter = rotationAngle + (angle + sliceSpaceAngleOuter / 2.0) * phaseY\n            var sweepAngleOuter = (sliceAngle - sliceSpaceAngleOuter) * phaseY\n            if (sweepAngleOuter < 0.0)\n            {\n                sweepAngleOuter = 0.0\n            }\n            \n            let startAngleShifted = rotationAngle + (angle + sliceSpaceAngleShifted / 2.0) * phaseY\n            var sweepAngleShifted = (sliceAngle - sliceSpaceAngleShifted) * phaseY\n            if (sweepAngleShifted < 0.0)\n            {\n                sweepAngleShifted = 0.0\n            }\n            \n            let path = CGPathCreateMutable()\n            \n            CGPathMoveToPoint(\n                path,\n                nil,\n                center.x + highlightedRadius * cos(startAngleShifted * ChartUtils.Math.FDEG2RAD),\n                center.y + highlightedRadius * sin(startAngleShifted * ChartUtils.Math.FDEG2RAD))\n            CGPathAddRelativeArc(\n                path,\n                nil,\n                center.x,\n                center.y,\n                highlightedRadius,\n                startAngleShifted * ChartUtils.Math.FDEG2RAD,\n                sweepAngleShifted * ChartUtils.Math.FDEG2RAD)\n            \n            var sliceSpaceRadius: CGFloat = 0.0\n            if accountForSliceSpacing\n            {\n                sliceSpaceRadius = calculateMinimumRadiusForSpacedSlice(\n                    center: center,\n                    radius: radius,\n                    angle: sliceAngle * phaseY,\n                    arcStartPointX: center.x + radius * cos(startAngleOuter * ChartUtils.Math.FDEG2RAD),\n                    arcStartPointY: center.y + radius * sin(startAngleOuter * ChartUtils.Math.FDEG2RAD),\n                    startAngle: startAngleOuter,\n                    sweepAngle: sweepAngleOuter)\n            }\n            \n            if drawInnerArc &&\n                (innerRadius > 0.0 || accountForSliceSpacing)\n            {\n                if accountForSliceSpacing\n                {\n                    var minSpacedRadius = sliceSpaceRadius\n                    if minSpacedRadius < 0.0\n                    {\n                        minSpacedRadius = -minSpacedRadius\n                    }\n                    innerRadius = min(max(innerRadius, minSpacedRadius), radius)\n                }\n                \n                let sliceSpaceAngleInner = visibleAngleCount == 1 || innerRadius == 0.0 ?\n                    0.0 :\n                    sliceSpace / (ChartUtils.Math.FDEG2RAD * innerRadius)\n                let startAngleInner = rotationAngle + (angle + sliceSpaceAngleInner / 2.0) * phaseY\n                var sweepAngleInner = (sliceAngle - sliceSpaceAngleInner) * phaseY\n                if (sweepAngleInner < 0.0)\n                {\n                    sweepAngleInner = 0.0\n                }\n                let endAngleInner = startAngleInner + sweepAngleInner\n                \n                CGPathAddLineToPoint(\n                    path,\n                    nil,\n                    center.x + innerRadius * cos(endAngleInner * ChartUtils.Math.FDEG2RAD),\n                    center.y + innerRadius * sin(endAngleInner * ChartUtils.Math.FDEG2RAD))\n                CGPathAddRelativeArc(\n                    path,\n                    nil,\n                    center.x,\n                    center.y,\n                    innerRadius,\n                    endAngleInner * ChartUtils.Math.FDEG2RAD,\n                    -sweepAngleInner * ChartUtils.Math.FDEG2RAD)\n            }\n            else\n            {\n                if accountForSliceSpacing\n                {\n                    let angleMiddle = startAngleOuter + sweepAngleOuter / 2.0\n                    \n                    let arcEndPointX = center.x + sliceSpaceRadius * cos(angleMiddle * ChartUtils.Math.FDEG2RAD)\n                    let arcEndPointY = center.y + sliceSpaceRadius * sin(angleMiddle * ChartUtils.Math.FDEG2RAD)\n                    \n                    CGPathAddLineToPoint(\n                        path,\n                        nil,\n                        arcEndPointX,\n                        arcEndPointY)\n                }\n                else\n                {\n                    CGPathAddLineToPoint(\n                        path,\n                        nil,\n                        center.x,\n                        center.y)\n                }\n            }\n            \n            CGPathCloseSubpath(path)\n            \n            CGContextBeginPath(context)\n            CGContextAddPath(context, path)\n            CGContextEOFillPath(context)\n        }\n        \n        CGContextRestoreGState(context)\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Renderers/RadarChartRenderer.swift",
    "content": "//\n//  RadarChartRenderer.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n\npublic class RadarChartRenderer: LineRadarChartRenderer\n{\n    public weak var chart: RadarChartView?\n\n    public init(chart: RadarChartView, animator: ChartAnimator?, viewPortHandler: ChartViewPortHandler)\n    {\n        super.init(animator: animator, viewPortHandler: viewPortHandler)\n        \n        self.chart = chart\n    }\n    \n    public override func drawData(context context: CGContext)\n    {\n        guard let chart = chart else { return }\n        \n        let radarData = chart.data\n        \n        if (radarData != nil)\n        {\n            var mostEntries = 0\n            \n            for set in radarData!.dataSets\n            {\n                if set.entryCount > mostEntries\n                {\n                    mostEntries = set.entryCount\n                }\n            }\n            \n            for set in radarData!.dataSets as! [IRadarChartDataSet]\n            {\n                if set.isVisible && set.entryCount > 0\n                {\n                    drawDataSet(context: context, dataSet: set, mostEntries: mostEntries)\n                }\n            }\n        }\n    }\n    \n    /// Draws the RadarDataSet\n    ///\n    /// - parameter context:\n    /// - parameter dataSet:\n    /// - parameter mostEntries: the entry count of the dataset with the most entries\n    internal func drawDataSet(context context: CGContext, dataSet: IRadarChartDataSet, mostEntries: Int)\n    {\n        guard let\n            chart = chart,\n            animator = animator\n            else { return }\n        \n        CGContextSaveGState(context)\n        \n        let phaseX = animator.phaseX\n        let phaseY = animator.phaseY\n        \n        let sliceangle = chart.sliceAngle\n        \n        // calculate the factor that is needed for transforming the value to pixels\n        let factor = chart.factor\n        \n        let center = chart.centerOffsets\n        let entryCount = dataSet.entryCount\n        let path = CGPathCreateMutable()\n        var hasMovedToPoint = false\n        \n        for j in 0 ..< entryCount\n        {\n            guard let e = dataSet.entryForIndex(j) else { continue }\n            \n            let p = ChartUtils.getPosition(\n                center: center,\n                dist: CGFloat(e.value - chart.chartYMin) * factor * phaseY,\n                angle: sliceangle * CGFloat(j) * phaseX + chart.rotationAngle)\n            \n            if p.x.isNaN\n            {\n                continue\n            }\n            \n            if !hasMovedToPoint\n            {\n                CGPathMoveToPoint(path, nil, p.x, p.y)\n                hasMovedToPoint = true\n            }\n            else\n            {\n                CGPathAddLineToPoint(path, nil, p.x, p.y)\n            }\n        }\n        \n        // if this is the largest set, close it\n        if dataSet.entryCount < mostEntries\n        {\n            // if this is not the largest set, draw a line to the center before closing\n            CGPathAddLineToPoint(path, nil, center.x, center.y)\n        }\n        \n        CGPathCloseSubpath(path)\n        \n        // draw filled\n        if dataSet.isDrawFilledEnabled\n        {\n            if dataSet.fill != nil\n            {\n                drawFilledPath(context: context, path: path, fill: dataSet.fill!, fillAlpha: dataSet.fillAlpha)\n            }\n            else\n            {\n                drawFilledPath(context: context, path: path, fillColor: dataSet.fillColor, fillAlpha: dataSet.fillAlpha)\n            }\n        }\n        \n        // draw the line (only if filled is disabled or alpha is below 255)\n        if !dataSet.isDrawFilledEnabled || dataSet.fillAlpha < 1.0\n        {\n            CGContextSetStrokeColorWithColor(context, dataSet.colorAt(0).CGColor)\n            CGContextSetLineWidth(context, dataSet.lineWidth)\n            CGContextSetAlpha(context, 1.0)\n            \n            CGContextBeginPath(context)\n            CGContextAddPath(context, path)\n            CGContextStrokePath(context)\n        }\n        \n        CGContextRestoreGState(context)\n    }\n    \n    public override func drawValues(context context: CGContext)\n    {\n        guard let\n            chart = chart,\n            data = chart.data,\n            animator = animator\n            else { return }\n        \n        let phaseX = animator.phaseX\n        let phaseY = animator.phaseY\n        \n        let sliceangle = chart.sliceAngle\n        \n        // calculate the factor that is needed for transforming the value to pixels\n        let factor = chart.factor\n        \n        let center = chart.centerOffsets\n        \n        let yoffset = CGFloat(5.0)\n        \n        for i in 0 ..< data.dataSetCount\n        {\n            let dataSet = data.getDataSetByIndex(i) as! IRadarChartDataSet\n            \n            if !dataSet.isDrawValuesEnabled || dataSet.entryCount == 0\n            {\n                continue\n            }\n            \n            let entryCount = dataSet.entryCount\n            \n            for j in 0 ..< entryCount\n            {\n                guard let e = dataSet.entryForIndex(j) else { continue }\n                \n                let p = ChartUtils.getPosition(\n                    center: center,\n                    dist: CGFloat(e.value) * factor * phaseY,\n                    angle: sliceangle * CGFloat(j) * phaseX + chart.rotationAngle)\n                \n                let valueFont = dataSet.valueFont\n                \n                guard let formatter = dataSet.valueFormatter else { continue }\n                \n                ChartUtils.drawText(\n                    context: context,\n                    text: formatter.stringFromNumber(e.value)!,\n                    point: CGPoint(x: p.x, y: p.y - yoffset - valueFont.lineHeight),\n                    align: .Center,\n                    attributes: [NSFontAttributeName: valueFont,\n                        NSForegroundColorAttributeName: dataSet.valueTextColorAt(j)]\n                )\n            }\n        }\n    }\n    \n    public override func drawExtras(context context: CGContext)\n    {\n        drawWeb(context: context)\n    }\n    \n    private var _webLineSegmentsBuffer = [CGPoint](count: 2, repeatedValue: CGPoint())\n    \n    public func drawWeb(context context: CGContext)\n    {\n        guard let\n            chart = chart,\n            data = chart.data\n            else { return }\n        \n        let sliceangle = chart.sliceAngle\n        \n        CGContextSaveGState(context)\n        \n        // calculate the factor that is needed for transforming the value to\n        // pixels\n        let factor = chart.factor\n        let rotationangle = chart.rotationAngle\n        \n        let center = chart.centerOffsets\n        \n        // draw the web lines that come from the center\n        CGContextSetLineWidth(context, chart.webLineWidth)\n        CGContextSetStrokeColorWithColor(context, chart.webColor.CGColor)\n        CGContextSetAlpha(context, chart.webAlpha)\n        \n        let xIncrements = 1 + chart.skipWebLineCount\n        \n        for i in 0.stride(to: data.xValCount, by: xIncrements)\n        {\n            let p = ChartUtils.getPosition(\n                center: center,\n                dist: CGFloat(chart.yRange) * factor,\n                angle: sliceangle * CGFloat(i) + rotationangle)\n            \n            _webLineSegmentsBuffer[0].x = center.x\n            _webLineSegmentsBuffer[0].y = center.y\n            _webLineSegmentsBuffer[1].x = p.x\n            _webLineSegmentsBuffer[1].y = p.y\n            \n            CGContextStrokeLineSegments(context, _webLineSegmentsBuffer, 2)\n        }\n        \n        // draw the inner-web\n        CGContextSetLineWidth(context, chart.innerWebLineWidth)\n        CGContextSetStrokeColorWithColor(context, chart.innerWebColor.CGColor)\n        CGContextSetAlpha(context, chart.webAlpha)\n        \n        let labelCount = chart.yAxis.entryCount\n        \n        for j in 0 ..< labelCount\n        {\n            for i in 0 ..< data.xValCount\n            {\n                let r = CGFloat(chart.yAxis.entries[j] - chart.chartYMin) * factor\n\n                let p1 = ChartUtils.getPosition(center: center, dist: r, angle: sliceangle * CGFloat(i) + rotationangle)\n                let p2 = ChartUtils.getPosition(center: center, dist: r, angle: sliceangle * CGFloat(i + 1) + rotationangle)\n                \n                _webLineSegmentsBuffer[0].x = p1.x\n                _webLineSegmentsBuffer[0].y = p1.y\n                _webLineSegmentsBuffer[1].x = p2.x\n                _webLineSegmentsBuffer[1].y = p2.y\n                \n                CGContextStrokeLineSegments(context, _webLineSegmentsBuffer, 2)\n            }\n        }\n        \n        CGContextRestoreGState(context)\n    }\n    \n    private var _highlightPointBuffer = CGPoint()\n\n    public override func drawHighlighted(context context: CGContext, indices: [ChartHighlight])\n    {\n        guard let\n            chart = chart,\n            data = chart.data as? RadarChartData,\n            animator = animator\n            else { return }\n        \n        CGContextSaveGState(context)\n        CGContextSetLineWidth(context, data.highlightLineWidth)\n        if (data.highlightLineDashLengths != nil)\n        {\n            CGContextSetLineDash(context, data.highlightLineDashPhase, data.highlightLineDashLengths!, data.highlightLineDashLengths!.count)\n        }\n        else\n        {\n            CGContextSetLineDash(context, 0.0, nil, 0)\n        }\n        \n        let phaseX = animator.phaseX\n        let phaseY = animator.phaseY\n        \n        let sliceangle = chart.sliceAngle\n        let factor = chart.factor\n        \n        let center = chart.centerOffsets\n        \n        for i in 0 ..< indices.count\n        {\n            guard let set = chart.data?.getDataSetByIndex(indices[i].dataSetIndex) as? IRadarChartDataSet else { continue }\n            \n            if !set.isHighlightEnabled\n            {\n                continue\n            }\n            \n            CGContextSetStrokeColorWithColor(context, set.highlightColor.CGColor)\n            \n            // get the index to highlight\n            let xIndex = indices[i].xIndex\n            \n            let e = set.entryForXIndex(xIndex)\n            if e?.xIndex != xIndex\n            {\n                continue\n            }\n            \n            let j = set.entryIndex(entry: e!)\n            let y = (e!.value - chart.chartYMin)\n            \n            if (y.isNaN)\n            {\n                continue\n            }\n            \n            _highlightPointBuffer = ChartUtils.getPosition(\n                center: center,\n                dist: CGFloat(y) * factor * phaseY,\n                angle: sliceangle * CGFloat(j) * phaseX + chart.rotationAngle)\n            \n            // draw the lines\n            drawHighlightLines(context: context, point: _highlightPointBuffer, set: set)\n            \n            if (set.isDrawHighlightCircleEnabled)\n            {\n                if (!_highlightPointBuffer.x.isNaN && !_highlightPointBuffer.y.isNaN)\n                {\n                    var strokeColor = set.highlightCircleStrokeColor\n                    if strokeColor == nil\n                    {\n                        strokeColor = set.colorAt(0)\n                    }\n                    if set.highlightCircleStrokeAlpha < 1.0\n                    {\n                        strokeColor = strokeColor?.colorWithAlphaComponent(set.highlightCircleStrokeAlpha)\n                    }\n                    \n                    drawHighlightCircle(\n                        context: context,\n                        atPoint: _highlightPointBuffer,\n                        innerRadius: set.highlightCircleInnerRadius,\n                        outerRadius: set.highlightCircleOuterRadius,\n                        fillColor: set.highlightCircleFillColor,\n                        strokeColor: strokeColor,\n                        strokeWidth: set.highlightCircleStrokeWidth)\n                }\n            }\n        }\n        \n        CGContextRestoreGState(context)\n    }\n    \n    internal func drawHighlightCircle(\n        context context: CGContext,\n        atPoint point: CGPoint,\n        innerRadius: CGFloat,\n        outerRadius: CGFloat,\n        fillColor: NSUIColor?,\n        strokeColor: NSUIColor?,\n        strokeWidth: CGFloat)\n    {\n        CGContextSaveGState(context)\n        \n        if let fillColor = fillColor\n        {\n            CGContextBeginPath(context)\n            CGContextAddEllipseInRect(context, CGRectMake(point.x - outerRadius, point.y - outerRadius, outerRadius * 2.0, outerRadius * 2.0))\n            if innerRadius > 0.0\n            {\n                CGContextAddEllipseInRect(context, CGRectMake(point.x - innerRadius, point.y - innerRadius, innerRadius * 2.0, innerRadius * 2.0))\n            }\n            \n            CGContextSetFillColorWithColor(context, fillColor.CGColor)\n            CGContextEOFillPath(context)\n        }\n            \n        if let strokeColor = strokeColor\n        {\n            CGContextBeginPath(context)\n            CGContextAddEllipseInRect(context, CGRectMake(point.x - outerRadius, point.y - outerRadius, outerRadius * 2.0, outerRadius * 2.0))\n            CGContextSetStrokeColorWithColor(context, strokeColor.CGColor)\n            CGContextSetLineWidth(context, strokeWidth)\n            CGContextStrokePath(context)\n        }\n        \n        CGContextRestoreGState(context)\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Renderers/ScatterChartRenderer.swift",
    "content": "//\n//  ScatterChartRenderer.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 4/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n\npublic class ScatterChartRenderer: LineScatterCandleRadarChartRenderer\n{\n    public weak var dataProvider: ScatterChartDataProvider?\n    \n    public init(dataProvider: ScatterChartDataProvider?, animator: ChartAnimator?, viewPortHandler: ChartViewPortHandler)\n    {\n        super.init(animator: animator, viewPortHandler: viewPortHandler)\n        \n        self.dataProvider = dataProvider\n    }\n    \n    public override func drawData(context context: CGContext)\n    {\n        guard let scatterData = dataProvider?.scatterData else { return }\n        \n        for i in 0 ..< scatterData.dataSetCount\n        {\n            guard let set = scatterData.getDataSetByIndex(i) else { continue }\n            \n            if set.isVisible\n            {\n                if !(set is IScatterChartDataSet)\n                {\n                    fatalError(\"Datasets for ScatterChartRenderer must conform to IScatterChartDataSet\")\n                }\n                \n                drawDataSet(context: context, dataSet: set as! IScatterChartDataSet)\n            }\n        }\n    }\n    \n    private var _lineSegments = [CGPoint](count: 2, repeatedValue: CGPoint())\n    \n    public func drawDataSet(context context: CGContext, dataSet: IScatterChartDataSet)\n    {\n        guard let\n            dataProvider = dataProvider,\n            animator = animator\n            else { return }\n        \n        let trans = dataProvider.getTransformer(dataSet.axisDependency)\n        \n        let phaseY = animator.phaseY\n        \n        let entryCount = dataSet.entryCount\n        \n        let shapeSize = dataSet.scatterShapeSize\n        let shapeHalf = shapeSize / 2.0\n        let shapeHoleSizeHalf = dataSet.scatterShapeHoleRadius\n        let shapeHoleSize = shapeHoleSizeHalf * 2.0\n        let shapeHoleColor = dataSet.scatterShapeHoleColor\n        let shapeStrokeSize = (shapeSize - shapeHoleSize) / 2.0\n        let shapeStrokeSizeHalf = shapeStrokeSize / 2.0\n        \n        var point = CGPoint()\n        \n        let valueToPixelMatrix = trans.valueToPixelMatrix\n        \n        let shape = dataSet.scatterShape\n        \n        CGContextSaveGState(context)\n        \n        for j in 0 ..< Int(min(ceil(CGFloat(entryCount) * animator.phaseX), CGFloat(entryCount)))\n        {\n            guard let e = dataSet.entryForIndex(j) else { continue }\n            \n            point.x = CGFloat(e.xIndex)\n            point.y = CGFloat(e.value) * phaseY\n            point = CGPointApplyAffineTransform(point, valueToPixelMatrix);            \n            \n            if (!viewPortHandler.isInBoundsRight(point.x))\n            {\n                break\n            }\n            \n            if (!viewPortHandler.isInBoundsLeft(point.x) || !viewPortHandler.isInBoundsY(point.y))\n            {\n                continue\n            }\n            \n            if (shape == .Square)\n            {\n                if shapeHoleSize > 0.0\n                {\n                    CGContextSetStrokeColorWithColor(context, dataSet.colorAt(j).CGColor)\n                    CGContextSetLineWidth(context, shapeStrokeSize)\n                    var rect = CGRect()\n                    rect.origin.x = point.x - shapeHoleSizeHalf - shapeStrokeSizeHalf\n                    rect.origin.y = point.y - shapeHoleSizeHalf - shapeStrokeSizeHalf\n                    rect.size.width = shapeHoleSize + shapeStrokeSize\n                    rect.size.height = shapeHoleSize + shapeStrokeSize\n                    CGContextStrokeRect(context, rect)\n                    \n                    if let shapeHoleColor = shapeHoleColor\n                    {\n                        CGContextSetFillColorWithColor(context, shapeHoleColor.CGColor)\n                        rect.origin.x = point.x - shapeHoleSizeHalf\n                        rect.origin.y = point.y - shapeHoleSizeHalf\n                        rect.size.width = shapeHoleSize\n                        rect.size.height = shapeHoleSize\n                        CGContextFillRect(context, rect)\n                    }\n                }\n                else\n                {\n                    CGContextSetFillColorWithColor(context, dataSet.colorAt(j).CGColor)\n                    var rect = CGRect()\n                    rect.origin.x = point.x - shapeHalf\n                    rect.origin.y = point.y - shapeHalf\n                    rect.size.width = shapeSize\n                    rect.size.height = shapeSize\n                    CGContextFillRect(context, rect)\n                }\n            }\n            else if (shape == .Circle)\n            {\n                if shapeHoleSize > 0.0\n                {\n                    CGContextSetStrokeColorWithColor(context, dataSet.colorAt(j).CGColor)\n                    CGContextSetLineWidth(context, shapeStrokeSize)\n                    var rect = CGRect()\n                    rect.origin.x = point.x - shapeHoleSizeHalf - shapeStrokeSizeHalf\n                    rect.origin.y = point.y - shapeHoleSizeHalf - shapeStrokeSizeHalf\n                    rect.size.width = shapeHoleSize + shapeStrokeSize\n                    rect.size.height = shapeHoleSize + shapeStrokeSize\n                    CGContextStrokeEllipseInRect(context, rect)\n                    \n                    if let shapeHoleColor = shapeHoleColor\n                    {\n                        CGContextSetFillColorWithColor(context, shapeHoleColor.CGColor)\n                        rect.origin.x = point.x - shapeHoleSizeHalf\n                        rect.origin.y = point.y - shapeHoleSizeHalf\n                        rect.size.width = shapeHoleSize\n                        rect.size.height = shapeHoleSize\n                        CGContextFillEllipseInRect(context, rect)\n                    }\n                }\n                else\n                {\n                    CGContextSetFillColorWithColor(context, dataSet.colorAt(j).CGColor)\n                    var rect = CGRect()\n                    rect.origin.x = point.x - shapeHalf\n                    rect.origin.y = point.y - shapeHalf\n                    rect.size.width = shapeSize\n                    rect.size.height = shapeSize\n                    CGContextFillEllipseInRect(context, rect)\n                }\n            }\n            else if (shape == .Triangle)\n            {\n                CGContextSetFillColorWithColor(context, dataSet.colorAt(j).CGColor)\n                \n                // create a triangle path\n                CGContextBeginPath(context)\n                CGContextMoveToPoint(context, point.x, point.y - shapeHalf)\n                CGContextAddLineToPoint(context, point.x + shapeHalf, point.y + shapeHalf)\n                CGContextAddLineToPoint(context, point.x - shapeHalf, point.y + shapeHalf)\n                \n                if shapeHoleSize > 0.0\n                {\n                    CGContextAddLineToPoint(context, point.x, point.y - shapeHalf)\n                    \n                    CGContextMoveToPoint(context, point.x - shapeHalf + shapeStrokeSize, point.y + shapeHalf - shapeStrokeSize)\n                    CGContextAddLineToPoint(context, point.x + shapeHalf - shapeStrokeSize, point.y + shapeHalf - shapeStrokeSize)\n                    CGContextAddLineToPoint(context, point.x, point.y - shapeHalf + shapeStrokeSize)\n                    CGContextAddLineToPoint(context, point.x - shapeHalf + shapeStrokeSize, point.y + shapeHalf - shapeStrokeSize)\n                }\n                \n                CGContextClosePath(context)\n                \n                CGContextFillPath(context)\n                \n                if shapeHoleSize > 0.0 && shapeHoleColor != nil\n                {\n                    CGContextSetFillColorWithColor(context, shapeHoleColor!.CGColor)\n                    \n                    // create a triangle path\n                    CGContextBeginPath(context)\n                    CGContextMoveToPoint(context, point.x, point.y - shapeHalf + shapeStrokeSize)\n                    CGContextAddLineToPoint(context, point.x + shapeHalf - shapeStrokeSize, point.y + shapeHalf - shapeStrokeSize)\n                    CGContextAddLineToPoint(context, point.x - shapeHalf + shapeStrokeSize, point.y + shapeHalf - shapeStrokeSize)\n                    CGContextClosePath(context)\n                    \n                    CGContextFillPath(context)\n                }\n            }\n            else if (shape == .Cross)\n            {\n                CGContextSetStrokeColorWithColor(context, dataSet.colorAt(j).CGColor)\n                _lineSegments[0].x = point.x - shapeHalf\n                _lineSegments[0].y = point.y\n                _lineSegments[1].x = point.x + shapeHalf\n                _lineSegments[1].y = point.y\n                CGContextStrokeLineSegments(context, _lineSegments, 2)\n                \n                _lineSegments[0].x = point.x\n                _lineSegments[0].y = point.y - shapeHalf\n                _lineSegments[1].x = point.x\n                _lineSegments[1].y = point.y + shapeHalf\n                CGContextStrokeLineSegments(context, _lineSegments, 2)\n            }\n            else if (shape == .X)\n            {\n                CGContextSetStrokeColorWithColor(context, dataSet.colorAt(j).CGColor)\n                _lineSegments[0].x = point.x - shapeHalf\n                _lineSegments[0].y = point.y - shapeHalf\n                _lineSegments[1].x = point.x + shapeHalf\n                _lineSegments[1].y = point.y + shapeHalf\n                CGContextStrokeLineSegments(context, _lineSegments, 2)\n                \n                _lineSegments[0].x = point.x + shapeHalf\n                _lineSegments[0].y = point.y - shapeHalf\n                _lineSegments[1].x = point.x - shapeHalf\n                _lineSegments[1].y = point.y + shapeHalf\n                CGContextStrokeLineSegments(context, _lineSegments, 2)\n            }\n            else if (shape == .Custom)\n            {\n                CGContextSetFillColorWithColor(context, dataSet.colorAt(j).CGColor)\n                \n                let customShape = dataSet.customScatterShape\n                \n                if customShape == nil\n                {\n                    return\n                }\n                \n                // transform the provided custom path\n                CGContextSaveGState(context)\n                CGContextTranslateCTM(context, point.x, point.y)\n                \n                CGContextBeginPath(context)\n                CGContextAddPath(context, customShape)\n                CGContextFillPath(context)\n                \n                CGContextRestoreGState(context)\n            }\n        }\n        \n        CGContextRestoreGState(context)\n    }\n    \n    public override func drawValues(context context: CGContext)\n    {\n        guard let\n            dataProvider = dataProvider,\n            scatterData = dataProvider.scatterData,\n            animator = animator\n            else { return }\n        \n        // if values are drawn\n        if (scatterData.yValCount < Int(ceil(CGFloat(dataProvider.maxVisibleValueCount) * viewPortHandler.scaleX)))\n        {\n            guard let dataSets = scatterData.dataSets as? [IScatterChartDataSet] else { return }\n            \n            let phaseX = animator.phaseX\n            let phaseY = animator.phaseY\n            \n            var pt = CGPoint()\n            \n            for i in 0 ..< scatterData.dataSetCount\n            {\n                let dataSet = dataSets[i]\n                \n                if !dataSet.isDrawValuesEnabled || dataSet.entryCount == 0\n                {\n                    continue\n                }\n                \n                let valueFont = dataSet.valueFont\n                \n                guard let formatter = dataSet.valueFormatter else { continue }\n                \n                let trans = dataProvider.getTransformer(dataSet.axisDependency)\n                let valueToPixelMatrix = trans.valueToPixelMatrix\n                \n                let entryCount = dataSet.entryCount\n                \n                let shapeSize = dataSet.scatterShapeSize\n                let lineHeight = valueFont.lineHeight\n                \n                for j in 0 ..< Int(ceil(CGFloat(entryCount) * phaseX))\n                {\n                    guard let e = dataSet.entryForIndex(j) else { break }\n                    \n                    pt.x = CGFloat(e.xIndex)\n                    pt.y = CGFloat(e.value) * phaseY\n                    pt = CGPointApplyAffineTransform(pt, valueToPixelMatrix)\n                    \n                    if (!viewPortHandler.isInBoundsRight(pt.x))\n                    {\n                        break\n                    }\n                    \n                    // make sure the lines don't do shitty things outside bounds\n                    if ((!viewPortHandler.isInBoundsLeft(pt.x)\n                        || !viewPortHandler.isInBoundsY(pt.y)))\n                    {\n                        continue\n                    }\n                    \n                    let text = formatter.stringFromNumber(e.value)\n                    \n                    ChartUtils.drawText(\n                        context: context,\n                        text: text!,\n                        point: CGPoint(\n                            x: pt.x,\n                            y: pt.y - shapeSize - lineHeight),\n                        align: .Center,\n                        attributes: [NSFontAttributeName: valueFont, NSForegroundColorAttributeName: dataSet.valueTextColorAt(j)]\n                    )\n                }\n            }\n        }\n    }\n    \n    public override func drawExtras(context context: CGContext)\n    {\n        \n    }\n    \n    private var _highlightPointBuffer = CGPoint()\n    \n    public override func drawHighlighted(context context: CGContext, indices: [ChartHighlight])\n    {\n        guard let\n            dataProvider = dataProvider,\n            scatterData = dataProvider.scatterData,\n            animator = animator\n            else { return }\n        \n        let chartXMax = dataProvider.chartXMax\n        \n        CGContextSaveGState(context)\n        \n        for i in 0 ..< indices.count\n        {\n            guard let set = scatterData.getDataSetByIndex(indices[i].dataSetIndex) as? IScatterChartDataSet else { continue }\n            \n            if !set.isHighlightEnabled\n            {\n                continue\n            }\n            \n            CGContextSetStrokeColorWithColor(context, set.highlightColor.CGColor)\n            CGContextSetLineWidth(context, set.highlightLineWidth)\n            if (set.highlightLineDashLengths != nil)\n            {\n                CGContextSetLineDash(context, set.highlightLineDashPhase, set.highlightLineDashLengths!, set.highlightLineDashLengths!.count)\n            }\n            else\n            {\n                CGContextSetLineDash(context, 0.0, nil, 0)\n            }\n            \n            let xIndex = indices[i].xIndex; // get the x-position\n            \n            if (CGFloat(xIndex) > CGFloat(chartXMax) * animator.phaseX)\n            {\n                continue\n            }\n            \n            let yVal = set.yValForXIndex(xIndex)\n            if (yVal.isNaN)\n            {\n                continue\n            }\n            \n            let y = CGFloat(yVal) * animator.phaseY; // get the y-position\n            \n            _highlightPointBuffer.x = CGFloat(xIndex)\n            _highlightPointBuffer.y = y\n            \n            let trans = dataProvider.getTransformer(set.axisDependency)\n            \n            trans.pointValueToPixel(&_highlightPointBuffer)\n            \n            // draw the lines\n            drawHighlightLines(context: context, point: _highlightPointBuffer, set: set)\n        }\n        \n        CGContextRestoreGState(context)\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Utils/ChartColorTemplates.swift",
    "content": "//\n//  ChartColorTemplates.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\n\npublic class ChartColorTemplates: NSObject\n{\n    public class func liberty () -> [NSUIColor]\n    {\n        return [\n            NSUIColor(red: 207/255.0, green: 248/255.0, blue: 246/255.0, alpha: 1.0),\n            NSUIColor(red: 148/255.0, green: 212/255.0, blue: 212/255.0, alpha: 1.0),\n            NSUIColor(red: 136/255.0, green: 180/255.0, blue: 187/255.0, alpha: 1.0),\n            NSUIColor(red: 118/255.0, green: 174/255.0, blue: 175/255.0, alpha: 1.0),\n            NSUIColor(red: 42/255.0, green: 109/255.0, blue: 130/255.0, alpha: 1.0)\n        ]\n    }\n    \n    public class func joyful () -> [NSUIColor]\n    {\n        return [\n            NSUIColor(red: 217/255.0, green: 80/255.0, blue: 138/255.0, alpha: 1.0),\n            NSUIColor(red: 254/255.0, green: 149/255.0, blue: 7/255.0, alpha: 1.0),\n            NSUIColor(red: 254/255.0, green: 247/255.0, blue: 120/255.0, alpha: 1.0),\n            NSUIColor(red: 106/255.0, green: 167/255.0, blue: 134/255.0, alpha: 1.0),\n            NSUIColor(red: 53/255.0, green: 194/255.0, blue: 209/255.0, alpha: 1.0)\n        ]\n    }\n    \n    public class func pastel () -> [NSUIColor]\n    {\n        return [\n            NSUIColor(red: 64/255.0, green: 89/255.0, blue: 128/255.0, alpha: 1.0),\n            NSUIColor(red: 149/255.0, green: 165/255.0, blue: 124/255.0, alpha: 1.0),\n            NSUIColor(red: 217/255.0, green: 184/255.0, blue: 162/255.0, alpha: 1.0),\n            NSUIColor(red: 191/255.0, green: 134/255.0, blue: 134/255.0, alpha: 1.0),\n            NSUIColor(red: 179/255.0, green: 48/255.0, blue: 80/255.0, alpha: 1.0)\n        ]\n    }\n    \n    public class func colorful () -> [NSUIColor]\n    {\n        return [\n            NSUIColor(red: 193/255.0, green: 37/255.0, blue: 82/255.0, alpha: 1.0),\n            NSUIColor(red: 255/255.0, green: 102/255.0, blue: 0/255.0, alpha: 1.0),\n            NSUIColor(red: 245/255.0, green: 199/255.0, blue: 0/255.0, alpha: 1.0),\n            NSUIColor(red: 106/255.0, green: 150/255.0, blue: 31/255.0, alpha: 1.0),\n            NSUIColor(red: 179/255.0, green: 100/255.0, blue: 53/255.0, alpha: 1.0)\n        ]\n    }\n    \n    public class func vordiplom () -> [NSUIColor]\n    {\n        return [\n            NSUIColor(red: 192/255.0, green: 255/255.0, blue: 140/255.0, alpha: 1.0),\n            NSUIColor(red: 255/255.0, green: 247/255.0, blue: 140/255.0, alpha: 1.0),\n            NSUIColor(red: 255/255.0, green: 208/255.0, blue: 140/255.0, alpha: 1.0),\n            NSUIColor(red: 140/255.0, green: 234/255.0, blue: 255/255.0, alpha: 1.0),\n            NSUIColor(red: 255/255.0, green: 140/255.0, blue: 157/255.0, alpha: 1.0)\n        ]\n    }\n    \n    public class func colorFromString(colorString: String) -> NSUIColor\n    {\n        let leftParenCharset: NSCharacterSet = NSCharacterSet(charactersInString: \"( \")\n        let commaCharset: NSCharacterSet = NSCharacterSet(charactersInString: \", \")\n\n        let colorString = colorString.lowercaseString\n        \n        if colorString.hasPrefix(\"#\")\n        {\n            var argb: [UInt] = [255, 0, 0, 0]\n            let colorString = colorString.unicodeScalars\n            var length = colorString.count\n            var index = colorString.startIndex\n            let endIndex = colorString.endIndex\n            \n            index = index.advancedBy(1)\n            length = length - 1\n            \n            if length == 3 || length == 6 || length == 8\n            {\n                var i = length == 8 ? 0 : 1\n                while index < endIndex\n                {\n                    var c = colorString[index]\n                    index = index.advancedBy(1)\n                    \n                    var val = (c.value >= 0x61 && c.value <= 0x66) ? (c.value - 0x61 + 10) : c.value - 0x30\n                    argb[i] = UInt(val) * 16\n                    if length == 3\n                    {\n                        argb[i] = argb[i] + UInt(val)\n                    }\n                    else\n                    {\n                        c = colorString[index]\n                        index = index.advancedBy(1)\n                        \n                        val = (c.value >= 0x61 && c.value <= 0x66) ? (c.value - 0x61 + 10) : c.value - 0x30\n                        argb[i] = argb[i] + UInt(val)\n                    }\n                    \n                    i += 1\n                }\n            }\n            \n            return NSUIColor(red: CGFloat(argb[1]) / 255.0, green: CGFloat(argb[2]) / 255.0, blue: CGFloat(argb[3]) / 255.0, alpha: CGFloat(argb[0]) / 255.0)\n        }\n        else if colorString.hasPrefix(\"rgba\")\n        {\n            var a: Float = 1.0\n            var r: Int32 = 0\n            var g: Int32 = 0\n            var b: Int32 = 0\n            let scanner: NSScanner = NSScanner(string: colorString)\n            scanner.scanString(\"rgba\", intoString: nil)\n            scanner.scanCharactersFromSet(leftParenCharset, intoString: nil)\n            scanner.scanInt(&r)\n            scanner.scanCharactersFromSet(commaCharset, intoString: nil)\n            scanner.scanInt(&g)\n            scanner.scanCharactersFromSet(commaCharset, intoString: nil)\n            scanner.scanInt(&b)\n            scanner.scanCharactersFromSet(commaCharset, intoString: nil)\n            scanner.scanFloat(&a)\n            return NSUIColor(\n                red: CGFloat(r) / 255.0,\n                green: CGFloat(g) / 255.0,\n                blue: CGFloat(b) / 255.0,\n                alpha: CGFloat(a)\n            )\n        }\n        else if colorString.hasPrefix(\"argb\")\n        {\n            var a: Float = 1.0\n            var r: Int32 = 0\n            var g: Int32 = 0\n            var b: Int32 = 0\n            let scanner: NSScanner = NSScanner(string: colorString)\n            scanner.scanString(\"argb\", intoString: nil)\n            scanner.scanCharactersFromSet(leftParenCharset, intoString: nil)\n            scanner.scanFloat(&a)\n            scanner.scanCharactersFromSet(commaCharset, intoString: nil)\n            scanner.scanInt(&r)\n            scanner.scanCharactersFromSet(commaCharset, intoString: nil)\n            scanner.scanInt(&g)\n            scanner.scanCharactersFromSet(commaCharset, intoString: nil)\n            scanner.scanInt(&b)\n            return NSUIColor(\n                red: CGFloat(r) / 255.0,\n                green: CGFloat(g) / 255.0,\n                blue: CGFloat(b) / 255.0,\n                alpha: CGFloat(a)\n            )\n        }\n        else if colorString.hasPrefix(\"rgb\")\n        {\n            var r: Int32 = 0\n            var g: Int32 = 0\n            var b: Int32 = 0\n            let scanner: NSScanner = NSScanner(string: colorString)\n            scanner.scanString(\"rgb\", intoString: nil)\n            scanner.scanCharactersFromSet(leftParenCharset, intoString: nil)\n            scanner.scanInt(&r)\n            scanner.scanCharactersFromSet(commaCharset, intoString: nil)\n            scanner.scanInt(&g)\n            scanner.scanCharactersFromSet(commaCharset, intoString: nil)\n            scanner.scanInt(&b)\n            return NSUIColor(\n                red: CGFloat(r) / 255.0,\n                green: CGFloat(g) / 255.0,\n                blue: CGFloat(b) / 255.0,\n                alpha: 1.0\n            )\n        }\n        \n        return NSUIColor.clearColor()\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Utils/ChartFill.swift",
    "content": "//\n//  ChartFill.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 27/01/2016.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\npublic class ChartFill: NSObject\n{\n    @objc\n    public enum ChartFillType: Int\n    {\n        case Empty\n        case Color\n        case LinearGradient\n        case RadialGradient\n        case Image\n        case TiledImage\n        case Layer\n    }\n    \n    private var _type: ChartFillType = ChartFillType.Empty\n    private var _color: CGColorRef?\n    private var _gradient: CGGradientRef?\n    private var _gradientAngle: CGFloat = 0.0\n    private var _gradientStartOffsetPercent: CGPoint = CGPoint()\n    private var _gradientStartRadiusPercent: CGFloat = 0.0\n    private var _gradientEndOffsetPercent: CGPoint = CGPoint()\n    private var _gradientEndRadiusPercent: CGFloat = 0.0\n    private var _image: CGImageRef?\n    private var _layer: CGLayerRef?\n    \n    // MARK: Properties\n    \n    public var type: ChartFillType\n    {\n        return _type\n    }\n    \n    public var color: CGColorRef?\n    {\n        return _color\n    }\n    \n    public var gradient: CGGradientRef?\n    {\n        return _gradient\n    }\n    \n    public var gradientAngle: CGFloat\n    {\n        return _gradientAngle\n    }\n    \n    public var gradientStartOffsetPercent: CGPoint\n    {\n        return _gradientStartOffsetPercent\n    }\n    \n    public var gradientStartRadiusPercent: CGFloat\n    {\n        return _gradientStartRadiusPercent\n    }\n    \n    public var gradientEndOffsetPercent: CGPoint\n    {\n        return _gradientEndOffsetPercent\n    }\n    \n    public var gradientEndRadiusPercent: CGFloat\n    {\n        return _gradientEndRadiusPercent\n    }\n    \n    public var image: CGImageRef?\n    {\n        return _image\n    }\n    \n    public var layer: CGLayerRef?\n    {\n        return _layer\n    }\n    \n    // MARK: Constructors\n    \n    public override init()\n    {\n    }\n    \n    public init(CGColor: CGColorRef)\n    {\n        _type = .Color\n        _color = CGColor\n    }\n    \n    public convenience init(color: NSUIColor)\n    {\n        self.init(CGColor: color.CGColor)\n    }\n    \n    public init(linearGradient: CGGradientRef, angle: CGFloat)\n    {\n        _type = .LinearGradient\n        _gradient = linearGradient\n        _gradientAngle = angle\n    }\n    \n    public init(\n        radialGradient: CGGradientRef,\n        startOffsetPercent: CGPoint,\n        startRadiusPercent: CGFloat,\n        endOffsetPercent: CGPoint,\n        endRadiusPercent: CGFloat\n        )\n    {\n        _type = .RadialGradient\n        _gradient = radialGradient\n        _gradientStartOffsetPercent = startOffsetPercent\n        _gradientStartRadiusPercent = startRadiusPercent\n        _gradientEndOffsetPercent = endOffsetPercent\n        _gradientEndRadiusPercent = endRadiusPercent\n    }\n    \n    public convenience init(radialGradient: CGGradientRef)\n    {\n        self.init(\n            radialGradient: radialGradient,\n            startOffsetPercent: CGPointMake(0.0, 0.0),\n            startRadiusPercent: 0.0,\n            endOffsetPercent: CGPointMake(0.0, 0.0),\n            endRadiusPercent: 1.0\n        )\n    }\n    \n    public init(CGImage: CGImageRef, tiled: Bool)\n    {\n        _type = tiled ? .TiledImage : .Image\n        _image = CGImage\n    }\n    \n    public convenience init(image: NSUIImage, tiled: Bool)\n    {\n        if image.CGImage == nil\n        {\n            self.init()\n        }\n        else\n        {\n            self.init(CGImage: image.CGImage!, tiled: tiled)\n        }\n    }\n    \n    public convenience init(CGImage: CGImageRef)\n    {\n        self.init(CGImage: CGImage, tiled: false)\n    }\n    \n    public convenience init(image: NSUIImage)\n    {\n        self.init(image: image, tiled: false)\n    }\n    \n    public init(CGLayer: CGLayerRef)\n    {\n        _type = .Layer\n        _layer = CGLayer\n    }\n    \n    // MARK: Constructors\n    \n    public class func fillWithCGColor(CGColor: CGColorRef) -> ChartFill\n    {\n        return ChartFill(CGColor: CGColor)\n    }\n    \n    public class func fillWithColor(color: NSUIColor) -> ChartFill\n    {\n        return ChartFill(color: color)\n    }\n    \n    public class func fillWithLinearGradient(linearGradient: CGGradientRef, angle: CGFloat) -> ChartFill\n    {\n        return ChartFill(linearGradient: linearGradient, angle: angle)\n    }\n    \n    public class func fillWithRadialGradient(\n        radialGradient: CGGradientRef,\n        startOffsetPercent: CGPoint,\n        startRadiusPercent: CGFloat,\n        endOffsetPercent: CGPoint,\n        endRadiusPercent: CGFloat\n        ) -> ChartFill\n    {\n        return ChartFill(\n            radialGradient: radialGradient,\n            startOffsetPercent: startOffsetPercent,\n            startRadiusPercent: startRadiusPercent,\n            endOffsetPercent: endOffsetPercent,\n            endRadiusPercent: endRadiusPercent\n        )\n    }\n    \n    public class func fillWithRadialGradient(radialGradient: CGGradientRef) -> ChartFill\n    {\n        return ChartFill(radialGradient: radialGradient)\n    }\n    \n    public class func fillWithCGImage(CGImage: CGImageRef, tiled: Bool) -> ChartFill\n    {\n        return ChartFill(CGImage: CGImage, tiled: tiled)\n    }\n    \n    public class func fillWithImage(image: NSUIImage, tiled: Bool) -> ChartFill\n    {\n        return ChartFill(image: image, tiled: tiled)\n    }\n    \n    public class func fillWithCGImage(CGImage: CGImageRef) -> ChartFill\n    {\n        return ChartFill(CGImage: CGImage)\n    }\n    \n    public class func fillWithImage(image: NSUIImage) -> ChartFill\n    {\n        return ChartFill(image: image)\n    }\n    \n    public class func fillWithCGLayer(CGLayer: CGLayerRef) -> ChartFill\n    {\n        return ChartFill(CGLayer: CGLayer)\n    }\n    \n    // MARK: Drawing code\n    \n    /// Draws the provided path in filled mode with the provided area\n    public func fillPath(\n        context context: CGContext,\n        rect: CGRect)\n    {\n        let fillType = _type\n        if fillType == .Empty\n        {\n            return\n        }\n        \n        CGContextSaveGState(context)\n        \n        switch fillType\n        {\n        case .Color:\n            \n            CGContextSetFillColorWithColor(context, _color)\n            CGContextFillPath(context)\n            \n        case .Image:\n            \n            CGContextClip(context)\n            CGContextDrawImage(context, rect, _image)\n            \n        case .TiledImage:\n            \n            CGContextClip(context)\n            CGContextDrawTiledImage(context, rect, _image)\n            \n        case .Layer:\n            \n            CGContextClip(context)\n            CGContextDrawLayerInRect(context, rect, _layer)\n            \n        case .LinearGradient:\n            \n            let radians = ChartUtils.Math.FDEG2RAD * (360.0 - _gradientAngle)\n            let centerPoint = CGPointMake(rect.midX, rect.midY)\n            let xAngleDelta = cos(radians) * rect.width / 2.0\n            let yAngleDelta = sin(radians) * rect.height / 2.0\n            let startPoint = CGPointMake(\n                centerPoint.x - xAngleDelta,\n                centerPoint.y - yAngleDelta\n            )\n            let endPoint = CGPointMake(\n                centerPoint.x + xAngleDelta,\n                centerPoint.y + yAngleDelta\n            )\n            \n            CGContextClip(context)\n            CGContextDrawLinearGradient(\n                context,\n                _gradient,\n                startPoint,\n                endPoint,\n                [.DrawsAfterEndLocation, .DrawsBeforeStartLocation]\n            )\n            \n        case .RadialGradient:\n            \n            let centerPoint = CGPointMake(rect.midX, rect.midY)\n            let radius = max(rect.width, rect.height) / 2.0\n            \n            CGContextClip(context)\n            CGContextDrawRadialGradient(\n                context,\n                _gradient,\n                CGPointMake(\n                    centerPoint.x + rect.width * _gradientStartOffsetPercent.x,\n                    centerPoint.y + rect.height * _gradientStartOffsetPercent.y\n                ),\n                radius * _gradientStartRadiusPercent,\n                CGPointMake(\n                    centerPoint.x + rect.width * _gradientEndOffsetPercent.x,\n                    centerPoint.y + rect.height * _gradientEndOffsetPercent.y\n                ),\n                radius * _gradientEndRadiusPercent,\n                [.DrawsAfterEndLocation, .DrawsBeforeStartLocation]\n            )\n            \n        case .Empty:\n            break;\n        }\n        \n        CGContextRestoreGState(context)\n    }\n    \n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Utils/ChartPlatform.swift",
    "content": "import Foundation\n\n/** This file provides a thin abstraction layer atop of UIKit (iOS, tvOS) and Cocoa (OS X). The two APIs are very much \nalike, and for the chart library's usage of the APIs it is often sufficient to typealias one to the other. The NSUI*\ntypes are aliased to either their UI* implementation (on iOS) or their NS* implementation (on OS X). */\n#if os(iOS) || os(tvOS)\n\timport UIKit\n\t\n\tpublic typealias NSUIFont = UIFont\n\tpublic typealias NSUIColor = UIColor\n\tpublic typealias NSUIEvent = UIEvent\n\tpublic typealias NSUITouch = UITouch\n\tpublic typealias NSUIImage = UIImage\n\tpublic typealias NSUIScrollView = UIScrollView\n\tpublic typealias NSUIGestureRecognizer = UIGestureRecognizer\n\tpublic typealias NSUIGestureRecognizerState = UIGestureRecognizerState\n\tpublic typealias NSUIGestureRecognizerDelegate = UIGestureRecognizerDelegate\n\tpublic typealias NSUITapGestureRecognizer = UITapGestureRecognizer\n\tpublic typealias NSUIPanGestureRecognizer = UIPanGestureRecognizer\n#if !os(tvOS)\n    public typealias NSUIPinchGestureRecognizer = UIPinchGestureRecognizer\n    public typealias NSUIRotationGestureRecognizer = UIRotationGestureRecognizer\n#endif\n    public typealias NSUIScreen = UIScreen\n\n\tpublic typealias NSUIDisplayLink = CADisplayLink\n    \n    extension NSUITapGestureRecognizer\n    {\n        final func nsuiNumberOfTouches() -> Int\n        {\n            return numberOfTouches()\n        }\n        \n        final var nsuiNumberOfTapsRequired: Int\n        {\n            get\n            {\n                return self.numberOfTapsRequired\n            }\n            set\n            {\n                self.numberOfTapsRequired = newValue\n            }\n        }\n    }\n    \n    extension NSUIPanGestureRecognizer\n    {\n        final func nsuiNumberOfTouches() -> Int\n        {\n            return numberOfTouches()\n        }\n        \n        final func nsuiLocationOfTouch(touch: Int, inView: UIView?) -> CGPoint\n        {\n            return super.locationOfTouch(touch, inView: inView)\n        }\n    }\n    \n#if !os(tvOS)\n    extension NSUIRotationGestureRecognizer\n    {\n        final var nsuiRotation: CGFloat\n        {\n            get { return rotation }\n            set { rotation = newValue }\n        }\n    }\n#endif\n    \n#if !os(tvOS)\n    extension NSUIPinchGestureRecognizer\n    {\n        final var nsuiScale: CGFloat\n        {\n            get\n            {\n                return scale\n            }\n            set\n            {\n                scale = newValue\n            }\n        }\n        \n        final func nsuiLocationOfTouch(touch: Int, inView: UIView?) -> CGPoint\n        {\n            return super.locationOfTouch(touch, inView: inView)\n        }\n    }\n#endif\n\n\tpublic class NSUIView: UIView\n    {\n\t\tpublic final override func touchesBegan(touches: Set<NSUITouch>, withEvent event: NSUIEvent?)\n        {\n\t\t\tself.nsuiTouchesBegan(touches, withEvent: event)\n\t\t}\n\n\t\tpublic final override func touchesMoved(touches: Set<NSUITouch>, withEvent event: NSUIEvent?)\n        {\n\t\t\tself.nsuiTouchesMoved(touches, withEvent: event)\n\t\t}\n\n\t\tpublic final override func touchesEnded(touches: Set<NSUITouch>, withEvent event: NSUIEvent?)\n        {\n\t\t\tself.nsuiTouchesEnded(touches, withEvent: event)\n\t\t}\n\n\t\tpublic final override func touchesCancelled(touches: Set<NSUITouch>?, withEvent event: NSUIEvent?)\n        {\n\t\t\tself.nsuiTouchesCancelled(touches, withEvent: event)\n\t\t}\n\n\t\tpublic func nsuiTouchesBegan(touches: Set<NSUITouch>, withEvent event: NSUIEvent?)\n        {\n\t\t\tsuper.touchesBegan(touches, withEvent: event!)\n\t\t}\n\n\t\tpublic func nsuiTouchesMoved(touches: Set<NSUITouch>, withEvent event: NSUIEvent?)\n        {\n\t\t\tsuper.touchesMoved(touches, withEvent: event!)\n\t\t}\n\n\t\tpublic func nsuiTouchesEnded(touches: Set<NSUITouch>, withEvent event: NSUIEvent?)\n        {\n\t\t\tsuper.touchesEnded(touches, withEvent: event!)\n\t\t}\n\n\t\tpublic func nsuiTouchesCancelled(touches: Set<NSUITouch>?, withEvent event: NSUIEvent?)\n        {\n\t\t\tsuper.touchesCancelled(touches, withEvent: event!)\n\t\t}\n\n\t\tvar nsuiLayer: CALayer?\n        {\n\t\t\treturn self.layer\n\t\t}\n\t}\n\n\textension UIView\n    {\n\t\tfinal var nsuiGestureRecognizers: [NSUIGestureRecognizer]?\n        {\n\t\t\treturn self.gestureRecognizers\n\t\t}\n    }\n    \n    extension UIScreen\n    {\n        final var nsuiScale: CGFloat\n        {\n            return self.scale\n        }\n    }\n\n    func NSUIGraphicsGetCurrentContext() -> CGContextRef?\n    {\n\t\treturn UIGraphicsGetCurrentContext()\n\t}\n\n    func NSUIGraphicsGetImageFromCurrentImageContext() -> NSUIImage!\n    {\n\t\treturn UIGraphicsGetImageFromCurrentImageContext()\n\t}\n\n\tfunc NSUIGraphicsPushContext(context: CGContextRef)\n    {\n\t\tUIGraphicsPushContext(context)\n\t}\n\n\tfunc NSUIGraphicsPopContext()\n    {\n\t\tUIGraphicsPopContext()\n\t}\n\n\tfunc NSUIGraphicsEndImageContext()\n    {\n\t\tUIGraphicsEndImageContext()\n\t}\n\n\tfunc NSUIImagePNGRepresentation(image: NSUIImage) -> NSData?\n    {\n\t\treturn UIImagePNGRepresentation(image)\n\t}\n\n\tfunc NSUIImageJPEGRepresentation(image: NSUIImage, _ quality: CGFloat = 0.8) -> NSData?\n    {\n\t\treturn UIImageJPEGRepresentation(image, quality)\n\t}\n\n\tfunc NSUIMainScreen() -> NSUIScreen?\n    {\n\t\treturn NSUIScreen.mainScreen()\n\t}\n\n\tfunc NSUIGraphicsBeginImageContextWithOptions(size: CGSize, _ opaque: Bool, _ scale: CGFloat)\n    {\n\t\tUIGraphicsBeginImageContextWithOptions(size, opaque, scale)\n\t}\n\n#endif\n\n#if os(OSX)\n\timport Cocoa\n\timport Quartz\n\n\tpublic typealias NSUIFont = NSFont\n\tpublic typealias NSUIColor = NSColor\n\tpublic typealias NSUIEvent = NSEvent\n\tpublic typealias NSUITouch = NSTouch\n\tpublic typealias NSUIImage = NSImage\n\tpublic typealias NSUIScrollView = NSScrollView\n\tpublic typealias NSUIGestureRecognizer = NSGestureRecognizer\n\tpublic typealias NSUIGestureRecognizerState = NSGestureRecognizerState\n\tpublic typealias NSUIGestureRecognizerDelegate = NSGestureRecognizerDelegate\n\tpublic typealias NSUITapGestureRecognizer = NSClickGestureRecognizer\n\tpublic typealias NSUIPanGestureRecognizer = NSPanGestureRecognizer\n\tpublic typealias NSUIPinchGestureRecognizer = NSMagnificationGestureRecognizer\n\tpublic typealias NSUIRotationGestureRecognizer = NSRotationGestureRecognizer\n\tpublic typealias NSUIScreen = NSScreen\n\n\t/** On OS X there is no CADisplayLink. Use a 60 fps timer to render the animations. */\n\tpublic class NSUIDisplayLink\n    {\n        private var timer: NSTimer?\n        private var displayLink: CVDisplayLink?\n        private var _timestamp: CFTimeInterval = 0.0\n        \n        private weak var _target: AnyObject?\n        private var _selector: Selector\n        \n        public var timestamp: CFTimeInterval\n        {\n            return _timestamp\n        }\n\n\t\tinit(target: AnyObject, selector: Selector)\n        {\n            _target = target\n            _selector = selector\n            \n            if CVDisplayLinkCreateWithActiveCGDisplays(&displayLink) == kCVReturnSuccess\n            {\n                CVDisplayLinkSetOutputCallback(displayLink!, { (displayLink, inNow, inOutputTime, flagsIn, flagsOut, userData) -> CVReturn in\n                    \n                    let _self = unsafeBitCast(userData, NSUIDisplayLink.self)\n                    \n                    _self._timestamp = CFAbsoluteTimeGetCurrent()\n                    _self._target?.performSelectorOnMainThread(_self._selector, withObject: _self, waitUntilDone: false)\n                    \n                    return kCVReturnSuccess\n                    }, UnsafeMutablePointer(unsafeAddressOf(self)))\n            }\n            else\n            {\n                timer = NSTimer(timeInterval: 1.0 / 60.0, target: target, selector: selector, userInfo: nil, repeats: true)\n            }\n\t\t}\n        \n        deinit\n        {\n            stop()\n        }\n\n\t\tpublic func addToRunLoop(runloop: NSRunLoop, forMode: String)\n        {\n            if displayLink != nil\n            {\n                CVDisplayLinkStart(displayLink!)\n            }\n            else if timer != nil\n            {\n                runloop.addTimer(timer!, forMode: forMode)\n            }\n\t\t}\n\n\t\tpublic func removeFromRunLoop(runloop: NSRunLoop, forMode: String)\n        {\n            stop()\n\t\t}\n        \n        private func stop()\n        {\n            if displayLink != nil\n            {\n                CVDisplayLinkStop(displayLink!)\n            }\n            if timer != nil\n            {\n                timer?.invalidate()\n            }\n        }\n\t}\n\n\t/** The 'tap' gesture is mapped to clicks. */\n\textension NSUITapGestureRecognizer\n    {\n\t\tfinal func nsuiNumberOfTouches() -> Int\n        {\n\t\t\treturn 1\n\t\t}\n        \n\t\tfinal var nsuiNumberOfTapsRequired: Int\n        {\n\t\t\tget\n            {\n\t\t\t\treturn self.numberOfClicksRequired\n\t\t\t}\n\t\t\tset\n            {\n\t\t\t\tself.numberOfClicksRequired = newValue\n\t\t\t}\n\t\t}\n\t}\n\n\textension NSUIPanGestureRecognizer\n    {\n\t\tfinal func nsuiNumberOfTouches() -> Int\n        {\n\t\t\treturn 1\n\t\t}\n        \n        /// FIXME: Currently there are no more than 1 touch in OSX gestures, and not way to create custom touch gestures.\n\t\tfinal func nsuiLocationOfTouch(touch: Int, inView: NSView?) -> NSPoint\n        {\n\t\t\treturn super.locationInView(inView)\n\t\t}\n    }\n    \n    extension NSUIRotationGestureRecognizer\n    {\n        /// FIXME: Currently there are no velocities in OSX gestures, and not way to create custom touch gestures.\n        final var velocity: CGFloat\n        {\n            return 0.1\n        }\n        \n        final var nsuiRotation: CGFloat\n        {\n            get { return -rotation }\n            set { rotation = -newValue }\n        }\n    }\n    \n    extension NSUIPinchGestureRecognizer\n    {\n        final var nsuiScale: CGFloat\n        {\n            get\n            {\n                return magnification + 1.0\n            }\n            set\n            {\n                magnification = newValue - 1.0\n            }\n        }\n        \n        /// FIXME: Currently there are no more than 1 touch in OSX gestures, and not way to create custom touch gestures.\n        final func nsuiLocationOfTouch(touch: Int, inView: NSView?) -> NSPoint\n        {\n            return super.locationInView(inView)\n        }\n    }\n\n\textension NSView\n    {\n\t\tfinal var nsuiGestureRecognizers: [NSGestureRecognizer]?\n        {\n\t\t\treturn self.gestureRecognizers\n\t\t}\n\t}\n\n\tpublic class NSUIView: NSView\n    {\n\t\tpublic final override var flipped: Bool\n        {\n\t\t\treturn true\n\t\t}\n\n\t\tfunc setNeedsDisplay()\n        {\n\t\t\tself.setNeedsDisplayInRect(self.bounds)\n\t\t}\n\n\t\tpublic final override func touchesBeganWithEvent(event: NSEvent)\n        {\n\t\t\tself.nsuiTouchesBegan(event.touchesMatchingPhase(.Any, inView: self), withEvent: event)\n\t\t}\n\n\t\tpublic final override func touchesEndedWithEvent(event: NSEvent)\n        {\n\t\t\tself.nsuiTouchesEnded(event.touchesMatchingPhase(.Any, inView: self), withEvent: event)\n\t\t}\n\n\t\tpublic final override func touchesMovedWithEvent(event: NSEvent)\n        {\n\t\t\tself.nsuiTouchesMoved(event.touchesMatchingPhase(.Any, inView: self), withEvent: event)\n\t\t}\n\n\t\tpublic override func touchesCancelledWithEvent(event: NSEvent)\n        {\n\t\t\tself.nsuiTouchesCancelled(event.touchesMatchingPhase(.Any, inView: self), withEvent: event)\n\t\t}\n\n\t\tpublic func nsuiTouchesBegan(touches: Set<NSUITouch>, withEvent event: NSUIEvent?)\n        {\n\t\t\tsuper.touchesBeganWithEvent(event!)\n\t\t}\n\n\t\tpublic func nsuiTouchesMoved(touches: Set<NSUITouch>, withEvent event: NSUIEvent?)\n        {\n\t\t\tsuper.touchesMovedWithEvent(event!)\n\t\t}\n\n\t\tpublic func nsuiTouchesEnded(touches: Set<NSUITouch>, withEvent event: NSUIEvent?)\n        {\n\t\t\tsuper.touchesEndedWithEvent(event!)\n\t\t}\n\n\t\tpublic func nsuiTouchesCancelled(touches: Set<NSUITouch>?, withEvent event: NSUIEvent?)\n        {\n\t\t\tsuper.touchesCancelledWithEvent(event!)\n        }\n        \n\t\tvar backgroundColor: NSUIColor?\n        {\n            get\n            {\n                return self.layer?.backgroundColor == nil\n                    ? nil\n                    : NSColor(CGColor: self.layer!.backgroundColor!)\n            }\n            set\n            {\n                self.layer?.backgroundColor = newValue == nil ? nil : newValue!.CGColor\n            }\n        }\n\n\t\tfinal var nsuiLayer: CALayer?\n        {\n\t\t\treturn self.layer\n\t\t}\n\t}\n\n\textension NSFont\n    {\n\t\tvar lineHeight: CGFloat\n        {\n\t\t\t// Not sure if this is right, but it looks okay\n\t\t\treturn self.boundingRectForFont.size.height\n\t\t}\n\t}\n\n\textension NSScreen\n    {\n\t\tfinal var nsuiScale: CGFloat\n        {\n\t\t\treturn self.backingScaleFactor\n\t\t}\n\t}\n\n\textension NSImage\n    {\n\t\tvar CGImage: CGImageRef?\n        {\n            return self.CGImageForProposedRect(nil, context: nil, hints: nil)\n\t\t}\n\t}\n\n\textension NSTouch\n    {\n\t\t/** Touch locations on OS X are relative to the trackpad, whereas on iOS they are actually *on* the view. */\n\t\tfunc locationInView(view: NSView) -> NSPoint\n        {\n\t\t\tlet n = self.normalizedPosition\n\t\t\tlet b = view.bounds\n\t\t\treturn NSPoint(x: b.origin.x + b.size.width * n.x, y: b.origin.y + b.size.height * n.y)\n\t\t}\n\t}\n\n\textension NSScrollView\n    {\n\t\tvar scrollEnabled: Bool\n        {\n\t\t\tget\n            {\n\t\t\t\treturn true\n\t\t\t}\n            set\n            {\n                // FIXME: We can't disable  scrolling it on OSX\n            }\n\t\t}\n\t}\n\n\tfunc NSUIGraphicsGetCurrentContext() -> CGContextRef?\n    {\n\t\treturn NSGraphicsContext.currentContext()?.CGContext\n\t}\n\n\tfunc NSUIGraphicsPushContext(context: CGContextRef)\n    {\n\t\tlet address = unsafeAddressOf(context)\n\t\tlet ptr: UnsafeMutablePointer<CGContext> = UnsafeMutablePointer(UnsafePointer<CGContext>(address))\n\t\tlet cx = NSGraphicsContext(graphicsPort: ptr, flipped: true)\n\t\tNSGraphicsContext.saveGraphicsState()\n\t\tNSGraphicsContext.setCurrentContext(cx)\n\t}\n\n\tfunc NSUIGraphicsPopContext()\n    {\n\t\tNSGraphicsContext.restoreGraphicsState()\n\t}\n\n\tfunc NSUIImagePNGRepresentation(image: NSUIImage) -> NSData?\n    {\n\t\timage.lockFocus()\n\t\tlet rep = NSBitmapImageRep(focusedViewRect: NSMakeRect(0, 0, image.size.width, image.size.height))\n\t\timage.unlockFocus()\n\t\treturn rep?.representationUsingType(.NSPNGFileType, properties: [:])\n\t}\n\n\tfunc NSUIImageJPEGRepresentation(image: NSUIImage, _ quality: CGFloat = 0.9) -> NSData?\n    {\n\t\timage.lockFocus()\n\t\tlet rep = NSBitmapImageRep(focusedViewRect: NSMakeRect(0, 0, image.size.width, image.size.height))\n\t\timage.unlockFocus()\n\t\treturn rep?.representationUsingType(.NSJPEGFileType, properties: [NSImageCompressionFactor: quality])\n\t}\n\n\tprivate var imageContextStack: [CGFloat] = []\n\n\tfunc NSUIGraphicsBeginImageContextWithOptions(size: CGSize, _ opaque: Bool, _ scale: CGFloat)\n    {\n\t\tvar scale = scale\n\t\tif scale == 0.0\n        {\n\t\t\tscale = NSScreen.mainScreen()?.backingScaleFactor ?? 1.0\n\t\t}\n\n\t\tlet width = Int(size.width * scale)\n\t\tlet height = Int(size.height * scale)\n\n\t\tif width > 0 && height > 0\n        {\n\t\t\timageContextStack.append(scale)\n\n\t\t\tlet colorSpace = CGColorSpaceCreateDeviceRGB()\n\t\t\tlet ctx = CGBitmapContextCreate(nil, width, height, 8, 4*width, colorSpace, (opaque ?  CGImageAlphaInfo.NoneSkipFirst.rawValue : CGImageAlphaInfo.PremultipliedFirst.rawValue))\n\t\t\tCGContextConcatCTM(ctx, CGAffineTransformMake(1, 0, 0, -1, 0, CGFloat(height)))\n\t\t\tCGContextScaleCTM(ctx, scale, scale)\n\t\t\tNSUIGraphicsPushContext(ctx!)\n\t\t}\n\t}\n\n\tfunc NSUIGraphicsGetImageFromCurrentImageContext() -> NSUIImage?\n    {\n\t\tif !imageContextStack.isEmpty\n        {\n\t\t\tlet ctx = NSUIGraphicsGetCurrentContext()\n\t\t\tlet scale = imageContextStack.last!\n\t\t\tif let theCGImage = CGBitmapContextCreateImage(ctx)\n            {\n\t\t\t\tlet size = CGSizeMake(CGFloat(CGBitmapContextGetWidth(ctx)) / scale, CGFloat(CGBitmapContextGetHeight(ctx)) / scale)\n\t\t\t\tlet image = NSImage(CGImage: theCGImage, size: size)\n\t\t\t\treturn image\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\n\tfunc NSUIGraphicsEndImageContext()\n    {\n\t\tif imageContextStack.last != nil\n        {\n\t\t\timageContextStack.removeLast()\n\t\t\tNSUIGraphicsPopContext()\n\t\t}\n\t}\n\n\tfunc NSUIMainScreen() -> NSUIScreen?\n    {\n\t\treturn NSUIScreen.mainScreen()\n\t}\n\n#endif\n"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Utils/ChartSelectionDetail.swift",
    "content": "//\n//  ChartSelectionDetail.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\n\npublic class ChartSelectionDetail: NSObject\n{\n    private var _value = Double(0)\n    private var _dataSetIndex = Int(0)\n    private var _dataSet: IChartDataSet!\n    \n    public override init()\n    {\n        super.init()\n    }\n    \n    public init(value: Double, dataSetIndex: Int, dataSet: IChartDataSet)\n    {\n        super.init()\n        \n        _value = value\n        _dataSetIndex = dataSetIndex\n        _dataSet = dataSet\n    }\n    \n    public var value: Double\n    {\n        return _value\n    }\n    \n    public var dataSetIndex: Int\n    {\n        return _dataSetIndex\n    }\n    \n    public var dataSet: IChartDataSet?\n    {\n        return _dataSet\n    }\n    \n    // MARK: NSObject\n    \n    public override func isEqual(object: AnyObject?) -> Bool\n    {\n        if (object === nil)\n        {\n            return false\n        }\n        \n        if (!object!.isKindOfClass(self.dynamicType))\n        {\n            return false\n        }\n        \n        if (object!.value != _value)\n        {\n            return false\n        }\n        \n        if (object!.dataSetIndex != _dataSetIndex)\n        {\n            return false\n        }\n        \n        if (object!.dataSet !== _dataSet)\n        {\n            return false\n        }\n        \n        return true\n    }\n}\n\npublic func ==(lhs: ChartSelectionDetail, rhs: ChartSelectionDetail) -> Bool\n{\n    if (lhs === rhs)\n    {\n        return true\n    }\n    \n    if (!lhs.isKindOfClass(rhs.dynamicType))\n    {\n        return false\n    }\n    \n    if (lhs.value != rhs.value)\n    {\n        return false\n    }\n    \n    if (lhs.dataSetIndex != rhs.dataSetIndex)\n    {\n        return false\n    }\n    \n    if (lhs.dataSet !== rhs.dataSet)\n    {\n        return false\n    }\n    \n    return true\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Utils/ChartTransformer.swift",
    "content": "//\n//  ChartTransformer.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 6/3/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n/// Transformer class that contains all matrices and is responsible for transforming values into pixels on the screen and backwards.\npublic class ChartTransformer: NSObject\n{\n    /// matrix to map the values to the screen pixels\n    internal var _matrixValueToPx = CGAffineTransformIdentity\n\n    /// matrix for handling the different offsets of the chart\n    internal var _matrixOffset = CGAffineTransformIdentity\n\n    internal var _viewPortHandler: ChartViewPortHandler\n\n    public init(viewPortHandler: ChartViewPortHandler)\n    {\n        _viewPortHandler = viewPortHandler\n    }\n\n    /// Prepares the matrix that transforms values to pixels. Calculates the scale factors from the charts size and offsets.\n    public func prepareMatrixValuePx(chartXMin chartXMin: Double, deltaX: CGFloat, deltaY: CGFloat, chartYMin: Double)\n    {\n        var scaleX = (_viewPortHandler.contentWidth / deltaX)\n        var scaleY = (_viewPortHandler.contentHeight / deltaY)\n        \n        if CGFloat.infinity == scaleX\n        {\n            scaleX = 0.0\n        }\n        if CGFloat.infinity == scaleY\n        {\n            scaleY = 0.0\n        }\n\n        // setup all matrices\n        _matrixValueToPx = CGAffineTransformIdentity\n        _matrixValueToPx = CGAffineTransformScale(_matrixValueToPx, scaleX, -scaleY)\n        _matrixValueToPx = CGAffineTransformTranslate(_matrixValueToPx, CGFloat(-chartXMin), CGFloat(-chartYMin))\n    }\n\n    /// Prepares the matrix that contains all offsets.\n    public func prepareMatrixOffset(inverted: Bool)\n    {\n        if (!inverted)\n        {\n            _matrixOffset = CGAffineTransformMakeTranslation(_viewPortHandler.offsetLeft, _viewPortHandler.chartHeight - _viewPortHandler.offsetBottom)\n        }\n        else\n        {\n            _matrixOffset = CGAffineTransformMakeScale(1.0, -1.0)\n            _matrixOffset = CGAffineTransformTranslate(_matrixOffset, _viewPortHandler.offsetLeft, -_viewPortHandler.offsetTop)\n        }\n    }\n    \n    /// Transforms an Entry into a transformed point for bar chart\n    public func getTransformedValueBarChart(entry entry: ChartDataEntry, xIndex: Int, dataSetIndex: Int, phaseY: CGFloat, dataSetCount: Int, groupSpace: CGFloat) -> CGPoint\n    {\n        // calculate the x-position, depending on datasetcount\n        let x = CGFloat(xIndex + (xIndex * (dataSetCount - 1)) + dataSetIndex) + groupSpace * CGFloat(xIndex) + groupSpace / 2.0\n        let y = entry.value\n        \n        var valuePoint = CGPoint(\n            x: x,\n            y: CGFloat(y) * phaseY\n        )\n        \n        pointValueToPixel(&valuePoint)\n        \n        return valuePoint\n    }\n    \n    /// Transforms an Entry into a transformed point for horizontal bar chart\n    public func getTransformedValueHorizontalBarChart(entry entry: ChartDataEntry, xIndex: Int, dataSetIndex: Int, phaseY: CGFloat, dataSetCount: Int, groupSpace: CGFloat) -> CGPoint\n    {\n        // calculate the x-position, depending on datasetcount\n        let x = CGFloat(xIndex + (xIndex * (dataSetCount - 1)) + dataSetIndex) + groupSpace * CGFloat(xIndex) + groupSpace / 2.0\n        let y = entry.value\n        \n        var valuePoint = CGPoint(\n            x: CGFloat(y) * phaseY,\n            y: x\n        )\n        \n        pointValueToPixel(&valuePoint)\n        \n        return valuePoint\n    }\n\n    /// Transform an array of points with all matrices.\n    // VERY IMPORTANT: Keep matrix order \"value-touch-offset\" when transforming.\n    public func pointValuesToPixel(inout pts: [CGPoint])\n    {\n        let trans = valueToPixelMatrix\n        for i in 0 ..< pts.count\n        {\n            pts[i] = CGPointApplyAffineTransform(pts[i], trans)\n        }\n    }\n    \n    public func pointValueToPixel(inout point: CGPoint)\n    {\n        point = CGPointApplyAffineTransform(point, valueToPixelMatrix)\n    }\n    \n    /// Transform a rectangle with all matrices.\n    public func rectValueToPixel(inout r: CGRect)\n    {\n        r = CGRectApplyAffineTransform(r, valueToPixelMatrix)\n    }\n    \n    /// Transform a rectangle with all matrices with potential animation phases.\n    public func rectValueToPixel(inout r: CGRect, phaseY: CGFloat)\n    {\n        // multiply the height of the rect with the phase\n        var bottom = r.origin.y + r.size.height\n        bottom *= phaseY\n        let top = r.origin.y * phaseY\n        r.size.height = bottom - top\n        r.origin.y = top\n\n        r = CGRectApplyAffineTransform(r, valueToPixelMatrix)\n    }\n    \n    /// Transform a rectangle with all matrices.\n    public func rectValueToPixelHorizontal(inout r: CGRect)\n    {\n        r = CGRectApplyAffineTransform(r, valueToPixelMatrix)\n    }\n    \n    /// Transform a rectangle with all matrices with potential animation phases.\n    public func rectValueToPixelHorizontal(inout r: CGRect, phaseY: CGFloat)\n    {\n        // multiply the height of the rect with the phase\n        var right = r.origin.x + r.size.width\n        right *= phaseY\n        let left = r.origin.x * phaseY\n        r.size.width = right - left\n        r.origin.x = left\n        \n        r = CGRectApplyAffineTransform(r, valueToPixelMatrix)\n    }\n\n    /// transforms multiple rects with all matrices\n    public func rectValuesToPixel(inout rects: [CGRect])\n    {\n        let trans = valueToPixelMatrix\n        \n        for i in 0 ..< rects.count\n        {\n            rects[i] = CGRectApplyAffineTransform(rects[i], trans)\n        }\n    }\n    \n    /// Transforms the given array of touch points (pixels) into values on the chart.\n    public func pixelsToValue(inout pixels: [CGPoint])\n    {\n        let trans = pixelToValueMatrix\n        \n        for i in 0 ..< pixels.count\n        {\n            pixels[i] = CGPointApplyAffineTransform(pixels[i], trans)\n        }\n    }\n    \n    /// Transforms the given touch point (pixels) into a value on the chart.\n    public func pixelToValue(inout pixel: CGPoint)\n    {\n        pixel = CGPointApplyAffineTransform(pixel, pixelToValueMatrix)\n    }\n    \n    /// - returns: the x and y values in the chart at the given touch point\n    /// (encapsulated in a PointD). This method transforms pixel coordinates to\n    /// coordinates / values in the chart.\n    public func getValueByTouchPoint(point: CGPoint) -> CGPoint\n    {\n        return CGPointApplyAffineTransform(point, pixelToValueMatrix)\n    }\n    \n    public var valueToPixelMatrix: CGAffineTransform\n    {\n        return\n            CGAffineTransformConcat(\n                CGAffineTransformConcat(\n                    _matrixValueToPx,\n                    _viewPortHandler.touchMatrix\n                ),\n                _matrixOffset\n        )\n    }\n    \n    public var pixelToValueMatrix: CGAffineTransform\n    {\n        return CGAffineTransformInvert(valueToPixelMatrix)\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Utils/ChartTransformerHorizontalBarChart.swift",
    "content": "//\n//  ChartTransformerHorizontalBarChart.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 1/4/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\npublic class ChartTransformerHorizontalBarChart: ChartTransformer\n{\n    /// Prepares the matrix that contains all offsets.\n    public override func prepareMatrixOffset(inverted: Bool)\n    {\n        if (!inverted)\n        {\n            _matrixOffset = CGAffineTransformMakeTranslation(_viewPortHandler.offsetLeft, _viewPortHandler.chartHeight - _viewPortHandler.offsetBottom)\n        }\n        else\n        {\n            _matrixOffset = CGAffineTransformMakeScale(-1.0, 1.0)\n            _matrixOffset = CGAffineTransformTranslate(_matrixOffset,\n                -(_viewPortHandler.chartWidth - _viewPortHandler.offsetRight),\n                _viewPortHandler.chartHeight - _viewPortHandler.offsetBottom)\n        }\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Utils/ChartUtils.swift",
    "content": "//\n//  Utils.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 23/2/15.\n\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n#if !os(OSX)\n    import UIKit\n#endif\n\npublic class ChartUtils\n{\n    private static var _defaultValueFormatter: NSNumberFormatter = ChartUtils.generateDefaultValueFormatter()\n    \n    internal struct Math\n    {\n        internal static let FDEG2RAD = CGFloat(M_PI / 180.0)\n        internal static let FRAD2DEG = CGFloat(180.0 / M_PI)\n        internal static let DEG2RAD = M_PI / 180.0\n        internal static let RAD2DEG = 180.0 / M_PI\n    }\n    \n    internal class func roundToNextSignificant(number number: Double) -> Double\n    {\n        if (isinf(number) || isnan(number) || number == 0)\n        {\n            return number\n        }\n        \n        let d = ceil(log10(number < 0.0 ? -number : number))\n        let pw = 1 - Int(d)\n        let magnitude = pow(Double(10.0), Double(pw))\n        let shifted = round(number * magnitude)\n        return shifted / magnitude\n    }\n    \n    internal class func decimals(number: Double) -> Int\n    {\n        if (number == 0.0)\n        {\n            return 0\n        }\n        \n        let i = roundToNextSignificant(number: Double(number))\n        return Int(ceil(-log10(i))) + 2\n    }\n    \n    internal class func nextUp(number: Double) -> Double\n    {\n        if (isinf(number) || isnan(number))\n        {\n            return number\n        }\n        else\n        {\n            return number + DBL_EPSILON\n        }\n    }\n\n    /// - returns: the index of the DataSet that contains the closest value on the y-axis. This will return -Integer.MAX_VALUE if failure.\n    internal class func closestDataSetIndex(valsAtIndex: [ChartSelectionDetail], value: Double, axis: ChartYAxis.AxisDependency?) -> Int\n    {\n        var index = -Int.max\n        var distance = DBL_MAX\n        \n        for i in 0 ..< valsAtIndex.count\n        {\n            let sel = valsAtIndex[i]\n            \n            if (axis == nil || sel.dataSet?.axisDependency == axis)\n            {\n                let cdistance = abs(sel.value - value)\n                if (cdistance < distance)\n                {\n                    index = valsAtIndex[i].dataSetIndex\n                    distance = cdistance\n                }\n            }\n        }\n        \n        return index\n    }\n    \n    /// - returns: the minimum distance from a touch-y-value (in pixels) to the closest y-value (in pixels) that is displayed in the chart.\n    internal class func getMinimumDistance(valsAtIndex: [ChartSelectionDetail], val: Double, axis: ChartYAxis.AxisDependency) -> Double\n    {\n        var distance = DBL_MAX\n        \n        for i in 0 ..< valsAtIndex.count\n        {\n            let sel = valsAtIndex[i]\n            \n            if (sel.dataSet!.axisDependency == axis)\n            {\n                let cdistance = abs(sel.value - val)\n                if (cdistance < distance)\n                {\n                    distance = cdistance\n                }\n            }\n        }\n        \n        return distance\n    }\n    \n    /// Calculates the position around a center point, depending on the distance from the center, and the angle of the position around the center.\n    internal class func getPosition(center center: CGPoint, dist: CGFloat, angle: CGFloat) -> CGPoint\n    {\n        return CGPoint(\n            x: center.x + dist * cos(angle * Math.FDEG2RAD),\n            y: center.y + dist * sin(angle * Math.FDEG2RAD)\n        )\n    }\n    \n    public class func drawText(context context: CGContext, text: String, point: CGPoint, align: NSTextAlignment, attributes: [String : AnyObject]?)\n    {\n        var point = point\n        \n        if (align == .Center)\n        {\n            point.x -= text.sizeWithAttributes(attributes).width / 2.0\n        }\n        else if (align == .Right)\n        {\n            point.x -= text.sizeWithAttributes(attributes).width\n        }\n        \n        NSUIGraphicsPushContext(context)\n        \n        (text as NSString).drawAtPoint(point, withAttributes: attributes)\n        \n        NSUIGraphicsPopContext()\n    }\n    \n    public class func drawText(context context: CGContext, text: String, point: CGPoint, attributes: [String : AnyObject]?, anchor: CGPoint, angleRadians: CGFloat)\n    {\n        var drawOffset = CGPoint()\n        \n        NSUIGraphicsPushContext(context)\n        \n        if angleRadians != 0.0\n        {\n            let size = text.sizeWithAttributes(attributes)\n            \n            // Move the text drawing rect in a way that it always rotates around its center\n            drawOffset.x = -size.width * 0.5\n            drawOffset.y = -size.height * 0.5\n            \n            var translate = point\n            \n            // Move the \"outer\" rect relative to the anchor, assuming its centered\n            if anchor.x != 0.5 || anchor.y != 0.5\n            {\n                let rotatedSize = sizeOfRotatedRectangle(size, radians: angleRadians)\n                \n                translate.x -= rotatedSize.width * (anchor.x - 0.5)\n                translate.y -= rotatedSize.height * (anchor.y - 0.5)\n            }\n            \n            CGContextSaveGState(context)\n            CGContextTranslateCTM(context, translate.x, translate.y)\n            CGContextRotateCTM(context, angleRadians)\n            \n            (text as NSString).drawAtPoint(drawOffset, withAttributes: attributes)\n            \n            CGContextRestoreGState(context)\n        }\n        else\n        {\n            if anchor.x != 0.0 || anchor.y != 0.0\n            {\n                let size = text.sizeWithAttributes(attributes)\n                \n                drawOffset.x = -size.width * anchor.x\n                drawOffset.y = -size.height * anchor.y\n            }\n            \n            drawOffset.x += point.x\n            drawOffset.y += point.y\n            \n            (text as NSString).drawAtPoint(drawOffset, withAttributes: attributes)\n        }\n        \n        NSUIGraphicsPopContext()\n    }\n    \n    internal class func drawMultilineText(context context: CGContext, text: String, knownTextSize: CGSize, point: CGPoint, attributes: [String : AnyObject]?, constrainedToSize: CGSize, anchor: CGPoint, angleRadians: CGFloat)\n    {\n        var rect = CGRect(origin: CGPoint(), size: knownTextSize)\n        \n        NSUIGraphicsPushContext(context)\n        \n        if angleRadians != 0.0\n        {\n            // Move the text drawing rect in a way that it always rotates around its center\n            rect.origin.x = -knownTextSize.width * 0.5\n            rect.origin.y = -knownTextSize.height * 0.5\n            \n            var translate = point\n            \n            // Move the \"outer\" rect relative to the anchor, assuming its centered\n            if anchor.x != 0.5 || anchor.y != 0.5\n            {\n                let rotatedSize = sizeOfRotatedRectangle(knownTextSize, radians: angleRadians)\n                \n                translate.x -= rotatedSize.width * (anchor.x - 0.5)\n                translate.y -= rotatedSize.height * (anchor.y - 0.5)\n            }\n            \n            CGContextSaveGState(context)\n            CGContextTranslateCTM(context, translate.x, translate.y)\n            CGContextRotateCTM(context, angleRadians)\n            \n            (text as NSString).drawWithRect(rect, options: .UsesLineFragmentOrigin, attributes: attributes, context: nil)\n            \n            CGContextRestoreGState(context)\n        }\n        else\n        {\n            if anchor.x != 0.0 || anchor.y != 0.0\n            {\n                rect.origin.x = -knownTextSize.width * anchor.x\n                rect.origin.y = -knownTextSize.height * anchor.y\n            }\n            \n            rect.origin.x += point.x\n            rect.origin.y += point.y\n            \n            (text as NSString).drawWithRect(rect, options: .UsesLineFragmentOrigin, attributes: attributes, context: nil)\n        }\n        \n        NSUIGraphicsPopContext()\n    }\n    \n    internal class func drawMultilineText(context context: CGContext, text: String, point: CGPoint, attributes: [String : AnyObject]?, constrainedToSize: CGSize, anchor: CGPoint, angleRadians: CGFloat)\n    {\n        let rect = text.boundingRectWithSize(constrainedToSize, options: .UsesLineFragmentOrigin, attributes: attributes, context: nil)\n        drawMultilineText(context: context, text: text, knownTextSize: rect.size, point: point, attributes: attributes, constrainedToSize: constrainedToSize, anchor: anchor, angleRadians: angleRadians)\n    }\n    \n    /// - returns: an angle between 0.0 < 360.0 (not less than zero, less than 360)\n    internal class func normalizedAngleFromAngle(angle: CGFloat) -> CGFloat\n    {\n        var angle = angle\n        \n        while (angle < 0.0)\n        {\n            angle += 360.0\n        }\n        \n        return angle % 360.0\n    }\n    \n    private class func generateDefaultValueFormatter() -> NSNumberFormatter\n    {\n        let formatter = NSNumberFormatter()\n        formatter.minimumIntegerDigits = 1\n        formatter.maximumFractionDigits = 1\n        formatter.minimumFractionDigits = 1\n        formatter.usesGroupingSeparator = true\n        return formatter\n    }\n    \n    /// - returns: the default value formatter used for all chart components that needs a default\n    internal class func defaultValueFormatter() -> NSNumberFormatter\n    {\n        return _defaultValueFormatter\n    }\n    \n    internal class func sizeOfRotatedRectangle(rectangleSize: CGSize, degrees: CGFloat) -> CGSize\n    {\n        let radians = degrees * Math.FDEG2RAD\n        return sizeOfRotatedRectangle(rectangleWidth: rectangleSize.width, rectangleHeight: rectangleSize.height, radians: radians)\n    }\n    \n    internal class func sizeOfRotatedRectangle(rectangleSize: CGSize, radians: CGFloat) -> CGSize\n    {\n        return sizeOfRotatedRectangle(rectangleWidth: rectangleSize.width, rectangleHeight: rectangleSize.height, radians: radians)\n    }\n    \n    internal class func sizeOfRotatedRectangle(rectangleWidth rectangleWidth: CGFloat, rectangleHeight: CGFloat, degrees: CGFloat) -> CGSize\n    {\n        let radians = degrees * Math.FDEG2RAD\n        return sizeOfRotatedRectangle(rectangleWidth: rectangleWidth, rectangleHeight: rectangleHeight, radians: radians)\n    }\n    \n    internal class func sizeOfRotatedRectangle(rectangleWidth rectangleWidth: CGFloat, rectangleHeight: CGFloat, radians: CGFloat) -> CGSize\n    {\n        return CGSize(\n            width: abs(rectangleWidth * cos(radians)) + abs(rectangleHeight * sin(radians)),\n            height: abs(rectangleWidth * sin(radians)) + abs(rectangleHeight * cos(radians))\n        )\n    }\n    \n    /// MARK: - Bridging functions\n    \n    internal class func bridgedObjCGetNSUIColorArray (swift array: [NSUIColor?]) -> [NSObject]\n    {\n        var newArray = [NSObject]()\n        for val in array\n        {\n            if (val == nil)\n            {\n                newArray.append(NSNull())\n            }\n            else\n            {\n                newArray.append(val!)\n            }\n        }\n        return newArray\n    }\n    \n    internal class func bridgedObjCGetNSUIColorArray (objc array: [NSObject]) -> [NSUIColor?]\n    {\n        var newArray = [NSUIColor?]()\n        for object in array\n        {\n            newArray.append(object as? NSUIColor)\n        }\n        return newArray\n    }\n    \n    internal class func bridgedObjCGetStringArray (swift array: [String?]) -> [NSObject]\n    {\n        var newArray = [NSObject]()\n        for val in array\n        {\n            if (val == nil)\n            {\n                newArray.append(NSNull())\n            }\n            else\n            {\n                newArray.append(val!)\n            }\n        }\n        return newArray\n    }\n    \n    internal class func bridgedObjCGetStringArray (objc array: [NSObject]) -> [String?]\n    {\n        var newArray = [String?]()\n        for object in array\n        {\n            newArray.append(object as? String)\n        }\n        return newArray\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Charts/Charts/Classes/Utils/ChartViewPortHandler.swift",
    "content": "//\n//  ChartViewPortHandler.swift\n//  Charts\n//\n//  Created by Daniel Cohen Gindi on 27/2/15.\n//\n//  Copyright 2015 Daniel Cohen Gindi & Philipp Jahoda\n//  A port of MPAndroidChart for iOS\n//  Licensed under Apache License 2.0\n//\n//  https://github.com/danielgindi/ios-charts\n//\n\nimport Foundation\nimport CoreGraphics\n\n/// Class that contains information about the charts current viewport settings, including offsets, scale & translation levels, ...\npublic class ChartViewPortHandler: NSObject\n{\n    /// matrix used for touch events\n    private var _touchMatrix = CGAffineTransformIdentity\n    \n    /// this rectangle defines the area in which graph values can be drawn\n    private var _contentRect = CGRect()\n    \n    private var _chartWidth = CGFloat(0.0)\n    private var _chartHeight = CGFloat(0.0)\n    \n    /// minimum scale value on the y-axis\n    private var _minScaleY = CGFloat(1.0)\n    \n    /// maximum scale value on the y-axis\n    private var _maxScaleY = CGFloat.max\n    \n    /// minimum scale value on the x-axis\n    private var _minScaleX = CGFloat(1.0)\n    \n    /// maximum scale value on the x-axis\n    private var _maxScaleX = CGFloat.max\n    \n    /// contains the current scale factor of the x-axis\n    private var _scaleX = CGFloat(1.0)\n    \n    /// contains the current scale factor of the y-axis\n    private var _scaleY = CGFloat(1.0)\n    \n    /// current translation (drag distance) on the x-axis\n    private var _transX = CGFloat(0.0)\n    \n    /// current translation (drag distance) on the y-axis\n    private var _transY = CGFloat(0.0)\n    \n    /// offset that allows the chart to be dragged over its bounds on the x-axis\n    private var _transOffsetX = CGFloat(0.0)\n    \n    /// offset that allows the chart to be dragged over its bounds on the x-axis\n    private var _transOffsetY = CGFloat(0.0)\n    \n    public override init()\n    {\n    }\n    \n    /// Constructor - don't forget calling setChartDimens(...)\n    public init(width: CGFloat, height: CGFloat)\n    {\n        super.init()\n        \n        setChartDimens(width: width, height: height)\n    }\n    \n    public func setChartDimens(width width: CGFloat, height: CGFloat)\n    {\n        let offsetLeft = self.offsetLeft\n        let offsetTop = self.offsetTop\n        let offsetRight = self.offsetRight\n        let offsetBottom = self.offsetBottom\n        \n        _chartHeight = height\n        _chartWidth = width\n        \n        restrainViewPort(offsetLeft: offsetLeft, offsetTop: offsetTop, offsetRight: offsetRight, offsetBottom: offsetBottom)\n    }\n    \n    public var hasChartDimens: Bool\n    {\n        if (_chartHeight > 0.0 && _chartWidth > 0.0)\n        {\n            return true\n        }\n        else\n        {\n            return false\n        }\n    }\n\n    public func restrainViewPort(offsetLeft offsetLeft: CGFloat, offsetTop: CGFloat, offsetRight: CGFloat, offsetBottom: CGFloat)\n    {\n        _contentRect.origin.x = offsetLeft\n        _contentRect.origin.y = offsetTop\n        _contentRect.size.width = _chartWidth - offsetLeft - offsetRight\n        _contentRect.size.height = _chartHeight - offsetBottom - offsetTop\n    }\n    \n    public var offsetLeft: CGFloat\n    {\n        return _contentRect.origin.x\n    }\n    \n    public var offsetRight: CGFloat\n    {\n        return _chartWidth - _contentRect.size.width - _contentRect.origin.x\n    }\n    \n    public var offsetTop: CGFloat\n    {\n        return _contentRect.origin.y\n    }\n    \n    public var offsetBottom: CGFloat\n    {\n        return _chartHeight - _contentRect.size.height - _contentRect.origin.y\n    }\n    \n    public var contentTop: CGFloat\n    {\n        return _contentRect.origin.y\n    }\n    \n    public var contentLeft: CGFloat\n    {\n        return _contentRect.origin.x\n    }\n    \n    public var contentRight: CGFloat\n    {\n        return _contentRect.origin.x + _contentRect.size.width\n    }\n    \n    public var contentBottom: CGFloat\n    {\n        return _contentRect.origin.y + _contentRect.size.height\n    }\n    \n    public var contentWidth: CGFloat\n    {\n        return _contentRect.size.width\n    }\n    \n    public var contentHeight: CGFloat\n    {\n        return _contentRect.size.height\n    }\n    \n    public var contentRect: CGRect\n    {\n        return _contentRect\n    }\n    \n    public var contentCenter: CGPoint\n    {\n        return CGPoint(x: _contentRect.origin.x + _contentRect.size.width / 2.0, y: _contentRect.origin.y + _contentRect.size.height / 2.0)\n    }\n    \n    public var chartHeight: CGFloat\n    { \n        return _chartHeight\n    }\n    \n    public var chartWidth: CGFloat\n    { \n        return _chartWidth\n    }\n\n    // MARK: - Scaling/Panning etc.\n    \n    /// Zooms by the specified zoom factors.\n    public func zoom(scaleX scaleX: CGFloat, scaleY: CGFloat) -> CGAffineTransform\n    {\n        return CGAffineTransformScale(_touchMatrix, scaleX, scaleY)\n    }\n    \n    /// Zooms around the specified center\n    public func zoom(scaleX scaleX: CGFloat, scaleY: CGFloat, x: CGFloat, y: CGFloat) -> CGAffineTransform\n    {\n        var matrix = CGAffineTransformTranslate(_touchMatrix, x, y)\n        matrix = CGAffineTransformScale(matrix, scaleX, scaleY)\n        matrix = CGAffineTransformTranslate(matrix, -x, -y)\n        return matrix\n    }\n    \n    /// Zooms in by 1.4, x and y are the coordinates (in pixels) of the zoom center.\n    public func zoomIn(x x: CGFloat, y: CGFloat) -> CGAffineTransform\n    {\n        return zoom(scaleX: 1.4, scaleY: 1.4, x: x, y: y)\n    }\n    \n    /// Zooms out by 0.7, x and y are the coordinates (in pixels) of the zoom center.\n    public func zoomOut(x x: CGFloat, y: CGFloat) -> CGAffineTransform\n    {\n        return zoom(scaleX: 0.7, scaleY: 0.7, x: x, y: y)\n    }\n    \n    /// Sets the scale factor to the specified values.\n    public func setZoom(scaleX scaleX: CGFloat, scaleY: CGFloat) -> CGAffineTransform\n    {\n        var matrix = _touchMatrix\n        matrix.a = scaleX\n        matrix.d = scaleY\n        return matrix\n    }\n    \n    /// Sets the scale factor to the specified values. x and y is pivot.\n    public func setZoom(scaleX scaleX: CGFloat, scaleY: CGFloat, x: CGFloat, y: CGFloat) -> CGAffineTransform\n    {\n        var matrix = _touchMatrix\n        matrix.a = 1.0\n        matrix.d = 1.0\n        matrix = CGAffineTransformTranslate(matrix, x, y)\n        matrix = CGAffineTransformScale(matrix, scaleX, scaleY)\n        matrix = CGAffineTransformTranslate(matrix, -x, -y)\n        return matrix\n    }\n    \n    /// Resets all zooming and dragging and makes the chart fit exactly it's bounds.\n    public func fitScreen() -> CGAffineTransform\n    {\n        _minScaleX = 1.0\n        _minScaleY = 1.0\n\n        return CGAffineTransformIdentity\n    }\n    \n    /// Translates to the specified point.\n    public func translate(pt pt: CGPoint) -> CGAffineTransform\n    {\n        let translateX = pt.x - offsetLeft\n        let translateY = pt.y - offsetTop\n        \n        let matrix = CGAffineTransformConcat(_touchMatrix, CGAffineTransformMakeTranslation(-translateX, -translateY))\n        \n        return matrix\n    }\n    \n    /// Centers the viewport around the specified position (x-index and y-value) in the chart.\n    /// Centering the viewport outside the bounds of the chart is not possible.\n    /// Makes most sense in combination with the setScaleMinima(...) method.\n    public func centerViewPort(pt pt: CGPoint, chart: ChartViewBase)\n    {\n        let translateX = pt.x - offsetLeft\n        let translateY = pt.y - offsetTop\n        \n        let matrix = CGAffineTransformConcat(_touchMatrix, CGAffineTransformMakeTranslation(-translateX, -translateY))\n        \n        refresh(newMatrix: matrix, chart: chart, invalidate: true)\n    }\n    \n    /// call this method to refresh the graph with a given matrix\n    public func refresh(newMatrix newMatrix: CGAffineTransform, chart: ChartViewBase, invalidate: Bool) -> CGAffineTransform\n    {\n        _touchMatrix = newMatrix\n        \n        // make sure scale and translation are within their bounds\n        limitTransAndScale(matrix: &_touchMatrix, content: _contentRect)\n        \n        chart.setNeedsDisplay()\n        \n        return _touchMatrix\n    }\n    \n    /// limits the maximum scale and X translation of the given matrix\n    private func limitTransAndScale(inout matrix matrix: CGAffineTransform, content: CGRect?)\n    {\n        // min scale-x is 1\n        _scaleX = min(max(_minScaleX, matrix.a), _maxScaleX)\n        \n        // min scale-y is 1\n        _scaleY = min(max(_minScaleY,  matrix.d), _maxScaleY)\n        \n        \n        var width: CGFloat = 0.0\n        var height: CGFloat = 0.0\n        \n        if (content != nil)\n        {\n            width = content!.width\n            height = content!.height\n        }\n        \n        let maxTransX = -width * (_scaleX - 1.0)\n        _transX = min(max(matrix.tx, maxTransX - _transOffsetX), _transOffsetX)\n        \n        let maxTransY = height * (_scaleY - 1.0)\n        _transY = max(min(matrix.ty, maxTransY + _transOffsetY), -_transOffsetY)\n        \n        matrix.tx = _transX\n        matrix.a = _scaleX\n        matrix.ty = _transY\n        matrix.d = _scaleY\n    }\n    \n    /// Sets the minimum scale factor for the x-axis\n    public func setMinimumScaleX(xScale: CGFloat)\n    {\n        var newValue = xScale\n        \n        if (newValue < 1.0)\n        {\n            newValue = 1.0\n        }\n        \n        _minScaleX = newValue\n        \n        limitTransAndScale(matrix: &_touchMatrix, content: _contentRect)\n    }\n    \n    /// Sets the maximum scale factor for the x-axis\n    public func setMaximumScaleX(xScale: CGFloat)\n    {\n        _maxScaleX = xScale\n        \n        limitTransAndScale(matrix: &_touchMatrix, content: _contentRect)\n    }\n    \n    /// Sets the minimum and maximum scale factors for the x-axis\n    public func setMinMaxScaleX(minScaleX minScaleX: CGFloat, maxScaleX: CGFloat)\n    {\n        var newMin = minScaleX\n        \n        if (newMin < 1.0)\n        {\n            newMin = 1.0\n        }\n        \n        _minScaleX = newMin\n        _maxScaleX = maxScaleX\n        \n        limitTransAndScale(matrix: &_touchMatrix, content: _contentRect)\n    }\n    \n    /// Sets the minimum scale factor for the y-axis\n    public func setMinimumScaleY(yScale: CGFloat)\n    {\n        var newValue = yScale\n        \n        if (newValue < 1.0)\n        {\n            newValue = 1.0\n        }\n        \n        _minScaleY = newValue\n        \n        limitTransAndScale(matrix: &_touchMatrix, content: _contentRect)\n    }\n    \n    /// Sets the maximum scale factor for the y-axis\n    public func setMaximumScaleY(yScale: CGFloat)\n    {\n        _maxScaleY = yScale\n        \n        limitTransAndScale(matrix: &_touchMatrix, content: _contentRect)\n    }\n    \n    public var touchMatrix: CGAffineTransform\n    {\n        return _touchMatrix\n    }\n    \n    // MARK: - Boundaries Check\n    \n    public func isInBoundsX(x: CGFloat) -> Bool\n    {\n        if (isInBoundsLeft(x) && isInBoundsRight(x))\n        {\n            return true\n        }\n        else\n        {\n            return false\n        }\n    }\n    \n    public func isInBoundsY(y: CGFloat) -> Bool\n    {\n        if (isInBoundsTop(y) && isInBoundsBottom(y))\n        {\n            return true\n        }\n        else\n        {\n            return false\n        }\n    }\n    \n    public func isInBounds(x x: CGFloat, y: CGFloat) -> Bool\n    {\n        if (isInBoundsX(x) && isInBoundsY(y))\n        {\n            return true\n        }\n        else\n        {\n            return false\n        }\n    }\n    \n    public func isInBoundsLeft(x: CGFloat) -> Bool\n    {\n        return _contentRect.origin.x <= x ? true : false\n    }\n    \n    public func isInBoundsRight(x: CGFloat) -> Bool\n    {\n        let normalizedX = CGFloat(Int(x * 100.0)) / 100.0\n        return (_contentRect.origin.x + _contentRect.size.width) >= normalizedX ? true : false\n    }\n    \n    public func isInBoundsTop(y: CGFloat) -> Bool\n    {\n        return _contentRect.origin.y <= y ? true : false\n    }\n    \n    public func isInBoundsBottom(y: CGFloat) -> Bool\n    {\n        let normalizedY = CGFloat(Int(y * 100.0)) / 100.0\n        return (_contentRect.origin.y + _contentRect.size.height) >= normalizedY ? true : false\n    }\n    \n    /// - returns: the current x-scale factor\n    public var scaleX: CGFloat\n    {\n        return _scaleX\n    }\n    \n    /// - returns: the current y-scale factor\n    public var scaleY: CGFloat\n    {\n        return _scaleY\n    }\n    \n    /// - returns: the minimum x-scale factor\n    public var minScaleX: CGFloat\n    {\n        return _minScaleX\n    }\n    \n    /// - returns: the minimum y-scale factor\n    public var minScaleY: CGFloat\n    {\n        return _minScaleY\n    }\n    \n    /// - returns: the minimum x-scale factor\n    public var maxScaleX: CGFloat\n    {\n        return _maxScaleX\n    }\n    \n    /// - returns: the minimum y-scale factor\n    public var maxScaleY: CGFloat\n    {\n        return _maxScaleY\n    }\n    \n    /// - returns: the translation (drag / pan) distance on the x-axis\n    public var transX: CGFloat\n    {\n        return _transX\n    }\n    \n    /// - returns: the translation (drag / pan) distance on the y-axis\n    public var transY: CGFloat\n    {\n        return _transY\n    }\n    \n    /// if the chart is fully zoomed out, return true\n    public var isFullyZoomedOut: Bool\n    {\n        if (isFullyZoomedOutX && isFullyZoomedOutY)\n        {\n            return true\n        }\n        else\n        {\n            return false\n        }\n    }\n    \n    /// - returns: true if the chart is fully zoomed out on it's y-axis (vertical).\n    public var isFullyZoomedOutY: Bool\n    {\n        if (_scaleY > _minScaleY || _minScaleY > 1.0)\n        {\n            return false\n        }\n        else\n        {\n            return true\n        }\n    }\n    \n    /// - returns: true if the chart is fully zoomed out on it's x-axis (horizontal).\n    public var isFullyZoomedOutX: Bool\n    {\n        if (_scaleX > _minScaleX || _minScaleX > 1.0)\n        {\n            return false\n        }\n        else\n        {\n            return true\n        }\n    }\n    \n    /// Set an offset in pixels that allows the user to drag the chart over it's bounds on the x-axis.\n    public func setDragOffsetX(offset: CGFloat)\n    {\n        _transOffsetX = offset\n    }\n    \n    /// Set an offset in pixels that allows the user to drag the chart over it's bounds on the y-axis.\n    public func setDragOffsetY(offset: CGFloat)\n    {\n        _transOffsetY = offset\n    }\n    \n    /// - returns: true if both drag offsets (x and y) are zero or smaller.\n    public var hasNoDragOffset: Bool\n    {\n        return _transOffsetX <= 0.0 && _transOffsetY <= 0.0 ? true : false\n    }\n    \n    /// - returns: true if the chart is not yet fully zoomed out on the x-axis\n    public var canZoomOutMoreX: Bool\n    {\n        return (_scaleX > _minScaleX)\n    }\n    \n    /// - returns: true if the chart is not yet fully zoomed in on the x-axis\n    public var canZoomInMoreX: Bool\n    {\n        return (_scaleX < _maxScaleX)\n    }\n    \n    /// - returns: true if the chart is not yet fully zoomed out on the y-axis\n    public var canZoomOutMoreY: Bool\n    {\n        return (_scaleY > _minScaleY)\n    }\n    \n    /// - returns: true if the chart is not yet fully zoomed in on the y-axis\n    public var canZoomInMoreY: Bool\n    {\n        return (_scaleY < _maxScaleY)\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Charts/LICENSE",
    "content": "Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright {yyyy} {name of copyright owner}\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n"
  },
  {
    "path": "Sublime/Pods/Charts/README.md",
    "content": "**Version 2.2.4**, synced to [MPAndroidChart #2e41714](https://github.com/PhilJay/MPAndroidChart/commit/2e41714)\n\n![alt tag](https://raw.github.com/danielgindi/Charts/master/Assets/feature_graphic.png)\n  ![Supported Platforms](https://img.shields.io/cocoapods/p/Charts.svg) [![Releases](https://img.shields.io/github/release/danielgindi/Charts.svg)](https://github.com/danielgindi/Charts/releases) [![Latest pod release](https://img.shields.io/cocoapods/v/Charts.svg)](http://cocoapods.org/pods/charts) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) [![Build Status](https://travis-ci.org/danielgindi/Charts.svg?branch=master)](https://travis-ci.org/danielgindi/Charts) \n[![Join the chat at https://gitter.im/danielgindi/Charts](https://badges.gitter.im/danielgindi/Charts.svg)](https://gitter.im/danielgindi/Charts?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n\n## Just a heads up: We've renamed from *ios-charts* to **Charts**.\n\n* Xcode 7.3 / Swift 2.2 / 3.0\n* iOS 7.0 (Drag .swift files to your project)\n* iOS 8.0 / 9.0 (Use as an **Embedded** Framework)\n* tvOS 9.0\n* OSX 10.11\n\nOkay so there's this beautiful library called [MPAndroidChart](https://github.com/PhilJay/MPAndroidChart) by [Philipp Jahoda](https://www.linkedin.com/in/philippjahoda) which has become very popular amongst Android developers, and in the meanwhile there's no decent charting solution for iOS.\n\nI've chosen to write it in `Swift` as it can be highly optimized by the compiler, and can be used in both `Swift` and `ObjC` project. The demo project is written in `ObjC` to demonstrate how it works.\n\n**An amazing feature** of this library now, for Android, iOS, tvOS and OSX, is the time it saves you when developing for both platforms, as the learning curve is singleton- it happens only once, and the code stays very similar so developers don't have to go around and re-invent the app to produce the same output with a different library. (And that's not even considering the fact that there's not really another good choice out there currently...)\n\n## Usage\n\nIn order to correctly compile:\n\n1. Drag the `Charts.xcodeproj` to your project  \n2. Go to your target's settings, hit the \"+\" under the \"Embedded Binaries\" section, and select the Charts.framework  \n3. **Temporary workaround**: Xcode 6.3.1 has a bug, where you have to build your project once before actually writing the `@import` line. So hit \"Build\" now!  \n4. `@import Charts`  \n5.  When using Swift in an ObjC project:\n   - You need to import your Bridging Header. Usually it is \"*YourProject-Swift.h*\", so in ChartsDemo it's \"*ChartsDemo-Swift.h*\". Do not try to actually include \"*ChartsDemo-Swift.h*\" in your project :-)\n   - Under \"Build Options\", mark \"Embedded Content Contains Swift Code\"\n6. When using [Realm.io](https://realm.io/):\n   - Note that the Realm framework is not linked with Charts - it is only there for *optional* bindings. Which means that you need to have the framework in your project, and in a compatible version to whatever is compiled with Charts. We will do our best to always compile against the latest version.\n\n\nIf you want to compile for iOS 7:\n\n1. Drag the code itself (.swift files) to your project. As sadly, Swift currently does not support compiling Frameworks for iOS 7.\n2. Make sure that the files are added to the Target membership.\n\n## Troubleshooting\n\n#### Can't compile?\n\n* Please note the difference between installing a compiled framework from CocoaPods or Carthage, and copying the source code.\n* If you are using [Realm](https://realm.io/), please also `#import <ChartsRealm/ChartsRealm.h>`\n* If you are compiling the source code and want to use Realm, please make sure to include the code from `ChartsRealm` project.\n* Please read the **Usage** section again.\n* Search in the issues\n* Try to politely ask in the issues section\n\n#### Other problems / feature requests\n\n* Search in the issues\n* Try to politely ask in the issues section\n\n## CocoaPods Install\n\nAdd `pod 'Charts'` to your Podfile. \"Charts\" is the name of the library.  \n\nFor [Realm](https://realm.io/) support you can specify the subspec in your Podfile as follows:\n```\npod 'Charts/Realm'\n```\n\n**Note:** ~~`pod 'ios-charts'`~~ is not the correct library, and refers to a different project by someone else.\n\n## Carthage Install\n\nCharts now include Carthage prebuilt binaries.\n\n```carthage\ngithub \"danielgindi/Charts\" == 2.2.4\ngithub \"danielgindi/Charts\" ~> 2.2.4\n```\n\nIn order to build the binaries for a new release, use `carthage build --no-skip-current && carthage archive Charts && carthage archive ChartsRealm`.\n\n## Help\n\nIf you like what you see here, and want to support the work being done in this repository, you could:\n* Contribute code, issues and pull requests\n* Let people know this library exists (:fire: spread the word :fire:)\n* [![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=68UL6Y8KUPS96) (You can buy me a beer, or you can buy me dinner :-)\n\n**Note:** The author of [MPAndroidChart](https://github.com/PhilJay/MPAndroidChart) is the reason that this library exists, and is accepting [donations](https://github.com/PhilJay/MPAndroidChart#donations) on his page. He deserves them!\n\nQuestions & Issues\n-----\n\nIf you are having questions or problems, you should:\n\n - Make sure you are using the latest version of the library. Check the [**release-section**](https://github.com/danielgindi/Charts/releases).\n - Study the Android version's [**Documentation-Wiki**](https://github.com/PhilJay/MPAndroidChart/wiki)\n - Study the (Still incomplete [![Doc-Percent](https://img.shields.io/cocoapods/metrics/doc-percent/Charts.svg)](http://cocoadocs.org/docsets/Charts/)) [**Pod-Documentation**](http://cocoadocs.org/docsets/Charts/)\n - Search or open questions on [**stackoverflow**](http://stackoverflow.com/questions/tagged/ios-charts) with the `ios-charts` tag\n - Search [**known issues**](https://github.com/danielgindi/Charts/issues) for your problem (open and closed)\n - Create new issues (please :fire: **search known issues before** :fire:, do not create duplicate issues)\n\n\nFeatures\n=======\n\n**Core features:**\n - 8 different chart types\n - Scaling on both axes (with touch-gesture, axes separately or pinch-zoom)\n - Dragging / Panning (with touch-gesture)\n - Combined-Charts (line-, bar-, scatter-, candle-stick-, bubble-)\n - Dual (separate) Axes\n - Customizable Axes (both x- and y-axis)\n - Highlighting values (with customizable popup-views)\n - Save chart to camera-roll / export to PNG/JPEG\n - Predefined color templates\n - Legends (generated automatically, customizable)\n - Animations (build up animations, on both x- and y-axis)\n - Limit lines (providing additional information, maximums, ...)\n - Fully customizable (paints, typefaces, legends, colors, background, gestures, dashed lines, ...)\n - Plotting data directly from [**Realm.io**](https://realm.io) mobile database\n\n**Chart types:**\n\n*Screenshots are currently taken from the original repository, as they render exactly the same :-)*\n\n\n - **LineChart (with legend, simple design)**\n![alt tag](https://raw.github.com/PhilJay/MPChart/master/screenshots/simpledesign_linechart4.png)\n - **LineChart (with legend, simple design)**\n![alt tag](https://raw.github.com/PhilJay/MPChart/master/screenshots/simpledesign_linechart3.png)\n\n - **LineChart (cubic lines)**\n![alt tag](https://raw.github.com/PhilJay/MPChart/master/screenshots/cubiclinechart.png)\n\n - **LineChart (gradient fill)**\n![alt tag](https://raw.github.com/PhilJay/MPAndroidChart/master/screenshots/line_chart_gradient.png)\n\n - **Combined-Chart (bar- and linechart in this case)**\n![alt tag](https://raw.github.com/PhilJay/MPChart/master/screenshots/combined_chart.png)\n\n - **BarChart (with legend, simple design)**\n\n![alt tag](https://raw.github.com/PhilJay/MPChart/master/screenshots/simpledesign_barchart3.png)\n\n - **BarChart (grouped DataSets)**\n\n![alt tag](https://raw.github.com/PhilJay/MPChart/master/screenshots/groupedbarchart.png)\n\n - **Horizontal-BarChart**\n\n![alt tag](https://raw.github.com/PhilJay/MPChart/master/screenshots/horizontal_barchart.png)\n\n\n - **PieChart (with selection, ...)**\n\n![alt tag](https://raw.github.com/PhilJay/MPAndroidChart/master/screenshots/simpledesign_piechart1.png)\n\n - **ScatterChart** (with squares, triangles, circles, ... and more)\n\n![alt tag](https://raw.github.com/PhilJay/MPAndroidChart/master/screenshots/scatterchart.png)\n\n - **CandleStickChart** (for financial data)\n\n![alt tag](https://raw.github.com/PhilJay/MPAndroidChart/master/screenshots/candlestickchart.png)\n\n - **BubbleChart** (area covered by bubbles indicates the value)\n\n![alt tag](https://raw.github.com/PhilJay/MPAndroidChart/master/screenshots/bubblechart.png)\n\n - **RadarChart** (spider web chart)\n\n![alt tag](https://raw.github.com/PhilJay/MPAndroidChart/master/screenshots/radarchart.png)\n\n\nDocumentation\n=======\nCurrently there's no need for documentation for the iOS/tvOS/OSX version, as the API is **95% the same** as on Android.  \nYou can read the official [MPAndroidChart](https://github.com/PhilJay/MPAndroidChart) documentation here: [**Wiki**](https://github.com/PhilJay/MPAndroidChart/wiki)\n\nOr you can see the [**ChartsDemo**](https://github.com/danielgindi/Charts/tree/master/ChartsDemo) project and learn the how-tos from it.\n\n\nSpecial Thanks\n=======\n\nGoes to [@liuxuan30](https://github.com/liuxuan30), [@petester42](https://github.com/petester42) and  [@AlBirdie](https://github.com/AlBirdie) for new features, bugfixes, and lots and lots of involvement in our open-sourced community! You guys are a huge help to all of those coming here with questions and issues, and I couldn't respond to all of those without you.\n\nLicense\n=======\nCopyright 2016 Daniel Cohen Gindi & Philipp Jahoda\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "Sublime/Pods/DGElasticPullToRefresh/DGElasticPullToRefresh/DGElasticPullToRefreshConstants.swift",
    "content": "/*\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Danil Gontovnik\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n*/\n\nimport CoreGraphics\n\npublic struct DGElasticPullToRefreshConstants {\n    \n    struct KeyPaths {\n        static let ContentOffset = \"contentOffset\"\n        static let ContentInset = \"contentInset\"\n        static let Frame = \"frame\"\n        static let PanGestureRecognizerState = \"panGestureRecognizer.state\"\n    }\n    \n    static let WaveMaxHeight: CGFloat = 70.0\n    static let MinOffsetToPull: CGFloat = 95.0\n    static let LoadingContentInset: CGFloat = 50.0\n    static let LoadingViewSize: CGFloat = 30.0\n    \n}"
  },
  {
    "path": "Sublime/Pods/DGElasticPullToRefresh/DGElasticPullToRefresh/DGElasticPullToRefreshExtensions.swift",
    "content": "/*\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Danil Gontovnik\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n*/\n\nimport UIKit\nimport ObjectiveC\n\n// MARK: -\n// MARK: (NSObject) Extension\n\npublic extension NSObject {\n    \n    // MARK: -\n    // MARK: Vars\n    \n    private struct dg_associatedKeys {\n        static var observersArray = \"observers\"\n    }\n    \n    private var dg_observers: [[String : NSObject]] {\n        get {\n            if let observers = objc_getAssociatedObject(self, &dg_associatedKeys.observersArray) as? [[String : NSObject]] {\n                return observers\n            } else {\n                let observers = [[String : NSObject]]()\n                self.dg_observers = observers\n                return observers\n            }\n        } set {\n            objc_setAssociatedObject(self, &dg_associatedKeys.observersArray, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n        }\n    }\n    \n    // MARK: -\n    // MARK: Methods\n    \n    public func dg_addObserver(observer: NSObject, forKeyPath keyPath: String) {\n        let observerInfo = [keyPath : observer]\n        \n        if dg_observers.indexOf({ $0 == observerInfo }) == nil {\n            dg_observers.append(observerInfo)\n            addObserver(observer, forKeyPath: keyPath, options: .New, context: nil)\n        }\n    }\n    \n    public func dg_removeObserver(observer: NSObject, forKeyPath keyPath: String) {\n        let observerInfo = [keyPath : observer]\n        \n        if let index = dg_observers.indexOf({ $0 == observerInfo}) {\n            dg_observers.removeAtIndex(index)\n            removeObserver(observer, forKeyPath: keyPath)\n        }\n    }\n    \n}\n\n// MARK: -\n// MARK: (UIScrollView) Extension\n\npublic extension UIScrollView {\n    \n    // MARK: -\n    // MARK: Vars\n    \n    private struct dg_associatedKeys {\n        static var pullToRefreshView = \"pullToRefreshView\"\n    }\n    \n    private var _pullToRefreshView: DGElasticPullToRefreshView? {\n        get {\n            if let pullToRefreshView = objc_getAssociatedObject(self, &dg_associatedKeys.pullToRefreshView) as? DGElasticPullToRefreshView {\n                return pullToRefreshView\n            }\n            \n            return nil\n        }\n        set {\n            objc_setAssociatedObject(self, &dg_associatedKeys.pullToRefreshView, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n        }\n    }\n    \n    private var pullToRefreshView: DGElasticPullToRefreshView! {\n        get {\n            if let pullToRefreshView = _pullToRefreshView {\n                return pullToRefreshView\n            } else {\n                let pullToRefreshView = DGElasticPullToRefreshView()\n                _pullToRefreshView = pullToRefreshView\n                return pullToRefreshView\n            }\n        }\n    }\n    \n    // MARK: -\n    // MARK: Methods (Public)\n    \n    public func dg_addPullToRefreshWithActionHandler(actionHandler: () -> Void) {\n        dg_addPullToRefreshWithActionHandler(actionHandler, loadingView: nil)\n    }\n    \n    public func dg_addPullToRefreshWithActionHandler(actionHandler: () -> Void, loadingView: DGElasticPullToRefreshLoadingView?) {\n        multipleTouchEnabled = false\n        panGestureRecognizer.maximumNumberOfTouches = 1\n        \n        pullToRefreshView.actionHandler = actionHandler\n        pullToRefreshView.loadingView = loadingView\n        addSubview(pullToRefreshView)\n        \n        pullToRefreshView.observing = true\n    }\n    \n    public func dg_removePullToRefresh() {\n        pullToRefreshView.observing = false\n        pullToRefreshView.removeFromSuperview()\n    }\n    \n    public func dg_setPullToRefreshBackgroundColor(color: UIColor) {\n        pullToRefreshView.backgroundColor = color\n    }\n    \n    public func dg_setPullToRefreshFillColor(color: UIColor) {\n        pullToRefreshView.fillColor = color\n    }\n    \n    public func dg_stopLoading() {\n        pullToRefreshView.stopLoading()\n    }\n    \n    func dg_stopScrollingAnimation() {\n        if let superview = self.superview, let index = superview.subviews.indexOf({ $0 == self }) as Int! {\n            removeFromSuperview()\n            superview.insertSubview(self, atIndex: index)\n        }\n    }\n    \n}\n\n// MARK: -\n// MARK: (UIView) Extension\n\npublic extension UIView {\n    func dg_center(usePresentationLayerIfPossible: Bool) -> CGPoint {\n        if usePresentationLayerIfPossible, let presentationLayer = layer.presentationLayer() as? CALayer {\n            // Position can be used as a center, because anchorPoint is (0.5, 0.5)\n            return presentationLayer.position\n        }\n        return center\n    }\n}\n\n// MARK: -\n// MARK: (UIPanGestureRecognizer) Extension\n\npublic extension UIPanGestureRecognizer {\n    func dg_resign() {\n        enabled = false\n        enabled = true\n    }\n}\n\n// MARK: -\n// MARK: (UIGestureRecognizerState) Extension\n\npublic extension UIGestureRecognizerState {\n    func dg_isAnyOf(values: [UIGestureRecognizerState]) -> Bool {\n        return values.contains({ $0 == self })\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/DGElasticPullToRefresh/DGElasticPullToRefresh/DGElasticPullToRefreshLoadingView.swift",
    "content": "/*\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Danil Gontovnik\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n*/\n\nimport UIKit\n\npublic class DGElasticPullToRefreshLoadingView: UIView {\n    \n    // MARK: -\n    // MARK: Vars\n    \n    lazy var maskLayer: CAShapeLayer = {\n        let maskLayer = CAShapeLayer()\n        maskLayer.backgroundColor = UIColor.clearColor().CGColor\n        maskLayer.fillColor = UIColor.blackColor().CGColor\n        maskLayer.actions = [\"path\" : NSNull(), \"position\" : NSNull(), \"bounds\" : NSNull()]\n        self.layer.mask = maskLayer\n        return maskLayer\n    }()\n    \n    // MARK: -\n    // MARK: Constructors\n    \n    public init() {\n        super.init(frame: .zero)\n    }\n    \n    public override init(frame: CGRect) {\n        super.init(frame: .zero)\n    }\n\n    required public init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n\n    // MARK: -\n    // MARK: Methods\n    \n    public func setPullProgress(progress: CGFloat) {\n        \n    }\n    \n    public func startAnimating() {\n        \n    }\n    \n    public func stopLoading() {\n        \n    }\n\n}\n"
  },
  {
    "path": "Sublime/Pods/DGElasticPullToRefresh/DGElasticPullToRefresh/DGElasticPullToRefreshLoadingViewCircle.swift",
    "content": "/*\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Danil Gontovnik\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n*/\n\nimport UIKit\n\n// MARK: -\n// MARK: (CGFloat) Extension\n\npublic extension CGFloat {\n    \n    public func toRadians() -> CGFloat {\n        return (self * CGFloat(M_PI)) / 180.0\n    }\n    \n    public func toDegrees() -> CGFloat {\n        return self * 180.0 / CGFloat(M_PI)\n    }\n    \n}\n\n// MARK: -\n// MARK: DGElasticPullToRefreshLoadingViewCircle\n\npublic class DGElasticPullToRefreshLoadingViewCircle: DGElasticPullToRefreshLoadingView {\n    \n    // MARK: -\n    // MARK: Vars\n    \n    private let kRotationAnimation = \"kRotationAnimation\"\n    \n    private let shapeLayer = CAShapeLayer()\n    private lazy var identityTransform: CATransform3D = {\n        var transform = CATransform3DIdentity\n        transform.m34 = CGFloat(1.0 / -500.0)\n        transform = CATransform3DRotate(transform, CGFloat(-90.0).toRadians(), 0.0, 0.0, 1.0)\n        return transform\n    }()\n\n    // MARK: -\n    // MARK: Constructors\n    \n    public override init() {\n        super.init(frame: .zero)\n        \n        shapeLayer.lineWidth = 1.0\n        shapeLayer.fillColor = UIColor.clearColor().CGColor\n        shapeLayer.strokeColor = tintColor.CGColor\n        shapeLayer.actions = [\"strokeEnd\" : NSNull(), \"transform\" : NSNull()]\n        shapeLayer.anchorPoint = CGPoint(x: 0.5, y: 0.5)\n        layer.addSublayer(shapeLayer)\n    }\n\n    required public init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    // MARK: -\n    // MARK: Methods\n    \n    override public func setPullProgress(progress: CGFloat) {\n        super.setPullProgress(progress)\n        \n        shapeLayer.strokeEnd = min(0.9 * progress, 0.9)\n        \n        if progress > 1.0 {\n            let degrees = ((progress - 1.0) * 200.0)\n            shapeLayer.transform = CATransform3DRotate(identityTransform, degrees.toRadians(), 0.0, 0.0, 1.0)\n        } else {\n            shapeLayer.transform = identityTransform\n        }\n    }\n    \n    override public func startAnimating() {\n        super.startAnimating()\n        \n        if shapeLayer.animationForKey(kRotationAnimation) != nil { return }\n        \n        let rotationAnimation = CABasicAnimation(keyPath: \"transform.rotation.z\")\n        rotationAnimation.toValue = CGFloat(2 * M_PI) + currentDegree()\n        rotationAnimation.duration = 1.0\n        rotationAnimation.repeatCount = Float.infinity\n        rotationAnimation.removedOnCompletion = false\n        rotationAnimation.fillMode = kCAFillModeForwards\n        shapeLayer.addAnimation(rotationAnimation, forKey: kRotationAnimation)\n    }\n    \n    override public func stopLoading() {\n        super.stopLoading()\n        \n        shapeLayer.removeAnimationForKey(kRotationAnimation)\n    }\n    \n    private func currentDegree() -> CGFloat {\n        return shapeLayer.valueForKeyPath(\"transform.rotation.z\") as! CGFloat\n    }\n    \n    override public func tintColorDidChange() {\n        super.tintColorDidChange()\n        \n        shapeLayer.strokeColor = tintColor.CGColor\n    }\n    \n    // MARK: -\n    // MARK: Layout\n    \n    override public func layoutSubviews() {\n        super.layoutSubviews()\n        \n        shapeLayer.frame = bounds\n        \n        let inset = shapeLayer.lineWidth / 2.0\n        shapeLayer.path = UIBezierPath(ovalInRect: CGRectInset(shapeLayer.bounds, inset, inset)).CGPath\n    }\n    \n}\n"
  },
  {
    "path": "Sublime/Pods/DGElasticPullToRefresh/DGElasticPullToRefresh/DGElasticPullToRefreshView.swift",
    "content": "/*\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Danil Gontovnik\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n*/\n\nimport UIKit\n\n// MARK: -\n// MARK: DGElasticPullToRefreshState\n\npublic\nenum DGElasticPullToRefreshState: Int {\n    case Stopped\n    case Dragging\n    case AnimatingBounce\n    case Loading\n    case AnimatingToStopped\n    \n    func isAnyOf(values: [DGElasticPullToRefreshState]) -> Bool {\n        return values.contains({ $0 == self })\n    }\n}\n\n// MARK: -\n// MARK: DGElasticPullToRefreshView\n\npublic class DGElasticPullToRefreshView: UIView {\n    \n    // MARK: -\n    // MARK: Vars\n    \n    private var _state: DGElasticPullToRefreshState = .Stopped\n    private(set) var state: DGElasticPullToRefreshState {\n        get { return _state }\n        set {\n            let previousValue = state\n            _state = newValue\n            \n            if previousValue == .Dragging && newValue == .AnimatingBounce {\n                loadingView?.startAnimating()\n                animateBounce()\n            } else if newValue == .Loading && actionHandler != nil {\n                actionHandler()\n            } else if newValue == .AnimatingToStopped {\n                resetScrollViewContentInset(shouldAddObserverWhenFinished: true, animated: true, completion: { [weak self] () -> () in self?.state = .Stopped })\n            } else if newValue == .Stopped {\n                loadingView?.stopLoading()\n            }\n        }\n    }\n    \n    private var originalContentInsetTop: CGFloat = 0.0 { didSet { layoutSubviews() } }\n    private let shapeLayer = CAShapeLayer()\n    \n    private var displayLink: CADisplayLink!\n    \n    var actionHandler: (() -> Void)!\n    \n    var loadingView: DGElasticPullToRefreshLoadingView? {\n        willSet {\n            loadingView?.removeFromSuperview()\n            if let newValue = newValue {\n                addSubview(newValue)\n            }\n        }\n    }\n    \n    var observing: Bool = false {\n        didSet {\n            guard let scrollView = scrollView() else { return }\n            if observing {\n                scrollView.dg_addObserver(self, forKeyPath: DGElasticPullToRefreshConstants.KeyPaths.ContentOffset)\n                scrollView.dg_addObserver(self, forKeyPath: DGElasticPullToRefreshConstants.KeyPaths.ContentInset)\n                scrollView.dg_addObserver(self, forKeyPath: DGElasticPullToRefreshConstants.KeyPaths.Frame)\n                scrollView.dg_addObserver(self, forKeyPath: DGElasticPullToRefreshConstants.KeyPaths.PanGestureRecognizerState)\n            } else {\n                scrollView.dg_removeObserver(self, forKeyPath: DGElasticPullToRefreshConstants.KeyPaths.ContentOffset)\n                scrollView.dg_removeObserver(self, forKeyPath: DGElasticPullToRefreshConstants.KeyPaths.ContentInset)\n                scrollView.dg_removeObserver(self, forKeyPath: DGElasticPullToRefreshConstants.KeyPaths.Frame)\n                scrollView.dg_removeObserver(self, forKeyPath: DGElasticPullToRefreshConstants.KeyPaths.PanGestureRecognizerState)\n            }\n        }\n    }\n    \n    var fillColor: UIColor = .clearColor() { didSet { shapeLayer.fillColor = fillColor.CGColor } }\n    \n    // MARK: Views\n    \n    private let bounceAnimationHelperView = UIView()\n    \n    private let cControlPointView = UIView()\n    private let l1ControlPointView = UIView()\n    private let l2ControlPointView = UIView()\n    private let l3ControlPointView = UIView()\n    private let r1ControlPointView = UIView()\n    private let r2ControlPointView = UIView()\n    private let r3ControlPointView = UIView()\n    \n    // MARK: -\n    // MARK: Constructors\n    \n    init() {\n        super.init(frame: CGRect.zero)\n        \n        displayLink = CADisplayLink(target: self, selector: Selector(\"displayLinkTick\"))\n        displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)\n        displayLink.paused = true\n        \n        shapeLayer.backgroundColor = UIColor.clearColor().CGColor\n        shapeLayer.fillColor = UIColor.blackColor().CGColor\n        shapeLayer.actions = [\"path\" : NSNull(), \"position\" : NSNull(), \"bounds\" : NSNull()]\n        layer.addSublayer(shapeLayer)\n        \n        addSubview(bounceAnimationHelperView)\n        addSubview(cControlPointView)\n        addSubview(l1ControlPointView)\n        addSubview(l2ControlPointView)\n        addSubview(l3ControlPointView)\n        addSubview(r1ControlPointView)\n        addSubview(r2ControlPointView)\n        addSubview(r3ControlPointView)\n        \n        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector(\"applicationWillEnterForeground\"), name: UIApplicationWillEnterForegroundNotification, object: nil)\n    }\n\n    required public init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    // MARK: -\n    \n    deinit {\n        observing = false\n        NSNotificationCenter.defaultCenter().removeObserver(self)\n    }\n\n    // MARK: -\n    // MARK: Observer\n    \n    override public func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {\n        if keyPath == DGElasticPullToRefreshConstants.KeyPaths.ContentOffset {\n            if let newContentOffsetY = change?[NSKeyValueChangeNewKey]?.CGPointValue.y, let scrollView = scrollView() {\n                if state.isAnyOf([.Loading, .AnimatingToStopped]) && newContentOffsetY < -scrollView.contentInset.top {\n                    scrollView.dg_stopScrollingAnimation()\n                    scrollView.contentOffset.y = -scrollView.contentInset.top\n                } else {\n                    scrollViewDidChangeContentOffset(dragging: scrollView.dragging)\n                }\n                layoutSubviews()\n            }\n        } else if keyPath == DGElasticPullToRefreshConstants.KeyPaths.ContentInset {\n            if let newContentInsetTop = change?[NSKeyValueChangeNewKey]?.UIEdgeInsetsValue().top {\n                originalContentInsetTop = newContentInsetTop\n            }\n        } else if keyPath == DGElasticPullToRefreshConstants.KeyPaths.Frame {\n            layoutSubviews()\n        } else if keyPath == DGElasticPullToRefreshConstants.KeyPaths.PanGestureRecognizerState {\n            if let gestureState = scrollView()?.panGestureRecognizer.state where gestureState.dg_isAnyOf([.Ended, .Cancelled, .Failed]) {\n                scrollViewDidChangeContentOffset(dragging: false)\n            }\n        }\n    }\n    \n    // MARK: -\n    // MARK: Notifications\n    \n    func applicationWillEnterForeground() {\n        if state == .Loading {\n            layoutSubviews()\n        }\n    }\n    \n    // MARK: -\n    // MARK: Methods (Public)\n    \n    private func scrollView() -> UIScrollView? {\n        return superview as? UIScrollView\n    }\n    \n    func stopLoading() {\n        // Prevent stop close animation\n        if state == .AnimatingToStopped {\n            return\n        }\n        state = .AnimatingToStopped\n    }\n    \n    // MARK: Methods (Private)\n    \n    private func isAnimating() -> Bool {\n        return state.isAnyOf([.AnimatingBounce, .AnimatingToStopped])\n    }\n    \n    private func actualContentOffsetY() -> CGFloat {\n        guard let scrollView = scrollView() else { return 0.0 }\n        return max(-scrollView.contentInset.top - scrollView.contentOffset.y, 0)\n    }\n    \n    private func currentHeight() -> CGFloat {\n        guard let scrollView = scrollView() else { return 0.0 }\n        return max(-originalContentInsetTop - scrollView.contentOffset.y, 0)\n    }\n    \n    private func currentWaveHeight() -> CGFloat {\n        return min(bounds.height / 3.0 * 1.6, DGElasticPullToRefreshConstants.WaveMaxHeight)\n    }\n    \n    private func currentPath() -> CGPath {\n        let width: CGFloat = scrollView()?.bounds.width ?? 0.0\n        \n        let bezierPath = UIBezierPath()\n        let animating = isAnimating()\n        \n        bezierPath.moveToPoint(CGPoint(x: 0.0, y: 0.0))\n        bezierPath.addLineToPoint(CGPoint(x: 0.0, y: l3ControlPointView.dg_center(animating).y))\n        bezierPath.addCurveToPoint(l1ControlPointView.dg_center(animating), controlPoint1: l3ControlPointView.dg_center(animating), controlPoint2: l2ControlPointView.dg_center(animating))\n        bezierPath.addCurveToPoint(r1ControlPointView.dg_center(animating), controlPoint1: cControlPointView.dg_center(animating), controlPoint2: r1ControlPointView.dg_center(animating))\n        bezierPath.addCurveToPoint(r3ControlPointView.dg_center(animating), controlPoint1: r1ControlPointView.dg_center(animating), controlPoint2: r2ControlPointView.dg_center(animating))\n        bezierPath.addLineToPoint(CGPoint(x: width, y: 0.0))\n        \n        bezierPath.closePath()\n        \n        return bezierPath.CGPath\n    }\n    \n    private func scrollViewDidChangeContentOffset(dragging dragging: Bool) {\n        let offsetY = actualContentOffsetY()\n        \n        if state == .Stopped && dragging {\n            state = .Dragging\n        } else if state == .Dragging && dragging == false {\n            if offsetY >= DGElasticPullToRefreshConstants.MinOffsetToPull {\n                state = .AnimatingBounce\n                scrollView()?.dg_stopScrollingAnimation()\n            } else {\n                state = .Stopped\n            }\n        } else if state.isAnyOf([.Dragging, .Stopped]) {\n            let pullProgress: CGFloat = offsetY / DGElasticPullToRefreshConstants.MinOffsetToPull\n            loadingView?.setPullProgress(pullProgress)\n        }\n    }\n    \n    private func resetScrollViewContentInset(shouldAddObserverWhenFinished shouldAddObserverWhenFinished: Bool, animated: Bool, completion: (() -> ())?) {\n        guard let scrollView = scrollView() else { return }\n        \n        var contentInset = scrollView.contentInset\n        contentInset.top = originalContentInsetTop\n        \n        if state == .AnimatingBounce {\n            contentInset.top += currentHeight()\n        } else if state == .Loading {\n            contentInset.top += DGElasticPullToRefreshConstants.LoadingContentInset\n        }\n        \n        scrollView.dg_removeObserver(self, forKeyPath: DGElasticPullToRefreshConstants.KeyPaths.ContentInset)\n        \n        let animationBlock = { scrollView.contentInset = contentInset }\n        let completionBlock = { () -> Void in\n            if shouldAddObserverWhenFinished {\n                scrollView.dg_addObserver(self, forKeyPath: DGElasticPullToRefreshConstants.KeyPaths.ContentInset)\n            }\n            completion?()\n        }\n        \n        if animated {\n            startDisplayLink()\n            UIView.animateWithDuration(0.4, animations: animationBlock, completion: { _ in\n                self.stopDisplayLink()\n                completionBlock()\n            })\n        } else {\n            animationBlock()\n            completionBlock()\n        }\n    }\n    \n    private func animateBounce() {\n        guard let scrollView = scrollView() else { return }\n        \n        resetScrollViewContentInset(shouldAddObserverWhenFinished: false, animated: false, completion: nil)\n        \n        let centerY = DGElasticPullToRefreshConstants.LoadingContentInset\n        let duration = 0.9\n        \n        scrollView.scrollEnabled = false\n        startDisplayLink()\n        scrollView.dg_removeObserver(self, forKeyPath: DGElasticPullToRefreshConstants.KeyPaths.ContentOffset)\n        scrollView.dg_removeObserver(self, forKeyPath: DGElasticPullToRefreshConstants.KeyPaths.ContentInset)\n        UIView.animateWithDuration(duration, delay: 0.0, usingSpringWithDamping: 0.43, initialSpringVelocity: 0.0, options: [], animations: { () -> Void in\n            self.cControlPointView.center.y = centerY\n            self.l1ControlPointView.center.y = centerY\n            self.l2ControlPointView.center.y = centerY\n            self.l3ControlPointView.center.y = centerY\n            self.r1ControlPointView.center.y = centerY\n            self.r2ControlPointView.center.y = centerY\n            self.r3ControlPointView.center.y = centerY\n            }, completion: { _ in\n                self.stopDisplayLink()\n                self.resetScrollViewContentInset(shouldAddObserverWhenFinished: true, animated: false, completion: nil)\n                scrollView.dg_addObserver(self, forKeyPath: DGElasticPullToRefreshConstants.KeyPaths.ContentOffset)\n                scrollView.scrollEnabled = true\n                self.state = .Loading\n        })\n        \n        bounceAnimationHelperView.center = CGPoint(x: 0.0, y: originalContentInsetTop + currentHeight())\n        UIView.animateWithDuration(duration * 0.4, animations: { () -> Void in\n            self.bounceAnimationHelperView.center = CGPoint(x: 0.0, y: self.originalContentInsetTop + DGElasticPullToRefreshConstants.LoadingContentInset)\n            }, completion: nil)\n    }\n    \n    // MARK: -\n    // MARK: CADisplayLink\n    \n    private func startDisplayLink() {\n        displayLink.paused = false\n    }\n    \n    private func stopDisplayLink() {\n        displayLink.paused = true\n    }\n    \n    func displayLinkTick() {\n        let width = bounds.width\n        var height: CGFloat = 0.0\n        \n        if state == .AnimatingBounce {\n            guard let scrollView = scrollView() else { return }\n        \n            scrollView.contentInset.top = bounceAnimationHelperView.dg_center(isAnimating()).y\n            scrollView.contentOffset.y = -scrollView.contentInset.top\n            \n            height = scrollView.contentInset.top - originalContentInsetTop\n            \n            frame = CGRect(x: 0.0, y: -height - 1.0, width: width, height: height)\n        } else if state == .AnimatingToStopped {\n            height = actualContentOffsetY()\n        }\n    \n        shapeLayer.frame = CGRect(x: 0.0, y: 0.0, width: width, height: height)\n        shapeLayer.path = currentPath()\n        \n        layoutLoadingView()\n    }\n    \n    // MARK: -\n    // MARK: Layout\n    \n    private func layoutLoadingView() {\n        let width = bounds.width\n        let height: CGFloat = bounds.height\n        \n        let loadingViewSize: CGFloat = DGElasticPullToRefreshConstants.LoadingViewSize\n        let minOriginY = (DGElasticPullToRefreshConstants.LoadingContentInset - loadingViewSize) / 2.0\n        let originY: CGFloat = max(min((height - loadingViewSize) / 2.0, minOriginY), 0.0)\n        \n        loadingView?.frame = CGRect(x: (width - loadingViewSize) / 2.0, y: originY, width: loadingViewSize, height: loadingViewSize)\n        loadingView?.maskLayer.frame = convertRect(shapeLayer.frame, toView: loadingView)\n        loadingView?.maskLayer.path = shapeLayer.path\n    }\n    \n    override public func layoutSubviews() {\n        super.layoutSubviews()\n        \n        if let scrollView = scrollView() where state != .AnimatingBounce {\n            let width = scrollView.bounds.width\n            let height = currentHeight()\n            \n            frame = CGRect(x: 0.0, y: -height, width: width, height: height)\n            \n            if state.isAnyOf([.Loading, .AnimatingToStopped]) {\n                cControlPointView.center = CGPoint(x: width / 2.0, y: height)\n                l1ControlPointView.center = CGPoint(x: 0.0, y: height)\n                l2ControlPointView.center = CGPoint(x: 0.0, y: height)\n                l3ControlPointView.center = CGPoint(x: 0.0, y: height)\n                r1ControlPointView.center = CGPoint(x: width, y: height)\n                r2ControlPointView.center = CGPoint(x: width, y: height)\n                r3ControlPointView.center = CGPoint(x: width, y: height)\n            } else {\n                let locationX = scrollView.panGestureRecognizer.locationInView(scrollView).x\n                \n                let waveHeight = currentWaveHeight()\n                let baseHeight = bounds.height - waveHeight\n                \n                let minLeftX = min((locationX - width / 2.0) * 0.28, 0.0)\n                let maxRightX = max(width + (locationX - width / 2.0) * 0.28, width)\n                \n                let leftPartWidth = locationX - minLeftX\n                let rightPartWidth = maxRightX - locationX\n                \n                cControlPointView.center = CGPoint(x: locationX , y: baseHeight + waveHeight * 1.36)\n                l1ControlPointView.center = CGPoint(x: minLeftX + leftPartWidth * 0.71, y: baseHeight + waveHeight * 0.64)\n                l2ControlPointView.center = CGPoint(x: minLeftX + leftPartWidth * 0.44, y: baseHeight)\n                l3ControlPointView.center = CGPoint(x: minLeftX, y: baseHeight)\n                r1ControlPointView.center = CGPoint(x: maxRightX - rightPartWidth * 0.71, y: baseHeight + waveHeight * 0.64)\n                r2ControlPointView.center = CGPoint(x: maxRightX - (rightPartWidth * 0.44), y: baseHeight)\n                r3ControlPointView.center = CGPoint(x: maxRightX, y: baseHeight)\n            }\n            \n            shapeLayer.frame = CGRect(x: 0.0, y: 0.0, width: width, height: height)\n            shapeLayer.path = currentPath()\n            \n            layoutLoadingView()\n        }\n    }\n    \n}\n"
  },
  {
    "path": "Sublime/Pods/DGElasticPullToRefresh/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Danil Gontovnik\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "Sublime/Pods/DGElasticPullToRefresh/README.md",
    "content": "# DGElasticPullToRefresh\nElastic pull to refresh compontent developed in Swift\n\nInspired by this Dribbble post: [Pull Down to Refresh](https://dribbble.com/shots/2232385-Pull-Down-to-Refresh) by [Hoang Nguyen](https://dribbble.com/Hoanguyen)\n\nTutorial on how this bounce effect was achieved can be found [here](http://iostuts.io/2015/10/17/elastic-bounce-using-uibezierpath-and-pan-gesture/).\n\n![](https://raw.githubusercontent.com/gontovnik/DGElasticPullToRefresh/master/DGElasticPullToRefreshPreview1.gif)\n![](https://raw.githubusercontent.com/gontovnik/DGElasticPullToRefresh/master/DGElasticPullToRefreshPreview2.gif)\n\n## Requirements\n* Xcode 7 or higher\n* iOS 8.0 or higher (may work on previous versions, just did not test it)\n* ARC\n* Swift 2.0\n\n## Demo\n\nOpen and run the DGElasticPullToRefreshExample project in Xcode to see DGElasticPullToRefresh in action.\n\n## Installation\n\n### Cocoapods\n\n``` ruby\npod \"DGElasticPullToRefresh\"\n```\n\n### Manual\n\nAdd DGElasticPullToRefresh folder into your project.\n\n## Example usage\n\n``` swift\n// Initialize tableView\nlet loadingView = DGElasticPullToRefreshLoadingViewCircle()\nloadingView.tintColor = UIColor(red: 78/255.0, green: 221/255.0, blue: 200/255.0, alpha: 1.0)\ntableView.dg_addPullToRefreshWithActionHandler({ [weak self] () -> Void in\n    // Add your logic here\n    // Do not forget to call dg_stopLoading() at the end \n    self?.tableView.dg_stopLoading()\n}, loadingView: loadingView)\ntableView.dg_setPullToRefreshFillColor(UIColor(red: 57/255.0, green: 67/255.0, blue: 89/255.0, alpha: 1.0))\ntableView.dg_setPullToRefreshBackgroundColor(tableView.backgroundColor!)\n```\n\n### Description\n\nAdd pull to refresh without loading view:\n\n``` swift\nfunc dg_addPullToRefreshWithActionHandler(actionHandler: () -> Void)\n```\n\nAdd pull to refresh with loading view:\n\n``` swift\nfunc dg_addPullToRefreshWithActionHandler(actionHandler: () -> Void, loadingView: DGElasticPullToRefreshLoadingView?)\n```\n\nYou can use built-in *DGElasticPullToRefreshLoadingViewCircle* or create your own by subclassing **DGElasticPullToRefreshLoadingView** and implementing these methods:\n\n``` swift\nfunc setPullProgress(progress: CGFloat) { }\nfunc startAnimating() { }\nfunc stopLoading() { }\n```\n\nRemove pull to refresh:\n\n``` swift\nfunc dg_removePullToRefresh()\n```\n\nChange pull to refresh background color:\n\n``` swift\nfunc dg_setPullToRefreshBackgroundColor(color: UIColor)\n```\n\nChange pull to refresh fill color:\n\n``` swift \nfunc dg_setPullToRefreshFillColor(color: UIColor)\n```\n\n## Contribution\n\nPlease feel free to submit pull requests. Cannot wait to see your custom loading views for this pull to refresh.\n\n## Contact\n\nDanil Gontovnik\n\n- https://github.com/gontovnik\n- https://twitter.com/gontovnik\n- http://gontovnik.com/\n- danil@gontovnik.com\n- http://iostuts.io/author/danil-gontovnik/\n\n## License\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Danil Gontovnik\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/AEFloatConverter.h",
    "content": "//\n//  AEFloatConverter.h\n//  The Amazing Audio Engine\n//\n//  Created by Michael Tyson on 25/10/2012.\n//\n//  This software is provided 'as-is', without any express or implied\n//  warranty.  In no event will the authors be held liable for any damages\n//  arising from the use of this software.\n//\n//  Permission is granted to anyone to use this software for any purpose,\n//  including commercial applications, and to alter it and redistribute it\n//  freely, subject to the following restrictions:\n//\n//  1. The origin of this software must not be misrepresented; you must not\n//     claim that you wrote the original software. If you use this software\n//     in a product, an acknowledgment in the product documentation would be\n//     appreciated but is not required.\n//\n//  2. Altered source versions must be plainly marked as such, and must not be\n//     misrepresented as being the original software.\n//\n//  3. This notice may not be removed or altered from any source distribution.\n//\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#import <Foundation/Foundation.h>\n#import <AudioToolbox/AudioToolbox.h>\n\n/*!\n * Universal converter to float format\n *\n *  Use this class to easily convert arbitrary audio formats to floating point\n *  for use with utilities like the Accelerate framework.\n */\n@interface AEFloatConverter : NSObject\n\n/*!\n * Initialize\n *\n * @param sourceFormat The audio format to use\n */\n- (id)initWithSourceFormat:(AudioStreamBasicDescription)sourceFormat;\n\n/*!\n * Convert audio to floating-point\n *\n *  This C function, safe to use in a Core Audio realtime thread context, will take\n *  an audio buffer list of audio in the format you provided at initialisation, and\n *  convert it into a noninterleaved float array.\n *\n * @param converter         Pointer to the converter object.\n * @param sourceBuffer      An audio buffer list containing the source audio.\n * @param targetBuffers     An array of floating-point arrays to store the converted float audio into. \n *                          Note that you must provide the correct number of arrays, to match the number of channels.\n * @param frames            The number of frames to convert.\n * @return YES on success; NO on failure\n */\nBOOL AEFloatConverterToFloat(AEFloatConverter* converter, AudioBufferList *sourceBuffer, float * const * targetBuffers, UInt32 frames);\n\n/*!\n * Convert audio to floating-point, in a buffer list\n *\n *  This C function, safe to use in a Core Audio realtime thread context, will take\n *  an audio buffer list of audio in the format you provided at initialisation, and\n *  convert it into a noninterleaved float format.\n *\n * @param converter         Pointer to the converter object.\n * @param sourceBuffer      An audio buffer list containing the source audio.\n * @param targetBuffer      An audio buffer list to store the converted floating-point audio.\n * @param frames            The number of frames to convert.\n * @return YES on success; NO on failure\n */\nBOOL AEFloatConverterToFloatBufferList(AEFloatConverter* converter, AudioBufferList *sourceBuffer,  AudioBufferList *targetBuffer, UInt32 frames);\n\n/*!\n * Convert audio from floating-point\n *\n *  This C function, safe to use in a Core Audio realtime thread context, will take\n *  an audio buffer list of audio in the format you provided at initialisation, and\n *  convert it into a float array.\n *\n * @param converter         Pointer to the converter object.\n * @param sourceBuffers     An array of floating-point arrays containing the floating-point audio to convert.\n *                          Note that you must provide the correct number of arrays, to match the number of channels.\n * @param targetBuffer      An audio buffer list to store the converted audio into.\n * @param frames            The number of frames to convert.\n * @return YES on success; NO on failure\n */\nBOOL AEFloatConverterFromFloat(AEFloatConverter* converter, float * const * sourceBuffers, AudioBufferList *targetBuffer, UInt32 frames);\n\n/*!\n * Convert audio from floating-point, in a buffer list\n *\n *  This C function, safe to use in a Core Audio realtime thread context, will take\n *  an audio buffer list of audio in the format you provided at initialisation, and\n *  convert it into a float array.\n *\n * @param converter         Pointer to the converter object.\n * @param sourceBuffer      An audio buffer list containing the source audio.\n * @param targetBuffer      An audio buffer list to store the converted audio into.\n * @param frames            The number of frames to convert.\n * @return YES on success; NO on failure\n */\nBOOL AEFloatConverterFromFloatBufferList(AEFloatConverter* converter, AudioBufferList *sourceBuffer, AudioBufferList *targetBuffer, UInt32 frames);\n\n/*!\n * The AudioStreamBasicDescription representing the converted floating-point format\n */\n@property (nonatomic, readonly) AudioStreamBasicDescription floatingPointAudioDescription;\n\n/*!\n * The source audio format set at initialization\n */\n@property (nonatomic, readonly) AudioStreamBasicDescription sourceFormat;\n\n@end\n\n#ifdef __cplusplus\n}\n#endif"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/AEFloatConverter.m",
    "content": "//\n//  AEFloatConverter.m\n//  The Amazing Audio Engine\n//\n//  Created by Michael Tyson on 25/10/2012.\n//\n//  This software is provided 'as-is', without any express or implied\n//  warranty.  In no event will the authors be held liable for any damages\n//  arising from the use of this software.\n//\n//  Permission is granted to anyone to use this software for any purpose,\n//  including commercial applications, and to alter it and redistribute it\n//  freely, subject to the following restrictions:\n//\n//  1. The origin of this software must not be misrepresented; you must not\n//     claim that you wrote the original software. If you use this software\n//     in a product, an acknowledgment in the product documentation would be\n//     appreciated but is not required.\n//\n//  2. Altered source versions must be plainly marked as such, and must not be\n//     misrepresented as being the original software.\n//\n//  3. This notice may not be removed or altered from any source distribution.\n//\n\n#import \"AEFloatConverter.h\"\n\n#define checkResult(result,operation) (_checkResult((result),(operation),strrchr(__FILE__, '/')+1,__LINE__))\nstatic inline BOOL _checkResult(OSStatus result, const char *operation, const char* file, int line) {\n    if ( result != noErr ) {\n        NSLog(@\"%s:%d: %s result %d %08X %4.4s\", file, line, operation, (int)result, (int)result, (char*)&result);\n        return NO;\n    }\n    return YES;\n}\n\n#define                        kNoMoreDataErr                            -2222\n\nstruct complexInputDataProc_t {\n    AudioBufferList *sourceBuffer;\n};\n\n@interface AEFloatConverter () {\n    AudioStreamBasicDescription _sourceAudioDescription;\n    AudioStreamBasicDescription _floatAudioDescription;\n    AudioConverterRef           _toFloatConverter;\n    AudioConverterRef           _fromFloatConverter;\n    AudioBufferList            *_scratchFloatBufferList;\n}\n\nstatic OSStatus complexInputDataProc(AudioConverterRef             inAudioConverter,\n                                     UInt32                        *ioNumberDataPackets,\n                                     AudioBufferList               *ioData,\n                                     AudioStreamPacketDescription  **outDataPacketDescription,\n                                     void                          *inUserData);\n@end\n\n@implementation AEFloatConverter\n@synthesize sourceFormat = _sourceAudioDescription;\n\n-(id)initWithSourceFormat:(AudioStreamBasicDescription)sourceFormat {\n    if ( !(self = [super init]) ) return nil;\n\n    _floatAudioDescription.mFormatID          = kAudioFormatLinearPCM;\n    _floatAudioDescription.mFormatFlags       = kAudioFormatFlagIsFloat | kAudioFormatFlagIsPacked | kAudioFormatFlagIsNonInterleaved;\n    _floatAudioDescription.mChannelsPerFrame  = sourceFormat.mChannelsPerFrame;\n    _floatAudioDescription.mBytesPerPacket    = sizeof(float);\n    _floatAudioDescription.mFramesPerPacket   = 1;\n    _floatAudioDescription.mBytesPerFrame     = sizeof(float);\n    _floatAudioDescription.mBitsPerChannel    = 8 * sizeof(float);\n    _floatAudioDescription.mSampleRate        = sourceFormat.mSampleRate;\n    \n    _sourceAudioDescription = sourceFormat;\n    \n    if ( memcmp(&sourceFormat, &_floatAudioDescription, sizeof(AudioStreamBasicDescription)) != 0 ) {\n        checkResult(AudioConverterNew(&sourceFormat, &_floatAudioDescription, &_toFloatConverter), \"AudioConverterNew\");\n        checkResult(AudioConverterNew(&_floatAudioDescription, &sourceFormat, &_fromFloatConverter), \"AudioConverterNew\");\n        _scratchFloatBufferList = (AudioBufferList*)malloc(sizeof(AudioBufferList) + (_floatAudioDescription.mChannelsPerFrame-1)*sizeof(AudioBuffer));\n        _scratchFloatBufferList->mNumberBuffers = _floatAudioDescription.mChannelsPerFrame;\n        for ( int i=0; i<_scratchFloatBufferList->mNumberBuffers; i++ ) {\n            _scratchFloatBufferList->mBuffers[i].mNumberChannels = 1;\n        }\n    }\n    \n    return self;\n}\n\n-(void)dealloc {\n    if ( _toFloatConverter ) AudioConverterDispose(_toFloatConverter);\n    if ( _fromFloatConverter ) AudioConverterDispose(_fromFloatConverter);\n    if ( _scratchFloatBufferList ) free(_scratchFloatBufferList);\n//    [super dealloc];\n}\n\n\nBOOL AEFloatConverterToFloat(AEFloatConverter* THIS, AudioBufferList *sourceBuffer, float * const * targetBuffers, UInt32 frames) {\n    if ( frames == 0 ) return YES;\n    \n    if ( THIS->_toFloatConverter ) {\n        UInt32 priorDataByteSize = sourceBuffer->mBuffers[0].mDataByteSize;\n        for ( int i=0; i<sourceBuffer->mNumberBuffers; i++ ) {\n            sourceBuffer->mBuffers[i].mDataByteSize = frames * THIS->_sourceAudioDescription.mBytesPerFrame;\n        }\n        \n        for ( int i=0; i<THIS->_scratchFloatBufferList->mNumberBuffers; i++ ) {\n            THIS->_scratchFloatBufferList->mBuffers[i].mData = targetBuffers[i];\n            THIS->_scratchFloatBufferList->mBuffers[i].mDataByteSize = frames * sizeof(float);\n        }\n      \n        OSStatus result = AudioConverterFillComplexBuffer(THIS->_toFloatConverter,\n                                                          complexInputDataProc,\n                                                          &(struct complexInputDataProc_t) { .sourceBuffer = sourceBuffer },\n                                                          &frames,\n                                                          THIS->_scratchFloatBufferList,\n                                                          NULL);\n        \n        for ( int i=0; i<sourceBuffer->mNumberBuffers; i++ ) {\n            sourceBuffer->mBuffers[i].mDataByteSize = priorDataByteSize;\n        }\n        \n        if ( !checkResult(result, \"AudioConverterConvertComplexBuffer\") ) {\n            return NO;\n        }\n        \n    } else {\n        for ( int i=0; i<sourceBuffer->mNumberBuffers; i++ ) {\n            memcpy(targetBuffers[i], sourceBuffer->mBuffers[i].mData, frames * sizeof(float));\n        }\n    }\n    \n    return YES;\n}\n\nBOOL AEFloatConverterToFloatBufferList(AEFloatConverter* converter, AudioBufferList *sourceBuffer,  AudioBufferList *targetBuffer, UInt32 frames) {\n    assert(targetBuffer->mNumberBuffers == converter->_floatAudioDescription.mChannelsPerFrame);\n    \n    float *targetBuffers[targetBuffer->mNumberBuffers];\n    for ( int i=0; i<targetBuffer->mNumberBuffers; i++ ) {\n        targetBuffers[i] = (float*)targetBuffer->mBuffers[i].mData;\n    }\n    return AEFloatConverterToFloat(converter, sourceBuffer, targetBuffers, frames);\n}\n\nBOOL AEFloatConverterFromFloat(AEFloatConverter* THIS, float * const * sourceBuffers, AudioBufferList *targetBuffer, UInt32 frames) {\n    if ( frames == 0 ) return YES;\n    \n    if ( THIS->_fromFloatConverter ) {\n        for ( int i=0; i<THIS->_scratchFloatBufferList->mNumberBuffers; i++ ) {\n            THIS->_scratchFloatBufferList->mBuffers[i].mData = sourceBuffers[i];\n            THIS->_scratchFloatBufferList->mBuffers[i].mDataByteSize = frames * sizeof(float);\n        }\n        \n        UInt32 priorDataByteSize = targetBuffer->mBuffers[0].mDataByteSize;\n        for ( int i=0; i<targetBuffer->mNumberBuffers; i++ ) {\n            targetBuffer->mBuffers[i].mDataByteSize = frames * THIS->_sourceAudioDescription.mBytesPerFrame;\n        }\n        \n        OSStatus result = AudioConverterFillComplexBuffer(THIS->_fromFloatConverter,\n                                                          complexInputDataProc,\n                                                          &(struct complexInputDataProc_t) { .sourceBuffer = THIS->_scratchFloatBufferList },\n                                                          &frames,\n                                                          targetBuffer,\n                                                          NULL);\n        \n        for ( int i=0; i<targetBuffer->mNumberBuffers; i++ ) {\n            targetBuffer->mBuffers[i].mDataByteSize = priorDataByteSize;\n        }\n        \n        if ( !checkResult(result, \"AudioConverterConvertComplexBuffer\") ) {\n            return NO;\n        }\n    } else {\n        for ( int i=0; i<targetBuffer->mNumberBuffers; i++ ) {\n            memcpy(targetBuffer->mBuffers[i].mData, sourceBuffers[i], frames * sizeof(float));\n        }\n    }\n    \n    return YES;\n}\n\nBOOL AEFloatConverterFromFloatBufferList(AEFloatConverter* converter, AudioBufferList *sourceBuffer, AudioBufferList *targetBuffer, UInt32 frames) {\n    assert(sourceBuffer->mNumberBuffers == converter->_floatAudioDescription.mChannelsPerFrame);\n    \n    float *sourceBuffers[sourceBuffer->mNumberBuffers];\n    for ( int i=0; i<sourceBuffer->mNumberBuffers; i++ ) {\n        sourceBuffers[i] = (float*)sourceBuffer->mBuffers[i].mData;\n    }\n    return AEFloatConverterFromFloat(converter, sourceBuffers, targetBuffer, frames);\n}\n\nstatic OSStatus complexInputDataProc(AudioConverterRef             inAudioConverter,\n                                     UInt32                        *ioNumberDataPackets,\n                                     AudioBufferList               *ioData,\n                                     AudioStreamPacketDescription  **outDataPacketDescription,\n                                     void                          *inUserData) {\n    struct complexInputDataProc_t *arg = (struct complexInputDataProc_t*)inUserData;\n    if ( !arg->sourceBuffer ) {\n        return kNoMoreDataErr;\n    }\n    \n    memcpy(ioData, arg->sourceBuffer, sizeof(AudioBufferList) + (arg->sourceBuffer->mNumberBuffers-1)*sizeof(AudioBuffer));\n    arg->sourceBuffer = NULL;\n    \n    return noErr;\n}\n\n-(AudioStreamBasicDescription)floatingPointAudioDescription {\n    return _floatAudioDescription;\n}\n\n@end"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/EZAudio.h",
    "content": "//\n//  EZAudio.h\n//  EZAudio\n//\n//  Created by Syed Haris Ali on 11/21/13.\n//  Copyright (c) 2013 Syed Haris Ali. All rights reserved.\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#import <Foundation/Foundation.h>\n\n#pragma mark - 3rd Party Utilties\n#import \"AEFloatConverter.h\"\n#import \"TPCircularBuffer.h\"\n\n#pragma mark - Core Components\n#import \"EZAudioFile.h\"\n#import \"EZMicrophone.h\"\n#import \"EZOutput.h\"\n#import \"EZRecorder.h\"\n\n#pragma mark - Extended Components\n#import \"EZAudioPlayer.h\"\n\n#pragma mark - Interface Components\n#import \"EZPlot.h\"\n#import \"EZAudioPlot.h\"\n#import \"EZAudioPlotGL.h\"\n#import \"EZAudioPlotGLKViewController.h\"\n\n/**\n EZAudio is a simple, intuitive framework for iOS and OSX. The goal of EZAudio was to provide a modular, cross-platform framework to simplify performing everyday audio operations like getting microphone input, creating audio waveforms, recording/playing audio files, etc. The visualization tools like the EZAudioPlot and EZAudioPlotGL were created to plug right into the framework's various components and provide highly optimized drawing routines that work in harmony with audio callback loops. All components retain the same namespace whether you're on an iOS device or a Mac computer so an EZAudioPlot understands it will subclass an UIView on an iOS device or an NSView on a Mac.\n \n Class methods for EZAudio are provided as utility methods used throughout the other modules within the framework. For instance, these methods help make sense of error codes (checkResult:operation:), map values betwen coordinate systems (MAP:leftMin:leftMax:rightMin:rightMax:), calculate root mean squared values for buffers (RMS:length:), etc.\n */\n@interface EZAudio : NSObject\n\n#pragma mark - AudioBufferList Utility\n///-----------------------------------------------------------\n/// @name AudioBufferList Utility\n///-----------------------------------------------------------\n\n/**\n Allocates an AudioBufferList structure. Make sure to call freeBufferList when done using AudioBufferList or it will leak.\n @param frames The number of frames that will be stored within each audio buffer\n @param channels The number of channels (e.g. 2 for stereo, 1 for mono, etc.)\n @param interleaved Whether the samples will be interleaved (if not it will be assumed to be non-interleaved and each channel will have an AudioBuffer allocated)\n @return An AudioBufferList struct that has been allocated in memory\n */\n+(AudioBufferList *)audioBufferListWithNumberOfFrames:(UInt32)frames\n                                     numberOfChannels:(UInt32)channels\n                                          interleaved:(BOOL)interleaved;\n\n/**\n Deallocates an AudioBufferList structure from memory.\n @param bufferList A pointer to the buffer list you would like to free\n */\n+(void)freeBufferList:(AudioBufferList*)bufferList;\n\n#pragma mark - AudioStreamBasicDescription Utilties\n///-----------------------------------------------------------\n/// @name Creating An AudioStreamBasicDescription\n///-----------------------------------------------------------\n\n/**\n \n @param channels   The desired number of channels\n @param sampleRate The desired sample rate\n @return A new AudioStreamBasicDescription with the specified format.\n */\n+(AudioStreamBasicDescription)AIFFFormatWithNumberOfChannels:(UInt32)channels\n                                                  sampleRate:(float)sampleRate;\n\n/**\n \n @param sampleRate The desired sample rate\n @return A new AudioStreamBasicDescription with the specified format.\n */\n+(AudioStreamBasicDescription)iLBCFormatWithSampleRate:(float)sampleRate;\n\n/**\n \n @param channels   The desired number of channels\n @param sampleRate The desired sample rate\n @return A new AudioStreamBasicDescription with the specified format.\n */\n+(AudioStreamBasicDescription)M4AFormatWithNumberOfChannels:(UInt32)channels\n                                                 sampleRate:(float)sampleRate;\n\n/**\n \n @param sampleRate The desired sample rate\n @return A new AudioStreamBasicDescription with the specified format.\n */\n+(AudioStreamBasicDescription)monoFloatFormatWithSampleRate:(float)sampleRate;\n\n/**\n \n @param sampleRate The desired sample rate\n @return A new AudioStreamBasicDescription with the specified format.\n */\n+(AudioStreamBasicDescription)monoCanonicalFormatWithSampleRate:(float)sampleRate;\n\n/**\n \n @param sampleRate The desired sample rate\n @return A new AudioStreamBasicDescription with the specified format.\n */\n+(AudioStreamBasicDescription)stereoCanonicalNonInterleavedFormatWithSampleRate:(float)sampleRate;\n\n/**\n \n @param sampleRate The desired sample rate\n @return A new AudioStreamBasicDescription with the specified format.\n */\n+(AudioStreamBasicDescription)stereoFloatInterleavedFormatWithSampleRate:(float)sampleRate;\n\n/**\n \n @param sampleRate The desired sample rate\n @return A new AudioStreamBasicDescription with the specified format.\n */\n+(AudioStreamBasicDescription)stereoFloatNonInterleavedFormatWithSampleRate:(float)sameRate;\n\n///-----------------------------------------------------------\n/// @name AudioStreamBasicDescription Utilities\n///-----------------------------------------------------------\n\n/**\n Nicely logs out the contents of an AudioStreamBasicDescription struct\n @param \tasbd \tThe AudioStreamBasicDescription struct with content to print out\n */\n+(void)printASBD:(AudioStreamBasicDescription)asbd;\n\n/**\n Just a wrapper around the setCanonical function provided in the Core Audio Utility C++ class.\n @param asbd        The AudioStreamBasicDescription structure to modify\n @param nChannels   The number of expected channels on the description\n @param interleaved A flag indicating whether the stereo samples should be interleaved in the buffer\n */\n+(void)setCanonicalAudioStreamBasicDescription:(AudioStreamBasicDescription*)asbd\n                              numberOfChannels:(UInt32)nChannels\n                                   interleaved:(BOOL)interleaved;\n\n#pragma mark - Math Utilities\n///-----------------------------------------------------------\n/// @name Math Utilities\n///-----------------------------------------------------------\n\n/**\n Appends an array of values to a history buffer and performs an internal shift to add the values to the tail and removes the same number of values from the head.\n @param buffer              A float array of values to append to the tail of the history buffer\n @param bufferLength        The length of the float array being appended to the history buffer\n @param scrollHistory       The target history buffer in which to append the values\n @param scrollHistoryLength The length of the target history buffer\n */\n+(void)appendBufferAndShift:(float*)buffer\n             withBufferSize:(int)bufferLength\n            toScrollHistory:(float*)scrollHistory\n      withScrollHistorySize:(int)scrollHistoryLength;\n\n/**\n Appends a value to a history buffer and performs an internal shift to add the value to the tail and remove the 0th value.\n @param value               The float value to append to the history array\n @param scrollHistory       The target history buffer in which to append the values\n @param scrollHistoryLength The length of the target history buffer\n */\n+(void)    appendValue:(float)value\n       toScrollHistory:(float*)scrollHistory\n withScrollHistorySize:(int)scrollHistoryLength;\n\n/**\n Maps a value from one coordinate system into another one. Takes in the current value to map, the minimum and maximum values of the first coordinate system, and the minimum and maximum values of the second coordinate system and calculates the mapped value in the second coordinate system's constraints.\n @param \tvalue \tThe value expressed in the first coordinate system\n @param \tleftMin \tThe minimum of the first coordinate system\n @param \tleftMax \tThe maximum of the first coordinate system\n @param \trightMin \tThe minimum of the second coordindate system\n @param \trightMax \tThe maximum of the second coordinate system\n @return\tThe mapped value in terms of the second coordinate system\n */\n+(float)MAP:(float)value\n    leftMin:(float)leftMin\n    leftMax:(float)leftMax\n   rightMin:(float)rightMin\n   rightMax:(float)rightMax;\n\n/**\n Calculates the root mean squared for a buffer.\n @param \tbuffer \tA float buffer array of values whose root mean squared to calculate\n @param \tbufferSize \tThe size of the float buffer\n @return\tThe root mean squared of the buffer\n */\n+(float)RMS:(float*)buffer\n     length:(int)bufferSize;\n\n/**\n Calculate the sign function sgn(x) =\n {  -1 , x < 0,\n {   0 , x = 0,\n {   1 , x > 0\n @param value The float value for which to use as x\n @return The float sign value\n */\n+(float)SGN:(float)value;\n\n#pragma mark - OSStatus Utility\n///-----------------------------------------------------------\n/// @name OSStatus Utility\n///-----------------------------------------------------------\n\n/**\n Basic check result function useful for checking each step of the audio setup process\n @param result    The OSStatus representing the result of an operation\n @param operation A string (const char, not NSString) describing the operation taking place (will print if fails)\n */\n+(void)checkResult:(OSStatus)result\n         operation:(const char*)operation;\n\n#pragma mark - Plot Utility\n///-----------------------------------------------------------\n/// @name Plot Utility\n///-----------------------------------------------------------\n\n+(void)updateScrollHistory:(float**)scrollHistory\n                withLength:(int)scrollHistoryLength\n                   atIndex:(int*)index\n                withBuffer:(float*)buffer\n            withBufferSize:(int)bufferSize\n      isResolutionChanging:(BOOL*)isChanging;\n\n#pragma mark - TPCircularBuffer Utility\n///-----------------------------------------------------------\n/// @name TPCircularBuffer Utility\n///-----------------------------------------------------------\n\n/**\n Appends the data from the audio buffer list to the circular buffer\n @param circularBuffer  Pointer to the instance of the TPCircularBuffer to add the audio data to\n @param audioBufferList Pointer to the instance of the AudioBufferList with the audio data\n */\n+(void)appendDataToCircularBuffer:(TPCircularBuffer*)circularBuffer\n              fromAudioBufferList:(AudioBufferList*)audioBufferList;\n\n/**\n Initializes the circular buffer (just a wrapper around the C method)\n *  @param circularBuffer Pointer to an instance of the TPCircularBuffer\n *  @param size           The length of the TPCircularBuffer (usually 1024)\n */\n+(void)circularBuffer:(TPCircularBuffer*)circularBuffer\n             withSize:(int)size;\n\n/**\n Frees a circular buffer\n @param circularBuffer Pointer to the circular buffer to clear\n */\n+(void)freeCircularBuffer:(TPCircularBuffer*)circularBuffer;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/EZAudio.m",
    "content": "//\n//  EZAudio.m\n//  EZAudio\n//\n//  Created by Syed Haris Ali on 11/21/13.\n//  Copyright (c) 2013 Syed Haris Ali. All rights reserved.\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#import \"EZAudio.h\"\n\n@implementation EZAudio\n\n#pragma mark - AudioBufferList Utility\n+(AudioBufferList *)audioBufferListWithNumberOfFrames:(UInt32)frames\n                                     numberOfChannels:(UInt32)channels\n                                          interleaved:(BOOL)interleaved\n{\n    AudioBufferList *audioBufferList = (AudioBufferList*)malloc(sizeof(AudioBufferList));\n    UInt32 outputBufferSize = 32 * frames; // 32 KB\n    audioBufferList->mNumberBuffers = interleaved ? 1 : channels;\n    for( int i = 0; i < audioBufferList->mNumberBuffers; i++ )\n    {\n        audioBufferList->mBuffers[i].mNumberChannels = channels;\n        audioBufferList->mBuffers[i].mDataByteSize = channels * outputBufferSize;\n        audioBufferList->mBuffers[i].mData = (float*)malloc(channels * sizeof(float) *outputBufferSize);\n    }\n    return audioBufferList;\n}\n\n+(void)freeBufferList:(AudioBufferList *)bufferList\n{\n    if( bufferList )\n    {\n        if( bufferList->mNumberBuffers )\n        {\n            for( int i = 0; i < bufferList->mNumberBuffers; i++ )\n            {\n                if( bufferList->mBuffers[i].mData )\n                {\n                    free(bufferList->mBuffers[i].mData);\n                }\n            }\n        }\n        free(bufferList);\n    }\n    bufferList = NULL;\n}\n\n#pragma mark - AudioStreamBasicDescription Utility\n+(AudioStreamBasicDescription)AIFFFormatWithNumberOfChannels:(UInt32)channels\n                                                  sampleRate:(float)sampleRate\n{\n    AudioStreamBasicDescription asbd;\n    memset(&asbd, 0, sizeof(asbd));\n    asbd.mFormatID          = kAudioFormatLinearPCM;\n    asbd.mFormatFlags       = kAudioFormatFlagIsBigEndian|kAudioFormatFlagIsPacked|kAudioFormatFlagIsSignedInteger;\n    asbd.mSampleRate        = sampleRate;\n    asbd.mChannelsPerFrame  = channels;\n    asbd.mBitsPerChannel    = 32;\n    asbd.mBytesPerPacket    = (asbd.mBitsPerChannel / 8) * asbd.mChannelsPerFrame;\n    asbd.mFramesPerPacket   = 1;\n    asbd.mBytesPerFrame     = (asbd.mBitsPerChannel / 8) * asbd.mChannelsPerFrame;\n    return asbd;\n}\n\n+(AudioStreamBasicDescription)iLBCFormatWithSampleRate:(float)sampleRate\n{\n    AudioStreamBasicDescription asbd;\n    memset(&asbd, 0, sizeof(asbd));\n    asbd.mFormatID          = kAudioFormatiLBC;\n    asbd.mChannelsPerFrame  = 1;\n    asbd.mSampleRate        = sampleRate;\n    \n    // Fill in the rest of the descriptions using the Audio Format API\n    UInt32 propSize = sizeof(asbd);\n    [EZAudio checkResult:AudioFormatGetProperty(kAudioFormatProperty_FormatInfo,\n                                                0,\n                                                NULL,\n                                                &propSize,\n                                                &asbd)\n               operation:\"Failed to fill out the rest of the m4a AudioStreamBasicDescription\"];\n    \n    return asbd;\n}\n\n+(AudioStreamBasicDescription)M4AFormatWithNumberOfChannels:(UInt32)channels\n                                                 sampleRate:(float)sampleRate\n{\n    AudioStreamBasicDescription asbd;\n    memset(&asbd, 0, sizeof(asbd));\n    asbd.mFormatID          = kAudioFormatMPEG4AAC;\n    asbd.mChannelsPerFrame  = channels;\n    asbd.mSampleRate        = sampleRate;\n    \n    // Fill in the rest of the descriptions using the Audio Format API\n    UInt32 propSize = sizeof(asbd);\n    [EZAudio checkResult:AudioFormatGetProperty(kAudioFormatProperty_FormatInfo,\n                                                0,\n                                                NULL,\n                                                &propSize,\n                                                &asbd)\n               operation:\"Failed to fill out the rest of the m4a AudioStreamBasicDescription\"];\n    \n    return asbd;\n}\n\n+(AudioStreamBasicDescription)monoFloatFormatWithSampleRate:(float)sampleRate\n{\n    AudioStreamBasicDescription asbd;\n    UInt32 byteSize = sizeof(float);\n    asbd.mBitsPerChannel   = 8 * byteSize;\n    asbd.mBytesPerFrame    = byteSize;\n    asbd.mBytesPerPacket   = byteSize;\n    asbd.mChannelsPerFrame = 1;\n    asbd.mFormatFlags      = kAudioFormatFlagIsPacked|kAudioFormatFlagIsFloat;\n    asbd.mFormatID         = kAudioFormatLinearPCM;\n    asbd.mFramesPerPacket  = 1;\n    asbd.mSampleRate       = sampleRate;\n    return asbd;\n}\n\n+(AudioStreamBasicDescription)monoCanonicalFormatWithSampleRate:(float)sampleRate\n{\n    AudioStreamBasicDescription asbd;\n    UInt32 byteSize = sizeof(float);\n    asbd.mBitsPerChannel   = 8 * byteSize;\n    asbd.mBytesPerFrame    = byteSize;\n    asbd.mBytesPerPacket   = byteSize;\n    asbd.mChannelsPerFrame = 1;\n    asbd.mFormatFlags      = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked|kAudioFormatFlagIsNonInterleaved;\n    asbd.mFormatID         = kAudioFormatLinearPCM;\n    asbd.mFramesPerPacket  = 1;\n    asbd.mSampleRate       = sampleRate;\n    return asbd;\n}\n\n+(AudioStreamBasicDescription)stereoCanonicalNonInterleavedFormatWithSampleRate:(float)sampleRate\n{\n    AudioStreamBasicDescription asbd;\n    UInt32 byteSize = sizeof(float);\n    asbd.mBitsPerChannel   = 8 * byteSize;\n    asbd.mBytesPerFrame    = byteSize;\n    asbd.mBytesPerPacket   = byteSize;\n    asbd.mChannelsPerFrame = 2;\n    asbd.mFormatFlags      = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked|kAudioFormatFlagIsNonInterleaved;\n    asbd.mFormatID         = kAudioFormatLinearPCM;\n    asbd.mFramesPerPacket  = 1;\n    asbd.mSampleRate       = sampleRate;\n    return asbd;\n}\n\n+(AudioStreamBasicDescription)stereoFloatInterleavedFormatWithSampleRate:(float)sampleRate\n{\n    AudioStreamBasicDescription asbd;\n    UInt32 floatByteSize   = sizeof(float);\n    asbd.mChannelsPerFrame = 2;\n    asbd.mBitsPerChannel   = 8 * floatByteSize;\n    asbd.mBytesPerFrame    = asbd.mChannelsPerFrame * floatByteSize;\n    asbd.mBytesPerPacket   = asbd.mChannelsPerFrame * floatByteSize;\n    asbd.mFormatFlags      = kAudioFormatFlagIsPacked|kAudioFormatFlagIsFloat;\n    asbd.mFormatID         = kAudioFormatLinearPCM;\n    asbd.mFramesPerPacket  = 1;\n    asbd.mSampleRate       = sampleRate;\n    return asbd;\n}\n\n+(AudioStreamBasicDescription)stereoFloatNonInterleavedFormatWithSampleRate:(float)sampleRate\n{\n    AudioStreamBasicDescription asbd;\n    UInt32 floatByteSize   = sizeof(float);\n    asbd.mBitsPerChannel   = 8 * floatByteSize;\n    asbd.mBytesPerFrame    = floatByteSize;\n    asbd.mBytesPerPacket   = floatByteSize;\n    asbd.mChannelsPerFrame = 2;\n    asbd.mFormatFlags      = kAudioFormatFlagIsFloat|kAudioFormatFlagIsNonInterleaved;\n    asbd.mFormatID         = kAudioFormatLinearPCM;\n    asbd.mFramesPerPacket  = 1;\n    asbd.mSampleRate       = sampleRate;\n    return asbd;\n}\n\n+(void)printASBD:(AudioStreamBasicDescription)asbd {\n    char formatIDString[5];\n    UInt32 formatID = CFSwapInt32HostToBig(asbd.mFormatID);\n    bcopy (&formatID, formatIDString, 4);\n    formatIDString[4] = '\\0';\n    NSLog (@\"  Sample Rate:         %10.0f\",  asbd.mSampleRate);\n    NSLog (@\"  Format ID:           %10s\",    formatIDString);\n    NSLog (@\"  Format Flags:        %10X\",    (unsigned int)asbd.mFormatFlags);\n    NSLog (@\"  Bytes per Packet:    %10d\",    (unsigned int)asbd.mBytesPerPacket);\n    NSLog (@\"  Frames per Packet:   %10d\",    (unsigned int)asbd.mFramesPerPacket);\n    NSLog (@\"  Bytes per Frame:     %10d\",    (unsigned int)asbd.mBytesPerFrame);\n    NSLog (@\"  Channels per Frame:  %10d\",    (unsigned int)asbd.mChannelsPerFrame);\n    NSLog (@\"  Bits per Channel:    %10d\",    (unsigned int)asbd.mBitsPerChannel);\n}\n\n+(void)setCanonicalAudioStreamBasicDescription:(AudioStreamBasicDescription*)asbd\n                              numberOfChannels:(UInt32)nChannels\n                                   interleaved:(BOOL)interleaved {\n    \n    asbd->mFormatID = kAudioFormatLinearPCM;\n#if TARGET_OS_IPHONE\n    int sampleSize = sizeof(float);\n    asbd->mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked;\n#elif TARGET_OS_MAC\n    int sampleSize = sizeof(Float32);\n    asbd->mFormatFlags = kAudioFormatFlagsNativeFloatPacked;\n#endif\n    asbd->mBitsPerChannel = 8 * sampleSize;\n    asbd->mChannelsPerFrame = nChannels;\n    asbd->mFramesPerPacket = 1;\n    if (interleaved)\n        asbd->mBytesPerPacket = asbd->mBytesPerFrame = nChannels * sampleSize;\n    else {\n        asbd->mBytesPerPacket = asbd->mBytesPerFrame = sampleSize;\n        asbd->mFormatFlags |= kAudioFormatFlagIsNonInterleaved;\n    }\n}\n\n#pragma mark - OSStatus Utility\n+(void)checkResult:(OSStatus)result\n         operation:(const char *)operation {\n\tif (result == noErr) return;\n\tchar errorString[20];\n\t// see if it appears to be a 4-char-code\n\t*(UInt32 *)(errorString + 1) = CFSwapInt32HostToBig(result);\n\tif (isprint(errorString[1]) && isprint(errorString[2]) && isprint(errorString[3]) && isprint(errorString[4])) {\n\t\terrorString[0] = errorString[5] = '\\'';\n\t\terrorString[6] = '\\0';\n\t} else\n\t\t// no, format it as an integer\n\t\tsprintf(errorString, \"%d\", (int)result);\n\tfprintf(stderr, \"Error: %s (%s)\\n\", operation, errorString);\n\texit(1);\n}\n\n#pragma mark - Math Utility\n+(void)appendBufferAndShift:(float*)buffer\n             withBufferSize:(int)bufferLength\n            toScrollHistory:(float*)scrollHistory\n      withScrollHistorySize:(int)scrollHistoryLength {\n    NSAssert(scrollHistoryLength>=bufferLength,@\"Scroll history array length must be greater buffer length\");\n    NSAssert(scrollHistoryLength>0,@\"Scroll history array length must be greater than 0\");\n    NSAssert(bufferLength>0,@\"Buffer array length must be greater than 0\");\n    int    shiftLength    = scrollHistoryLength - bufferLength;\n    size_t floatByteSize  = sizeof(float);\n    size_t shiftByteSize  = shiftLength  * floatByteSize;\n    size_t bufferByteSize = bufferLength * floatByteSize;\n    memmove(&scrollHistory[0],\n            &scrollHistory[bufferLength],\n            shiftByteSize);\n    memmove(&scrollHistory[shiftLength],\n            &buffer[0],\n            bufferByteSize);\n}\n\n+(void)    appendValue:(float)value\n       toScrollHistory:(float*)scrollHistory\n withScrollHistorySize:(int)scrollHistoryLength {\n    float val[1]; val[0] = value;\n    [self appendBufferAndShift:val\n                withBufferSize:1\n               toScrollHistory:scrollHistory\n         withScrollHistorySize:scrollHistoryLength];\n}\n\n+(float)MAP:(float)value\n    leftMin:(float)leftMin\n    leftMax:(float)leftMax\n   rightMin:(float)rightMin\n   rightMax:(float)rightMax {\n    float leftSpan    = leftMax  - leftMin;\n    float rightSpan   = rightMax - rightMin;\n    float valueScaled = ( value  - leftMin ) / leftSpan;\n    return rightMin + (valueScaled * rightSpan);\n}\n\n+(float)RMS:(float *)buffer\n     length:(int)bufferSize {\n    float sum = 0.0;\n    for(int i = 0; i < bufferSize; i++)\n        sum += buffer[i] * buffer[i];\n    return sqrtf( sum / bufferSize );\n}\n\n+(float)SGN:(float)value\n{\n    return value < 0 ? -1.0f : ( value > 0 ? 1.0f : 0.0f );\n}\n\n#pragma mark - Plot Utility\n+(void)updateScrollHistory:(float **)scrollHistory\n                withLength:(int)scrollHistoryLength\n                   atIndex:(int*)index\n                withBuffer:(float *)buffer\n            withBufferSize:(int)bufferSize\n      isResolutionChanging:(BOOL*)isChanging {\n    \n    //\n    size_t floatByteSize = sizeof(float);\n    \n    //\n    if( *scrollHistory == NULL ){\n        // Create the history buffer\n        *scrollHistory = (float*)calloc(kEZAudioPlotMaxHistoryBufferLength,floatByteSize);\n    }\n    \n    //\n    if( !*isChanging ){\n        float rms = [EZAudio RMS:buffer length:bufferSize];\n        if( *index < scrollHistoryLength ){\n            float *hist = *scrollHistory;\n            hist[*index] = rms;\n            (*index)++;\n        }\n        else {\n            [EZAudio appendValue:rms\n                 toScrollHistory:*scrollHistory\n           withScrollHistorySize:scrollHistoryLength];\n        }\n    }\n    \n}\n\n#pragma mark - TPCircularBuffer Utility\n+(void)circularBuffer:(TPCircularBuffer *)circularBuffer withSize:(int)size {\n    TPCircularBufferInit(circularBuffer,size);\n}\n\n+(void)appendDataToCircularBuffer:(TPCircularBuffer*)circularBuffer\n              fromAudioBufferList:(AudioBufferList*)audioBufferList {\n    TPCircularBufferProduceBytes(circularBuffer,\n                                 audioBufferList->mBuffers[0].mData,\n                                 audioBufferList->mBuffers[0].mDataByteSize);\n}\n\n+(void)freeCircularBuffer:(TPCircularBuffer *)circularBuffer {\n    TPCircularBufferClear(circularBuffer);\n    TPCircularBufferCleanup(circularBuffer);\n}\n\n@end"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/EZAudioFile.h",
    "content": "//\n//  EZAudioFile.h\n//  EZAudio\n//\n//  Created by Syed Haris Ali on 12/1/13.\n//  Copyright (c) 2013 Syed Haris Ali. All rights reserved.\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#import <Foundation/Foundation.h>\n#import <AudioToolbox/AudioToolbox.h>\n\n@class EZAudio;\n@class EZAudioFile;\n\n/**\n The EZAudioFileDelegate provides event callbacks for the EZAudioFile object. These type of events are triggered by reads and seeks on the file and gives feedback such as the audio data read as a float array for visualizations and the new seek position for UI updating.\n */\n@protocol EZAudioFileDelegate <NSObject>\n\n@optional\n/**\n Triggered from the EZAudioFile function `readFrames:audioBufferList:bufferSize:eof:` to notify the delegate of the read audio data as a float array instead of a buffer list. Common use case of this would be to visualize the float data using an audio plot or audio data dependent OpenGL sketch.\n @param audioFile        The instance of the EZAudioFile that triggered the event.\n @param buffer           A float array of float arrays holding the audio data. buffer[0] would be the left channel's float array while buffer[1] would be the right channel's float array in a stereo file.\n @param bufferSize       The length of the buffers float arrays\n @param numberOfChannels The number of channels. 2 for stereo, 1 for mono.\n */\n-(void)     audioFile:(EZAudioFile*)audioFile\n            readAudio:(float**)buffer\n       withBufferSize:(UInt32)bufferSize\n withNumberOfChannels:(UInt32)numberOfChannels;\n\n/**\n Occurs when the audio file's internal seek position has been updated by the EZAudioFile functions `readFrames:audioBufferList:bufferSize:eof:` or `audioFile:updatedPosition:`.\n @param audioFile     The instance of the EZAudio in which the change occured\n @param framePosition The new frame index as a 64-bit signed integer\n */\n-(void)audioFile:(EZAudioFile*)audioFile\n updatedPosition:(SInt64)framePosition;\n\n@end\n\n/**\n The EZAudioFile provides a lightweight and intuitive way to asynchronously interact with audio files. These interactions included reading audio data, seeking within an audio file, getting information about the file, and pulling the waveform data for visualizing the contents of the audio file. The EZAudioFileDelegate provides event callbacks for when reads, seeks, and various updates happen within the audio file to allow the caller to interact with the action in meaningful ways. Common use cases here could be to read the audio file's data as AudioBufferList structures for output (see EZOutput) and visualizing the audio file's data as a float array using an audio plot (see EZAudioPlot).\n */\n@interface EZAudioFile : NSObject\n\n#pragma mark - Blocks\n/**\n A block used when returning back the waveform data. The waveform data itself will be an array of float values and the length indicates the total length of the float array.\n @param waveformData An array of float values representing the amplitude data from the audio waveform\n @param length       The length of the waveform data's float array\n */\ntypedef void (^WaveformDataCompletionBlock)(float *waveformData, UInt32 length);\n\n#pragma mark - Properties\n/**\n A EZAudioFileDelegate for the audio file that is used to return events such as new seek positions within the file and the read audio data as a float array.\n */\n@property (nonatomic,assign) id<EZAudioFileDelegate> audioFileDelegate;\n\n/**\n The resolution of the waveform data. This value specifies how the recommendedDrawingFrameRate chooses itself. A low value like 128 will render a waveform containing 128 points representing a low resolution waveform while a high value like 4096 will render a high quality waveform. Higher resolutions provide more detail, but take more work to render in the audio waveform plots (EZAudioPlot or EZAudioPlotGL) while lower resolutions providel less detail, but work better for displaying many at a time (like in a UITableView)\n */\n@property (nonatomic,assign) UInt32 waveformResolution;\n\n#pragma mark - Initializers\n///-----------------------------------------------------------\n/// @name Initializers\n///-----------------------------------------------------------\n\n/**\n Creates a new instance of the EZAudioFile using a file path URL.\n @param url The file path reference of the audio file as an NSURL.\n @return The newly created EZAudioFile instance.\n */\n-(EZAudioFile*)initWithURL:(NSURL*)url;\n\n/**\n Creates a new instance of the EZAudioFile using a file path URL and allows specifying an EZAudioFileDelegate.\n @param url      The file path reference of the audio file as an NSURL.\n @param delegate The audio file delegate that receives events specified by the EZAudioFileDelegate protocol\n @return The newly created EZAudioFile instance.\n */\n-(EZAudioFile*)initWithURL:(NSURL*)url\n               andDelegate:(id<EZAudioFileDelegate>)delegate;\n\n#pragma mark - Class Initializers\n///-----------------------------------------------------------\n/// @name Class Initializers\n///-----------------------------------------------------------\n\n/**\n Class method that creates a new instance of the EZAudioFile using a file path URL.\n @param url The file path reference of the audio file as an NSURL.\n @return The newly created EZAudioFile instance.\n */\n+(EZAudioFile*)audioFileWithURL:(NSURL*)url;\n\n/**\n Class method that creates a new instance of the EZAudioFile using a file path URL and allows specifying an EZAudioFileDelegate.\n @param url      The file path reference of the audio file as an NSURL.\n @param delegate The audio file delegate that receives events specified by the EZAudioFileDelegate protocol\n @return The newly created EZAudioFile instance.\n */\n+(EZAudioFile*)audioFileWithURL:(NSURL*)url\n                    andDelegate:(id<EZAudioFileDelegate>)delegate;\n\n#pragma mark - Class Methods\n///-----------------------------------------------------------\n/// @name Class Methods\n///-----------------------------------------------------------\n\n/**\n Provides an array of the supported audio files types. Each audio file type is provided as a string, i.e. @\"caf\". Useful for filtering lists of files in an open panel to only the types allowed.\n @return An array of NSString objects representing the represented file types.\n */\n+(NSArray*)supportedAudioFileTypes;\n\n#pragma mark - Events\n///-----------------------------------------------------------\n/// @name Reading The Audio File\n///-----------------------------------------------------------\n\n/**\n Reads a specified number of frames from the audio file. In addition, this will notify the EZAudioFileDelegate (if specified) of the read data as a float array with the audioFile:readAudio:withBufferSize:withNumberOfChannels: event and the new seek position within the file with the audioFile:updatedPosition: event.\n @param frames          The number of frames to read from the file.\n @param audioBufferList An allocated AudioBufferList structure in which to store the read audio data\n @param bufferSize      A pointer to a UInt32 in which to store the read buffersize\n @param eof             A pointer to a BOOL in which to store whether the read operation reached the end of the audio file.\n */\n-(void)readFrames:(UInt32)frames\n  audioBufferList:(AudioBufferList*)audioBufferList\n       bufferSize:(UInt32*)bufferSize\n              eof:(BOOL*)eof;\n\n///-----------------------------------------------------------\n/// @name Seeking Through The Audio File\n///-----------------------------------------------------------\n\n/**\n Seeks through an audio file to a specified frame. This will notify the EZAudioFileDelegate (if specified) with the audioFile:updatedPosition: function.\n @param frame The new frame position to seek to as a SInt64.\n */\n-(void)seekToFrame:(SInt64)frame;\n\n#pragma mark - Getters\n///-----------------------------------------------------------\n/// @name Getting Information About The Audio File\n///-----------------------------------------------------------\n\n/**\n Provides the AudioStreamBasicDescription structure used within the app. The file's format will be converted to this format and then sent back as either a float array or a `AudioBufferList` pointer. Use this when communicating with other EZAudio components.\n @return An AudioStreamBasicDescription structure describing the format of the audio file.\n */\n-(AudioStreamBasicDescription)clientFormat;\n\n/**\n Provides the AudioStreamBasicDescription structure containing the format of the file.\n @return An AudioStreamBasicDescription structure describing the format of the audio file.\n */\n-(AudioStreamBasicDescription)fileFormat;\n\n/**\n Provides the frame index (a.k.a the seek positon) within the audio file as an integer. This can be helpful when seeking through the audio file.\n @return The current frame index within the audio file as a SInt64.\n */\n-(SInt64)frameIndex;\n\n/**\n Provides a dictionary containing the metadata (ID3) tags that are included in the header for the audio file. Typically this contains stuff like artist, title, release year, etc.\n @return An NSDictionary containing the metadata for the audio file.\n */\n-(NSDictionary *)metadata;\n\n/**\n Provides the total duration of the audio file in seconds.\n @return The total duration of the audio file as a Float32.\n */\n-(Float32)totalDuration;\n\n/**\n Provides the total frame count of the audio file.\n @return The total number of frames in the audio file as a SInt64.\n */\n-(SInt64)totalFrames;\n\n/**\n Provides the NSURL for the audio file.\n @return An NSURL representing the path of the EZAudioFile instance.\n */\n-(NSURL*)url;\n\n#pragma mark - Helpers\n///-----------------------------------------------------------\n/// @name Manipulating The Audio Data\n///-----------------------------------------------------------\n\n/**\n Tells the caller whether the EZAudioFile has cached waveform data that was loaded via the getWaveformDataWithCompletionBlock: function.\n *  @return A BOOL indicating whether there is cached waveform data\n */\n-(BOOL)hasLoadedAudioData;\n\n/**\n Asynchronously pulls the waveform amplitude data into a float array for the receiver.\n @param waveformDataCompletionBlock A WaveformDataCompletionBlock that executes when the waveform data has been extracted. Provides the waveform data as a float array and the length of the array.\n */\n-(void)getWaveformDataWithCompletionBlock:(WaveformDataCompletionBlock)waveformDataCompletionBlock;\n\n/**\n Provides the minimum number of buffers that would be required with the constant frames read rate provided.\n @param frameRate A constant frame rate to use when calculating the number of buffers needed as a UInt32.\n @return The minimum number of buffers required for the constant frames read rate provided as a UInt32.\n */\n-(UInt32)minBuffersWithFrameRate:(UInt32)frameRate;\n\n/**\n Provides a frame rate to use when drawing and averaging a bin of values to create each point in a graph. The ideal amount of end buffers seems to be between 1000-3000 so we determine a frame rate per audio file that can achieve a high degree of detail for the entire waveform.\n @return A frame rate value as a UInt32 to use when reading frames in a file.\n */\n-(UInt32)recommendedDrawingFrameRate;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/EZAudioFile.m",
    "content": "//\n//  EZAudioFile.m\n//  EZAudio\n//\n//  Created by Syed Haris Ali on 12/1/13.\n//  Copyright (c) 2013 Syed Haris Ali. All rights reserved.\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#import \"EZAudioFile.h\"\n\n#import \"EZAudio.h\"\n\n#define kEZAudioFileWaveformDefaultResolution (1024)\n\n@interface EZAudioFile (){\n  \n  // Reading from the audio file\n  ExtAudioFileRef             _audioFile;\n  AudioStreamBasicDescription _clientFormat;\n  AudioStreamBasicDescription _fileFormat;\n  float                       **_floatBuffers;\n  AEFloatConverter            *_floatConverter;\n  SInt64                      _frameIndex;\n  CFURLRef                    _sourceURL;\n  Float32                     _totalDuration;\n  SInt64                      _totalFrames;\n  \n  // Waveform Data\n  float  *_waveformData;\n  UInt32 _waveformFrameRate;\n  UInt32 _waveformTotalBuffers;\n  \n}\n@end\n\n@implementation EZAudioFile\n@synthesize audioFileDelegate = _audioFileDelegate;\n@synthesize waveformResolution = _waveformResolution;\n\n#pragma mark - Initializers\n-(EZAudioFile*)initWithURL:(NSURL*)url {\n  self = [super init];\n  if(self){\n    _sourceURL = (__bridge CFURLRef)url;\n    [self _configureAudioFile];\n  }\n  return self;\n}\n\n-(EZAudioFile *)initWithURL:(NSURL *)url andDelegate:(id<EZAudioFileDelegate>)delegate {\n  self = [self initWithURL:url];\n  if(self){\n    self.audioFileDelegate = delegate;\n  }\n  return self;\n}\n\n#pragma mark - Class Initializers\n+(EZAudioFile*)audioFileWithURL:(NSURL*)url {\n  return [[EZAudioFile alloc] initWithURL:url];\n}\n\n+(EZAudioFile *)audioFileWithURL:(NSURL *)url andDelegate:(id<EZAudioFileDelegate>)delegate {\n  return [[EZAudioFile alloc] initWithURL:url andDelegate:delegate];\n}\n\n#pragma mark - Class Methods\n+(NSArray *)supportedAudioFileTypes {\n  return @[ @\"aac\",\n            @\"caf\",\n            @\"aif\",\n            @\"aiff\",\n            @\"aifc\",\n            @\"mp3\",\n            @\"mp4\",\n            @\"m4a\",\n            @\"snd\",\n            @\"au\",\n            @\"sd2\",\n            @\"wav\" ];\n}\n\n#pragma mark - Private Configuation\n-(void)_configureAudioFile {\n  \n  // Source URL should not be nil\n  NSAssert(_sourceURL,@\"Source URL was not specified correctly.\");\n  \n  // Try to open the file for reading\n  [EZAudio checkResult:ExtAudioFileOpenURL(_sourceURL,&_audioFile)\n             operation:\"Failed to open audio file for reading\"];\n  \n  // Try pulling the stream description\n  UInt32 size = sizeof(_fileFormat);\n  [EZAudio checkResult:ExtAudioFileGetProperty(_audioFile,kExtAudioFileProperty_FileDataFormat, &size, &_fileFormat)\n             operation:\"Failed to get audio stream basic description of input file\"];\n  \n  // Try pulling the total frame size\n  size = sizeof(_totalFrames);\n  [EZAudio checkResult:ExtAudioFileGetProperty(_audioFile,kExtAudioFileProperty_FileLengthFrames, &size, &_totalFrames)\n             operation:\"Failed to get total frames of input file\"];\n  _totalFrames = MAX(1, _totalFrames);\n  \n  // Total duration\n  _totalDuration = _totalFrames / _fileFormat.mSampleRate;\n  \n  // Set the client format on the stream\n  switch (_fileFormat.mChannelsPerFrame) {\n    case 1:\n      _clientFormat = [EZAudio monoFloatFormatWithSampleRate:_fileFormat.mSampleRate];\n      break;\n    case 2:\n      _clientFormat = [EZAudio stereoFloatInterleavedFormatWithSampleRate:_fileFormat.mSampleRate];\n      break;\n    default:\n      break;\n  }\n    \n  [EZAudio checkResult:ExtAudioFileSetProperty(_audioFile,\n                                               kExtAudioFileProperty_ClientDataFormat,\n                                               sizeof (AudioStreamBasicDescription),\n                                               &_clientFormat)\n             operation:\"Couldn't set client data format on input ext file\"];\n  \n  // Allocate the float buffers\n  _floatConverter = [[AEFloatConverter alloc] initWithSourceFormat:_clientFormat];\n  size_t sizeToAllocate = sizeof(float*) * _clientFormat.mChannelsPerFrame;\n  sizeToAllocate = MAX(8, sizeToAllocate);\n  _floatBuffers   = (float**)malloc( sizeToAllocate );\n  UInt32 outputBufferSize = 32 * 1024; // 32 KB\n  for ( int i=0; i< _clientFormat.mChannelsPerFrame; i++ ) {\n    _floatBuffers[i] = (float*)malloc(outputBufferSize);\n  }\n  \n    [EZAudio printASBD:_fileFormat];\n    \n  // There's no waveform data yet\n  _waveformData = NULL;\n  \n  // Set the default resolution for the waveform data\n  _waveformResolution = kEZAudioFileWaveformDefaultResolution;\n  \n}\n\n#pragma mark - Events\n-(void)readFrames:(UInt32)frames\n  audioBufferList:(AudioBufferList *)audioBufferList\n       bufferSize:(UInt32 *)bufferSize\n              eof:(BOOL *)eof {\n    [EZAudio checkResult:ExtAudioFileRead(_audioFile,\n                                          &frames,\n                                          audioBufferList)\n               operation:\"Failed to read audio data from audio file\"];\n    *bufferSize = audioBufferList->mBuffers[0].mDataByteSize/sizeof(float);\n    *eof = frames == 0;\n    _frameIndex += frames;\n    if( self.audioFileDelegate ){\n      if( [self.audioFileDelegate respondsToSelector:@selector(audioFile:updatedPosition:)] ){\n        [self.audioFileDelegate audioFile:self\n                          updatedPosition:_frameIndex];\n      }\n      if( [self.audioFileDelegate respondsToSelector:@selector(audioFile:readAudio:withBufferSize:withNumberOfChannels:)] ){\n        AEFloatConverterToFloat(_floatConverter,audioBufferList,_floatBuffers,frames);\n        [self.audioFileDelegate audioFile:self\n                                readAudio:_floatBuffers\n                           withBufferSize:frames\n                     withNumberOfChannels:_clientFormat.mChannelsPerFrame];\n      }\n    }\n}\n\n-(void)seekToFrame:(SInt64)frame {\n  [EZAudio checkResult:ExtAudioFileSeek(_audioFile,frame)\n             operation:\"Failed to seek frame position within audio file\"];\n  _frameIndex = frame;\n  if( self.audioFileDelegate ){\n    if( [self.audioFileDelegate respondsToSelector:@selector(audioFile:updatedPosition:)] ){\n      [self.audioFileDelegate audioFile:self updatedPosition:_frameIndex];\n    }\n  }\n}\n\n#pragma mark - Getters\n-(BOOL)hasLoadedAudioData {\n  return _waveformData != NULL;\n}\n\n-(void)getWaveformDataWithCompletionBlock:(WaveformDataCompletionBlock)waveformDataCompletionBlock {\n  \n  SInt64 currentFramePosition = _frameIndex;\n  \n  if( _waveformData != NULL ){\n    waveformDataCompletionBlock( _waveformData, _waveformTotalBuffers );\n    return;\n  }\n  \n  _waveformFrameRate    = [self recommendedDrawingFrameRate];\n  _waveformTotalBuffers = [self minBuffersWithFrameRate:_waveformFrameRate];\n  _waveformData         = (float*)malloc(sizeof(float)*_waveformTotalBuffers);\n  \n  if( self.totalFrames == 0 ){\n    waveformDataCompletionBlock( _waveformData, _waveformTotalBuffers );\n    return;\n  }\n  \n  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0ul), ^{\n    \n    for( int i = 0; i < _waveformTotalBuffers; i++ ){\n      \n      // Take a snapshot of each buffer through the audio file to form the waveform\n      AudioBufferList *bufferList = [EZAudio audioBufferListWithNumberOfFrames:_waveformFrameRate\n                                                              numberOfChannels:_clientFormat.mChannelsPerFrame\n                                                                   interleaved:YES];\n      UInt32 bufferSize;\n      BOOL eof;\n      \n      // Read in the specified number of frames\n      [EZAudio checkResult:ExtAudioFileRead(_audioFile,\n                                            &_waveformFrameRate,\n                                            bufferList)\n                 operation:\"Failed to read audio data from audio file\"];\n      bufferSize = bufferList->mBuffers[0].mDataByteSize/sizeof(float);\n      bufferSize = MAX(1, bufferSize);\n      eof = _waveformFrameRate == 0;\n      _frameIndex += _waveformFrameRate;\n      \n      // Calculate RMS of each buffer\n      float rms = [EZAudio RMS:bufferList->mBuffers[0].mData\n                        length:bufferSize];\n      _waveformData[i] = rms;\n      \n      // Since we malloc'ed, we should cleanup\n      [EZAudio freeBufferList:bufferList];\n      \n    }\n    \n    // Seek the audio file back to the beginning\n    [EZAudio checkResult:ExtAudioFileSeek(_audioFile,currentFramePosition)\n               operation:\"Failed to seek frame position within audio file\"];\n    _frameIndex = currentFramePosition;\n    \n    // Once we're done send off the waveform data\n    dispatch_async(dispatch_get_main_queue(), ^{\n      waveformDataCompletionBlock( _waveformData, _waveformTotalBuffers );\n    });\n\n  });\n  \n}\n\n-(AudioStreamBasicDescription)clientFormat {\n  return _clientFormat;\n}\n\n-(AudioStreamBasicDescription)fileFormat {\n  return _fileFormat;\n}\n\n-(SInt64)frameIndex {\n  return _frameIndex;\n}\n\n-(NSDictionary *)metadata\n{\n    AudioFileID audioFileID;\n    UInt32 propSize = sizeof(audioFileID);\n    \n    [EZAudio checkResult:ExtAudioFileGetProperty(_audioFile,\n                                                 kExtAudioFileProperty_AudioFile,\n                                                 &propSize,\n                                                 &audioFileID)\n               operation:\"Failed to get audio file id\"];\n    \n    CFDictionaryRef metadata;\n    UInt32 isWritable;\n    [EZAudio checkResult:AudioFileGetPropertyInfo(audioFileID,\n                                                  kAudioFilePropertyInfoDictionary,\n                                                  &propSize,\n                                                  &isWritable)\n               operation:\"Failed to get the size of the metadata dictionary\"];\n    \n    [EZAudio checkResult:AudioFileGetProperty(audioFileID,\n                                              kAudioFilePropertyInfoDictionary,\n                                              &propSize,\n                                              &metadata)\n               operation:\"Failed to get metadata dictionary\"];\n    \n    return (__bridge NSDictionary *)metadata;\n}\n\n-(Float32)totalDuration {\n  return _totalDuration;\n}\n\n-(SInt64)totalFrames {\n  return _totalFrames;\n}\n\n-(NSURL *)url {\n  return (__bridge NSURL*)_sourceURL;\n}\n\n#pragma mark - Setters\n-(void)setWaveformResolution:(UInt32)waveformResolution {\n  if( _waveformResolution != waveformResolution ){\n    _waveformResolution = waveformResolution;\n    if( _waveformData ){\n      free(_waveformData);\n      _waveformData = NULL;\n    }\n  }\n}\n\n#pragma mark - Helpers\n-(UInt32)minBuffersWithFrameRate:(UInt32)frameRate {\n  frameRate = frameRate > 0 ? frameRate : 1;\n  UInt32 val = (UInt32) _totalFrames / frameRate + 1;\n  return MAX(1, val);\n}\n\n-(UInt32)recommendedDrawingFrameRate {\n  UInt32 val = 1;\n  if(_waveformResolution > 0){\n    val = (UInt32) _totalFrames / _waveformResolution;\n    if(val > 1)\n      --val;\n  }\n  return MAX(1, val);\n}\n\n#pragma mark - Cleanup\n-(void)dealloc {\n  if( _waveformData ){\n    free(_waveformData);\n    _waveformData = NULL;\n  }\n//  if( _floatBuffers ){\n//    free(_floatBuffers);\n//    _floatBuffers = NULL;\n//  }\n  _frameIndex = 0;\n  _waveformFrameRate = 0;\n  _waveformTotalBuffers = 0;\n  if( _audioFile ){\n    [EZAudio checkResult:ExtAudioFileDispose(_audioFile)\n               operation:\"Failed to dispose of audio file\"];\n  }\n}\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/EZAudioPlayer.h",
    "content": "//\n//  EZAudioPlayer.h\n//  EZAudio\n//\n//  Created by Syed Haris Ali on 1/16/14.\n//  Copyright (c) 2014 Syed Haris Ali. All rights reserved.\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#import <Foundation/Foundation.h>\n#import \"TargetConditionals.h\"\n\n#import \"EZAudio.h\"\n\n#if TARGET_OS_IPHONE\n  #import <AVFoundation/AVFoundation.h>\n#elif TARGET_OS_MAC\n#endif\n\n@class EZAudioPlayer;\n\n/**\n The EZAudioPlayerDelegate provides event callbacks for the EZAudioPlayer. These type of events are triggered by changes in the EZAudioPlayer's state and allow someone implementing the EZAudioPlayer to more easily update their user interface. Events are triggered anytime the EZAudioPlayer resumes/pauses playback, reaches the end of the file, reads audio data and converts it to float data visualizations (using the EZAudioFile), and updates its cursor position within the audio file during playback (use this for the play position on a slider on the user interface).\n @warning These callbacks don't necessarily occur on the main thread so make sure you wrap any UI code in a GCD block like: dispatch_async(dispatch_get_main_queue(), ^{ // Update UI });\n */\n@protocol EZAudioPlayerDelegate <NSObject>\n\n@optional\n/**\n Triggered by the EZAudioPlayer when the playback has been resumed or started.\n @param audioPlayer The instance of the EZAudioPlayer that triggered the event\n @param audioFile   The instance of the EZAudioFile that the event was triggered from\n */\n-(void)audioPlayer:(EZAudioPlayer*)audioPlayer didResumePlaybackOnAudioFile:(EZAudioFile*)audioFile;\n\n/**\n Triggered by the EZAudioPlayer when the playback has been paused.\n @param audioPlayer The instance of the EZAudioPlayer that triggered the event\n @param audioFile   The instance of the EZAudioFile that the event was triggered from\n */\n-(void)audioPlayer:(EZAudioPlayer*)audioPlayer didPausePlaybackOnAudioFile:(EZAudioFile*)audioFile;\n\n/**\n Triggered by the EZAudioPlayer when the output has reached the end of the EZAudioFile it's playing. If the EZAudioPlayer has its `shouldLoop` property set to true this will trigger, but playback will continue to loop once its hit the end of the audio file.\n @param audioPlayer The instance of the EZAudioPlayer that triggered the event\n @param audioFile   The instance of the EZAudioFile that the event was triggered from\n */\n-(void)audioPlayer:(EZAudioPlayer*)audioPlayer reachedEndOfAudioFile:(EZAudioFile*)audioFile;\n\n/**\n Triggered by the EZAudioPlayer's internal EZAudioFile's EZAudioFileDelegate callback and notifies the delegate of the read audio data as a float array instead of a buffer list. Common use case of this would be to visualize the float data using an audio plot or audio data dependent OpenGL sketch.\n @param audioPlayer The instance of the EZAudioPlayer that triggered the event\n @param buffer           A float array of float arrays holding the audio data. buffer[0] would be the left channel's float array while buffer[1] would be the right channel's float array in a stereo file.\n @param bufferSize       The length of the buffers float arrays\n @param numberOfChannels The number of channels. 2 for stereo, 1 for mono.\n @param audioFile   The instance of the EZAudioFile that the event was triggered from\n */\n-(void)   audioPlayer:(EZAudioPlayer*)audioPlayer\n            readAudio:(float**)buffer\n       withBufferSize:(UInt32)bufferSize\n withNumberOfChannels:(UInt32)numberOfChannels\n          inAudioFile:(EZAudioFile*)audioFile;;\n\n/**\n Triggered by EZAudioPlayer's internal EZAudioFile's EZAudioFileDelegate callback and notifies the delegate of the current playback position. The framePosition provides the current frame position and can be calculated against the EZAudioPlayer's total frames using the `totalFrames` function from the EZAudioPlayer.\n @param audioPlayer The instance of the EZAudioPlayer that triggered the event\n @param framePosition The new frame index as a 64-bit signed integer\n @param audioFile   The instance of the EZAudioFile that the event was triggered from\n */\n-(void)audioPlayer:(EZAudioPlayer*)audioPlayer\n   updatedPosition:(SInt64)framePosition\n       inAudioFile:(EZAudioFile*)audioFile;\n\n@end\n\n/**\n The EZAudioPlayer acts as the master delegate (the EZAudioFileDelegate) over whatever EZAudioFile it is using for playback. Classes that want to get the EZAudioFileDelegate callbacks should implement the EZAudioPlayer's EZAudioPlayerDelegate on the EZAudioPlayer instance.\n */\n@interface EZAudioPlayer : NSObject\n\n#pragma mark - Properties\n///-----------------------------------------------------------\n/// @name Properties\n///-----------------------------------------------------------\n\n/**\n The EZAudioPlayerDelegate that will handle the audio player callbacks\n */\n@property (nonatomic,assign) id<EZAudioPlayerDelegate> audioPlayerDelegate;\n\n/**\n A BOOL indicating whether the player should loop the file\n */\n@property (nonatomic,assign) BOOL shouldLoop;\n\n#pragma mark - Initializers\n///-----------------------------------------------------------\n/// @name Initializers\n///-----------------------------------------------------------\n\n/**\n Initializes the EZAudioPlayer with an EZAudioFile instance. This does not use the EZAudioFile by reference, but instead creates a separate EZAudioFile instance with the same file at the given file path provided by the internal NSURL to use for internal seeking so it doesn't cause any locking between the caller's instance of the EZAudioFile.\n @param audioFile The instance of the EZAudioFile to use for initializing the EZAudioPlayer\n @return The newly created instance of the EZAudioPlayer\n */\n-(EZAudioPlayer*)initWithEZAudioFile:(EZAudioFile*)audioFile;\n\n/**\n Initializes the EZAudioPlayer with an EZAudioFile instance and provides a way to assign the EZAudioPlayerDelegate on instantiation. This does not use the EZAudioFile by reference, but instead creates a separate EZAudioFile instance with the same file at the given file path provided by the internal NSURL to use for internal seeking so it doesn't cause any locking between the caller's instance of the EZAudioFile.\n @param audioFile The instance of the EZAudioFile to use for initializing the EZAudioPlayer\n @param audioPlayerDelegate The receiver that will act as the EZAudioPlayerDelegate. Set to nil if it should have no delegate or use the initWithEZAudioFile: function instead.\n @return The newly created instance of the EZAudioPlayer\n */\n-(EZAudioPlayer*)initWithEZAudioFile:(EZAudioFile*)audioFile\n                        withDelegate:(id<EZAudioPlayerDelegate>)audioPlayerDelegate;\n\n/**\n Initializes the EZAudioPlayer with an NSURL instance representing the file path of the audio file.\n @param url The NSURL instance representing the file path of the audio file.\n @return The newly created instance of the EZAudioPlayer\n */\n-(EZAudioPlayer*)initWithURL:(NSURL*)url;\n\n/**\n Initializes the EZAudioPlayer with an NSURL instance representing the file path of the audio file and a caller to assign as the EZAudioPlayerDelegate on instantiation.\n @param url The NSURL instance representing the file path of the audio file.\n @param audioPlayerDelegate The receiver that will act as the EZAudioPlayerDelegate. Set to nil if it should have no delegate or use the initWithEZAudioFile: function instead.\n @return The newly created instance of the EZAudioPlayer\n */\n-(EZAudioPlayer*)initWithURL:(NSURL*)url\n                withDelegate:(id<EZAudioPlayerDelegate>)audioPlayerDelegate;\n\n\n#pragma mark - Class Initializers\n///-----------------------------------------------------------\n/// @name Class Initializers\n///-----------------------------------------------------------\n\n/**\n Class initializer that initializes the EZAudioPlayer with an EZAudioFile instance. This does not use the EZAudioFile by reference, but instead creates a separate EZAudioFile instance with the same file at the given file path provided by the internal NSURL to use for internal seeking so it doesn't cause any locking between the caller's instance of the EZAudioFile.\n @param audioFile The instance of the EZAudioFile to use for initializing the EZAudioPlayer\n @return The newly created instance of the EZAudioPlayer\n */\n+(EZAudioPlayer*)audioPlayerWithEZAudioFile:(EZAudioFile*)audioFile;\n\n/**\n Class initializer that initializes the EZAudioPlayer with an EZAudioFile instance and provides a way to assign the EZAudioPlayerDelegate on instantiation. This does not use the EZAudioFile by reference, but instead creates a separate EZAudioFile instance with the same file at the given file path provided by the internal NSURL to use for internal seeking so it doesn't cause any locking between the caller's instance of the EZAudioFile.\n @param audioFile The instance of the EZAudioFile to use for initializing the EZAudioPlayer\n @param audioPlayerDelegate The receiver that will act as the EZAudioPlayerDelegate. Set to nil if it should have no delegate or use the audioPlayerWithEZAudioFile: function instead.\n @return The newly created instance of the EZAudioPlayer\n */\n+(EZAudioPlayer*)audioPlayerWithEZAudioFile:(EZAudioFile*)audioFile\n                               withDelegate:(id<EZAudioPlayerDelegate>)audioPlayerDelegate;\n\n/**\n Class initializer that initializes the EZAudioPlayer with an NSURL instance representing the file path of the audio file.\n @param url The NSURL instance representing the file path of the audio file.\n @return The newly created instance of the EZAudioPlayer\n */\n+(EZAudioPlayer*)audioPlayerWithURL:(NSURL*)url;\n\n/**\n Class initializer that initializes the EZAudioPlayer with an NSURL instance representing the file path of the audio file and a caller to assign as the EZAudioPlayerDelegate on instantiation.\n @param url The NSURL instance representing the file path of the audio file.\n @param audioPlayerDelegate The receiver that will act as the EZAudioPlayerDelegate. Set to nil if it should have no delegate or use the audioPlayerWithURL: function instead.\n @return The newly created instance of the EZAudioPlayer\n */\n+(EZAudioPlayer*)audioPlayerWithURL:(NSURL*)url\n                       withDelegate:(id<EZAudioPlayerDelegate>)audioPlayerDelegate;\n\n#pragma mark - Singleton\n///-----------------------------------------------------------\n/// @name Shared Instance\n///-----------------------------------------------------------\n\n/**\n The shared instance (singleton) of the audio player. Most applications will only have one instance of the EZAudioPlayer that can be reused with multiple different audio files.\n *  @return The shared instance of the EZAudioPlayer.\n */\n+(EZAudioPlayer*)sharedAudioPlayer;\n\n#pragma mark - Getters\n///-----------------------------------------------------------\n/// @name Getting The Audio Player's Properties\n///-----------------------------------------------------------\n\n/**\n Provides the EZAudioFile instance that is being used as the datasource for playback.\n @return The EZAudioFile instance that is currently being used for playback.\n */\n-(EZAudioFile*)audioFile;\n\n/**\n Provides the current time (a.k.a. the seek position) in seconds within the audio file that's being used for playback. This can be helpful when displaying the audio player's current time over duration.\n @return A float representing the current time within the audio file used for playback.\n */\n-(float)currentTime;\n\n/**\n Provides a flag indicating whether the EZAudioPlayer has reached the end of the audio file used for playback.\n @return A BOOL indicating whether or not the EZAudioPlayer has reached the end of the file it is using for playback.\n */\n-(BOOL)endOfFile;\n\n/**\n Provides the frame index (a.k.a the seek positon) within the audio file being used for playback. This can be helpful when seeking through the audio file.\n @return An SInt64 representing the current frame index within the audio file used for playback.\n */\n-(SInt64)frameIndex;\n\n/**\n Provides a flag indicating whether the EZAudioPlayer is currently playing back any audio.\n @return A BOOL indicating whether or not the EZAudioPlayer is performing playback,\n */\n-(BOOL)isPlaying;\n\n/**\n Provides the EZOutput instance that is being used to provide playback to the system output.\n @return The EZOutput instance that is currently being used for output playback.\n */\n-(EZOutput*)output;\n\n/**\n Provides the total duration of the current audio file being used for playback (in seconds).\n @return A float representing the total duration of the current audio file being used for playback in seconds.\n */\n-(float)totalDuration;\n\n/**\n Provides the total amount of frames in the current audio file being used for playback.\n @return A SInt64 representing the total amount of frames in the current audio file being used for playback.\n */\n-(SInt64)totalFrames;\n\n/**\n Provides the file path that's currently being used by the player for playback.\n @return  The NSURL representing the file path of the audio file being used for playback.\n */\n-(NSURL*)url;\n\n#pragma mark - Setters\n///-----------------------------------------------------------\n/// @name Setting The File/Output\n///-----------------------------------------------------------\n\n/**\n Sets the EZAudioFile to use for playback. This does not use the EZAudioFile by reference, but instead creates a separate EZAudioFile instance with the same file at the given file path provided by the internal NSURL to use for internal seeking so it doesn't cause any locking between the caller's instance of the EZAudioFile.\n @param audioFile The new EZAudioFile instance that should be used for playback\n */\n-(void)setAudioFile:(EZAudioFile*)audioFile;\n\n/**\n Sets the EZOutput to route playback. By default this uses the [EZOutput sharedOutput] singleton.\n @param output The new EZOutput instance that should be used for playback\n */\n-(void)setOutput:(EZOutput*)output;\n\n#pragma mark - Methods\n///-----------------------------------------------------------\n/// @name Play/Pause/Seeking the Player\n///-----------------------------------------------------------\n\n/**\n Starts or resumes playback.\n */\n-(void)play;\n\n/**\n Pauses playback.\n */\n-(void)pause;\n\n/**\n Stops playback.\n */\n-(void)stop;\n\n/**\n Seeks playback to a specified frame within the internal EZAudioFile. This will notify the EZAudioFileDelegate (if specified) with the audioPlayer:updatedPosition:inAudioFile: function.\n @param frame The new frame position to seek to as a SInt64.\n */\n-(void)seekToFrame:(SInt64)frame;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/EZAudioPlayer.m",
    "content": "//\n//  EZAudioPlayer.m\n//  EZAudio\n//\n//  Created by Syed Haris Ali on 1/16/14.\n//  Copyright (c) 2014 Syed Haris Ali. All rights reserved.\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#import \"EZAudioPlayer.h\"\n\n#if TARGET_OS_IPHONE\n#elif TARGET_OS_MAC\n#endif\n@interface EZAudioPlayer () <EZAudioFileDelegate,EZOutputDataSource>\n{\n  BOOL _eof;\n}\n@property (nonatomic,strong,setter=setAudioFile:) EZAudioFile *audioFile;\n@property (nonatomic,strong,setter=setOutput:)    EZOutput    *output;\n@end\n\n@implementation EZAudioPlayer\n@synthesize audioFile = _audioFile;\n@synthesize audioPlayerDelegate = _audioPlayerDelegate;\n@synthesize output = _output;\n@synthesize shouldLoop = _shouldLoop;\n\n#pragma mark - Initializers\n-(id)init {\n  self = [super init];\n  if(self){\n    [self _configureAudioPlayer];\n  }\n  return self;\n}\n\n-(EZAudioPlayer*)initWithEZAudioFile:(EZAudioFile *)audioFile {\n  return [self initWithEZAudioFile:audioFile withDelegate:nil];\n}\n\n-(EZAudioPlayer *)initWithEZAudioFile:(EZAudioFile *)audioFile\n                         withDelegate:(id<EZAudioPlayerDelegate>)audioPlayerDelegate {\n  self = [super init];\n  if(self){\n    // This should make a separate reference to the audio file\n    [self _configureAudioPlayer];\n    self.audioFile           = audioFile;\n    self.audioPlayerDelegate = audioPlayerDelegate;\n  }\n  return self;\n}\n\n-(EZAudioPlayer *)initWithURL:(NSURL *)url {\n  return [self initWithURL:url withDelegate:nil];\n}\n\n-(EZAudioPlayer *)initWithURL:(NSURL *)url\n                 withDelegate:(id<EZAudioPlayerDelegate>)audioPlayerDelegate {\n  self = [super init];\n  if(self){\n    [self _configureAudioPlayer];\n    self.audioFile           = [EZAudioFile audioFileWithURL:url andDelegate:self];\n    self.audioPlayerDelegate = audioPlayerDelegate;\n  }\n  return self;\n}\n\n#pragma mark - Class Initializers\n+(EZAudioPlayer *)audioPlayerWithEZAudioFile:(EZAudioFile *)audioFile {\n  return [[EZAudioPlayer alloc] initWithEZAudioFile:audioFile];\n}\n\n+(EZAudioPlayer *)audioPlayerWithEZAudioFile:(EZAudioFile *)audioFile\n                                withDelegate:(id<EZAudioPlayerDelegate>)audioPlayerDelegate {\n  return [[EZAudioPlayer alloc] initWithEZAudioFile:audioFile\n                                       withDelegate:audioPlayerDelegate];\n}\n\n+(EZAudioPlayer *)audioPlayerWithURL:(NSURL *)url {\n  return [[EZAudioPlayer alloc] initWithURL:url];\n}\n\n+(EZAudioPlayer *)audioPlayerWithURL:(NSURL *)url\n                        withDelegate:(id<EZAudioPlayerDelegate>)audioPlayerDelegate {\n  return [[EZAudioPlayer alloc] initWithURL:url\n                               withDelegate:audioPlayerDelegate];\n}\n\n#pragma mark - Singleton\n+(EZAudioPlayer *)sharedAudioPlayer {\n  static EZAudioPlayer *_sharedAudioPlayer = nil;\n  static dispatch_once_t onceToken;\n  dispatch_once(&onceToken, ^{\n    _sharedAudioPlayer = [[EZAudioPlayer alloc] init];\n  });\n  return _sharedAudioPlayer;\n}\n\n#pragma mark - Private Configuration\n-(void)_configureAudioPlayer {\n  \n  // Defaults\n  self.output = [EZOutput sharedOutput];\n  \n#if TARGET_OS_IPHONE\n  // Configure the AVSession\n  AVAudioSession *audioSession = [AVAudioSession sharedInstance];\n  NSError *err = NULL;\n  [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&err];\n  if( err ){\n    NSLog(@\"There was an error creating the audio session\");\n  }\n//  [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:NULL];\n//  if( err ){\n//    NSLog(@\"There was an error sending the audio to the speakers\");\n//  }\n#elif TARGET_OS_MAC\n#endif\n  \n}\n\n#pragma mark - Getters\n-(EZAudioFile*)audioFile {\n  return _audioFile;\n}\n\n-(float)currentTime {\n  NSAssert(_audioFile,@\"No audio file to perform the seek on, check that EZAudioFile is not nil\");\n  return [EZAudio MAP:self.audioFile.frameIndex\n              leftMin:0\n              leftMax:self.audioFile.totalFrames\n             rightMin:0\n             rightMax:self.audioFile.totalDuration];\n}\n\n-(BOOL)endOfFile {\n  return _eof;\n}\n\n-(SInt64)frameIndex {\n  NSAssert(_audioFile,@\"No audio file to perform the seek on, check that EZAudioFile is not nil\");\n  return _audioFile.frameIndex;\n}\n\n-(BOOL)isPlaying {\n  return self.output.isPlaying;\n}\n\n-(EZOutput*)output {\n  NSAssert(_output,@\"No output was found, this should by default be the EZOutput shared instance\");\n  return _output;\n}\n\n-(float)totalDuration {\n  NSAssert(_audioFile,@\"No audio file to perform the seek on, check that EZAudioFile is not nil\");\n  return _audioFile.totalDuration;\n}\n\n-(SInt64)totalFrames {\n  NSAssert(_audioFile,@\"No audio file to perform the seek on, check that EZAudioFile is not nil\");\n  return _audioFile.totalFrames;\n}\n\n-(NSURL *)url {\n  NSAssert(_audioFile,@\"No audio file to perform the seek on, check that EZAudioFile is not nil\");\n  return _audioFile.url;\n}\n\n#pragma mark - Setters\n-(void)setAudioFile:(EZAudioFile *)audioFile {\n  if( _audioFile ){\n    _audioFile.audioFileDelegate = nil;\n  }\n  _eof       = NO;\n  _audioFile = [EZAudioFile audioFileWithURL:audioFile.url andDelegate:self];\n  NSAssert(_output,@\"No output was found, this should by default be the EZOutput shared instance\");\n  [_output setAudioStreamBasicDescription:self.audioFile.clientFormat];    \n}\n\n-(void)setOutput:(EZOutput*)output {\n  _output                  = output;\n  _output.outputDataSource = self;\n}\n\n#pragma mark - Methods\n-(void)play {\n  NSAssert(_audioFile,@\"No audio file to perform the seek on, check that EZAudioFile is not nil\");\n  if( _audioFile ){\n    [_output startPlayback];\n    if( self.frameIndex != self.totalFrames ){\n      _eof = NO;\n    }\n    if( self.audioPlayerDelegate ){\n      if( [self.audioPlayerDelegate respondsToSelector:@selector(audioPlayer:didResumePlaybackOnAudioFile:)] ){\n        // Notify the delegate we're starting playback\n        [self.audioPlayerDelegate audioPlayer:self didResumePlaybackOnAudioFile:_audioFile];\n      }\n    }\n  }\n}\n\n-(void)pause {\n  NSAssert(self.audioFile,@\"No audio file to perform the seek on, check that EZAudioFile is not nil\");\n  if( _audioFile ){\n    [_output stopPlayback];\n    if( self.audioPlayerDelegate ){\n      if( [self.audioPlayerDelegate respondsToSelector:@selector(audioPlayer:didPausePlaybackOnAudioFile:)] ){\n        // Notify the delegate we're pausing playback\n        [self.audioPlayerDelegate audioPlayer:self didPausePlaybackOnAudioFile:_audioFile];\n      }\n    }\n  }\n}\n\n-(void)seekToFrame:(SInt64)frame {\n  NSAssert(_audioFile,@\"No audio file to perform the seek on, check that EZAudioFile is not nil\");\n  if( _audioFile ){\n    [_audioFile seekToFrame:frame];\n  }\n  if( self.frameIndex != self.totalFrames ){\n    _eof = NO;\n  }\n}\n\n-(void)stop {\n  NSAssert(_audioFile,@\"No audio file to perform the seek on, check that EZAudioFile is not nil\");\n  if( _audioFile ){\n    [_output stopPlayback];\n    [_audioFile seekToFrame:0];\n    _eof = NO;\n  }\n}\n\n#pragma mark - EZAudioFileDelegate\n-(void)audioFile:(EZAudioFile *)audioFile\n       readAudio:(float **)buffer\n  withBufferSize:(UInt32)bufferSize\nwithNumberOfChannels:(UInt32)numberOfChannels {\n  if( self.audioPlayerDelegate ){\n    if( [self.audioPlayerDelegate respondsToSelector:@selector(audioPlayer:readAudio:withBufferSize:withNumberOfChannels:inAudioFile:)] ){\n      [self.audioPlayerDelegate audioPlayer:self\n                                  readAudio:buffer\n                             withBufferSize:bufferSize\n                       withNumberOfChannels:numberOfChannels\n                                inAudioFile:audioFile];\n    }\n  }\n}\n\n-(void)audioFile:(EZAudioFile *)audioFile updatedPosition:(SInt64)framePosition {\n  if( self.audioPlayerDelegate ){\n    if( [self.audioPlayerDelegate respondsToSelector:@selector(audioPlayer:updatedPosition:inAudioFile:)] ){\n      [self.audioPlayerDelegate audioPlayer:self\n                            updatedPosition:framePosition\n                                inAudioFile:audioFile];\n    }\n  }\n}\n\n#pragma mark - EZOutputDataSource\n-(void)             output:(EZOutput *)output\n shouldFillAudioBufferList:(AudioBufferList *)audioBufferList\n        withNumberOfFrames:(UInt32)frames\n{\n    if( self.audioFile )\n    {\n        UInt32 bufferSize;\n        [self.audioFile readFrames:frames\n                   audioBufferList:audioBufferList\n                        bufferSize:&bufferSize\n                               eof:&_eof];\n        if( _eof && self.shouldLoop )\n        {\n            [self seekToFrame:0];\n        }\n    }\n}\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/EZAudioPlot.h",
    "content": "//\n//  EZAudioPlot.h\n//  EZAudio\n//\n//  Created by Syed Haris Ali on 9/2/13.\n//  Copyright (c) 2013 Syed Haris Ali. All rights reserved.\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#import \"TargetConditionals.h\"\n#import \"EZPlot.h\"\n\n@class EZAudio;\n\n#define kEZAudioPlotMaxHistoryBufferLength (8192)\n\n#define kEZAudioPlotDefaultHistoryBufferLength (1024)\n\n/**\n `EZAudioPlot`, a subclass of `EZPlot`, is a cross-platform (iOS and OSX) class that plots an audio waveform using Core Graphics. \n \n The caller provides updates a constant stream of updated audio data in the `updateBuffer:withBufferSize:` function, which in turn will be plotted in one of the plot types:\n    \n * Buffer (`EZPlotTypeBuffer`) - A plot that only consists of the current buffer and buffer size from the last call to `updateBuffer:withBufferSize:`. This looks similar to the default openFrameworks input audio example.\n * Rolling (`EZPlotTypeRolling`) - A plot that consists of a rolling history of values averaged from each buffer. This is the traditional waveform look.\n \n #Parent Methods and Properties#\n \n See EZPlot for full API methods and properties (colors, plot type, update function)\n \n */\n@interface EZAudioPlot : EZPlot\n{\n    CGPoint *plotData;\n    UInt32   plotLength;\n}\n\n#pragma mark - Adjust Resolution\n///-----------------------------------------------------------\n/// @name Adjusting The Resolution\n///-----------------------------------------------------------\n\n/**\n Sets the length of the rolling history display. Can grow or shrink the display up to the maximum size specified by the kEZAudioPlotMaxHistoryBufferLength macro. Will return the actual set value, which will be either the given value if smaller than the kEZAudioPlotMaxHistoryBufferLength or kEZAudioPlotMaxHistoryBufferLength if a larger value is attempted to be set. \n @param  historyLength The new length of the rolling history buffer.\n @return The new value equal to the historyLength or the kEZAudioPlotMaxHistoryBufferLength.\n */\n-(int)setRollingHistoryLength:(int)historyLength;\n\n/**\n Provides the length of the rolling history buffer\n *  @return An int representing the length of the rolling history buffer\n */\n-(int)rollingHistoryLength;\n\n#pragma mark - Subclass Methods\n\n/**\n <#Description#>\n @param data   <#theplotData description#>\n @param length <#length description#>\n */\n-(void)setSampleData:(float *)data\n              length:(int)length;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/EZAudioPlot.m",
    "content": "//\n//  EZAudioPlot.m\n//  EZAudio\n//\n//  Created by Syed Haris Ali on 9/2/13.\n//  Copyright (c) 2013 Syed Haris Ali. All rights reserved.\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#import \"EZAudioPlot.h\"\n\n#import \"EZAudio.h\"\n\n@interface EZAudioPlot () {\n//  BOOL             _hasData;\n//  TPCircularBuffer _historyBuffer;\n\n  // Rolling History\n  BOOL    _setMaxLength;\n  float   *_scrollHistory;\n  int     _scrollHistoryIndex;\n  UInt32  _scrollHistoryLength;\n  BOOL    _changingHistorySize;\n}\n@end\n\n@implementation EZAudioPlot\n@synthesize backgroundColor = _backgroundColor;\n@synthesize color           = _color;\n@synthesize gain            = _gain;\n@synthesize plotType        = _plotType;\n@synthesize shouldFill      = _shouldFill;\n@synthesize shouldMirror    = _shouldMirror;\n\n#pragma mark - Initialization\n-(id)init {\n  self = [super init];\n  if(self){\n    [self initPlot];\n  }\n  return self;\n}\n\n-(id)initWithCoder:(NSCoder *)aDecoder {\n  self = [super initWithCoder:aDecoder];\n  if(self){\n    [self initPlot];\n  }\n  return self;\n}\n\n#if TARGET_OS_IPHONE\n-(id)initWithFrame:(CGRect)frameRect {\n#elif TARGET_OS_MAC\n-(id)initWithFrame:(NSRect)frameRect {\n#endif\n  self = [super initWithFrame:frameRect];\n  if(self){\n    [self initPlot];\n  }\n  return self;\n}\n  \n-(void)initPlot {\n#if TARGET_OS_IPHONE\n  self.backgroundColor = [UIColor blackColor];\n  self.color           = [UIColor colorWithHue:0 saturation:1.0 brightness:1.0 alpha:1.0];\n#elif TARGET_OS_MAC\n  self.backgroundColor = [NSColor blackColor];\n  self.color           = [NSColor colorWithCalibratedHue:0 saturation:1.0 brightness:1.0 alpha:1.0];\n#endif\n  self.gain            = 1.0;\n  self.plotType        = EZPlotTypeRolling;\n  self.shouldMirror    = NO;\n  self.shouldFill      = NO;\n  plotData             = NULL;\n  _scrollHistory       = NULL;\n  _scrollHistoryLength = kEZAudioPlotDefaultHistoryBufferLength;\n}\n  \n#pragma mark - Setters\n-(void)setBackgroundColor:(id)backgroundColor {\n  _backgroundColor = backgroundColor;\n  [self _refreshDisplay];\n}\n  \n-(void)setColor:(id)color {\n  _color = color;\n  [self _refreshDisplay];\n}\n  \n-(void)setGain:(float)gain {\n  _gain = gain;\n  [self _refreshDisplay];\n}\n\n-(void)setPlotType:(EZPlotType)plotType {\n  _plotType = plotType;\n  [self _refreshDisplay];\n}\n\n-(void)setShouldFill:(BOOL)shouldFill {\n  _shouldFill = shouldFill;\n  [self _refreshDisplay];\n}\n\n-(void)setShouldMirror:(BOOL)shouldMirror {\n  _shouldMirror = shouldMirror;\n  [self _refreshDisplay];\n}\n  \n-(void)_refreshDisplay {\n#if TARGET_OS_IPHONE\n  [self setNeedsDisplay];\n#elif TARGET_OS_MAC\n  [self setNeedsDisplay:YES];\n#endif\n}\n  \n#pragma mark - Get Data\n-(void)setSampleData:(float *)data\n              length:(int)length {\n  if( plotData != nil ){\n    free(plotData);\n  }\n  \n  plotData   = (CGPoint *)calloc(sizeof(CGPoint),length);\n  plotLength = length;\n  \n  for(int i = 0; i < length; i++) {\n    data[i]     = i == 0 ? 0 : data[i];\n    plotData[i] = CGPointMake(i,data[i] * _gain);\n  }\n    \n  [self _refreshDisplay];\n}\n  \n#pragma mark - Update\n-(void)updateBuffer:(float *)buffer withBufferSize:(UInt32)bufferSize {\n  if( _plotType == EZPlotTypeRolling ){\n    \n    // Update the scroll history datasource\n    [EZAudio updateScrollHistory:&_scrollHistory\n                      withLength:_scrollHistoryLength\n                         atIndex:&_scrollHistoryIndex\n                      withBuffer:buffer\n                  withBufferSize:bufferSize\n            isResolutionChanging:&_changingHistorySize];\n\n    // \n    [self setSampleData:_scrollHistory\n                 length:(!_setMaxLength?kEZAudioPlotMaxHistoryBufferLength:_scrollHistoryLength)];\n    _setMaxLength = YES;\n    \n  }\n  else if( _plotType == EZPlotTypeBuffer ){\n    \n    [self setSampleData:buffer\n                 length:bufferSize];\n    \n  }\n  else {\n    \n    // Unknown plot type\n    \n  }\n}\n    \n#if TARGET_OS_IPHONE\n- (void)drawRect:(CGRect)rect\n{\n  CGContextRef ctx = UIGraphicsGetCurrentContext();\n  CGContextSaveGState(ctx);\n  CGRect frame = self.bounds;\n#elif TARGET_OS_MAC\n  - (void)drawRect:(NSRect)dirtyRect\n  {\n    [[NSGraphicsContext currentContext] saveGraphicsState];\n    NSGraphicsContext * nsGraphicsContext = [NSGraphicsContext currentContext];\n    CGContextRef ctx = (CGContextRef) [nsGraphicsContext graphicsPort];\n    NSRect frame = self.bounds;\n#endif\n    \n#if TARGET_OS_IPHONE\n    // Set the background color\n    [(UIColor*)self.backgroundColor set];\n    UIRectFill(frame);\n    // Set the waveform line color\n    [(UIColor*)self.color set];\n#elif TARGET_OS_MAC\n    [(NSColor*)self.backgroundColor set];\n    NSRectFill(frame);\n    [(NSColor*)self.color set];\n#endif\n    \n    if(plotLength > 0) {\n      \n      plotData[plotLength-1] = CGPointMake(plotLength-1,0.0f);\n      \n      CGMutablePathRef halfPath = CGPathCreateMutable();\n      CGPathAddLines(halfPath,\n                     NULL,\n                     plotData,\n                     plotLength);\n      CGMutablePathRef path = CGPathCreateMutable();\n      \n      double xscale = (frame.size.width) / (float)plotLength;\n      double halfHeight = floor( frame.size.height / 2.0 );\n      \n      // iOS drawing origin is flipped by default so make sure we account for that\n      int deviceOriginFlipped = 1;\n#if TARGET_OS_IPHONE\n      deviceOriginFlipped = -1;\n#elif TARGET_OS_MAC\n      deviceOriginFlipped = 1;\n#endif\n      \n      CGAffineTransform xf = CGAffineTransformIdentity;\n      xf = CGAffineTransformTranslate( xf, frame.origin.x , halfHeight + frame.origin.y );\n      xf = CGAffineTransformScale( xf, xscale, deviceOriginFlipped*halfHeight );\n      CGPathAddPath( path, &xf, halfPath );\n      \n      if( self.shouldMirror ){\n        xf = CGAffineTransformIdentity;\n        xf = CGAffineTransformTranslate( xf, frame.origin.x , halfHeight + frame.origin.y);\n        xf = CGAffineTransformScale( xf, xscale, -deviceOriginFlipped*(halfHeight));\n        CGPathAddPath( path, &xf, halfPath );\n      }\n      CGPathRelease( halfPath );\n      \n      // Now, path contains the full waveform path.\n      CGContextAddPath(ctx, path);\n      \n      // Make this color customizable\n      if( self.shouldFill ){\n        CGContextFillPath(ctx);\n      }\n      else {\n        CGContextStrokePath(ctx);\n      }\n      CGPathRelease(path);\n    }\n    \n#if TARGET_OS_IPHONE\n    CGContextRestoreGState(ctx);\n#elif TARGET_OS_MAC\n    [[NSGraphicsContext currentContext] restoreGraphicsState];\n#endif\n}\n  \n#pragma mark - Adjust Resolution\n-(int)setRollingHistoryLength:(int)historyLength {\n  historyLength = MIN(historyLength,kEZAudioPlotMaxHistoryBufferLength);\n  size_t floatByteSize = sizeof(float);\n  _changingHistorySize = YES;\n  if( _scrollHistoryLength != historyLength ){\n    _scrollHistoryLength = historyLength;\n  }\n  _scrollHistory = realloc(_scrollHistory,_scrollHistoryLength*floatByteSize);\n  if( _scrollHistoryIndex < _scrollHistoryLength ){\n    memset(&_scrollHistory[_scrollHistoryIndex],\n           0,\n           (_scrollHistoryLength-_scrollHistoryIndex)*floatByteSize);\n  }\n  else {\n    _scrollHistoryIndex = _scrollHistoryLength;\n  }\n  _changingHistorySize = NO;\n  return historyLength;\n}\n\n-(int)rollingHistoryLength {\n  return _scrollHistoryLength;\n}\n    \n-(void)dealloc {\n  if( plotData ){\n    free(plotData);\n  }\n}\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/EZAudioPlotGL.h",
    "content": "//\n//  EZAudioPlotGL.h\n//  EZAudio\n//\n//  Created by Syed Haris Ali on 11/22/13.\n//  Copyright (c) 2013 Syed Haris Ali. All rights reserved.\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#import \"TargetConditionals.h\"\n#import \"EZPlot.h\"\n\n#if TARGET_OS_IPHONE\n#import <GLKit/GLKit.h>\n@class EZAudioPlotGLKViewController;\n#elif TARGET_OS_MAC\n#import <Cocoa/Cocoa.h>\n#import <GLKit/GLKit.h>\n#import <OpenGL/gl3.h>\n#import <QuartzCore/CVDisplayLink.h>\n#endif\n\n#pragma mark - Enumerations\n/**\n Constant drawing types wrapping around the OpenGL equivalents. In the audio drawings the line strip will be the stroked graph while the triangle will provide the filled equivalent.\n */\ntypedef NS_ENUM(NSUInteger,EZAudioPlotGLDrawType){\n  /**\n   *  Maps to the OpenGL constant for a line strip, which for the audio graph will correspond to a stroked drawing (no fill).\n   */\n  EZAudioPlotGLDrawTypeLineStrip     = GL_LINE_STRIP,\n  /**\n   *  Maps to the OpenGL constant for a triangle strip, which for the audio graph will correspond to a filled drawing.\n   */\n  EZAudioPlotGLDrawTypeTriangleStrip = GL_TRIANGLE_STRIP\n};\n\n#pragma mark - Structures\n/**\n A structure describing a 2D point (x,y) in space for an audio plot.\n */\ntypedef struct {\n  GLfloat x;\n  GLfloat y;\n} EZAudioPlotGLPoint;\n\n/**\n EZAudioPlotGL is a subclass of either the EZPlot on iOS or an NSOpenGLView on OSX. I apologize ahead of time for the weirdness in the docs for this class, but I had to do a bit of hackery to get a universal namespace for something works on both iOS and OSX without any additional components. The EZAudioPlotGL provides an the same utilities and interface as the EZAudioPlot with the added benefit of being GPU-accelerated. This is the recommended plot to use on iOS devices to get super fast real-time drawings of audio streams. For the methods and properties below I've included notes on the bottom just indicating which OS they correspond to. In most (if not all) use cases you can just refer to the EZPlot documentation to see which custom properties can be setup. There update function is the same as the EZPlot as well: `updateBuffer:withBufferSize:`\n */\n#if TARGET_OS_IPHONE\n@interface EZAudioPlotGL : EZPlot\n#elif TARGET_OS_MAC\n@interface EZAudioPlotGL : NSOpenGLView\n#endif\n\n#if TARGET_OS_IPHONE\n\n// Inherited from EZPlot\n\n#elif TARGET_OS_MAC\n\n#pragma mark - Properties\n///-----------------------------------------------------------\n/// @name Customizing The Plot's Appearance\n///-----------------------------------------------------------\n/**\n The default background color of the plot. For iOS the color is specified as a UIColor while for OSX the color is an NSColor. The default value on both platforms is black.\n */\n@property (nonatomic,strong) id backgroundColor;\n\n/**\n The default color of the plot's data (i.e. waveform, y-axis values). For iOS the color is specified as a UIColor while for OSX the color is an NSColor. The default value on both platforms is red.\n */\n@property (nonatomic,strong) id color;\n\n/**\n The plot's gain value, which controls the scale of the y-axis values. The default value of the gain is 1.0f and should always be greater than 0.0f.\n */\n@property (nonatomic,assign,setter=setGain:) float gain;\n\n/**\n The type of plot as specified by the `EZPlotType` enumeration (i.e. a buffer or rolling plot type).\n */\n@property (nonatomic,assign,setter=setPlotType:) EZPlotType plotType;\n\n/**\n A BOOL indicating whether or not to fill in the graph. A value of YES will make a filled graph (filling in the space between the x-axis and the y-value), while a value of NO will create a stroked graph (connecting the points along the y-axis).\n */\n@property (nonatomic,assign,setter=setShouldFill:) BOOL shouldFill;\n\n/**\n A boolean indicating whether the graph should be rotated along the x-axis to give a mirrored reflection. This is typical for audio plots to produce the classic waveform look. A value of YES will produce a mirrored reflection of the y-values about the x-axis, while a value of NO will only plot the y-values.\n */\n@property (nonatomic,assign,setter=setShouldMirror:) BOOL shouldMirror;\n\n#pragma mark - Get Samples\n///-----------------------------------------------------------\n/// @name Updating The Plot\n///-----------------------------------------------------------\n/**\n Updates the plot with the new buffer data and tells the view to redraw itself. Caller will provide a float array with the values they expect to see on the y-axis. The plot will internally handle mapping the x-axis and y-axis to the current view port, any interpolation for fills effects, and mirroring.\n @param buffer     A float array of values to map to the y-axis.\n @param bufferSize The size of the float array that will be mapped to the y-axis.\n @warning The bufferSize is expected to be the same, constant value once initial triggered. For plots using OpenGL a vertex buffer object will be allocated with a maximum buffersize of (2 * the initial given buffer size) to account for any interpolation necessary for filling in the graph. Updates use the glBufferSubData(...) function, which will crash if the buffersize exceeds the initial maximum allocated size.\n */\n-(void)updateBuffer:(float *)buffer\n     withBufferSize:(UInt32)bufferSize;\n\n#endif\n\n#pragma mark - Adjust Resolution\n///-----------------------------------------------------------\n/// @name Adjusting The Resolution\n///-----------------------------------------------------------\n\n/**\n Sets the length of the rolling history display. Can grow or shrink the display up to the maximum size specified by the kEZAudioPlotMaxHistoryBufferLength macro. Will return the actual set value, which will be either the given value if smaller than the kEZAudioPlotMaxHistoryBufferLength or kEZAudioPlotMaxHistoryBufferLength if a larger value is attempted to be set.\n @param  historyLength The new length of the rolling history buffer.\n @return The new value equal to the historyLength or the kEZAudioPlotMaxHistoryBufferLength.\n */\n-(int)setRollingHistoryLength:(int)historyLength;\n\n/**\n Provides the length of the rolling history buffer\n *  @return An int representing the length of the rolling history buffer\n */\n-(int)rollingHistoryLength;\n\n#pragma mark - Shared Methods\n///-----------------------------------------------------------\n/// @name Clearing The Plot\n///-----------------------------------------------------------\n\n/**\n Clears all data from the audio plot (includes both EZPlotTypeBuffer and EZPlotTypeRolling)\n */\n-(void)clear;\n\n///-----------------------------------------------------------\n/// @name Shared OpenGL Methods\n///-----------------------------------------------------------\n/**\n Converts a float array to an array of EZAudioPlotGLPoint structures that hold the (x,y) values the OpenGL buffer needs to properly plot its points.\n @param graph       A pointer to the array that should hold the EZAudioPlotGLPoint structures.\n @param graphSize   The size (or length) of the array with the EZAudioPlotGLPoint structures.\n @param drawingType The EZAudioPlotGLDrawType constant defining whether the plot should interpolate between points for a triangle strip (filled waveform) or not for a line strip (stroked waveform)\n @param buffer      The float array holding the audio data\n @param bufferSize  The size of the float array holding the audio data\n @param gain        The gain (always greater than 0.0) to apply to the amplitudes (y-values) of the graph. Y-values can only range from -1.0 to 1.0 so any value that's greater will be rounded to -1.0 or 1.0.\n */\n+(void)fillGraph:(EZAudioPlotGLPoint*)graph\n   withGraphSize:(UInt32)graphSize\n  forDrawingType:(EZAudioPlotGLDrawType)drawingType\n      withBuffer:(float*)buffer\n  withBufferSize:(UInt32)bufferSize\n        withGain:(float)gain;\n\n/**\n Determines the proper size of a graph given a EZAudioPlotGLDrawType (line strip or triangle strip) and the size of the incoming buffer. Triangle strips require interpolating between points so the buffer becomes 2*bufferSize\n @param drawingType The EZAudioPlotGLDraw type (line strip or triangle strip)\n @param bufferSize  The size of the float array holding the audio data coming in.\n @return A Int32 representing the proper graph size that should be used to account for any necessary interpolating between points.\n */\n+(UInt32)graphSizeForDrawingType:(EZAudioPlotGLDrawType)drawingType\n                  withBufferSize:(UInt32)bufferSize;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/EZAudioPlotGL.m",
    "content": "//\n//  EZAudioPlotGL.m\n//  EZAudio\n//\n//  Created by Syed Haris Ali on 11/22/13.\n//  Copyright (c) 2013 Syed Haris Ali. All rights reserved.\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#import \"EZAudioPlotGL.h\"\n\n#import \"EZAudio.h\"\n\n#if TARGET_OS_IPHONE\n  #import \"EZAudioPlotGLKViewController.h\"\n@interface EZAudioPlotGL ()\n@property (nonatomic,strong,readonly) EZAudioPlotGLKViewController *glViewController;\n@end\n#elif TARGET_OS_MAC\n@interface EZAudioPlotGL (){\n  \n  // Flags indicating whether the plots have been instantiated\n  BOOL _hasBufferPlotData;\n  BOOL _hasRollingPlotData;\n  \n  // Vertex Array Buffers\n  GLuint _bufferPlotVAB;\n  GLuint _rollingPlotVAB;\n  \n  // Vertex Buffer Objects\n  GLuint _bufferPlotVBO;\n  GLuint _rollingPlotVBO;\n  \n  // Display Link\n  CVDisplayLinkRef _displayLink;\n  \n  // Buffers size\n  UInt32 _bufferPlotGraphSize;\n  UInt32 _rollingPlotGraphSize;\n  \n  // Rolling History\n  BOOL    _setMaxLength;\n  float   *_scrollHistory;\n  int     _scrollHistoryIndex;\n  UInt32  _scrollHistoryLength;\n  BOOL    _changingHistorySize;\n  \n  // Copied buffer data\n  float *_copiedBuffer;\n  UInt32 _copiedBufferSize;\n  \n}\n@property (nonatomic,assign,readonly) EZAudioPlotGLDrawType drawingType;\n@property (nonatomic,strong) GLKBaseEffect *baseEffect;\n@end\n#endif\n\n@implementation EZAudioPlotGL\n#if TARGET_OS_IPHONE\n@synthesize glViewController = _glViewController;\n#elif TARGET_OS_MAC\n@synthesize baseEffect = _baseEffect;\n#endif\n@synthesize backgroundColor  = _backgroundColor;\n@synthesize color            = _color;\n@synthesize gain             = _gain;\n@synthesize plotType         = _plotType;\n@synthesize shouldFill       = _shouldFill;\n@synthesize shouldMirror     = _shouldMirror;\n\n#pragma mark - Initialization\n-(id)init\n{\n  self = [super init];\n  if (self) {\n    [self initializeView];\n  }\n  return self;\n}\n\n-(id)initWithCoder:(NSCoder *)aDecoder {\n  self = [super initWithCoder:aDecoder];\n  if(self){\n    [self initializeView];\n  }\n  return self;\n}\n\n-(id)initWithFrame:(CGRect)frame\n{\n  self = [super initWithFrame:frame];\n  if (self) {\n    [self initializeView];\n  }\n  return self;\n}\n\n#pragma mark - Initialize Properties Here\n-(void)initializeView {\n#if TARGET_OS_IPHONE\n  // Initialize the subview controller\n  _glViewController = [[EZAudioPlotGLKViewController alloc] init];\n  _glViewController.view.frame = self.bounds;\n  [self insertSubview:self.glViewController.view atIndex:0];\n#elif TARGET_OS_MAC\n  _copiedBuffer = NULL;\n#endif\n  // Set the default properties\n  self.gain       = 1.0;\n  self.plotType   = EZPlotTypeBuffer;\n#if TARGET_OS_IPHONE\n  self.backgroundColor = [UIColor colorWithRed:0.796 green:0.749 blue:0.663 alpha:1];\n  self.color = [UIColor colorWithRed:0.481 green:0.548 blue:0.637 alpha:1];\n#elif TARGET_OS_MAC\n  _scrollHistory       = NULL;\n  _scrollHistoryLength = kEZAudioPlotDefaultHistoryBufferLength;\n#endif\n  self.shouldFill   = NO;\n  self.shouldMirror = NO;\n}\n\n#pragma mark - Setters\n-(void)setBackgroundColor:(id)backgroundColor {\n  _backgroundColor = backgroundColor;\n#if TARGET_OS_IPHONE\n  self.glViewController.backgroundColor = backgroundColor;\n#elif TARGET_OS_MAC\n  [self _refreshWithBackgroundColor:backgroundColor];\n#endif\n}\n\n-(void)setColor:(id)color {\n  _color = color;\n#if TARGET_OS_IPHONE\n  self.glViewController.color = color;\n#elif TARGET_OS_MAC\n  [self _refreshWithColor:color];\n#endif\n}\n\n#if TARGET_OS_IPHONE\n#elif TARGET_OS_MAC\n-(void)setDrawingType:(EZAudioPlotGLDrawType)drawingType {\n  CGLLockContext([[self openGLContext] CGLContextObj]);\n  _drawingType = drawingType;\n  CGLUnlockContext([[self openGLContext] CGLContextObj]);\n}\n#endif\n\n#if TARGET_OS_IPHONE\n-(void)setGain:(float)gain {\n  _gain = gain;\n  self.glViewController.gain = gain;\n}\n#elif TARGET_OS_MAC\n// Gain changed mac\n#endif\n\n#if TARGET_OS_IPHONE\n-(void)setPlotType:(EZPlotType)plotType {\n  _plotType = plotType;\n  self.glViewController.plotType = plotType;\n}\n#elif TARGET_OS_MAC\n// Plot type changed mac\n#endif\n\n-(void)setShouldFill:(BOOL)shouldFill {\n  _shouldFill = shouldFill;\n#if TARGET_OS_IPHONE\n  self.glViewController.drawingType = shouldFill ? EZAudioPlotGLDrawTypeTriangleStrip : EZAudioPlotGLDrawTypeLineStrip;\n#elif TARGET_OS_MAC\n  // Fill flag changed mac\n  self.drawingType = shouldFill ? EZAudioPlotGLDrawTypeTriangleStrip : EZAudioPlotGLDrawTypeLineStrip;\n#endif\n}\n\n#if TARGET_OS_IPHONE\n-(void)setShouldMirror:(BOOL)shouldMirror {\n  _shouldMirror = shouldMirror;\n  self.glViewController.shouldMirror = shouldMirror;\n}\n#elif TARGET_OS_MAC\n// Mirror flag changed mac\n#endif\n\n#pragma mark - Get Samples\n-(void)updateBuffer:(float *)buffer\n     withBufferSize:(UInt32)bufferSize {\n#if TARGET_OS_IPHONE\n  [self.glViewController updateBuffer:buffer\n                       withBufferSize:bufferSize];\n#elif TARGET_OS_MAC\n    \n    \n    \n  if( _copiedBuffer == NULL ){\n    _copiedBuffer = (float*)malloc(bufferSize*sizeof(float));\n  }\n  _copiedBufferSize = bufferSize;\n  // Copy the buffer\n  memcpy(_copiedBuffer,\n         buffer,\n         bufferSize*sizeof(float));\n  // Draw based on plot type\n  switch(_plotType) {\n    case EZPlotTypeBuffer:\n      [self _updateBufferPlotBufferWithAudioReceived:_copiedBuffer\n                                      withBufferSize:_copiedBufferSize];\n      break;\n    case EZPlotTypeRolling:\n      [self _updateRollingPlotBufferWithAudioReceived:_copiedBuffer\n                                       withBufferSize:_copiedBufferSize];\n      break;\n    default:\n      break;\n  }\n#endif\n}\n\n#pragma mark - OSX Specific GL Implementation\n#if TARGET_OS_IPHONE\n\n// Handled by the embedded GLKViewController\n\n#elif TARGET_OS_MAC\n\n#pragma mark - Awake\n-(void)awakeFromNib {\n  \n  // Setup the base effect\n  [self _setupBaseEffect];\n  \n  // Setup the OpenGL Pixel Format and Context\n  [self _setupProfile];\n  \n  // Setup view\n  [self _setupView];\n  \n}\n\n-(void)_setupBaseEffect {\n  self.baseEffect                  = [[GLKBaseEffect alloc] init];\n  self.baseEffect.useConstantColor = GL_TRUE;\n  self.baseEffect.constantColor    = GLKVector4Make(0.489, 0.34, 0.185, 1.0);\n}\n\n-(void)_setupProfile {\n  NSOpenGLPixelFormatAttribute attrs[] =\n\t{\n\t\tNSOpenGLPFADoubleBuffer,\n        NSOpenGLPFAMultisample,\n        NSOpenGLPFASampleBuffers,      1,\n        NSOpenGLPFASamples,            4,\n\t\tNSOpenGLPFADepthSize,          24,\n\t\tNSOpenGLPFAOpenGLProfile,\n\t\tNSOpenGLProfileVersion3_2Core, 0\n\t};\n\t\n\tNSOpenGLPixelFormat *pf = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];\n\t\n\tif (!pf)\n\t{\n\t\tNSLog(@\"No OpenGL pixel format\");\n\t}\n  \n    NSOpenGLContext* context = [[NSOpenGLContext alloc] initWithFormat:pf shareContext:nil];\n  \n  // Debug only\n  CGLEnable([context CGLContextObj], kCGLCECrashOnRemovedFunctions);\n\t\n  self.pixelFormat   = pf;\n  self.openGLContext = context;\n}\n\n-(void)_setupView {\n  self.backgroundColor = [NSColor colorWithCalibratedRed: 0.796 green: 0.749 blue: 0.663 alpha: 1];\n  self.color           = [NSColor colorWithCalibratedRed: 0.481 green: 0.548 blue: 0.637 alpha: 1];\n}\n\n#pragma mark - Prepare\n-(void)prepareOpenGL {\n  [super prepareOpenGL];\n  \n  GLint swapInt = 1;\n  [self.openGLContext setValues:&swapInt forParameter:NSOpenGLCPSwapInterval];\n  \n  ////////////////////////////////////////////////////////////////////////////\n  //                          Setup VABs and VBOs                           //\n  ////////////////////////////////////////////////////////////////////////////\n  // Buffer\n  glGenVertexArrays(1,&_bufferPlotVAB);\n  glBindVertexArray(_bufferPlotVAB);\n  glGenBuffers(1,&_bufferPlotVBO);\n  glBindBuffer(GL_ARRAY_BUFFER,_bufferPlotVBO);\n  \n  // Rolling\n  glGenVertexArrays(1,&_rollingPlotVAB);\n  glBindVertexArray(_rollingPlotVAB);\n  glGenBuffers(1,&_rollingPlotVBO);\n  glBindBuffer(GL_ARRAY_BUFFER,_rollingPlotVBO);\n  \n  if( self.shouldFill ){\n    glBindVertexArray(_rollingPlotVAB);\n    glBindBuffer(GL_ARRAY_BUFFER,_rollingPlotVBO);\n  }\n  \n    // Enable anti-aliasing\n    glEnable(GL_MULTISAMPLE);\n    glEnable(GL_BLEND);\n    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n    glClearColor(0, 0, 0, 0);\n    self.layer = nil;\n    \n  // Set the background color\n  [self _refreshWithBackgroundColor:self.backgroundColor];\n  [self _refreshWithColor:self.color];\n  \n  // Setup the display link (rendering loop)\n  [self _setupDisplayLink];\n  \n}\n\n-(void)_setupDisplayLink {\n\t// Create a display link capable of being used with all active displays\n\tCVDisplayLinkCreateWithActiveCGDisplays(&_displayLink);\n\t\n\t// Set the renderer output callback function\n\tCVDisplayLinkSetOutputCallback(_displayLink, &DisplayLinkCallback, (__bridge void *)(self));\n\t\n\t// Set the display link for the current renderer\n\tCGLContextObj     cglContext     = self.openGLContext.CGLContextObj;\n\tCGLPixelFormatObj cglPixelFormat = self.pixelFormat.CGLPixelFormatObj;\n\tCVDisplayLinkSetCurrentCGDisplayFromOpenGLContext(_displayLink, cglContext, cglPixelFormat);\n  \n\t// Activate the display link\n\tCVDisplayLinkStart(_displayLink);\n  \n  // Register to be notified when the window closes so we can stop the displaylink\n\t[[NSNotificationCenter defaultCenter] addObserver:self\n                                           selector:@selector(windowWillClose:)\n                                               name:NSWindowWillCloseNotification\n                                             object:[self window]];\n  \n}\n\n- (void) windowWillClose:(NSNotification*)notification\n{\n\t// Stop the display link when the window is closing because default\n\t// OpenGL render buffers will be destroyed.  If display link continues to\n\t// fire without renderbuffers, OpenGL draw calls will set errors.\n\t\n\tCVDisplayLinkStop(_displayLink);\n}\n\n#pragma mark - Display Link Callback\n// This is the renderer output callback function\nstatic CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink,\n                                    const CVTimeStamp* now,\n                                    const CVTimeStamp* outputTime,\n                                    CVOptionFlags flagsIn,\n                                    CVOptionFlags* flagsOut,\n                                    void* displayLinkContext)\n{\n  CVReturn result = [(__bridge EZAudioPlotGL*)displayLinkContext getFrameForTime:outputTime];\n  return result;\n}\n\n- (CVReturn)getFrameForTime:(const CVTimeStamp*)outputTime\n{\n  @autoreleasepool {\n   \t[self drawFrame];\n  }\n\treturn kCVReturnSuccess;\n}\n\n#pragma mark - Buffer Updating By Type\n-(void)_updateBufferPlotBufferWithAudioReceived:(float*)buffer\n                                 withBufferSize:(UInt32)bufferSize {\n  \n  // Lock\n  CGLLockContext([[self openGLContext] CGLContextObj]);\n  \n  // Bind to buffer VBO\n  glBindVertexArray(_bufferPlotVAB);\n  glBindBuffer(GL_ARRAY_BUFFER,_bufferPlotVBO);\n  \n  // If starting with a VBO of half of our max size make sure we initialize it to anticipate\n  // a filled graph (which needs 2 * bufferSize) to allocate its resources properly\n  if( !_hasBufferPlotData && _drawingType == EZAudioPlotGLDrawTypeLineStrip ){\n    EZAudioPlotGLPoint maxGraph[2*bufferSize];\n    glBufferData(GL_ARRAY_BUFFER, sizeof(maxGraph), maxGraph, GL_STREAM_DRAW );\n    _hasBufferPlotData = YES;\n  }\n  \n  // Setup the buffer plot's graph size\n  _bufferPlotGraphSize = [EZAudioPlotGL graphSizeForDrawingType:_drawingType\n                                                  withBufferSize:bufferSize];\n  \n  // Setup the graph\n  EZAudioPlotGLPoint graph[_bufferPlotGraphSize];\n  \n  // Fill in graph data\n  [EZAudioPlotGL fillGraph:graph\n              withGraphSize:_bufferPlotGraphSize\n             forDrawingType:_drawingType\n                 withBuffer:buffer\n             withBufferSize:bufferSize\n                   withGain:self.gain];\n  \n  // Update the drawing\n  if( !_hasBufferPlotData ){\n    glBufferData(GL_ARRAY_BUFFER, sizeof(graph) , graph, GL_STREAM_DRAW);\n    _hasBufferPlotData = YES;\n    \n  }\n  else {\n    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(graph), graph);\n    \n  }\n  \n  // Unlock\n  CGLUnlockContext([[self openGLContext] CGLContextObj]);\n  \n}\n\n-(void)_updateRollingPlotBufferWithAudioReceived:(float*)buffer\n                                  withBufferSize:(UInt32)bufferSize {\n  \n  // Lock\n  CGLLockContext([[self openGLContext] CGLContextObj]);\n  \n  // Bind to rolling VBO\n  glBindVertexArray(_rollingPlotVAB);\n  glBindBuffer(GL_ARRAY_BUFFER,_rollingPlotVBO);\n  \n  // If starting with a VBO of half of our max size make sure we initialize it to anticipate\n  // a filled graph (which needs 2 * bufferSize) to allocate its resources properly\n  if( !_hasRollingPlotData ){\n    EZAudioPlotGLPoint maxGraph[2*kEZAudioPlotMaxHistoryBufferLength];\n    glBufferData(GL_ARRAY_BUFFER, sizeof(maxGraph), maxGraph, GL_STREAM_DRAW );\n    _hasRollingPlotData = YES;\n  }\n  \n  // Setup the plot\n  _rollingPlotGraphSize = [EZAudioPlotGL graphSizeForDrawingType:_drawingType\n                                                   withBufferSize:_scrollHistoryLength];\n  \n  // Fill the graph with data\n  EZAudioPlotGLPoint graph[_rollingPlotGraphSize];\n\n  \n  \n  // Update the scroll history datasource\n  [EZAudio updateScrollHistory:&_scrollHistory\n                    withLength:_scrollHistoryLength\n                       atIndex:&_scrollHistoryIndex\n                    withBuffer:buffer\n                withBufferSize:bufferSize\n          isResolutionChanging:&_changingHistorySize];\n  \n  // Fill in graph data\n  [EZAudioPlotGL fillGraph:graph\n              withGraphSize:_rollingPlotGraphSize\n             forDrawingType:_drawingType\n                 withBuffer:_scrollHistory\n             withBufferSize:_scrollHistoryLength\n                   withGain:self.gain];\n  \n  // Update the drawing\n  if( !_hasRollingPlotData ){\n    glBufferData(GL_ARRAY_BUFFER, sizeof(graph), graph, GL_STREAM_DRAW);\n    _hasRollingPlotData = YES;\n  }\n  else {\n    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(graph), graph);\n  }\n  \n  // Unlock\n  CGLUnlockContext([[self openGLContext] CGLContextObj]);\n  \n}\n\n//#pragma mark - Render\n-(void)drawFrame {\n  \n\t// Avoid flickering during resize by drawing\n\t[[self openGLContext] makeCurrentContext];\n  \n  // Lock\n\tCGLLockContext([[self openGLContext] CGLContextObj]);\n  \n  // Draw frame\n  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );\n  \n  if( _hasBufferPlotData || _hasRollingPlotData ){  \n    // Plot either a buffer plot or a rolling plot\n    switch(_plotType) {\n      case EZPlotTypeBuffer:\n        [self _drawBufferPlot];\n        break;\n      case EZPlotTypeRolling:\n        [self _drawRollingPlot];\n        break;\n      default:\n        break;\n    }\n  }\n\n  // Flush and unlock\n  CGLFlushDrawable([[self openGLContext] CGLContextObj]);\n  CGLUnlockContext([[self openGLContext] CGLContextObj]);\n  \n}\n\n-(void)_drawBufferPlot {\n  \n  glBindVertexArray(_bufferPlotVAB);\n  glBindBuffer(GL_ARRAY_BUFFER,_bufferPlotVBO);\n  \n  [self.baseEffect prepareToDraw];\n  self.baseEffect.transform.modelviewMatrix = GLKMatrix4MakeXRotation(0);\n  \n  // Enable the vertex data\n\tglEnableVertexAttribArray(GLKVertexAttribPosition);\n\t// Define the vertex data size & layout\n  glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(EZAudioPlotGLPoint), NULL);\n  // Draw the triangle\n  glDrawArrays(_drawingType,0,_bufferPlotGraphSize);\n  \n  // Mirrored\n  if( self.shouldMirror ){\n    [self.baseEffect prepareToDraw];\n    self.baseEffect.transform.modelviewMatrix = GLKMatrix4MakeXRotation(M_PI);\n    \n    // Enable the vertex data\n    glEnableVertexAttribArray(GLKVertexAttribPosition);\n    // Define the vertex data size & layout\n    glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(EZAudioPlotGLPoint), NULL);\n    // Draw the triangle\n    glDrawArrays(_drawingType, 0, _bufferPlotGraphSize);\n  }\n  \n}\n\n-(void)_drawRollingPlot {\n  \n  glBindVertexArray(_rollingPlotVAB);\n  glBindBuffer(GL_ARRAY_BUFFER,_rollingPlotVBO);\n  \n  [self.baseEffect prepareToDraw];\n  self.baseEffect.transform.modelviewMatrix = GLKMatrix4MakeXRotation(0);\n  \n  // Enable the vertex data\n  glEnableVertexAttribArray(GLKVertexAttribPosition);\n  // Define the vertex data size & layout\n  glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(EZAudioPlotGLPoint), NULL);\n  // Draw the triangle\n  glDrawArrays(_drawingType, 0,_rollingPlotGraphSize);\n  \n  // Mirrored\n  if( self.shouldMirror ){\n    [self.baseEffect prepareToDraw];\n    self.baseEffect.transform.modelviewMatrix = GLKMatrix4MakeXRotation(M_PI);\n    \n    // Enable the vertex data\n    glEnableVertexAttribArray(GLKVertexAttribPosition);\n    // Define the vertex data size & layout\n    glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(EZAudioPlotGLPoint), NULL);\n    // Draw the triangle\n    glDrawArrays(_drawingType, 0,_rollingPlotGraphSize);\n  }\n  \n}\n\n-(void)drawRect:(NSRect)dirtyRect {\n\t[self drawFrame];\n}\n\n#pragma mark - Reshape\n-(void)reshape {\n\t[super reshape];\n\t\n\t// We draw on a secondary thread through the display link. However, when\n\t// resizing the view, -drawRect is called on the main thread.\n\t// Add a mutex around to avoid the threads accessing the context\n\t// simultaneously when resizing.\n\tCGLLockContext([[self openGLContext] CGLContextObj]);\n  \n\t// Get the view size in Points\n\tNSRect viewRectPoints = [self bounds];\n  NSRect viewRectPixels = [self convertRectToBacking:viewRectPoints];\n  \n\t// Set the new dimensions in our renderer\n  glViewport(0, 0, viewRectPixels.size.width, viewRectPixels.size.height);\n\t\n\tCGLUnlockContext([[self openGLContext] CGLContextObj]);\n}\n\n#pragma mark - Private Setters\n-(void)_refreshWithBackgroundColor:(NSColor*)backgroundColor {\n  CGLLockContext([[self openGLContext] CGLContextObj]);\n  // Extract colors\n  CGFloat red; CGFloat green; CGFloat blue; CGFloat alpha;\n  [backgroundColor getRed:&red\n                    green:&green\n                     blue:&blue\n                    alpha:&alpha];\n  // Set them on the context\n  glClearColor((GLclampf)red,(GLclampf)green,(GLclampf)blue,(GLclampf)alpha);\n  CGLUnlockContext([[self openGLContext] CGLContextObj]);\n}\n\n-(void)_refreshWithColor:(NSColor*)color {\n  CGLLockContext([[self openGLContext] CGLContextObj]);\n  // Extract colors\n  CGFloat red; CGFloat green; CGFloat blue; CGFloat alpha;\n  [color getRed:&red\n          green:&green\n           blue:&blue\n          alpha:&alpha];\n  // Set them on the base shader\n  self.baseEffect.constantColor = GLKVector4Make((GLclampf)red,(GLclampf)green,(GLclampf)blue,(GLclampf)alpha);\n  CGLUnlockContext([[self openGLContext] CGLContextObj]);\n}\n\n#pragma mark - Cleanup\n- (void) dealloc\n{\n\t// Stop the display link BEFORE releasing anything in the view\n  // otherwise the display link thread may call into the view and crash\n  // when it encounters something that has been release\n\tCVDisplayLinkStop(_displayLink);\n\tCVDisplayLinkRelease(_displayLink);\n  \n  if( _copiedBuffer != NULL ){\n    free( _copiedBuffer );\n  }\n}\n#endif\n\n#pragma mark - Adjust Resolution\n-(int)setRollingHistoryLength:(int)historyLength {\n#if TARGET_OS_IPHONE\n  int result = [self.glViewController setRollingHistoryLength:historyLength];\n  return result;\n#elif TARGET_OS_MAC\n  historyLength = MIN(historyLength,kEZAudioPlotMaxHistoryBufferLength);\n  size_t floatByteSize = sizeof(float);\n  _changingHistorySize = YES;\n  if( _scrollHistoryLength != historyLength ){\n    _scrollHistoryLength = historyLength;\n  }\n  _scrollHistory = realloc(_scrollHistory,_scrollHistoryLength*floatByteSize);\n  if( _scrollHistoryIndex < _scrollHistoryLength ){\n    memset(&_scrollHistory[_scrollHistoryIndex],\n           0,\n           (_scrollHistoryLength-_scrollHistoryIndex)*floatByteSize);\n  }\n  else {\n    _scrollHistoryIndex = _scrollHistoryLength;\n  }\n  _changingHistorySize = NO;\n  return historyLength;\n#endif\n  return kEZAudioPlotDefaultHistoryBufferLength;\n}\n\n-(int)rollingHistoryLength {\n#if TARGET_OS_IPHONE\n  return self.glViewController.rollingHistoryLength;\n#elif TARGET_OS_MAC\n  return _scrollHistoryLength;\n#endif\n}\n\n#pragma mark - Clearing\n-(void)clear {\n#if TARGET_OS_IPHONE\n  [self.glViewController clear];\n#elif TARGET_OS_MAC\n#endif\n}\n\n#pragma mark - Graph Methods\n+(void)fillGraph:(EZAudioPlotGLPoint*)graph\n   withGraphSize:(UInt32)graphSize\n  forDrawingType:(EZAudioPlotGLDrawType)drawingType\n      withBuffer:(float*)buffer\n  withBufferSize:(UInt32)bufferSize\n        withGain:(float)gain {\n  if( drawingType == EZAudioPlotGLDrawTypeLineStrip ){\n    // graph size = buffer size to stroke waveform\n    for(int i = 0; i < graphSize; i++){\n      float x = [EZAudio MAP:i\n                      leftMin:0\n                      leftMax:bufferSize\n                     rightMin:-1.0\n                     rightMax:1.0];\n      graph[i].x = x;\n      graph[i].y = gain*buffer[i];\n    }\n  }\n  else if( drawingType == EZAudioPlotGLDrawTypeTriangleStrip ) {\n    // graph size = 2 * buffer size to draw triangles and fill regions properly\n    for(int i = 0; i < graphSize; i+=2){\n      int bufferIndex = (int)[EZAudio MAP:i\n                              leftMin:0\n                              leftMax:graphSize\n                              rightMin:0\n                              rightMax:bufferSize];\n      float x = [EZAudio MAP:bufferIndex\n                      leftMin:0\n                      leftMax:bufferSize\n                     rightMin:-1.0\n                     rightMax:1.0];\n      graph[i].x = x;\n      graph[i].y = 0.0f;\n    }\n    for(int i = 0; i < graphSize; i+=2){\n      int bufferIndex = (int)[EZAudio\n                              MAP:i\n                              leftMin:0\n                              leftMax:graphSize\n                              rightMin:0\n                              rightMax:bufferSize];\n      float x = [EZAudio MAP:bufferIndex\n                      leftMin:0\n                      leftMax:bufferSize\n                     rightMin:-1.0\n                     rightMax:1.0];\n      graph[i+1].x = x;\n      graph[i+1].y = gain*buffer[bufferIndex];\n    }\n  }\n}\n\n+(UInt32)graphSizeForDrawingType:(EZAudioPlotGLDrawType)drawingType\n                  withBufferSize:(UInt32)bufferSize {\n  UInt32 graphSize = bufferSize;\n  switch(drawingType) {\n    case EZAudioPlotGLDrawTypeLineStrip:\n      graphSize = bufferSize;\n      break;\n    case EZAudioPlotGLDrawTypeTriangleStrip:\n      graphSize = 2*bufferSize;\n      break;\n    default:\n      break;\n  }\n  return graphSize;\n}\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/EZAudioPlotGLKViewController.h",
    "content": "//\n//  EZAudioPlotGLKViewController.h\n//  EZAudio\n//\n//  Created by Syed Haris Ali on 11/22/13.\n//  Copyright (c) 2013 Syed Haris Ali. All rights reserved.\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#import \"TargetConditionals.h\"\n\n#if TARGET_OS_IPHONE\n\n#import \"EZAudioPlotGL.h\"\n\n@class EZAudio;\n\n/**\n EZAudioPlotGLKViewController is a subclass of the GLKViewController and handles the OpenGL drawing routine for iOS OpenGL ES views. This class has not been used outside the scope of the EZAudioPlotGL, but should be safe to use by itself if the intended use case is to have a view controller take up the whole screen.\n */\n@interface EZAudioPlotGLKViewController : GLKViewController\n\n#pragma mark - Properties\n///-----------------------------------------------------------\n/// @name Customizing The Plot's Appearance\n///-----------------------------------------------------------\n/**\n The default background color of the plot. For iOS the color is specified as a UIColor while for OSX the color is an NSColor. The default value on both platforms is black.\n */\n@property (nonatomic,strong) UIColor *backgroundColor;\n\n/**\n The default shader to use to fill the graph.\n */\n@property (nonatomic,strong) GLKBaseEffect *baseEffect;\n\n/**\n The default color of the plot's data (i.e. waveform, y-axis values). For iOS the color is specified as a UIColor while for OSX the color is an NSColor. The default value on both platforms is red.\n */\n@property (nonatomic,strong) UIColor *color;\n\n/**\n The OpenGL ES context (EAGLContext) in which to perform the drawing\n */\n@property (nonatomic,strong) EAGLContext *context;\n\n/**\n The EZAudioPlotGLDrawType specifying which OpenGL primitive to use for drawing (either line strip for stroke and no fill or triangle strip for fill)\n */\n@property (nonatomic,assign) EZAudioPlotGLDrawType drawingType;\n\n/**\n The plot's gain value, which controls the scale of the y-axis values. The default value of the gain is 1.0f and should always be greater than 0.0f.\n */\n@property (nonatomic,assign,setter=setGain:) float gain;\n\n/**\n The type of plot as specified by the `EZPlotType` enumeration (i.e. a buffer or rolling plot type).\n */\n@property (nonatomic,assign,setter=setPlotType:) EZPlotType plotType;\n\n/**\n A boolean indicating whether the graph should be rotated along the x-axis to give a mirrored reflection. This is typical for audio plots to produce the classic waveform look. A value of YES will produce a mirrored reflection of the y-values about the x-axis, while a value of NO will only plot the y-values.\n */\n@property (nonatomic,assign,setter=setShouldMirror:) BOOL shouldMirror;\n\n#pragma mark - Adjust Resolution\n///-----------------------------------------------------------\n/// @name Adjusting The Resolution\n///-----------------------------------------------------------\n\n/**\n Sets the length of the rolling history display. Can grow or shrink the display up to the maximum size specified by the kEZAudioPlotMaxHistoryBufferLength macro. Will return the actual set value, which will be either the given value if smaller than the kEZAudioPlotMaxHistoryBufferLength or kEZAudioPlotMaxHistoryBufferLength if a larger value is attempted to be set.\n @param  historyLength The new length of the rolling history buffer.\n @return The new value equal to the historyLength or the kEZAudioPlotMaxHistoryBufferLength.\n */\n-(int)setRollingHistoryLength:(int)historyLength;\n\n/**\n Provides the length of the rolling history buffer\n *  @return An int representing the length of the rolling history buffer\n */\n-(int)rollingHistoryLength;\n\n#pragma mark - Clearing\n///-----------------------------------------------------------\n/// @name Clearing The Plot\n///-----------------------------------------------------------\n\n/**\n Clears all data from the audio plot (includes both EZPlotTypeBuffer and EZPlotTypeRolling)\n */\n-(void)clear;\n\n#pragma mark - Get Samples\n///-----------------------------------------------------------\n/// @name Updating The Plot\n///-----------------------------------------------------------\n/**\n Updates the plot with the new buffer data and tells the view to redraw itself. Caller will provide a float array with the values they expect to see on the y-axis. The plot will internally handle mapping the x-axis and y-axis to the current view port, any interpolation for fills effects, and mirroring.\n @param buffer     A float array of values to map to the y-axis.\n @param bufferSize The size of the float array that will be mapped to the y-axis.\n @warning The bufferSize is expected to be the same, constant value once initial triggered. For plots using OpenGL a vertex buffer object will be allocated with a maximum buffersize of (2 * the initial given buffer size) to account for any interpolation necessary for filling in the graph. Updates use the glBufferSubData(...) function, which will crash if the buffersize exceeds the initial maximum allocated size.\n */\n-(void)updateBuffer:(float *)buffer\n     withBufferSize:(UInt32)bufferSize;\n\n@end\n\n#elif TARGET_OS_MAC\n#endif\n"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/EZAudioPlotGLKViewController.m",
    "content": "//\n//  EZAudioPlotGLKViewController.m\n//  EZAudio\n//\n//  Created by Syed Haris Ali on 11/22/13.\n//  Copyright (c) 2013 Syed Haris Ali. All rights reserved.\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#if TARGET_OS_IPHONE\n\n#import \"EZAudioPlotGLKViewController.h\"\n#import \"EZAudio.h\"\n\n@interface EZAudioPlotGLKViewController () {\n  \n  // Flags indicating whether the plots have been instantiated\n  BOOL _hasBufferPlotData;\n  BOOL _hasRollingPlotData;\n  \n  // The buffers\n  GLuint _bufferPlotVBO;\n  GLuint _rollingPlotVBO;\n  \n  // Buffers size\n  UInt32 _bufferPlotGraphSize;\n  UInt32 _rollingPlotGraphSize;\n  \n  // Rolling History\n  BOOL    _setMaxLength;\n  float   *_scrollHistory;\n  int     _scrollHistoryIndex;\n  UInt32  _scrollHistoryLength;\n  BOOL    _changingHistorySize;\n  \n}\n@end\n\n@implementation EZAudioPlotGLKViewController\n@synthesize baseEffect   = _baseEffect;\n@synthesize context      = _context;\n@synthesize drawingType  = _drawingType;\n@synthesize plotType     = _plotType;\n@synthesize shouldMirror = _shouldMirror;\n\n#pragma mark - Initialization\n-(id)init\n{\n  self = [super init];\n  if (self) {\n    [self initializeView];\n  }\n  return self;\n}\n\n-(id)initWithCoder:(NSCoder *)aDecoder {\n  self = [super initWithCoder:aDecoder];\n  if(self){\n    [self initializeView];\n  }\n  return self;\n}\n\n-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {\n  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];\n  if(self){\n    [self initializeView];\n  }\n  return self;\n  \n}\n#pragma mark - Initialize Properties Here\n-(void)initializeView {\n  // Setup the base effect\n  self.baseEffect = [[GLKBaseEffect alloc] init];\n  self.baseEffect.useConstantColor = GL_TRUE;\n  self.preferredFramesPerSecond = 60;\n  _scrollHistory       = NULL;\n  _scrollHistoryLength = kEZAudioPlotDefaultHistoryBufferLength;\n}\n\n#pragma mark - View Did Load\n-(void)viewDidLoad {\n  [super viewDidLoad];\n  \n  // Setup the context\n  if( ![EAGLContext currentContext] )\n  {\n    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];\n  }\n  else\n  {\n    self.context = [EAGLContext currentContext];\n  }\n  \n  if (!self.context) {\n    NSLog(@\"Failed to create ES context\");\n  }\n  else {\n    EAGLContext.currentContext = self.context;\n  }\n  \n  // Set the view's context\n  GLKView *view            = (GLKView *)self.view;\n  view.context             = self.context;\n  view.drawableMultisample = GLKViewDrawableMultisample4X;\n  \n  // Generate both the buffer id references\n  glGenBuffers(1, &_bufferPlotVBO);\n  glGenBuffers(1, &_rollingPlotVBO);\n  \n  // Refresh color values\n  [self _refreshWithBackgroundColor: self.backgroundColor];\n  [self _refreshWithColor:           self.color];\n  \n  // Set the line width for the context\n  glLineWidth(2.0);\n  \n}\n\n#pragma mark - Adjust Resolution\n-(int)setRollingHistoryLength:(int)historyLength {\n  _changingHistorySize = YES;\n  historyLength = MIN(historyLength,kEZAudioPlotMaxHistoryBufferLength);\n  size_t floatByteSize = sizeof(float);\n  if( _scrollHistoryLength != historyLength ){\n    _scrollHistoryLength = historyLength;\n  }\n  _scrollHistory = realloc(_scrollHistory,_scrollHistoryLength*floatByteSize);\n  if( _scrollHistoryIndex < _scrollHistoryLength ){\n    memset(&_scrollHistory[_scrollHistoryIndex],\n           0,\n           (_scrollHistoryLength-_scrollHistoryIndex)*floatByteSize);\n  }\n  else {\n    _scrollHistoryIndex = _scrollHistoryLength;\n  }\n  [self _updateRollingPlotDisplay];\n  _changingHistorySize = NO;\n  return historyLength;\n}\n\n-(int)rollingHistoryLength {\n  return _scrollHistoryLength;\n}\n\n#pragma mark - Clearing\n-(void)clear\n{\n  _scrollHistoryIndex = 0;\n  [self _clearBufferPlot];\n  [self _clearRollingPlot];\n}\n\n-(void)_clearBufferPlot\n{\n  if( _hasBufferPlotData )\n  {\n    float empty[_bufferPlotGraphSize];\n    memset( empty, 0.0f, sizeof(float) );\n    [self _updateBufferPlotBufferWithAudioReceived:empty\n                                    withBufferSize:_bufferPlotGraphSize];\n  }\n}\n\n-(void)_clearRollingPlot\n{\n  if( _hasRollingPlotData )\n  {\n    float              empty[_rollingPlotGraphSize];\n    EZAudioPlotGLPoint graph[_rollingPlotGraphSize];\n    // Figure out better way to do this\n    for(int i = 0; i < _rollingPlotGraphSize; i++ )\n    {\n      empty[i] = 0.0f;\n    }\n    for(int i = 0; i < _scrollHistoryLength; i++)\n    {\n      _scrollHistory[i] = 0.0f;\n    }\n    // Update the scroll history datasource\n    [EZAudio updateScrollHistory:&_scrollHistory\n                      withLength:_scrollHistoryLength\n                         atIndex:&_scrollHistoryIndex\n                      withBuffer:empty\n                  withBufferSize:_rollingPlotGraphSize\n            isResolutionChanging:&_changingHistorySize];\n    // Fill in graph data\n    [EZAudioPlotGL fillGraph:graph\n               withGraphSize:_rollingPlotGraphSize\n              forDrawingType:_drawingType\n                  withBuffer:_scrollHistory\n              withBufferSize:_scrollHistoryLength\n                    withGain:self.gain];\n    // Update the drawing\n    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(graph), graph);\n  }\n}\n\n#pragma mark - Get Samples\n-(void)updateBuffer:(float *)buffer\n     withBufferSize:(UInt32)bufferSize {\n  \n  // Make sure the update render loop is active\n  if( self.paused ) self.paused = NO;\n  \n  // Make sure we are updating the buffers on the correct gl context.\n  EAGLContext.currentContext = self.context;\n  \n  // Draw based on plot type\n  switch(_plotType) {\n    case EZPlotTypeBuffer:\n      [self _updateBufferPlotBufferWithAudioReceived:buffer\n                                      withBufferSize:bufferSize];\n      break;\n    case EZPlotTypeRolling:\n      [self _updateRollingPlotBufferWithAudioReceived:buffer\n                                       withBufferSize:bufferSize];\n      break;\n    default:\n      break;\n  }\n  \n}\n\n#pragma mark - Buffer Updating By Type\n-(void)_updateBufferPlotBufferWithAudioReceived:(float*)buffer\n                                 withBufferSize:(UInt32)bufferSize {\n  \n  glBindBuffer(GL_ARRAY_BUFFER, _bufferPlotVBO);\n  \n  // If starting with a VBO of half of our max size make sure we initialize it to anticipate\n  // a filled graph (which needs 2 * bufferSize) to allocate its resources properly\n  if( !_hasBufferPlotData && _drawingType == EZAudioPlotGLDrawTypeLineStrip ){\n    EZAudioPlotGLPoint maxGraph[2*bufferSize];\n    glBufferData(GL_ARRAY_BUFFER, sizeof(maxGraph), maxGraph, GL_STREAM_DRAW );\n    _hasBufferPlotData = YES;\n  }\n  \n  // Setup the buffer plot's graph size\n  _bufferPlotGraphSize = [EZAudioPlotGL graphSizeForDrawingType:_drawingType\n                                                  withBufferSize:bufferSize];\n  \n  // Setup the graph\n  EZAudioPlotGLPoint graph[_bufferPlotGraphSize];\n  \n  // Fill in graph data\n  [EZAudioPlotGL fillGraph:graph\n              withGraphSize:_bufferPlotGraphSize\n             forDrawingType:_drawingType\n                 withBuffer:buffer\n             withBufferSize:bufferSize\n                   withGain:self.gain];\n  \n  if( !_hasBufferPlotData ){\n    glBufferData( GL_ARRAY_BUFFER, sizeof(graph), graph, GL_STREAM_DRAW );\n    _hasBufferPlotData = YES;\n  }\n  else {\n    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(graph), graph);\n  }\n  \n  glBindBuffer(GL_ARRAY_BUFFER, 0);\n  \n}\n\n-(void)_updateRollingPlotBufferWithAudioReceived:(float*)buffer\n                                  withBufferSize:(UInt32)bufferSize {\n  \n  glBindBuffer(GL_ARRAY_BUFFER, _rollingPlotVBO);\n  \n  \n  \n  // If starting with a VBO of half of our max size make sure we initialize it to anticipate\n  // a filled graph (which needs 2 * bufferSize) to allocate its resources properly\n  if( !_hasRollingPlotData ){\n    EZAudioPlotGLPoint maxGraph[2*kEZAudioPlotMaxHistoryBufferLength];\n    glBufferData( GL_ARRAY_BUFFER, sizeof(maxGraph), maxGraph, GL_STREAM_DRAW );\n    _hasRollingPlotData = YES;\n  }\n  \n  // Setup the plot\n  _rollingPlotGraphSize = [EZAudioPlotGL graphSizeForDrawingType:_drawingType\n                                                  withBufferSize:_scrollHistoryLength];\n  \n  // Fill the graph with data\n  EZAudioPlotGLPoint graph[_rollingPlotGraphSize];\n  \n  // Update the scroll history datasource\n  [EZAudio updateScrollHistory:&_scrollHistory\n                    withLength:_scrollHistoryLength\n                       atIndex:&_scrollHistoryIndex\n                    withBuffer:buffer\n                withBufferSize:bufferSize\n          isResolutionChanging:&_changingHistorySize];\n  \n  // Fill in graph data\n  [EZAudioPlotGL fillGraph:graph\n             withGraphSize:_rollingPlotGraphSize\n            forDrawingType:_drawingType\n                withBuffer:_scrollHistory\n            withBufferSize:_scrollHistoryLength\n                  withGain:self.gain];\n  \n  // Update the drawing\n  if( !_hasRollingPlotData ){\n    glBufferData( GL_ARRAY_BUFFER, sizeof(graph) , graph, GL_STREAM_DRAW );\n    _hasRollingPlotData = YES;\n  }\n  else {\n    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(graph), graph);\n  }\n  \n  glBindBuffer(GL_ARRAY_BUFFER, 0);\n  \n}\n\n-(void)_updateRollingPlotDisplay {\n  // Setup the plot\n  _rollingPlotGraphSize = [EZAudioPlotGL graphSizeForDrawingType:_drawingType\n                                                  withBufferSize:_scrollHistoryLength];\n  \n  // Fill the graph with data\n  EZAudioPlotGLPoint graph[_rollingPlotGraphSize];\n  // Fill in graph data\n  [EZAudioPlotGL fillGraph:graph\n             withGraphSize:_rollingPlotGraphSize\n            forDrawingType:_drawingType\n                withBuffer:_scrollHistory\n            withBufferSize:_scrollHistoryLength\n                  withGain:self.gain];\n  \n  // Update the drawing\n  if( _hasRollingPlotData ){\n    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(graph), graph);\n  }\n}\n\n#pragma mark - Drawing\n-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect {\n \n  EAGLContext.currentContext = self.context;\n \n  // Clear the context\n  glClear(GL_COLOR_BUFFER_BIT);\n  \n  if( _hasBufferPlotData || _hasRollingPlotData ){\n    // Prepare the effect for drawing\n    [self.baseEffect prepareToDraw];\n    \n    // Plot either a buffer plot or a rolling plot\n    switch(_plotType) {\n      case EZPlotTypeBuffer:\n        [self _drawBufferPlotWithView:view\n                           drawInRect:rect];\n        break;\n      case EZPlotTypeRolling:\n        [self _drawRollingPlotWithView:view\n                            drawInRect:rect];\n        break;\n      default:\n        break;\n        \n    }\n  }\n}\n\n#pragma mark - Private Drawing\n-(void)_drawBufferPlotWithView:(GLKView*)view drawInRect:(CGRect)rect {\n  if( _hasBufferPlotData ){\n    \n    glBindBuffer(GL_ARRAY_BUFFER, _bufferPlotVBO);\n    glEnableVertexAttribArray(GLKVertexAttribPosition);\n    glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(EZAudioPlotGLPoint), NULL);\n    \n    // Normal plot\n    \n    self.baseEffect.transform.modelviewMatrix = GLKMatrix4MakeXRotation(0);\n    glDrawArrays(_drawingType, 0, _bufferPlotGraphSize);\n    \n    \n    if( self.shouldMirror ){\n      // Mirrored plot\n      [self.baseEffect prepareToDraw];\n      \n      self.baseEffect.transform.modelviewMatrix = GLKMatrix4MakeXRotation(M_PI);\n      glDrawArrays(_drawingType, 0, _bufferPlotGraphSize);\n      \n    }\n    \n    \n    glBindBuffer(GL_ARRAY_BUFFER,0);\n    \n  }\n}\n\n-(void)_drawRollingPlotWithView:(GLKView*)view drawInRect:(CGRect)rect {\n  if( _hasRollingPlotData ){\n    \n    // Normal plot\n    glBindBuffer(GL_ARRAY_BUFFER, _rollingPlotVBO);\n    glEnableVertexAttribArray(GLKVertexAttribPosition);\n    glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(EZAudioPlotGLPoint), NULL);\n    \n    // Normal plot\n    \n    self.baseEffect.transform.modelviewMatrix = GLKMatrix4MakeXRotation(0);\n    glDrawArrays(_drawingType, 0, _rollingPlotGraphSize);\n    \n    \n    if( self.shouldMirror ){\n      // Mirrored plot\n      [self.baseEffect prepareToDraw];\n      \n      self.baseEffect.transform.modelviewMatrix = GLKMatrix4MakeXRotation(3.14159265359);\n      glDrawArrays(_drawingType, 0, _rollingPlotGraphSize);\n      \n    }\n    \n    glBindBuffer(GL_ARRAY_BUFFER,0);\n    \n  }\n}\n\n#pragma mark - Setters\n-(void)setBackgroundColor:(UIColor *)backgroundColor {\n  // Set the background color\n  _backgroundColor = backgroundColor;\n  // Refresh background color (map to GL vector)\n  [self _refreshWithBackgroundColor:backgroundColor];\n}\n\n-(void)setColor:(UIColor *)color {\n  // Set the color\n  _color = color;\n  // Refresh the color (map to GL vector)\n  [self _refreshWithColor:color];\n}\n\n#pragma mark - Private Setters\n-(void)_refreshWithBackgroundColor:(UIColor*)backgroundColor {\n  // Extract colors\n  CGFloat red; CGFloat green; CGFloat blue; CGFloat alpha;\n  [backgroundColor getRed:&red\n                    green:&green\n                     blue:&blue\n                    alpha:&alpha];\n  // Set them on the context\n  glClearColor((GLclampf)red,(GLclampf)green,(GLclampf)blue,(GLclampf)alpha);\n}\n\n-(void)_refreshWithColor:(UIColor*)color {\n  // Extract colors\n  CGFloat red; CGFloat green; CGFloat blue; CGFloat alpha;\n  [color getRed:&red\n          green:&green\n           blue:&blue\n          alpha:&alpha];\n  // Set them on the base shader\n  self.baseEffect.constantColor = GLKVector4Make((GLclampf)red,(GLclampf)green,(GLclampf)blue,(GLclampf)alpha);\n}\n\n@end\n\n#elif TARGET_OS_MAC\n\n#endif\n"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/EZMicrophone.h",
    "content": "//\n//  EZMicrophone.h\n//  EZAudio\n//\n//  Created by Syed Haris Ali on 9/2/13.\n//  Copyright (c) 2013 Syed Haris Ali. All rights reserved.\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#import  <Foundation/Foundation.h>\n#import  <AudioToolbox/AudioToolbox.h>\n#import  \"AEFloatConverter.h\"\n#import  \"TargetConditionals.h\"\n\n@class EZAudio;\n@class EZMicrophone;\n\n#pragma mark - EZMicrophoneDelegate\n/**\n The delegate for the EZMicrophone provides a receiver for the incoming audio data events. When the microphone has been successfully internally configured it will try to send its delegate an AudioStreamBasicDescription describing the format of the incoming audio data. \n \n The audio data itself is sent back to the delegate in various forms:\n \n   -`microphone:hasAudioReceived:withBufferSize:withNumberOfChannels:`\n     Provides float arrays instead of the AudioBufferList structure to hold the audio data. There could be a number of float arrays depending on the number of channels (see the function description below). These are useful for doing any visualizations that would like to make use of the raw audio data.\n \n   -`microphone:hasBufferList:withBufferSize:withNumberOfChannels:`\n     Provides the AudioBufferList structures holding the audio data. These are the native structures Core Audio uses to hold the buffer information and useful for piping out directly to an output (see EZOutput).\n \n */\n@protocol EZMicrophoneDelegate <NSObject>\n\n@optional\n///-----------------------------------------------------------\n/// @name Audio Data Description\n///-----------------------------------------------------------\n\n/**\n Returns back the audio stream basic description as soon as it has been initialized. This is guaranteed to occur before the stream callbacks, `microphone:hasBufferList:withBufferSize:withNumberOfChannels:` or `microphone:hasAudioReceived:withBufferSize:withNumberOfChannels:`\n @param microphone The instance of the EZMicrophone that triggered the event.\n @param audioStreamBasicDescription The AudioStreamBasicDescription that was created for the microphone instance.\n */\n-(void)              microphone:(EZMicrophone *)microphone\n hasAudioStreamBasicDescription:(AudioStreamBasicDescription)audioStreamBasicDescription;\n\n///-----------------------------------------------------------\n/// @name Audio Data Callbacks\n///-----------------------------------------------------------\n\n/**\n Returns back a float array of the audio received. This occurs on the background thread so any drawing code must explicity perform its functions on the main thread.\n @param microphone       The instance of the EZMicrophone that triggered the event.\n @param buffer           The audio data as an array of float arrays. In a stereo signal buffer[0] represents the left channel while buffer[1] would represent the right channel.\n @param bufferSize       The size of each of the buffers (the length of each float array).\n @param numberOfChannels The number of channels for the incoming audio.\n @warning This function executes on a background thread to avoid blocking any audio operations. If operations should be performed on any other thread (like the main thread) it should be performed within a dispatch block like so: dispatch_async(dispatch_get_main_queue(), ^{ ...Your Code... })\n */\n-(void)    microphone:(EZMicrophone*)microphone\n     hasAudioReceived:(float**)buffer\n       withBufferSize:(UInt32)bufferSize\n withNumberOfChannels:(UInt32)numberOfChannels;\n\n/**\n Returns back the buffer list containing the audio received. This occurs on the background thread so any drawing code must explicity perform its functions on the main thread.\n @param microphone       The instance of the EZMicrophone that triggered the event.\n @param bufferList       The AudioBufferList holding the audio data.\n @param bufferSize       The size of each of the buffers of the AudioBufferList.\n @param numberOfChannels The number of channels for the incoming audio.\n @warning This function executes on a background thread to avoid blocking any audio operations. If operations should be performed on any other thread (like the main thread) it should be performed within a dispatch block like so: dispatch_async(dispatch_get_main_queue(), ^{ ...Your Code... })\n */\n-(void)    microphone:(EZMicrophone*)microphone\n        hasBufferList:(AudioBufferList*)bufferList\n       withBufferSize:(UInt32)bufferSize\n withNumberOfChannels:(UInt32)numberOfChannels;\n\n@end\n\n#pragma mark - EZMicrophone\n/**\n The EZMicrophone provides a component to get audio data from the default device microphone. On OSX this is the default selected input device in the system preferences while on iOS this defaults to use the default RemoteIO audio unit. The microphone data is converted to a float buffer array and returned back to the caller via the EZMicrophoneDelegate protocol.\n */\n@interface EZMicrophone : NSObject\n\n/**\n The EZMicrophoneDelegate for which to handle the microphone callbacks\n */\n@property (nonatomic,assign) id<EZMicrophoneDelegate> microphoneDelegate;\n\n/**\n A bool describing whether the microphone is on and passing back audio data to its delegate.\n */\n@property (nonatomic,assign) BOOL microphoneOn;\n\n#pragma mark - Initializers\n///-----------------------------------------------------------\n/// @name Initializers\n///-----------------------------------------------------------\n\n/**\n Creates an instance of the EZMicrophone with a delegate to respond to the audioReceived callback. This will not start fetching the audio until startFetchingAudio has been called. Use initWithMicrophoneDelegate:startsImmediately: to instantiate this class and immediately start fetching audio data.\n @param \tmicrophoneDelegate \tA EZMicrophoneDelegate delegate that will receive the audioReceived callback.\n @return\tAn instance of the EZMicrophone class. This should be strongly retained.\n */\n-(EZMicrophone*)initWithMicrophoneDelegate:(id<EZMicrophoneDelegate>)microphoneDelegate;\n\n/**\n Creates an instance of the EZMicrophone with a custom AudioStreamBasicDescription and provides the caller to specify a delegate to respond to the audioReceived callback. This will not start fetching the audio until startFetchingAudio has been called. Use initWithMicrophoneDelegate:startsImmediately: to instantiate this class and immediately start fetching audio data.\n @param \tmicrophoneDelegate \t        A EZMicrophoneDelegate delegate that will receive the audioReceived callback.\n @param \taudioStreamBasicDescription A custom AudioStreamBasicFormat for the microphone input.\n @return\tAn instance of the EZMicrophone class. This should be strongly retained.\n */\n-(EZMicrophone*)initWithMicrophoneDelegate:(id<EZMicrophoneDelegate>)microphoneDelegate\n           withAudioStreamBasicDescription:(AudioStreamBasicDescription)audioStreamBasicDescription;\n\n/**\n Creates an instance of the EZMicrophone with a delegate to respond to the audioReceived callback and allows the caller to specify whether they'd immediately like to start fetching the audio data.\n @param \tmicrophoneDelegate \tA EZMicrophoneDelegate delegate that will receive the audioReceived callback.\n @param \tstartsImmediately \tA boolean indicating whether to start fetching the data immediately. IF YES, the delegate's audioReceived callback will immediately start getting called.\n @return\tAn instance of the EZMicrophone class. This should be strongly retained.\n */\n-(EZMicrophone*)initWithMicrophoneDelegate:(id<EZMicrophoneDelegate>)microphoneDelegate\n                          startsImmediately:(BOOL)startsImmediately;\n\n/**\n Creates an instance of the EZMicrophone with a custom AudioStreamBasicDescription and provides the caller with a delegate to respond to the audioReceived callback and allows the caller to specify whether they'd immediately like to start fetching the audio data.\n @param \tmicrophoneDelegate \tA EZMicrophoneDelegate delegate that will receive the audioReceived callback.\n @param \taudioStreamBasicDescription A custom AudioStreamBasicFormat for the microphone input.\n @param \tstartsImmediately \tA boolean indicating whether to start fetching the data immediately. IF YES, the delegate's audioReceived callback will immediately start getting called.\n @return\tAn instance of the EZMicrophone class. This should be strongly retained.\n */\n-(EZMicrophone*)initWithMicrophoneDelegate:(id<EZMicrophoneDelegate>)microphoneDelegate\n           withAudioStreamBasicDescription:(AudioStreamBasicDescription)audioStreamBasicDescription\n                         startsImmediately:(BOOL)startsImmediately;\n\n#pragma mark - Class Initializers\n///-----------------------------------------------------------\n/// @name Class Initializers\n///-----------------------------------------------------------\n\n/**\n Creates an instance of the EZMicrophone with a delegate to respond to the audioReceived callback. This will not start fetching the audio until startFetchingAudio has been called. Use microphoneWithDelegate:startsImmediately: to instantiate this class and immediately start fetching audio data.\n @param \tmicrophoneDelegate \tA EZMicrophoneDelegate delegate that will receive the audioReceived callback.\n @return\tAn instance of the EZMicrophone class. This should be declared as a strong property!\n */\n+(EZMicrophone*)microphoneWithDelegate:(id<EZMicrophoneDelegate>)microphoneDelegate;\n\n/**\n Creates an instance of the EZMicrophone with a delegate to respond to the audioReceived callback. This will not start fetching the audio until startFetchingAudio has been called. Use microphoneWithDelegate:startsImmediately: to instantiate this class and immediately start fetching audio data.\n @param \tmicrophoneDelegate \tA EZMicrophoneDelegate delegate that will receive the audioReceived callback.\n @param \taudioStreamBasicDescription A custom AudioStreamBasicFormat for the microphone input.\n @return\tAn instance of the EZMicrophone class. This should be declared as a strong property!\n */\n+(EZMicrophone*)microphoneWithDelegate:(id<EZMicrophoneDelegate>)microphoneDelegate\n       withAudioStreamBasicDescription:(AudioStreamBasicDescription)audioStreamBasicDescription;\n\n/**\n Creates an instance of the EZMicrophone with a delegate to respond to the audioReceived callback and allows the caller to specify whether they'd immediately like to start fetching the audio data.\n \n @param microphoneDelegate A EZMicrophoneDelegate delegate that will receive the audioReceived callback.\n @param startsImmediately  A boolean indicating whether to start fetching the data immediately. IF YES, the delegate's audioReceived callback will immediately start getting called.\n @return An instance of the EZMicrophone class. This should be strongly retained.\n */\n+(EZMicrophone*)microphoneWithDelegate:(id<EZMicrophoneDelegate>)microphoneDelegate\n                      startsImmediately:(BOOL)startsImmediately;\n\n/**\n Creates an instance of the EZMicrophone with a delegate to respond to the audioReceived callback and allows the caller to specify whether they'd immediately like to start fetching the audio data.\n \n @param microphoneDelegate A EZMicrophoneDelegate delegate that will receive the audioReceived callback.\n @param audioStreamBasicDescription A custom AudioStreamBasicFormat for the microphone input.\n @param startsImmediately  A boolean indicating whether to start fetching the data immediately. IF YES, the delegate's audioReceived callback will immediately start getting called.\n @return An instance of the EZMicrophone class. This should be strongly retained.\n */\n+(EZMicrophone*)microphoneWithDelegate:(id<EZMicrophoneDelegate>)microphoneDelegate\n       withAudioStreamBasicDescription:(AudioStreamBasicDescription)audioStreamBasicDescription\n                     startsImmediately:(BOOL)startsImmediately;\n\n#pragma mark - Singleton\n///-----------------------------------------------------------\n/// @name Shared Instance\n///-----------------------------------------------------------\n\n/**\n A shared instance of the microphone component. Most applications will only need to use one instance of the microphone component across multiple views. Make sure to call the `startFetchingAudio` method to receive the audio data in the microphone delegate.\n @return A shared instance of the `EZAudioMicrophone` component.\n */\n+(EZMicrophone*)sharedMicrophone;\n\n#pragma mark - Events\n///-----------------------------------------------------------\n/// @name Starting/Stopping The Microphone\n///-----------------------------------------------------------\n\n/**\n Starts fetching audio from the default microphone. Will notify delegate with audioReceived callback.\n */\n-(void)startFetchingAudio;\n\n/**\n Stops fetching audio. Will stop notifying the delegate's audioReceived callback.\n */\n-(void)stopFetchingAudio;\n\n#pragma mark - Getters\n///-----------------------------------------------------------\n/// @name Getting The Microphone's Audio Format\n///-----------------------------------------------------------\n\n/**\n Provides the AudioStreamBasicDescription structure containing the format of the microphone's audio.\n @return An AudioStreamBasicDescription structure describing the format of the microphone's audio.\n */\n-(AudioStreamBasicDescription)audioStreamBasicDescription;\n\n#pragma mark - Setters\n///-----------------------------------------------------------\n/// @name Customizing The Microphone Input Format\n///-----------------------------------------------------------\n\n/**\n Sets the AudioStreamBasicDescription on the microphone input.\n @warning Do not set this while fetching audio (startFetchingAudio)\n @param asbd The new AudioStreamBasicDescription to use in place of the current audio format description.\n */\n-(void)setAudioStreamBasicDescription:(AudioStreamBasicDescription)asbd;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/EZMicrophone.m",
    "content": "//\n//  EZMicrophone.m\n//  EZAudio\n//\n//  Created by Syed Haris Ali on 9/2/13.\n//  Copyright (c) 2013 Syed Haris Ali. All rights reserved.\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#import \"EZMicrophone.h\"\n\n#ifndef MAC_OS_X_VERSION_10_7\n// CoreServices defines eofErr, replaced in 10.7 by kAudioFileEndOfFileError\n#include <CoreServices/CoreServices.h>\n#endif\n\n#import \"EZAudio.h\"\n\n/// Buses\nstatic const AudioUnitScope kEZAudioMicrophoneInputBus  = 1;\nstatic const AudioUnitScope kEZAudioMicrophoneOutputBus = 0;\n\n/// Flags\n#if TARGET_OS_IPHONE\nstatic const UInt32 kEZAudioMicrophoneDisableFlag = 1;\n#elif TARGET_OS_MAC\nstatic const UInt32 kEZAudioMicrophoneDisableFlag = 0;\n#endif\nstatic const UInt32 kEZAudioMicrophoneEnableFlag  = 1;\n\n@interface EZMicrophone (){\n  /// Internal\n  BOOL _customASBD;\n  BOOL _isConfigured;\n  BOOL _isFetching;\n  \n  /// Stream Description\n  AEFloatConverter            *converter;\n  AudioStreamBasicDescription streamFormat;\n  \n  /// Audio Graph and Input/Output Units\n  AudioUnit microphoneInput;\n  \n  /// Audio Buffers\n  float           **floatBuffers;\n  AudioBufferList *microphoneInputBuffer;\n  \n  /// Device Parameters\n  Float64 _deviceSampleRate;\n  Float32 _deviceBufferDuration;\n  UInt32  _deviceBufferFrameSize;\n  \n#if TARGET_OS_IPHONE\n#elif TARGET_OS_MAC\n  Float64 inputScopeSampleRate;\n#endif\n  \n}\n@end\n\n@implementation EZMicrophone\n@synthesize microphoneDelegate = _microphoneDelegate;\n@synthesize microphoneOn = _microphoneOn;\n\n#pragma mark - Callbacks\nstatic OSStatus inputCallback(void                          *inRefCon,\n                              AudioUnitRenderActionFlags    *ioActionFlags,\n                              const AudioTimeStamp          *inTimeStamp,\n                              UInt32                        inBusNumber,\n                              UInt32                        inNumberFrames,\n                              AudioBufferList               *ioData ) {\n  EZMicrophone *microphone = (__bridge EZMicrophone*)inRefCon;\n  OSStatus      result     = noErr;\n  // Render audio into buffer\n  result = AudioUnitRender(microphone->microphoneInput,\n                           ioActionFlags,\n                           inTimeStamp,\n                           inBusNumber,\n                           inNumberFrames,\n                           microphone->microphoneInputBuffer);\n  if( !result ){\n    // ----- Notify delegate (OF-style) -----\n    // Audio Received (float array)\n    if( microphone.microphoneDelegate ){\n      // THIS IS NOT OCCURING ON THE MAIN THREAD\n      if( [microphone.microphoneDelegate respondsToSelector:@selector(microphone:hasAudioReceived:withBufferSize:withNumberOfChannels:)] ){\n        AEFloatConverterToFloat(microphone->converter,\n                                microphone->microphoneInputBuffer,\n                                microphone->floatBuffers,\n                                inNumberFrames);\n        [microphone.microphoneDelegate microphone:microphone\n                                 hasAudioReceived:microphone->floatBuffers\n                                   withBufferSize:inNumberFrames\n                             withNumberOfChannels:microphone->streamFormat.mChannelsPerFrame];\n      }\n    }\n    // Audio Received (buffer list)\n    if( microphone.microphoneDelegate ){\n      if( [microphone.microphoneDelegate respondsToSelector:@selector(microphone:hasBufferList:withBufferSize:withNumberOfChannels:)] ){\n        [microphone.microphoneDelegate microphone:microphone\n                                    hasBufferList:microphone->microphoneInputBuffer\n                                   withBufferSize:inNumberFrames\n                             withNumberOfChannels:microphone->streamFormat.mChannelsPerFrame];\n      }\n    }\n  }\n  return result;\n}\n\n#pragma mark - Initialization\n-(id)init {\n  self = [super init];\n  if(self){\n    // Clear the float buffer\n    floatBuffers = NULL;\n    // We're not fetching anything yet\n    _isConfigured = NO;\n    _isFetching   = NO;\n    if( !_isConfigured ){\n      // Create the input audio graph\n      [self _createInputUnit];\n      // We're configured meow\n      _isConfigured = YES;\n    }\n  }\n  return self;\n}\n\n-(EZMicrophone *)initWithMicrophoneDelegate:(id<EZMicrophoneDelegate>)microphoneDelegate {\n  self = [super init];\n  if(self){\n    self.microphoneDelegate = microphoneDelegate;\n    // Clear the float buffer\n    floatBuffers = NULL;\n    // We're not fetching anything yet\n    _isConfigured = NO;\n    _isFetching   = NO;\n    if( !_isConfigured ){\n      // Create the input audio graph\n      [self _createInputUnit];\n      // We're configured meow\n      _isConfigured = YES;\n    }\n  }\n  return self;\n}\n\n-(EZMicrophone *)initWithMicrophoneDelegate:(id<EZMicrophoneDelegate>)microphoneDelegate\n            withAudioStreamBasicDescription:(AudioStreamBasicDescription)audioStreamBasicDescription {\n  self = [self initWithMicrophoneDelegate:microphoneDelegate];\n  if(self){\n    _customASBD  = YES;\n    streamFormat = audioStreamBasicDescription;\n  }\n  return self;\n}\n\n-(EZMicrophone *)initWithMicrophoneDelegate:(id<EZMicrophoneDelegate>)microphoneDelegate\n                           startsImmediately:(BOOL)startsImmediately {\n  self = [self initWithMicrophoneDelegate:microphoneDelegate];\n  if(self){\n    startsImmediately ? [self startFetchingAudio] : -1;\n  }\n  return self;\n}\n\n-(EZMicrophone *)initWithMicrophoneDelegate:(id<EZMicrophoneDelegate>)microphoneDelegate\n            withAudioStreamBasicDescription:(AudioStreamBasicDescription)audioStreamBasicDescription\n                          startsImmediately:(BOOL)startsImmediately {\n  self = [self initWithMicrophoneDelegate:microphoneDelegate withAudioStreamBasicDescription:audioStreamBasicDescription];\n  if(self){\n    startsImmediately ? [self startFetchingAudio] : -1;\n  }\n  return self;\n}\n\n#pragma mark - Class Initializers\n+(EZMicrophone *)microphoneWithDelegate:(id<EZMicrophoneDelegate>)microphoneDelegate {\n  return [[EZMicrophone alloc] initWithMicrophoneDelegate:microphoneDelegate];\n}\n\n+(EZMicrophone *)microphoneWithDelegate:(id<EZMicrophoneDelegate>)microphoneDelegate\n        withAudioStreamBasicDescription:(AudioStreamBasicDescription)audioStreamBasicDescription {\n  return [[EZMicrophone alloc] initWithMicrophoneDelegate:microphoneDelegate\n                          withAudioStreamBasicDescription:audioStreamBasicDescription];\n}\n\n+(EZMicrophone *)microphoneWithDelegate:(id<EZMicrophoneDelegate>)microphoneDelegate\n                       startsImmediately:(BOOL)startsImmediately {\n  return [[EZMicrophone alloc] initWithMicrophoneDelegate:microphoneDelegate\n                                         startsImmediately:startsImmediately];\n}\n\n+(EZMicrophone *)microphoneWithDelegate:(id<EZMicrophoneDelegate>)microphoneDelegate\n        withAudioStreamBasicDescription:(AudioStreamBasicDescription)audioStreamBasicDescription\n                      startsImmediately:(BOOL)startsImmediately {\n  return [[EZMicrophone alloc] initWithMicrophoneDelegate:microphoneDelegate\n                          withAudioStreamBasicDescription:audioStreamBasicDescription\n                                        startsImmediately:startsImmediately];\n}\n\n#pragma mark - Singleton\n+(EZMicrophone*)sharedMicrophone {\n  static EZMicrophone *_sharedMicrophone = nil;\n  static dispatch_once_t onceToken;\n  dispatch_once(&onceToken, ^{\n    _sharedMicrophone = [[EZMicrophone alloc] init];\n  });\n  return _sharedMicrophone;\n}\n\n#pragma mark - Events\n-(void)startFetchingAudio {\n  if( !_isFetching ){\n    // Start fetching input\n    [EZAudio checkResult:AudioOutputUnitStart(self->microphoneInput)\n               operation:\"Microphone failed to start fetching audio\"];\n    _isFetching = YES;\n    self.microphoneOn = YES;\n  }\n}\n\n-(void)stopFetchingAudio {\n  // Stop fetching input data\n  if( _isConfigured ){\n    if( _isFetching ){\n      [EZAudio checkResult:AudioOutputUnitStop(self->microphoneInput)\n                 operation:\"Microphone failed to stop fetching audio\"];\n      _isFetching = NO;\n      self.microphoneOn = NO;\n    }\n  }\n}\n\n#pragma mark - Getters\n-(AudioStreamBasicDescription)audioStreamBasicDescription {\n  return streamFormat;\n}\n\n#pragma mark - Setter\n-(void)setMicrophoneOn:(BOOL)microphoneOn {\n  _microphoneOn = microphoneOn;\n  if( microphoneOn ){\n    [self startFetchingAudio];\n  }\n  else {\n    [self stopFetchingAudio];\n  }\n}\n\n-(void)setAudioStreamBasicDescription:(AudioStreamBasicDescription)asbd {\n  if( self.microphoneOn ){\n    NSAssert(self.microphoneOn,@\"Cannot set the AudioStreamBasicDescription while microphone is fetching audio\");\n  }\n  else {\n    _customASBD = YES;\n    streamFormat = asbd;\n    [self _configureStreamFormatWithSampleRate:_deviceSampleRate];\n  }  \n}\n\n#pragma mark - Configure The Input Unit\n\n-(void)_createInputUnit {\n  \n  // Get component description for input\n  AudioComponentDescription inputComponentDescription = [self _getInputAudioComponentDescription];\n  \n  // Get the input component\n  AudioComponent inputComponent = [self _getInputComponentWithAudioComponentDescription:inputComponentDescription];\n  \n  // Create a new instance of the component and store it for internal use\n  [self _createNewInstanceForInputComponent:inputComponent];\n  \n  // Enable Input Scope\n  [self _enableInputScope];\n  \n  // Disable Output Scope\n  [self _disableOutputScope];\n  \n  // Get the default device if we need to (OSX only, iOS uses RemoteIO)\n  #if TARGET_OS_IPHONE\n    // Do nothing (using RemoteIO)\n  #elif TARGET_OS_MAC\n    [self _configureDefaultDevice];\n  #endif\n  \n  // Configure device and pull hardware specific sampling rate (default = 44.1 kHz)\n  _deviceSampleRate = [self _configureDeviceSampleRateWithDefault:44100.0];\n  \n  // Configure device and pull hardware specific buffer duration (default = 0.0232)\n  _deviceBufferDuration = [self _configureDeviceBufferDurationWithDefault:0.0232];\n  \n  // Configure the stream format with the hardware sample rate\n  [self _configureStreamFormatWithSampleRate:_deviceSampleRate];\n  \n  // Notify delegate the audio stream basic description was successfully created\n  [self _notifyDelegateOfStreamFormat];\n  \n  // Get buffer frame size\n  _deviceBufferFrameSize = [self _getBufferFrameSize];\n  \n  // Create the audio buffer list and pre-malloc the buffers in the list\n  [self _configureAudioBufferListWithFrameSize:_deviceBufferFrameSize];\n  \n  // Set the float converter's stream format\n  [self _configureFloatConverterWithFrameSize:_deviceBufferFrameSize];\n  \n  // Setup input callback\n  [self _configureInputCallback];\n  \n  // Disable buffer allocation (optional - do this if we want to pass in our own)\n  [self _disableCallbackBufferAllocation];\n  \n  // Initialize the audio unit\n  [EZAudio checkResult:AudioUnitInitialize( microphoneInput )\n             operation:\"Couldn't initialize the input unit\"];\n  \n}\n\n#pragma mark - Audio Component Initialization\n-(AudioComponentDescription)_getInputAudioComponentDescription {\n  \n  // Create an input component description for mic input\n  AudioComponentDescription inputComponentDescription;\n  inputComponentDescription.componentType             = kAudioUnitType_Output;\n  inputComponentDescription.componentManufacturer     = kAudioUnitManufacturer_Apple;\n  inputComponentDescription.componentFlags            = 0;\n  inputComponentDescription.componentFlagsMask        = 0;\n  #if TARGET_OS_IPHONE\n    inputComponentDescription.componentSubType          = kAudioUnitSubType_RemoteIO;\n  #elif TARGET_OS_MAC\n    inputComponentDescription.componentSubType          = kAudioUnitSubType_HALOutput;\n  #endif\n  \n  // Return the successfully created input component description\n  return inputComponentDescription;\n  \n}\n\n-(AudioComponent)_getInputComponentWithAudioComponentDescription:(AudioComponentDescription)audioComponentDescription {\n  \n  // Try and find the component\n  AudioComponent inputComponent = AudioComponentFindNext( NULL , &audioComponentDescription );\n  NSAssert(inputComponent,@\"Couldn't get input component unit!\");\n  return inputComponent;\n  \n}\n\n-(void)_createNewInstanceForInputComponent:(AudioComponent)audioComponent {\n  \n  [EZAudio checkResult:AudioComponentInstanceNew(audioComponent,\n                                                 &microphoneInput )\n             operation:\"Couldn't open component for microphone input unit.\"];\n  \n}\n\n#pragma mark - Input/Output Scope Initialization\n-(void)_disableOutputScope {\n  [EZAudio checkResult:AudioUnitSetProperty(microphoneInput,\n                                            kAudioOutputUnitProperty_EnableIO,\n                                            kAudioUnitScope_Output,\n                                            kEZAudioMicrophoneOutputBus,\n                                            &kEZAudioMicrophoneDisableFlag,\n                                            sizeof(kEZAudioMicrophoneDisableFlag))\n             operation:\"Couldn't disable output on I/O unit.\"];\n}\n\n-(void)_enableInputScope {\n  [EZAudio checkResult:AudioUnitSetProperty(microphoneInput,\n                                            kAudioOutputUnitProperty_EnableIO,\n                                            kAudioUnitScope_Input,\n                                            kEZAudioMicrophoneInputBus,\n                                            &kEZAudioMicrophoneEnableFlag,\n                                            sizeof(kEZAudioMicrophoneEnableFlag))\n             operation:\"Couldn't enable input on I/O unit.\"];\n}\n\n#pragma mark - Pull Default Device (OSX)\n#if TARGET_OS_IPHONE\n  // Not needed, using RemoteIO\n#elif TARGET_OS_MAC\n-(void)_configureDefaultDevice {\n  // Get the default audio input device (pulls an abstract type from system preferences)\n  AudioDeviceID defaultDevice = kAudioObjectUnknown;\n  UInt32 propSize = sizeof(defaultDevice);\n  AudioObjectPropertyAddress defaultDeviceProperty;\n  defaultDeviceProperty.mSelector                  = kAudioHardwarePropertyDefaultInputDevice;\n  defaultDeviceProperty.mScope                     = kAudioObjectPropertyScopeGlobal;\n  defaultDeviceProperty.mElement                   = kAudioObjectPropertyElementMaster;\n  [EZAudio checkResult:AudioObjectGetPropertyData(kAudioObjectSystemObject,\n                                                  &defaultDeviceProperty,\n                                                  0,\n                                                  NULL,\n                                                  &propSize,\n                                                  &defaultDevice)\n             operation:\"Couldn't get default input device\"];\n  \n  // Set the default device on the microphone input unit\n  propSize = sizeof(defaultDevice);\n  [EZAudio checkResult:AudioUnitSetProperty(microphoneInput,\n                                            kAudioOutputUnitProperty_CurrentDevice,\n                                            kAudioUnitScope_Global,\n                                            kEZAudioMicrophoneOutputBus,\n                                            &defaultDevice,\n                                            propSize)\n             operation:\"Couldn't set default device on I/O unit\"];\n  \n  // Get the stream format description from the newly created input unit and assign it to the output of the input unit\n  AudioStreamBasicDescription inputScopeFormat;\n  propSize = sizeof(AudioStreamBasicDescription);\n  [EZAudio checkResult:AudioUnitGetProperty(microphoneInput,\n                                            kAudioUnitProperty_StreamFormat,\n                                            kAudioUnitScope_Output,\n                                            kEZAudioMicrophoneInputBus,\n                                            &inputScopeFormat,\n                                            &propSize)\n             operation:\"Couldn't get ASBD from input unit (1)\"];\n  \n  // Assign the same stream format description from the output of the input unit and pull the sample rate\n  AudioStreamBasicDescription outputScopeFormat;\n  propSize = sizeof(AudioStreamBasicDescription);\n  [EZAudio checkResult:AudioUnitGetProperty(microphoneInput,\n                                            kAudioUnitProperty_StreamFormat,\n                                            kAudioUnitScope_Input,\n                                            kEZAudioMicrophoneInputBus,\n                                            &outputScopeFormat,\n                                            &propSize)\n             operation:\"Couldn't get ASBD from input unit (2)\"];\n  \n  // Store the input scope's sample rate\n  inputScopeSampleRate = inputScopeFormat.mSampleRate;\n  \n}\n#endif\n\n#pragma mark - Pull Sample Rate\n-(Float64)_configureDeviceSampleRateWithDefault:(float)defaultSampleRate {\n  Float64 hardwareSampleRate = defaultSampleRate;\n  #if TARGET_OS_IPHONE\n    // Use approximations for simulator and pull from real device if connected\n    #if !(TARGET_IPHONE_SIMULATOR)\n    // Sample Rate\n    hardwareSampleRate = [[AVAudioSession sharedInstance] sampleRate];\n    #endif\n  #elif TARGET_OS_MAC\n    hardwareSampleRate = inputScopeSampleRate;\n  #endif\n  return hardwareSampleRate;\n}\n\n#pragma mark - Pull Buffer Duration\n-(Float32)_configureDeviceBufferDurationWithDefault:(float)defaultBufferDuration {\n  Float32 bufferDuration = defaultBufferDuration; // Type 1/43 by default\n  #if TARGET_OS_IPHONE\n  // Use approximations for simulator and pull from real device if connected\n    #if !(TARGET_IPHONE_SIMULATOR)\n        NSError *err;\n        [[AVAudioSession sharedInstance] setPreferredIOBufferDuration:bufferDuration error:&err];\n        if (err) {\n            NSLog(@\"Error setting preferredIOBufferDuration for audio session: %@\", err.localizedDescription);\n        }\n        \n        // Buffer Size\n        bufferDuration = [[AVAudioSession sharedInstance] IOBufferDuration];\n    #endif\n  #elif TARGET_OS_MAC\n  \n  #endif\n  return bufferDuration;\n}\n\n#pragma mark - Pull Buffer Frame Size\n-(UInt32)_getBufferFrameSize {\n  UInt32 bufferFrameSize;\n  UInt32 propSize = sizeof(bufferFrameSize);\n  [EZAudio checkResult:AudioUnitGetProperty(microphoneInput,\n                                            #if TARGET_OS_IPHONE\n                                              kAudioUnitProperty_MaximumFramesPerSlice,\n                                            #elif TARGET_OS_MAC\n                                              kAudioDevicePropertyBufferFrameSize,\n                                            #endif\n                                            kAudioUnitScope_Global,\n                                            kEZAudioMicrophoneOutputBus,\n                                            &bufferFrameSize,\n                                            &propSize)\n             operation:\"Failed to get buffer frame size\"];\n  return bufferFrameSize;\n}\n\n#pragma mark - Stream Format Initialization\n-(void)_configureStreamFormatWithSampleRate:(Float64)sampleRate {\n  // Set the stream format\n  if( !_customASBD ){\n    streamFormat = [EZAudio stereoCanonicalNonInterleavedFormatWithSampleRate:sampleRate];\n  }\n  else {\n    streamFormat.mSampleRate = sampleRate;\n  }\n  UInt32 propSize = sizeof(streamFormat);\n  // Set the stream format for output on the microphone's input scope\n  [EZAudio checkResult:AudioUnitSetProperty(microphoneInput,\n                                            kAudioUnitProperty_StreamFormat,\n                                            kAudioUnitScope_Input,\n                                            kEZAudioMicrophoneOutputBus,\n                                            &streamFormat,\n                                            propSize)\n             operation:\"Could not set microphone's stream format bus 0\"];\n  \n  // Set the stream format for the input on the microphone's output scope\n  [EZAudio checkResult:AudioUnitSetProperty(microphoneInput,\n                                            kAudioUnitProperty_StreamFormat,\n                                            kAudioUnitScope_Output,\n                                            kEZAudioMicrophoneInputBus,\n                                            &streamFormat,\n                                            propSize)\n             operation:\"Could not set microphone's stream format bus 1\"];\n}\n\n-(void)_notifyDelegateOfStreamFormat {\n  if( _microphoneDelegate ){\n    if( [_microphoneDelegate respondsToSelector:@selector(microphone:hasAudioStreamBasicDescription:) ] ){\n      [_microphoneDelegate microphone:self\n       hasAudioStreamBasicDescription:streamFormat];\n    }\n  }\n}\n\n#pragma mark - AudioBufferList Initialization\n-(void)_configureAudioBufferListWithFrameSize:(UInt32)bufferFrameSize {\n  UInt32 bufferSizeBytes = bufferFrameSize * streamFormat.mBytesPerFrame;\n  UInt32 propSize = offsetof( AudioBufferList, mBuffers[0] ) + ( sizeof( AudioBuffer ) *streamFormat.mChannelsPerFrame );\n  microphoneInputBuffer                 = (AudioBufferList*)malloc(propSize);\n  microphoneInputBuffer->mNumberBuffers = streamFormat.mChannelsPerFrame;\n  for( UInt32 i = 0; i < microphoneInputBuffer->mNumberBuffers; i++ ){\n    microphoneInputBuffer->mBuffers[i].mNumberChannels = streamFormat.mChannelsPerFrame;\n    microphoneInputBuffer->mBuffers[i].mDataByteSize   = bufferSizeBytes;\n    microphoneInputBuffer->mBuffers[i].mData           = malloc(bufferSizeBytes);\n  }\n}\n\n#pragma mark - Float Converter Initialization\n-(void)_configureFloatConverterWithFrameSize:(UInt32)bufferFrameSize {\n  UInt32 bufferSizeBytes = bufferFrameSize * streamFormat.mBytesPerFrame;\n  converter              = [[AEFloatConverter alloc] initWithSourceFormat:streamFormat];\n  floatBuffers           = (float**)malloc(sizeof(float*)*streamFormat.mChannelsPerFrame);\n  assert(floatBuffers);\n  for ( int i=0; i<streamFormat.mChannelsPerFrame; i++ ) {\n    floatBuffers[i] = (float*)malloc(bufferSizeBytes);\n    assert(floatBuffers[i]);\n  }\n}\n\n#pragma mark - Input Callback Initialization\n-(void)_configureInputCallback {\n  AURenderCallbackStruct microphoneCallbackStruct;\n  microphoneCallbackStruct.inputProc       = inputCallback;\n  microphoneCallbackStruct.inputProcRefCon = (__bridge void *)self;\n  [EZAudio checkResult:AudioUnitSetProperty(microphoneInput,\n                                            kAudioOutputUnitProperty_SetInputCallback,\n                                            kAudioUnitScope_Global,\n                                            // output bus for mac\n                                            #if TARGET_OS_IPHONE\n                                              kEZAudioMicrophoneInputBus,\n                                            #elif TARGET_OS_MAC\n                                              kEZAudioMicrophoneOutputBus,\n                                            #endif\n                                            &microphoneCallbackStruct,\n                                            sizeof(microphoneCallbackStruct))\n             operation:\"Couldn't set input callback\"];\n}\n\n-(void)_disableCallbackBufferAllocation {\n  [EZAudio checkResult:AudioUnitSetProperty(microphoneInput,\n                                            kAudioUnitProperty_ShouldAllocateBuffer,\n                                            kAudioUnitScope_Output,\n                                            kEZAudioMicrophoneInputBus,\n                                            &kEZAudioMicrophoneDisableFlag,\n                                            sizeof(kEZAudioMicrophoneDisableFlag))\n             operation:\"Could not disable audio unit allocating its own buffers\"];\n}\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/EZOutput.h",
    "content": "//\n//  EZOutput.h\n//  EZAudio\n//\n//  Created by Syed Haris Ali on 12/2/13.\n//  Copyright (c) 2013 Syed Haris Ali. All rights reserved.\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#import <Foundation/Foundation.h>\n#import <AudioToolbox/AudioToolbox.h>\n#if TARGET_OS_IPHONE\n#elif TARGET_OS_MAC\n#import <AudioUnit/AudioUnit.h>\n#endif\n\n#import \"TPCircularBuffer.h\"\n\n@class EZOutput;\n\n/**\n The EZOutputDataSource (required for the EZOutput) specifies a receiver to provide audio data when the EZOutput is started. Only ONE datasource method is expected to be implemented and priority is given as such:\n   1.) `output:callbackWithActionFlags:inTimeStamp:inBusNumber:inNumberFrames:ioData:`\n   2.) `outputShouldUseCircularBuffer:`\n   3.) `output:needsBufferListWithFrames:withBufferSize:`\n */\n@protocol EZOutputDataSource <NSObject>\n\n@optional\n///-----------------------------------------------------------\n/// @name Pulling The Audio Data\n///-----------------------------------------------------------\n\n/**\n Provides complete override of the output callback function. The delegate is expected to\n @param output         The instance of the EZOutput that asked for the data\n @param ioActionFlags  AudioUnitRenderActionFlags provided by the output callback\n @param inTimeStamp    AudioTimeStamp reference provided by the output callback\n @param inBusNumber    UInt32 representing the bus number provided by the output callback\n @param inNumberFrames UInt32 representing the number of frames provided by the output callback\n @param ioData         AudioBufferList pointer representing the audio data that will be used for output provided by the output callback (fill this!)\n */\n-(void)output:(EZOutput*)output\ncallbackWithActionFlags:(AudioUnitRenderActionFlags*)ioActionFlags\n  inTimeStamp:(const AudioTimeStamp*)inTimeStamp\n  inBusNumber:(UInt32)inBusNumber\ninNumberFrames:(UInt32)inNumberFrames\n       ioData:(AudioBufferList*)ioData;\n\n/**\n Provides output using a circular\n @param output The instance of the EZOutput that asked for the data\n @return The EZOutputDataSource's TPCircularBuffer structure holding the audio data in a circular buffer\n */\n-(TPCircularBuffer*)outputShouldUseCircularBuffer:(EZOutput *)output;\n\n\n/**\n Provides a way to provide output with data anytime the EZOutput needs audio data to play. This function provides an already allocated AudioBufferList to use for providing audio data into the output buffer.\n @param output The instance of the EZOutput that asked for the data.\n @param audioBufferList The AudioBufferList structure pointer that needs to be filled with audio data\n @param frames The amount of frames as a UInt32 that output will need to properly fill its output buffer.\n @return A pointer to the AudioBufferList structure holding the audio data. If nil or NULL, will output silence.\n */\n-(void)             output:(EZOutput *)output\n shouldFillAudioBufferList:(AudioBufferList*)audioBufferList\n        withNumberOfFrames:(UInt32)frames;\n\n@end\n\n/**\n The EZOutput component provides a generic output to glue all the other EZAudio components together and push whatever sound you've created to the default output device (think opposite of the microphone). The EZOutputDataSource provides the required AudioBufferList needed to populate the output buffer.\n */\n@interface EZOutput : NSObject\n\n#pragma mark - Properties\n/**\n The EZOutputDataSource that provides the required AudioBufferList to the output callback function\n */\n@property (nonatomic,assign) id<EZOutputDataSource>outputDataSource;\n\n#pragma mark - Initializers\n///-----------------------------------------------------------\n/// @name Initializers\n///-----------------------------------------------------------\n\n/**\n Creates a new instance of the EZOutput and allows the caller to specify an EZOutputDataSource.\n @param dataSource The EZOutputDataSource that will be used to pull the audio data for the output callback.\n @return A newly created instance of the EZOutput class.\n */\n-(id)initWithDataSource:(id<EZOutputDataSource>)dataSource;\n\n/**\n Creates a new instance of the EZOutput and allows the caller to specify an EZOutputDataSource.\n @param dataSource The EZOutputDataSource that will be used to pull the audio data for the output callback.\n @param audioStreamBasicDescription The AudioStreamBasicDescription of the EZOutput.\n @warning AudioStreamBasicDescriptions that are invalid will cause the EZOutput to fail to initialize\n @return A newly created instance of the EZOutput class.\n */\n-(id)         initWithDataSource:(id<EZOutputDataSource>)dataSource\n withAudioStreamBasicDescription:(AudioStreamBasicDescription)audioStreamBasicDescription;\n\n#pragma mark - Class Initializers\n///-----------------------------------------------------------\n/// @name Class Initializers\n///-----------------------------------------------------------\n\n/**\n Class method to create a new instance of the EZOutput and allows the caller to specify an EZOutputDataSource.\n @param dataSource The EZOutputDataSource that will be used to pull the audio data for the output callback.\n @return A newly created instance of the EZOutput class.\n */\n+(EZOutput*)outputWithDataSource:(id<EZOutputDataSource>)dataSource;\n\n/**\n Class method to create a new instance of the EZOutput and allows the caller to specify an EZOutputDataSource.\n @param dataSource The EZOutputDataSource that will be used to pull the audio data for the output callback.\n @param audioStreamBasicDescription The AudioStreamBasicDescription of the EZOutput.\n @warning AudioStreamBasicDescriptions that are invalid will cause the EZOutput to fail to initialize\n @return A newly created instance of the EZOutput class.\n */\n+(EZOutput*)outputWithDataSource:(id<EZOutputDataSource>)dataSource\n withAudioStreamBasicDescription:(AudioStreamBasicDescription)audioStreamBasicDescription;\n\n#pragma mark - Singleton\n///-----------------------------------------------------------\n/// @name Shared Instance\n///-----------------------------------------------------------\n\n/**\n Creates a shared instance of the EZOutput (one app will usually only need one output and share the role of the EZOutputDataSource).\n @return The shared instance of the EZOutput class.\n */\n+(EZOutput*)sharedOutput;\n\n#pragma mark - Events\n///-----------------------------------------------------------\n/// @name Starting/Stopping The Output\n///-----------------------------------------------------------\n\n/**\n Starts pulling audio data from the EZOutputDataSource to the default device output.\n */\n-(void)startPlayback;\n\n/**\n Stops pulling audio data from the EZOutputDataSource to the default device output.\n */\n-(void)stopPlayback;\n\n#pragma mark - Getters\n///-----------------------------------------------------------\n/// @name Getting The Output Audio Format\n///-----------------------------------------------------------\n\n/**\n Provides the AudioStreamBasicDescription structure containing the format of the microphone's audio.\n @return An AudioStreamBasicDescription structure describing the format of the microphone's audio.\n */\n-(AudioStreamBasicDescription)audioStreamBasicDescription;\n\n///-----------------------------------------------------------\n/// @name Getting The State Of The Output\n///-----------------------------------------------------------\n\n/**\n Provides a flag indicating whether the EZOutput is pulling audio data from the EZOutputDataSource for playback.\n @return YES if the EZOutput is pulling audio data to the output device, NO if it is stopped\n */\n-(BOOL)isPlaying;\n\n#pragma mark - Setters\n///-----------------------------------------------------------\n/// @name Customizing The Output Format\n///-----------------------------------------------------------\n\n/**\n Sets the AudioStreamBasicDescription on the output.\n @warning Do not set this during playback.\n @param asbd The new AudioStreamBasicDescription to use in place of the current audio format description.\n */\n-(void)setAudioStreamBasicDescription:(AudioStreamBasicDescription)asbd;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/EZOutput.m",
    "content": "//\n//  EZOutput.m\n//  EZAudio\n//\n//  Created by Syed Haris Ali on 12/2/13.\n//  Copyright (c) 2013 Syed Haris Ali. All rights reserved.\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#import \"EZOutput.h\"\n\n#import \"EZAudio.h\"\n\n@interface EZOutput (){\n  BOOL                        _customASBD;\n  BOOL                        _isPlaying;\n  AudioStreamBasicDescription _outputASBD;\n  AudioUnit                   _outputUnit;\n}\n@end\n\n@implementation EZOutput\n@synthesize outputDataSource = _outputDataSource;\n\nstatic OSStatus OutputRenderCallback(void                        *inRefCon,\n                                     AudioUnitRenderActionFlags  *ioActionFlags,\n                                     const AudioTimeStamp        *inTimeStamp,\n                                     UInt32                      inBusNumber,\n                                     UInt32                      inNumberFrames,\n                                     AudioBufferList             *ioData){\n  \n//  NSLog(@\"output something\");\n  \n  EZOutput *output = (__bridge EZOutput*)inRefCon;\n  // Manual override\n  if( [output.outputDataSource respondsToSelector:@selector(output:callbackWithActionFlags:inTimeStamp:inBusNumber:inNumberFrames:ioData:)] ){\n    [output.outputDataSource output:output\n            callbackWithActionFlags:ioActionFlags\n                        inTimeStamp:inTimeStamp\n                        inBusNumber:inBusNumber\n                     inNumberFrames:inNumberFrames\n                             ioData:ioData];\n  }\n  else if( [output.outputDataSource respondsToSelector:@selector(outputShouldUseCircularBuffer:)] ){\n    \n    TPCircularBuffer *circularBuffer = [output.outputDataSource outputShouldUseCircularBuffer:output];\n    if( !circularBuffer ){\n      float *left  = (float*)ioData->mBuffers[0].mData;\n      float *right = (float*)ioData->mBuffers[1].mData;\n      for(int i = 0; i < inNumberFrames; i++ ){\n        left[  i ] = 0.0f;\n        right[ i ] = 0.0f;\n      }\n      return noErr;\n    };\n    \n    /**\n     Thank you Michael Tyson (A Tasty Pixel) for writing the TPCircularBuffer, you are amazing!\n     */\n    \n    // Get the desired amount of bytes to copy\n    int32_t bytesToCopy = ioData->mBuffers[0].mDataByteSize;\n    float *left  = (float*)ioData->mBuffers[0].mData;\n    float *right = (float*)ioData->mBuffers[1].mData;\n    \n    // Get the available bytes in the circular buffer\n    int32_t availableBytes;\n    float *buffer = TPCircularBufferTail(circularBuffer,&availableBytes);\n    \n    // Ideally we'd have all the bytes to be copied, but compare it against the available bytes (get min)\n    int32_t amount = MIN(bytesToCopy,availableBytes);\n    memcpy( left,  buffer, amount );\n    memcpy( right, buffer, amount );\n    \n    // Consume those bytes ( this will internally push the head of the circular buffer )\n    TPCircularBufferConsume(circularBuffer,amount);\n    \n  }\n  // Provided an AudioBufferList (defaults to silence)\n  else if( [output.outputDataSource respondsToSelector:@selector(output:shouldFillAudioBufferList:withNumberOfFrames:)] ) {\n    [output.outputDataSource output:output\n          shouldFillAudioBufferList:ioData\n                 withNumberOfFrames:inNumberFrames];\n  }\n  \n  return noErr;\n}\n\n#pragma mark - Initialization\n-(id)init {\n  self = [super init];\n  if(self){\n    [self _configureOutput];\n  }\n  return self;\n}\n\n-(id)initWithDataSource:(id<EZOutputDataSource>)dataSource {\n  self = [super init];\n  if(self){\n    self.outputDataSource = dataSource;\n    [self _configureOutput];\n  }\n  return self;\n}\n\n-(id)         initWithDataSource:(id<EZOutputDataSource>)dataSource\n withAudioStreamBasicDescription:(AudioStreamBasicDescription)audioStreamBasicDescription {\n  self = [super init];\n  if(self){\n    _customASBD = YES;\n    _outputASBD = audioStreamBasicDescription;\n    self.outputDataSource = dataSource;\n    [self _configureOutput];\n  }\n  return self;\n}\n\n#pragma mark - Class Initializers\n+(EZOutput*)outputWithDataSource:(id<EZOutputDataSource>)dataSource {\n  return [[EZOutput alloc] initWithDataSource:dataSource];\n}\n\n+(EZOutput *)outputWithDataSource:(id<EZOutputDataSource>)dataSource\n  withAudioStreamBasicDescription:(AudioStreamBasicDescription)audioStreamBasicDescription {\n  return [[EZOutput alloc] initWithDataSource:dataSource withAudioStreamBasicDescription:audioStreamBasicDescription];\n}\n\n#pragma mark - Singleton\n+(EZOutput*)sharedOutput {\n  static EZOutput *_sharedOutput = nil;\n  static dispatch_once_t onceToken;\n  dispatch_once(&onceToken, ^{\n    _sharedOutput = [[EZOutput alloc] init];\n  });\n  return _sharedOutput;\n}\n\n#pragma mark - Audio Component Initialization\n-(AudioComponentDescription)_getOutputAudioComponentDescription {\n // Create an output component description for default output device\n  AudioComponentDescription outputComponentDescription;\n  outputComponentDescription.componentFlags        = 0;\n  outputComponentDescription.componentFlagsMask    = 0;\n  outputComponentDescription.componentManufacturer = kAudioUnitManufacturer_Apple;\n  #if TARGET_OS_IPHONE\n    outputComponentDescription.componentSubType      = kAudioUnitSubType_RemoteIO;\n  #elif TARGET_OS_MAC\n    outputComponentDescription.componentSubType      = kAudioUnitSubType_DefaultOutput;\n  #endif\n  outputComponentDescription.componentType         = kAudioUnitType_Output;\n  return outputComponentDescription;\n}\n\n-(AudioComponent)_getOutputComponentWithAudioComponentDescription:(AudioComponentDescription)outputComponentDescription {\n  // Try and find the component\n  AudioComponent outputComponent = AudioComponentFindNext( NULL , &outputComponentDescription );\n  NSAssert(outputComponent,@\"Couldn't get input component unit!\");\n  return outputComponent;\n}\n\n-(void)_createNewInstanceForOutputComponent:(AudioComponent)outputComponent {\n  //\n  [EZAudio checkResult:AudioComponentInstanceNew( outputComponent, &_outputUnit )\n             operation:\"Failed to open component for output unit\"];\n}\n\n#pragma mark - Configure The Output Unit\n\n//-(void)_configureOutput {\n//  \n//  // Get component description for output\n//  AudioComponentDescription outputComponentDescription = [self _getOutputAudioComponentDescription];\n//  \n//  // Get the output component\n//  AudioComponent outputComponent = [self _getOutputComponentWithAudioComponentDescription:outputComponentDescription];\n//  \n//  // Create a new instance of the component and store it for internal use\n//  [self _createNewInstanceForOutputComponent:outputComponent];\n//  \n//}\n\n#if TARGET_OS_IPHONE\n-(void)_configureOutput {\n  \n  //\n  AudioComponentDescription outputcd;\n  outputcd.componentFlags        = 0;\n  outputcd.componentFlagsMask    = 0;\n  outputcd.componentManufacturer = kAudioUnitManufacturer_Apple;\n  outputcd.componentSubType      = kAudioUnitSubType_RemoteIO;\n  outputcd.componentType         = kAudioUnitType_Output;\n  \n  //\n  AudioComponent comp = AudioComponentFindNext(NULL,&outputcd);\n  [EZAudio checkResult:AudioComponentInstanceNew(comp,&_outputUnit)\n             operation:\"Failed to get output unit\"];\n  \n  // Setup the output unit for playback\n  UInt32           oneFlag = 1;\n  AudioUnitElement bus0    = 0;\n  [EZAudio checkResult:AudioUnitSetProperty(_outputUnit,\n                                            kAudioOutputUnitProperty_EnableIO,\n                                            kAudioUnitScope_Output,\n                                            bus0,\n                                            &oneFlag,\n                                            sizeof(oneFlag))\n             operation:\"Failed to enable output unit\"];\n  \n  // Get the hardware sample rate\n  Float64 hardwareSampleRate = 44100;\n#if !(TARGET_IPHONE_SIMULATOR)\n  hardwareSampleRate = [[AVAudioSession sharedInstance] sampleRate];\n#endif\n  \n  // Setup an ASBD in canonical format by default\n  if( !_customASBD ){\n    _outputASBD = [EZAudio stereoCanonicalNonInterleavedFormatWithSampleRate:hardwareSampleRate];\n  }\n  \n  // Set the format for output\n  [EZAudio checkResult:AudioUnitSetProperty(_outputUnit,\n                                            kAudioUnitProperty_StreamFormat,\n                                            kAudioUnitScope_Input,\n                                            bus0,\n                                            &_outputASBD,\n                                            sizeof(_outputASBD))\n             operation:\"Couldn't set the ASBD for input scope/bos 0\"];\n  \n  //\n  AURenderCallbackStruct input;\n  input.inputProc = OutputRenderCallback;\n  input.inputProcRefCon = (__bridge void *)self;\n  [EZAudio checkResult:AudioUnitSetProperty(_outputUnit,\n                                            kAudioUnitProperty_SetRenderCallback,\n                                            kAudioUnitScope_Input,\n                                            bus0,\n                                            &input,\n                                            sizeof(input))\n             operation:\"Failed to set the render callback on the output unit\"];\n  \n  //\n  [EZAudio checkResult:AudioUnitInitialize(_outputUnit)\n             operation:\"Couldn't initialize output unit\"];\n  \n  \n}\n#elif TARGET_OS_MAC\n-(void)_configureOutput {\n  \n  //\n  AudioComponentDescription outputcd;\n  outputcd.componentType         = kAudioUnitType_Output;\n  outputcd.componentSubType      = kAudioUnitSubType_DefaultOutput;\n  outputcd.componentManufacturer = kAudioUnitManufacturer_Apple;\n  \n  //\n  AudioComponent comp = AudioComponentFindNext(NULL,&outputcd);\n  if( comp == NULL ){\n    NSLog(@\"Failed to get output unit\");\n    exit(-1);\n  }\n  [EZAudio checkResult:AudioComponentInstanceNew(comp,&_outputUnit)\n             operation:\"Failed to open component for output unit\"];\n\n  \n  // Setup an ASBD in canonical format by default\n  if( !_customASBD ){\n    _outputASBD = [EZAudio stereoCanonicalNonInterleavedFormatWithSampleRate:44100];\n  }\n  \n  // Set the format for output\n  [EZAudio checkResult:AudioUnitSetProperty(_outputUnit,\n                                            kAudioUnitProperty_StreamFormat,\n                                            kAudioUnitScope_Input,\n                                            0,\n                                            &_outputASBD,\n                                            sizeof(_outputASBD))\n             operation:\"Couldn't set the ASBD for input scope/bos 0\"];\n  \n  //\n  AURenderCallbackStruct input;\n  input.inputProc = OutputRenderCallback;\n  input.inputProcRefCon = (__bridge void *)(self);\n  [EZAudio checkResult:AudioUnitSetProperty(_outputUnit,\n                                            kAudioUnitProperty_SetRenderCallback,\n                                            kAudioUnitScope_Input,\n                                            0,\n                                            &input,\n                                            sizeof(input))\n             operation:\"Failed to set the render callback on the output unit\"];\n  \n  //\n  [EZAudio checkResult:AudioUnitInitialize(_outputUnit)\n             operation:\"Couldn't initialize output unit\"];\n  \n}\n#endif\n\n#pragma mark - Events\n-(void)startPlayback {\n  if( !_isPlaying ){\n    [EZAudio checkResult:AudioOutputUnitStart(_outputUnit)\n               operation:\"Failed to start output unit\"];\n    _isPlaying = YES;\n  }\n}\n\n-(void)stopPlayback {\n  if( _isPlaying ){\n    [EZAudio checkResult:AudioOutputUnitStop(_outputUnit)\n               operation:\"Failed to stop output unit\"];\n    _isPlaying = NO;\n  }\n}\n\n#pragma mark - Getters\n-(AudioStreamBasicDescription)audioStreamBasicDescription {\n  return _outputASBD;\n}\n\n-(BOOL)isPlaying {\n  return _isPlaying;\n}\n\n#pragma mark - Setters\n-(void)setAudioStreamBasicDescription:(AudioStreamBasicDescription)asbd {\n  BOOL wasPlaying = NO;\n  if( self.isPlaying ){\n    [self stopPlayback];\n    wasPlaying = YES;\n  }\n  _customASBD = YES;\n  _outputASBD = asbd;\n  // Set the format for output\n  [EZAudio checkResult:AudioUnitSetProperty(_outputUnit,\n                                            kAudioUnitProperty_StreamFormat,\n                                            kAudioUnitScope_Input,\n                                            0,\n                                            &_outputASBD,\n                                            sizeof(_outputASBD))\n             operation:\"Couldn't set the ASBD for input scope/bos 0\"];\n  if( wasPlaying )\n  {\n    [self startPlayback];\n  }\n}\n\n-(void)dealloc {\n  [EZAudio checkResult:AudioOutputUnitStop(_outputUnit)\n             operation:\"Failed to uninitialize output unit\"];\n  [EZAudio checkResult:AudioUnitUninitialize(_outputUnit)\n             operation:\"Failed to uninitialize output unit\"];\n  [EZAudio checkResult:AudioComponentInstanceDispose(_outputUnit)\n             operation:\"Failed to uninitialize output unit\"];\n}\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/EZPlot.h",
    "content": "//\n//  EZPlot.h\n//  EZAudio\n//\n//  Created by Syed Haris Ali on 11/24/13.\n//  Copyright (c) 2013 Syed Haris Ali. All rights reserved.\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#pragma mark - Enumerations\n///-----------------------------------------------------------\n/// @name Plot Types\n///-----------------------------------------------------------\n\n/**\n The types of plots that can be displayed in the view using the data.\n */\ntypedef NS_ENUM(NSInteger,EZPlotType){\n  /**\n   Plot that displays only the samples of the current buffer\n   */\n  EZPlotTypeBuffer,\n  /**\n   Plot that displays a rolling history of values using the RMS calculated for each incoming buffer\n   */\n  EZPlotTypeRolling\n};\n\n/**\n EZPlot is a cross-platform (iOS and OSX) class used to subclass the default view type (either UIView or NSView, respectively).\n \n ## Subclassing Notes\n \n This class isn't meant to be directly used in practice, but instead establishes the default properties and behaviors subclasses should obey to provide consistent behavior accross multiple types of graphs (i.e. set background color, plot type, should fill in, etc.). Subclasses should make use of the inherited properties from this class to allow all child plots to benefit from the same \n */\n#if TARGET_OS_IPHONE\n#import <UIKit/UIKit.h>\n@interface EZPlot : UIView\n#elif TARGET_OS_MAC\n#import <Cocoa/Cocoa.h>\n@interface EZPlot : NSView\n#endif\n\n#pragma mark - Properties\n///-----------------------------------------------------------\n/// @name Customizing The Plot's Appearance\n///-----------------------------------------------------------\n/**\n The default background color of the plot. For iOS the color is specified as a UIColor while for OSX the color is an NSColor. The default value on both platforms is black.\n */\n@property (nonatomic,strong) id backgroundColor;\n\n/**\n The default color of the plot's data (i.e. waveform, y-axis values). For iOS the color is specified as a UIColor while for OSX the color is an NSColor. The default value on both platforms is red.\n */\n@property (nonatomic,strong) id color;\n\n/**\n The plot's gain value, which controls the scale of the y-axis values. The default value of the gain is 1.0f and should always be greater than 0.0f.\n */\n@property (nonatomic,assign,setter=setGain:) float gain;\n\n/**\n The type of plot as specified by the `EZPlotType` enumeration (i.e. a buffer or rolling plot type).\n */\n@property (nonatomic,assign,setter=setPlotType:) EZPlotType plotType;\n\n/**\n A boolean indicating whether or not to fill in the graph. A value of YES will make a filled graph (filling in the space between the x-axis and the y-value), while a value of NO will create a stroked graph (connecting the points along the y-axis).\n */\n@property (nonatomic,assign,setter=setShouldFill:) BOOL shouldFill;\n\n/**\n A boolean indicating whether the graph should be rotated along the x-axis to give a mirrored reflection. This is typical for audio plots to produce the classic waveform look. A value of YES will produce a mirrored reflection of the y-values about the x-axis, while a value of NO will only plot the y-values.\n */\n@property (nonatomic,assign,setter=setShouldMirror:) BOOL shouldMirror;\n\n#pragma mark - Clearing\n///-----------------------------------------------------------\n/// @name Clearing The Plot\n///-----------------------------------------------------------\n\n/**\n Clears all data from the audio plot (includes both EZPlotTypeBuffer and EZPlotTypeRolling)\n */\n-(void)clear;\n\n#pragma mark - Get Samples\n///-----------------------------------------------------------\n/// @name Updating The Plot\n///-----------------------------------------------------------\n\n/**\n Updates the plot with the new buffer data and tells the view to redraw itself. Caller will provide a float array with the values they expect to see on the y-axis. The plot will internally handle mapping the x-axis and y-axis to the current view port, any interpolation for fills effects, and mirroring.\n @param buffer     A float array of values to map to the y-axis.\n @param bufferSize The size of the float array that will be mapped to the y-axis.\n @warning The bufferSize is expected to be the same, constant value once initial triggered. For plots using OpenGL a vertex buffer object will be allocated with a maximum buffersize of (2 * the initial given buffer size) to account for any interpolation necessary for filling in the graph. Updates use the glBufferSubData(...) function, which will crash if the buffersize exceeds the initial maximum allocated size.\n */\n-(void)updateBuffer:(float *)buffer\n     withBufferSize:(UInt32)bufferSize;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/EZPlot.m",
    "content": "//\n//  EZPlot.m\n//  EZAudio\n//\n//  Created by Syed Haris Ali on 11/24/13.\n//  Copyright (c) 2013 Syed Haris Ali. All rights reserved.\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#import \"EZPlot.h\"\n\n@interface EZPlot ()\n\n@end\n\n@implementation EZPlot\n\n#pragma mark - Clearing\n-(void)clear\n{\n  // Override in subclass\n}\n\n#pragma mark - Get Samples\n-(void)updateBuffer:(float *)buffer\n     withBufferSize:(UInt32)bufferSize\n{\n  // Override in subclass\n}\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/EZRecorder.h",
    "content": "//\n//  EZRecorder.h\n//  EZAudio\n//\n//  Created by Syed Haris Ali on 12/1/13.\n//  Copyright (c) 2013 Syed Haris Ali. All rights reserved.\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#import <Foundation/Foundation.h>\n#import <AudioToolbox/AudioToolbox.h>\n\n/**\n To ensure valid recording formats are used when recording to a file the EZRecorderFileType describes the most common file types that a file can be encoded in. Each of these types can be used to output recordings as such:\n \n EZRecorderFileTypeAIFF - .aif, .aiff, .aifc, .aac\n EZRecorderFileTypeM4A  - .m4a, .mp4\n EZRecorderFileTypeWAV  - .wav\n \n */\ntypedef NS_ENUM(NSInteger, EZRecorderFileType)\n{\n    /**\n     Recording format that describes AIFF file types. These are uncompressed, LPCM files that are completely lossless, but are large in file size.\n     */\n    EZRecorderFileTypeAIFF,\n    /**\n     Recording format that describes M4A file types. These are compressed, but yield great results especially when file size is an issue.\n     */\n    EZRecorderFileTypeM4A,\n    /**\n     Recording format that describes WAV file types. These are uncompressed, LPCM files that are completely lossless, but are large in file size.\n     */\n    EZRecorderFileTypeWAV\n};\n\n/**\n The EZRecorder provides a flexible way to create an audio file and append raw audio data to it. The EZRecorder will convert the incoming audio on the fly to the destination format so no conversion is needed between this and any other component. Right now the only supported output format is 'caf'. Each output file should have its own EZRecorder instance (think 1 EZRecorder = 1 audio file).\n */\n@interface EZRecorder : NSObject\n\n#pragma mark - Initializers\n///-----------------------------------------------------------\n/// @name Initializers\n///-----------------------------------------------------------\n\n/**\n Creates a new instance of an EZRecorder using a destination file path URL and the source format of the incoming audio.\n @param url                 An NSURL specifying the file path location of where the audio file should be written to.\n @param sourceFormat        The AudioStreamBasicDescription for the incoming audio that will be written to the file.\n @param destinationFileType A constant described by the EZRecorderFileType that corresponds to the type of destination file that should be written. For instance, an AAC file written using an '.m4a' extension would correspond to EZRecorderFileTypeM4A. See EZRecorderFileType for all the constants and mapping combinations.\n @return The newly created EZRecorder instance.\n */\n-(EZRecorder*)initWithDestinationURL:(NSURL*)url\n                        sourceFormat:(AudioStreamBasicDescription)sourceFormat\n                 destinationFileType:(EZRecorderFileType)destinationFileType;\n\n\n#pragma mark - Class Initializers\n///-----------------------------------------------------------\n/// @name Class Initializers\n///-----------------------------------------------------------\n\n/**\n Class method to create a new instance of an EZRecorder using a destination file path URL and the source format of the incoming audio.\n @param url                 An NSURL specifying the file path location of where the audio file should be written to.\n @param sourceFormat        The AudioStreamBasicDescription for the incoming audio that will be written to the file.\n @param destinationFileType A constant described by the EZRecorderFileType that corresponds to the type of destination file that should be written. For instance, an AAC file written using an '.m4a' extension would correspond to EZRecorderFileTypeM4A. See EZRecorderFileType for all the constants and mapping combinations.\n @return The newly created EZRecorder instance.\n */\n+(EZRecorder*)recorderWithDestinationURL:(NSURL*)url\n                            sourceFormat:(AudioStreamBasicDescription)sourceFormat\n                     destinationFileType:(EZRecorderFileType)destinationFileType;\n\n#pragma mark - Getters\n///-----------------------------------------------------------\n/// @name Getting The Recorder's Properties\n///-----------------------------------------------------------\n/**\n Provides the file path that's currently being used by the recorder.\n @return  The NSURL representing the file path of the audio file path being used for recording.\n */\n-(NSURL*)url;\n\n#pragma mark - Events\n///-----------------------------------------------------------\n/// @name Appending Data To The Audio File\n///-----------------------------------------------------------\n\n/**\n Appends audio data to the tail of the output file from an AudioBufferList.\n @param bufferList The AudioBufferList holding the audio data to append\n @param bufferSize The size of each of the buffers in the buffer list.\n */\n-(void)appendDataFromBufferList:(AudioBufferList*)bufferList\n                 withBufferSize:(UInt32)bufferSize;\n\n///-----------------------------------------------------------\n/// @name Closing The Audio File\n///-----------------------------------------------------------\n\n/**\n Finishes writes to the audio file and closes it.\n */\n-(void)closeAudioFile;\n\n@end"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/EZRecorder.m",
    "content": "//\n//  EZRecorder.m\n//  EZAudio\n//\n//  Created by Syed Haris Ali on 12/1/13.\n//  Copyright (c) 2013 Syed Haris Ali. All rights reserved.\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#import \"EZRecorder.h\"\n\n#import \"EZAudio.h\"\n\n@interface EZRecorder (){\n    ExtAudioFileRef             _destinationFile;\n    AudioFileTypeID             _destinationFileTypeID;\n    CFURLRef                    _destinationFileURL;\n    AudioStreamBasicDescription _destinationFormat;\n    AudioStreamBasicDescription _sourceFormat;\n}\n\n@end\n\n@implementation EZRecorder\n\n#pragma mark - Initializers\n-(EZRecorder*)initWithDestinationURL:(NSURL*)url\n                        sourceFormat:(AudioStreamBasicDescription)sourceFormat\n                 destinationFileType:(EZRecorderFileType)destinationFileType\n{\n    self = [super init];\n    if( self )\n    {\n        // Set defaults\n        _destinationFile        = NULL;\n        _destinationFileURL     = (__bridge CFURLRef)url;\n        _sourceFormat           = sourceFormat;\n        _destinationFormat      = [EZRecorder recorderFormatForFileType:destinationFileType\n                                                       withSourceFormat:_sourceFormat];\n        _destinationFileTypeID  = [EZRecorder recorderFileTypeIdForFileType:destinationFileType\n                                                           withSourceFormat:_sourceFormat];\n        \n        // Initializer the recorder instance\n        [self _initializeRecorder];\n    }\n    return self;\n}\n\n#pragma mark - Class Initializers\n+(EZRecorder*)recorderWithDestinationURL:(NSURL*)url\n                            sourceFormat:(AudioStreamBasicDescription)sourceFormat\n                     destinationFileType:(EZRecorderFileType)destinationFileType\n{\n    return [[EZRecorder alloc] initWithDestinationURL:url\n                                         sourceFormat:sourceFormat\n                                  destinationFileType:destinationFileType];\n}\n\n#pragma mark - Private Configuration\n+(AudioStreamBasicDescription)recorderFormatForFileType:(EZRecorderFileType)fileType\n                                       withSourceFormat:(AudioStreamBasicDescription)sourceFormat\n{\n    AudioStreamBasicDescription asbd;\n    switch ( fileType )\n    {\n        case EZRecorderFileTypeAIFF:\n            asbd = [EZAudio AIFFFormatWithNumberOfChannels:sourceFormat.mChannelsPerFrame\n                                                sampleRate:sourceFormat.mSampleRate];\n            break;\n        case EZRecorderFileTypeM4A:\n            asbd = [EZAudio M4AFormatWithNumberOfChannels:sourceFormat.mChannelsPerFrame\n                                               sampleRate:sourceFormat.mSampleRate];\n            break;\n            \n        case EZRecorderFileTypeWAV:\n            asbd = [EZAudio stereoFloatInterleavedFormatWithSampleRate:sourceFormat.mSampleRate];\n            break;\n            \n        default:\n            asbd = [EZAudio stereoCanonicalNonInterleavedFormatWithSampleRate:sourceFormat.mSampleRate];\n            break;\n    }\n    return asbd;\n}\n\n+(AudioFileTypeID)recorderFileTypeIdForFileType:(EZRecorderFileType)fileType\n                               withSourceFormat:(AudioStreamBasicDescription)sourceFormat\n{\n    AudioFileTypeID audioFileTypeID;\n    switch ( fileType )\n    {\n        case EZRecorderFileTypeAIFF:\n            audioFileTypeID = kAudioFileAIFFType;\n            break;\n            \n        case EZRecorderFileTypeM4A:\n            audioFileTypeID = kAudioFileM4AType;\n            break;\n            \n        case EZRecorderFileTypeWAV:\n            audioFileTypeID = kAudioFileWAVEType;\n            break;\n            \n        default:\n            audioFileTypeID = kAudioFileWAVEType;\n            break;\n    }\n    return audioFileTypeID;\n}\n\n-(void)_initializeRecorder\n{\n    // Finish filling out the destination format description\n    UInt32 propSize = sizeof(_destinationFormat);\n    [EZAudio checkResult:AudioFormatGetProperty(kAudioFormatProperty_FormatInfo,\n                                                0,\n                                                NULL,\n                                                &propSize,\n                                                &_destinationFormat)\n               operation:\"Failed to fill out rest of destination format\"];\n    \n    // Create the audio file\n    [EZAudio checkResult:ExtAudioFileCreateWithURL(_destinationFileURL,\n                                                   _destinationFileTypeID,\n                                                   &_destinationFormat,\n                                                   NULL,\n                                                   kAudioFileFlags_EraseFile,\n                                                   &_destinationFile)\n               operation:\"Failed to create audio file\"];\n    \n    // Set the client format (which should be equal to the source format)\n    [EZAudio checkResult:ExtAudioFileSetProperty(_destinationFile,\n                                                 kExtAudioFileProperty_ClientDataFormat,\n                                                 sizeof(_sourceFormat),\n                                                 &_sourceFormat)\n               operation:\"Failed to set client format on recorded audio file\"];\n    \n}\n\n#pragma mark - Events\n-(void)appendDataFromBufferList:(AudioBufferList *)bufferList\n                 withBufferSize:(UInt32)bufferSize\n{\n    if( _destinationFile )\n    {\n        [EZAudio checkResult:ExtAudioFileWriteAsync(_destinationFile,\n                                                    bufferSize,\n                                                    bufferList)\n                   operation:\"Failed to write audio data to recorded audio file\"];\n    }\n}\n\n-(void)closeAudioFile\n{\n    if( _destinationFile )\n    {\n        // Dispose of the audio file reference\n        [EZAudio checkResult:ExtAudioFileDispose(_destinationFile)\n                   operation:\"Failed to close audio file\"];\n        \n        // Null out the file reference\n        _destinationFile = NULL;\n    }\n}\n\n-(NSURL *)url\n{\n    return (__bridge NSURL*)_destinationFileURL;\n}\n\n#pragma mark - Dealloc\n-(void)dealloc\n{\n    [self closeAudioFile];\n}\n\n@end"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/TPCircularBuffer.c",
    "content": "//\n//  TPCircularBuffer.c\n//  Circular/Ring buffer implementation\n//\n//  https://github.com/michaeltyson/TPCircularBuffer\n//\n//  Created by Michael Tyson on 10/12/2011.\n//\n//  Copyright (C) 2012-2013 A Tasty Pixel\n//\n//  This software is provided 'as-is', without any express or implied\n//  warranty.  In no event will the authors be held liable for any damages\n//  arising from the use of this software.\n//\n//  Permission is granted to anyone to use this software for any purpose,\n//  including commercial applications, and to alter it and redistribute it\n//  freely, subject to the following restrictions:\n//\n//  1. The origin of this software must not be misrepresented; you must not\n//     claim that you wrote the original software. If you use this software\n//     in a product, an acknowledgment in the product documentation would be\n//     appreciated but is not required.\n//\n//  2. Altered source versions must be plainly marked as such, and must not be\n//     misrepresented as being the original software.\n//\n//  3. This notice may not be removed or altered from any source distribution.\n//\n\n#include \"TPCircularBuffer.h\"\n#include <mach/mach.h>\n#include <stdio.h>\n\n#define reportResult(result,operation) (_reportResult((result),(operation),strrchr(__FILE__, '/')+1,__LINE__))\nstatic inline bool _reportResult(kern_return_t result, const char *operation, const char* file, int line) {\n    if ( result != ERR_SUCCESS ) {\n        printf(\"%s:%d: %s: %s\\n\", file, line, operation, mach_error_string(result)); \n        return false;\n    }\n    return true;\n}\n\nbool TPCircularBufferInit(TPCircularBuffer *buffer, int length) {\n\n    // Keep trying until we get our buffer, needed to handle race conditions\n    int retries = 3;\n    while ( true ) {\n\n        buffer->length = (int32_t)round_page(length);    // We need whole page sizes\n\n        // Temporarily allocate twice the length, so we have the contiguous address space to\n        // support a second instance of the buffer directly after\n        vm_address_t bufferAddress;\n        kern_return_t result = vm_allocate(mach_task_self(),\n                                           &bufferAddress,\n                                           buffer->length * 2,\n                                           VM_FLAGS_ANYWHERE); // allocate anywhere it'll fit\n        if ( result != ERR_SUCCESS ) {\n            if ( retries-- == 0 ) {\n                reportResult(result, \"Buffer allocation\");\n                return false;\n            }\n            // Try again if we fail\n            continue;\n        }\n        \n        // Now replace the second half of the allocation with a virtual copy of the first half. Deallocate the second half...\n        result = vm_deallocate(mach_task_self(),\n                               bufferAddress + buffer->length,\n                               buffer->length);\n        if ( result != ERR_SUCCESS ) {\n            if ( retries-- == 0 ) {\n                reportResult(result, \"Buffer deallocation\");\n                return false;\n            }\n            // If this fails somehow, deallocate the whole region and try again\n            vm_deallocate(mach_task_self(), bufferAddress, buffer->length);\n            continue;\n        }\n        \n        // Re-map the buffer to the address space immediately after the buffer\n        vm_address_t virtualAddress = bufferAddress + buffer->length;\n        vm_prot_t cur_prot, max_prot;\n        result = vm_remap(mach_task_self(),\n                          &virtualAddress,   // mirror target\n                          buffer->length,    // size of mirror\n                          0,                 // auto alignment\n                          0,                 // force remapping to virtualAddress\n                          mach_task_self(),  // same task\n                          bufferAddress,     // mirror source\n                          0,                 // MAP READ-WRITE, NOT COPY\n                          &cur_prot,         // unused protection struct\n                          &max_prot,         // unused protection struct\n                          VM_INHERIT_DEFAULT);\n        if ( result != ERR_SUCCESS ) {\n            if ( retries-- == 0 ) {\n                reportResult(result, \"Remap buffer memory\");\n                return false;\n            }\n            // If this remap failed, we hit a race condition, so deallocate and try again\n            vm_deallocate(mach_task_self(), bufferAddress, buffer->length);\n            continue;\n        }\n        \n        if ( virtualAddress != bufferAddress+buffer->length ) {\n            // If the memory is not contiguous, clean up both allocated buffers and try again\n            if ( retries-- == 0 ) {\n                printf(\"Couldn't map buffer memory to end of buffer\\n\");\n                return false;\n            }\n\n            vm_deallocate(mach_task_self(), virtualAddress, buffer->length);\n            vm_deallocate(mach_task_self(), bufferAddress, buffer->length);\n            continue;\n        }\n        \n        buffer->buffer = (void*)bufferAddress;\n        buffer->fillCount = 0;\n        buffer->head = buffer->tail = 0;\n        \n        return true;\n    }\n    return false;\n}\n\nvoid TPCircularBufferCleanup(TPCircularBuffer *buffer) {\n    vm_deallocate(mach_task_self(), (vm_address_t)buffer->buffer, buffer->length * 2);\n    memset(buffer, 0, sizeof(TPCircularBuffer));\n}\n\nvoid TPCircularBufferClear(TPCircularBuffer *buffer) {\n    int32_t fillCount;\n    if ( TPCircularBufferTail(buffer, &fillCount) ) {\n        TPCircularBufferConsume(buffer, fillCount);\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/EZAudio/EZAudio/TPCircularBuffer.h",
    "content": "//\n//  TPCircularBuffer.h\n//  Circular/Ring buffer implementation\n//\n//  https://github.com/michaeltyson/TPCircularBuffer\n//\n//  Created by Michael Tyson on 10/12/2011.\n//\n//\n//  This implementation makes use of a virtual memory mapping technique that inserts a virtual copy\n//  of the buffer memory directly after the buffer's end, negating the need for any buffer wrap-around\n//  logic. Clients can simply use the returned memory address as if it were contiguous space.\n//  \n//  The implementation is thread-safe in the case of a single producer and single consumer.\n//\n//  Virtual memory technique originally proposed by Philip Howard (http://vrb.slashusr.org/), and\n//  adapted to Darwin by Kurt Revis (http://www.snoize.com,\n//  http://www.snoize.com/Code/PlayBufferedSoundFile.tar.gz)\n//\n//\n//  Copyright (C) 2012-2013 A Tasty Pixel\n//\n//  This software is provided 'as-is', without any express or implied\n//  warranty.  In no event will the authors be held liable for any damages\n//  arising from the use of this software.\n//\n//  Permission is granted to anyone to use this software for any purpose,\n//  including commercial applications, and to alter it and redistribute it\n//  freely, subject to the following restrictions:\n//\n//  1. The origin of this software must not be misrepresented; you must not\n//     claim that you wrote the original software. If you use this software\n//     in a product, an acknowledgment in the product documentation would be\n//     appreciated but is not required.\n//\n//  2. Altered source versions must be plainly marked as such, and must not be\n//     misrepresented as being the original software.\n//\n//  3. This notice may not be removed or altered from any source distribution.\n//\n\n#ifndef TPCircularBuffer_h\n#define TPCircularBuffer_h\n\n#include <libkern/OSAtomic.h>\n#include <string.h>\n#include <assert.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n    \ntypedef struct {\n    void             *buffer;\n    int32_t           length;\n    int32_t           tail;\n    int32_t           head;\n    volatile int32_t  fillCount;\n} TPCircularBuffer;\n\n/*!\n * Initialise buffer\n *\n *  Note that the length is advisory only: Because of the way the\n *  memory mirroring technique works, the true buffer length will\n *  be multiples of the device page size (e.g. 4096 bytes)\n *\n * @param buffer Circular buffer\n * @param length Length of buffer\n */\nbool  TPCircularBufferInit(TPCircularBuffer *buffer, int32_t length);\n\n/*!\n * Cleanup buffer\n *\n *  Releases buffer resources.\n */\nvoid  TPCircularBufferCleanup(TPCircularBuffer *buffer);\n\n/*!\n * Clear buffer\n *\n *  Resets buffer to original, empty state.\n *\n *  This is safe for use by consumer while producer is accessing \n *  buffer.\n */\nvoid  TPCircularBufferClear(TPCircularBuffer *buffer);\n\n// Reading (consuming)\n\n/*!\n * Access end of buffer\n *\n *  This gives you a pointer to the end of the buffer, ready\n *  for reading, and the number of available bytes to read.\n *\n * @param buffer Circular buffer\n * @param availableBytes On output, the number of bytes ready for reading\n * @return Pointer to the first bytes ready for reading, or NULL if buffer is empty\n */\nstatic __inline__ __attribute__((always_inline)) void* TPCircularBufferTail(TPCircularBuffer *buffer, int32_t* availableBytes) {\n    *availableBytes = buffer->fillCount;\n    if ( *availableBytes == 0 ) return NULL;\n    return (void*)((char*)buffer->buffer + buffer->tail);\n}\n\n/*!\n * Consume bytes in buffer\n *\n *  This frees up the just-read bytes, ready for writing again.\n *\n * @param buffer Circular buffer\n * @param amount Number of bytes to consume\n */\nstatic __inline__ __attribute__((always_inline)) void TPCircularBufferConsume(TPCircularBuffer *buffer, int32_t amount) {\n    buffer->tail = (buffer->tail + amount) % buffer->length;\n    OSAtomicAdd32Barrier(-amount, &buffer->fillCount);\n    assert(buffer->fillCount >= 0);\n}\n\n/*!\n * Version of TPCircularBufferConsume without the memory barrier, for more optimal use in single-threaded contexts\n */\nstatic __inline__ __attribute__((always_inline)) void TPCircularBufferConsumeNoBarrier(TPCircularBuffer *buffer, int32_t amount) {\n    buffer->tail = (buffer->tail + amount) % buffer->length;\n    buffer->fillCount -= amount;\n    assert(buffer->fillCount >= 0);\n}\n\n/*!\n * Access front of buffer\n *\n *  This gives you a pointer to the front of the buffer, ready\n *  for writing, and the number of available bytes to write.\n *\n * @param buffer Circular buffer\n * @param availableBytes On output, the number of bytes ready for writing\n * @return Pointer to the first bytes ready for writing, or NULL if buffer is full\n */\nstatic __inline__ __attribute__((always_inline)) void* TPCircularBufferHead(TPCircularBuffer *buffer, int32_t* availableBytes) {\n    *availableBytes = (buffer->length - buffer->fillCount);\n    if ( *availableBytes == 0 ) return NULL;\n    return (void*)((char*)buffer->buffer + buffer->head);\n}\n    \n// Writing (producing)\n\n/*!\n * Produce bytes in buffer\n *\n *  This marks the given section of the buffer ready for reading.\n *\n * @param buffer Circular buffer\n * @param amount Number of bytes to produce\n */\nstatic __inline__ __attribute__((always_inline)) void TPCircularBufferProduce(TPCircularBuffer *buffer, int amount) {\n    buffer->head = (buffer->head + amount) % buffer->length;\n    OSAtomicAdd32Barrier(amount, &buffer->fillCount);\n    assert(buffer->fillCount <= buffer->length);\n}\n\n/*!\n * Version of TPCircularBufferProduce without the memory barrier, for more optimal use in single-threaded contexts\n */\nstatic __inline__ __attribute__((always_inline)) void TPCircularBufferProduceNoBarrier(TPCircularBuffer *buffer, int amount) {\n    buffer->head = (buffer->head + amount) % buffer->length;\n    buffer->fillCount += amount;\n    assert(buffer->fillCount <= buffer->length);\n}\n\n/*!\n * Helper routine to copy bytes to buffer\n *\n *  This copies the given bytes to the buffer, and marks them ready for writing.\n *\n * @param buffer Circular buffer\n * @param src Source buffer\n * @param len Number of bytes in source buffer\n * @return true if bytes copied, false if there was insufficient space\n */\nstatic __inline__ __attribute__((always_inline)) bool TPCircularBufferProduceBytes(TPCircularBuffer *buffer, const void* src, int32_t len) {\n    int32_t space;\n    void *ptr = TPCircularBufferHead(buffer, &space);\n    if ( space < len ) return false;\n    memcpy(ptr, src, len);\n    TPCircularBufferProduce(buffer, len);\n    return true;\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Sublime/Pods/EZAudio/LICENSE",
    "content": "The MIT License (MIT)\n\nEZAudio\nCopyright (c) 2013 Syed Haris Ali\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 of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject 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, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Sublime/Pods/EZAudio/README.md",
    "content": "![alt text](https://s3-us-west-1.amazonaws.com/ezaudio-media/EZAudioJumbo-Alt.png \"EZAudioLogo\")\n\n#EZAudio\nA simple, intuitive audio framework for iOS and OSX.\n\n*The Official EZAudio Page:*\nhttp://syedharisali.com/projects/EZAudio/getting-started\n\n## Update\nThank you everyone for using EZAudio! Just an update - I'm working on a 1.0.0 production version of EZAudio that will contain a bunch of improvements in the API, feature an EZAudioPlayer, and hooks for the DOUAudioStreamer for visualizing remote streaming audio. To make the next version of EZAudio even better I encourage you all to email me your feedback, feature requests, and experiences using the framework. Thanks!\n\n##Features\n![alt text](https://s3-us-west-1.amazonaws.com/ezaudio-media/EZAudioSummary.png \"EZAudioFeatures\")\n\n**Awesome Components**\n\nI've designed six core components to allow you to immediately get your hands dirty recording, playing, and visualizing audio data. These components simply plug into each other and build on top of the high-performance, low-latency AudioUnits API and give you an easy to use API written in Objective-C instead of pure C.\n\n[EZMicrophone](#EZMicrophone)\n\nA microphone class that provides its delegate audio data from the default device microphone with one line of code.\n\n[EZRecorder](#EZRecorder)\n\nA recorder class that provides a quick and easy way to write audio files from any datasource.\n\n[EZAudioFile](#EZAudioFile)\n\nAn audio file class that reads/seeks through audio files and provides useful delegate callbacks. \n\n[EZOutput](#EZOutput)\n\nAn output class that will playback any audio it is provided by its datasource. \n\n[EZAudioPlot](#EZAudioPlot)\n\nA CoreGraphics-based audio waveform plot capable of visualizing any float array as a buffer or rolling plot.\n\n[EZAudioPlotGL](#EZAudioPlotGL)\n\nAn OpenGL-based, GPU-accelerated audio waveform plot capable of visualizing any float array as a buffer or rolling plot.\n\n**Cross Platform**\n\n`EZAudio` was designed to work transparently across all iOS and OSX devices. This means one universal API whether you're building for Mac or iOS. For instance, under the hood an `EZAudioPlot` knows that it will subclass a UIView for iOS or an NSView for OSX and the `EZMicrophone` knows to build on top of the RemoteIO AudioUnit for iOS, but defaults to the system defaults for input and output for OSX.\n\n##Examples & Docs\n\nWithin this repo you'll find the examples for iOS and OSX to get you up to speed using each component and plugging them into each other. With just a few lines of code you'll be recording from the microphone, generating audio waveforms, and playing audio files like a boss. See the full Getting Started guide for an interactive look into each of components.\n\n### Example Projects\n\n**_EZAudioCoreGraphicsWaveformExample_** \n\nShows how to use the `EZMicrophone` and `EZAudioPlot` to visualize the audio data from the microphone in real-time. The waveform can be displayed as a buffer or a rolling waveform plot (traditional waveform look). \n\n**_EZAudioOpenGLWaveformExample_**\n\nShows how to use the `EZMicrophone` and `EZAudioPlotGL` to visualize the audio data from the microphone in real-time. The drawing is using OpenGL so it is much faster and like the first example can display a buffer or rolling waveform.\n\n**_EZAudioPlayFileExample_**\n\nShows how to use the `EZAudioFile`, `EZOutput`, and `EZAudioPlotGL` to playback, pause, and seek through an audio file while displaying its waveform as a buffer or a rolling waveform plot.\n\n**_EZAudioRecordWaveformExample_**\n\nShows how to use the `EZMicrophone`, `EZRecorder`, and `EZAudioPlotGL` to record the audio from the microphone input to a file while displaying the audio waveform of the incoming data. You can then playback the newly recorded audio file using AVFoundation and keep adding more audio data to the tail of the file.\n\n**_EZAudioWaveformFromFileExample_**\n\nShows how to use the `EZAudioFile` and `EZAudioPlot` to display the audio waveform an entire audio file. \n\n**_EZAudioPassThroughExample_**\n\nShows how to use the `EZMicrophone`, `EZOutput`, and the `EZAudioPlotGL` to pass the microphone input to the output for playback while displaying the audio waveform (as a buffer or rolling plot) in real-time. \n\n**_EZAudioFFTExample_**\n\nShows how to calculate the real-time FFT of the audio data coming from the `EZMicrophone` and the Accelerate framework. The audio data is plotted using the `EZAudioPlotGL` for the time domain plot and the `EZAudioPlot` for the frequency domain plot. \n\n![alt text](https://s3-us-west-1.amazonaws.com/ezaudio-media/fftMacExample.png)\n\n### Documentation\nThe official documentation for EZAudio can be found here: http://cocoadocs.org/docsets/EZAudio/0.0.5/\n<br>You can also generate the docset yourself using appledocs by running the appledocs on the EZAudio source folder.\n\n##Getting Started\n*To see the full project page, interactive Getting Started guide, and Documentation go here:*\nhttp://syedharisali.com/projects/EZAudio/getting-started\n\nTo begin using `EZAudio` you must first make sure you have the proper build requirements and frameworks. Below you'll find explanations of each component and code snippets to show how to use each to perform common tasks like getting microphone data, updating audio waveform plots, reading/seeking through audio files, and performing playback.\n\n###Build Requirements\n**iOS**\n- 6.0+\n\n\n**OSX**\n- 10.8+\n\n###Frameworks\n**iOS**\n- AudioToolbox\n- AVFoundation\n- GLKit\n\n\n**OSX**\n- AudioToolbox\n- AudioUnit\n- CoreAudio\n- QuartzCore\n- OpenGL\n- GLKit\n\n###Adding To Project\nYou can add EZAudio to your project in a few ways: <br><br>1.) The easiest way to use EZAudio is via <a href=\"http://cocoapods.org/\", target=\"_blank\">Cocoapods</a>. Simply add EZAudio to your <a href=\"http://guides.cocoapods.org/using/the-podfile.html\", target=\"_blank\">Podfile</a> like so:\n\n`\npod 'EZAudio', '~> 0.0.5'\n`\n\n2.) Alternatively, you could clone or fork this repo and just drag and drop the source into your project. \n\n*For more information see main project page:*\nhttp://syedharisali.com/projects/EZAudio/getting-started\n\n##Core Components\n`EZAudio` currently offers four components that encompass a wide range of audio functionality. In addition to the functional aspects of these components such as pulling audio data, reading/writing from files, and performing playback they also take special care to hook into the interface components to allow developers to display visual feedback (see the Interface Components below).\n\n###<a name=\"EZAudioFile\"></a>EZAudioFile\nProvides simple read/seek operations, pulls waveform amplitude data, and provides the `EZAudioFileDelegate` to notify of any read/seek action occuring on the `EZAudioFile`.\n\n**_Relevant Example Projects_**\n- EZAudioPlayFileExample (iOS)\n- EZAudioPlayFileExample (OSX)\n- EZAudioWaveformFromFileExample (iOS)\n- EZAudioWaveformFromFileExample (OSX)\n\n####Opening An Audio File\nTo open an audio file create a new instance of the `EZAudioFile` class.\n```objectivec\n// Declare the EZAudioFile as a strong property\n@property (nonatomic,strong) EZAudioFile *audioFile;\n\n...\n\n// Initialize the EZAudioFile instance and assign it a delegate to receive the read/seek callbacks\nself.audioFile = [EZAudioFile audioFileWithURL:[NSURL fileURLWithPath:@\"/path/to/your/file\"] \n                                   andDelegate:self];\n```\n\n####Getting Waveform Data\n\nThere is a `getWaveformDataWithCompletionBlock:` method to allow you to easily and asynchronously get the waveform amplitude data that will best represent the whole audio file (will calculate the best fit that's constrainted to ~2048 data points)\n```objectivec\n// Get the waveform data from the audio file asynchronously \n[audioFile getWaveformDataWithCompletionBlock:^(float *waveformData, UInt32 length) {\n  // Update the audio plot with the waveform data (use the EZPlotTypeBuffer in this case)\n  self.audioPlot.plotType = EZPlotTypeBuffer;\n  [self.audioPlot updateBuffer:waveformData withBufferSize:length];\n}];\n```\n\n####Reading From An Audio File\n\nReading audio data from a file requires you to create an AudioBufferList to hold the data. The `EZAudio` utility function, `audioBufferList`, provides a convenient way to get an allocated AudioBufferList to use. There is also a utility function, `freeBufferList:`, to use to free (or release) the AudioBufferList when you are done using that audio data.\n\n**Note: You have to free the AudioBufferList, even in ARC.**\n```objectivec\n// Allocate a buffer list to hold the file's data\nUInt32          frames      = 512;\nAudioBufferList *bufferList = [EZAudio audioBufferList];\nUInt32          bufferSize; // Read function will populate this value\nBOOL            eof;        // Read function will populate this value\n// Reads 512 frames from the audio file\n[audioFile readFrames:frames\n      audioBufferList:bufferList\n           bufferSize:&bufferSize\n                  eof:&eof];\n// Cleanup when done working with audio data (yes, even in ARC)\n[EZAudio freeBufferList:bufferList];\n```\n\nWhen a read occurs the `EZAudioFileDelegate` receives two events.\n\nAn event notifying the delegate of the read audio data as float arrays:\n```objectivec\n// The EZAudioFile method `readFrames:audioBufferList:bufferSize:eof:` triggers an event notifying the delegate of the read audio data as float arrays\n-(void)     audioFile:(EZAudioFile *)audioFile\n            readAudio:(float **)buffer\n       withBufferSize:(UInt32)bufferSize\n withNumberOfChannels:(UInt32)numberOfChannels {\n  // The audio data from the read as a float buffer. You can feed this into an audio plot!\n  dispatch_async(dispatch_get_main_queue(), ^{\n    // Update that audio plot!\n    [self.audioPlot updateBuffer:buffer[0] withBufferSize:bufferSize];\n  });\n}\n```\nand an event notifying the delegate of the new frame position within the `EZAudioFile`:\n```objectivec\n// The EZAudioFile method `readFrames:audioBufferList:bufferSize:eof:` triggers an event notifying the delegate of the new frame position within the file.\n-(void)audioFile:(EZAudioFile *)audioFile updatedPosition:(SInt64)framePosition {\n  dispatch_async(dispatch_get_main_queue(), ^{\n    // Move that slider to this new position!\n  });\n}\n```\n\n####Seeking Through An Audio File\n\nYou can seek very easily through an audio file using the `EZAudioFile`'s seekToFrame: method. The `EZAudioFile` provides a `totalFrames` method to provide you the total amount of frames in an audio file so you can calculate a proper offset.\n```objectivec\n// Get the total number of frames for the audio file\nSInt64 totalFrames = [self.audioFile totalFrames];\n// Seeks halfway through the audio file\n[self.audioFile seekToFrame:(totalFrames/2)];\n```\nWhen a seek occurs the `EZAudioFileDelegate` receives the seek event:\n```objectivec\n// The EZAudioFile method `seekToFrame:` triggers an event notifying the delegate of the new frame position within the file.\n-(void)audioFile:(EZAudioFile *)audioFile updatedPosition:(SInt64)framePosition {\n  dispatch_async(dispatch_get_main_queue(), ^{\n    // Move that slider to this new position!\n  });\n}\n```\n###<a name=\"EZMicrophone\"></a>EZMicrophone\nProvides access to the default device microphone in one line of code and provides delegate callbacks to receive the audio data as an AudioBufferList and float arrays.\n\n**_Relevant Example Projects_**\n- EZAudioCoreGraphicsWaveformExample (iOS)\n- EZAudioCoreGraphicsWaveformExample (OSX)\n- EZAudioOpenGLWaveformExample (iOS)\n- EZAudioOpenGLWaveformExample (OSX)\n- EZAudioRecordExample (iOS)\n- EZAudioRecordExample (OSX)\n\n####Creating A Microphone\n\nCreate an `EZMicrophone` instance by declaring a property and initializing it like so:\n\n```objectivec\n// Declare the EZMicrophone as a strong property\n@property (nonatomic,strong) EZMicrophone *microphone;\n\n...\n\n// Initialize the microphone instance and assign it a delegate to receive the audio data callbacks\nself.microphone = [EZMicrophone microphoneWithDelegate:self];\n```\nAlternatively, you could also use the shared `EZMicrophone` instance and just assign its `EZMicrophoneDelegate`.\n```objectivec\n// Assign a delegate to the shared instance of the microphone to receive the audio data callbacks\n[EZMicrophone sharedMicrophone].microphoneDelegate = self;\n```\n\n####Getting Microphone Data\n\nTo tell the microphone to start fetching audio use the `startFetchingAudio` function.\n\n```objectivec\n// Starts fetching audio from the default device microphone and sends data to EZMicrophoneDelegate\n[self.microphone startFetchingAudio];\n```\nOnce the `EZMicrophone` has started it will send the `EZMicrophoneDelegate` the audio back in a few ways.\nAn array of float arrays:\n```objectivec\n/**\n The microphone data represented as float arrays useful for:\n    - Creating real-time waveforms using EZAudioPlot or EZAudioPlotGL\n    - Creating any number of custom visualizations that utilize audio!\n */\n-(void)   microphone:(EZMicrophone *)microphone\n    hasAudioReceived:(float **)buffer\n      withBufferSize:(UInt32)bufferSize\nwithNumberOfChannels:(UInt32)numberOfChannels {\n  // Getting audio data as an array of float buffer arrays that can be fed into the EZAudioPlot, EZAudioPlotGL, or whatever visualization you would like to do with the microphone data.\n  dispatch_async(dispatch_get_main_queue(),^{\n    // Visualize this data brah, buffer[0] = left channel, buffer[1] = right channel\n    [self.audioPlot updateBuffer:buffer[0] withBufferSize:bufferSize];\n  });\n}\n```\nor the AudioBufferList representation:\n```objectivec\n/**\n The microphone data represented as CoreAudio's AudioBufferList useful for:\n    - Appending data to an audio file via the EZRecorder\n    - Playback via the EZOutput\n    \n */\n-(void)    microphone:(EZMicrophone *)microphone\n        hasBufferList:(AudioBufferList *)bufferList\n       withBufferSize:(UInt32)bufferSize\n withNumberOfChannels:(UInt32)numberOfChannels {\n    // Getting audio data as an AudioBufferList that can be directly fed into the EZRecorder or EZOutput. Say whattt...\n}\n```\n####Pausing/Resuming The Microphone\n\nPause or resume fetching audio at any time like so:\n```objectivec\n// Stop fetching audio\n[self.microphone stopFetchingAudio];\n\n// Resume fetching audio\n[self.microphone startFetchingAudio];\n```\nAlternatively, you could also toggle the `microphoneOn` property (safe to use with Cocoa Bindings)\n```objectivec\n// Stop fetching audio\nself.microphone.microphoneOn = NO;\n\n// Start fetching audio\nself.microphone.microphoneOn = YES;\n```\n\n###<a name=\"EZOutput\"></a>EZOutput\nProvides flexible playback to the default output device by asking the `EZOutputDataSource` for audio data to play. Doesn't care where the buffers come from (microphone, audio file, streaming audio, etc). The `EZOutputDataSource` has three functions that can provide audio data for the output callback. You should implement only **ONE** of these functions:\n```objectivec\n// Full override of the audio callback \n-(void)           output:(EZOutput*)output\n callbackWithActionFlags:(AudioUnitRenderActionFlags*)ioActionFlags\n             inTimeStamp:(const AudioTimeStamp*)inTimeStamp\n             inBusNumber:(UInt32)inBusNumber\n          inNumberFrames:(UInt32)inNumberFrames\n                  ioData:(AudioBufferList*)ioData;\n                 \n// Provides the audio callback with a circular buffer holding the audio data\n-(TPCircularBuffer*)outputShouldUseCircularBuffer:(EZOutput *)output;\n\n// Provides the audio callback with a buffer list, number of frames, and buffer size to use\n-(void)             output:(EZOutput *)output\n shouldFillAudioBufferList:(AudioBufferList *)audioBufferList\n        withNumberOfFrames:(UInt32)frames;\n```\n\n**_Relevant Example Projects_**\n- EZAudioPlayFileExample (iOS)\n- EZAudioPlayFileExample (OSX)\n- EZAudioPassThroughExample (iOS)\n- EZAudioPassThroughExample (OSX)\n\n####Creating An Output\n\nCreate an `EZOutput` by declaring a property and initializing it like so:\n\n```objectivec\n// Declare the EZOutput as a strong property\n@property (nonatomic,strong) EZOutput *output;\n\n...\n\n// Initialize the EZOutput instance and assign it a delegate to provide the output audio data\nself.output = [EZOutput outputWithDataSource:self];\n```\nAlternatively, you could also use the shared output instance and just assign it an `EZOutputDataSource`. This is the preferred way to use the `EZOutput` (usually just have one per app).\n```objectivec\n// Assign a delegate to the shared instance of the output to provide the output audio data\n[EZOutput sharedOutput].outputDataSource = self;\n```\n####Playback Using An AudioBufferList\n\nOne method to play back audio is to provide an AudioBufferList (for instance, reading from an `EZAudioFile`):\n```objectivec\n// Use the AudioBufferList datasource method to read from an EZAudioFile\n-(void)             output:(EZOutput *)output\n shouldFillAudioBufferList:(AudioBufferList *)audioBufferList\n        withNumberOfFrames:(UInt32)frames\n{\n  if( self.audioFile )\n  {\n    UInt32 bufferSize;\n    [self.audioFile readFrames:frames\n               audioBufferList:audioBufferList\n                    bufferSize:&bufferSize\n                           eof:&_eof];\n    if( _eof )\n    {\n      [self seekToFrame:0];\n    }\n  }\n}\n```\n####Playback Using A Circular Buffer\n\nAnother method is to provide a circular buffer via Michael Tyson's (who, btw is a serious badass and also wrote the Amazing Audio Engine for iOS) TPCircularBuffer containing the data. For instance, for passing the microphone input to the output for a basic passthrough:\n```objectivec\n// Declare circular buffer as global\nTPCircularBuffer circularBuffer;\n...\n// Using an EZMicrophone, append the AudioBufferList from the microphone callback to the global circular buffer\n-(void)    microphone:(EZMicrophone *)microphone\n        hasBufferList:(AudioBufferList *)bufferList\n       withBufferSize:(UInt32)bufferSize\n withNumberOfChannels:(UInt32)numberOfChannels {\n  /**\n   Append the audio data to a circular buffer\n   */\n  [EZAudio appendDataToCircularBuffer:&circularBuffer\n                  fromAudioBufferList:bufferList];\n}\n// Pass the circular buffer to the EZOutputDataSource using the circular buffer callback\n-(TPCircularBuffer *)outputShouldUseCircularBuffer:(EZOutput *)output {\n  return &circularBuffer;\n}\n```\n####Playback By Manual Override\n\nAnd the last method is to completely override the output callback method and populate the AudioBufferList however you can imagine:\n```objectivec\n// Completely override the output callback function\n-(void)           output:(EZOutput *)output\n callbackWithActionFlags:(AudioUnitRenderActionFlags *)ioActionFlags\n             inTimeStamp:(const AudioTimeStamp *)inTimeStamp\n             inBusNumber:(UInt32)inBusNumber\n          inNumberFrames:(UInt32)inNumberFrames\n                  ioData:(AudioBufferList *)ioData {\n // Fill the ioData with your audio data from anywhere\n}\n```\n###<a name=\"EZRecorder\"></a>EZRecorder\nProvides a way to record any audio source to an audio file. This hooks into the other components quite nicely to do something like plot the audio waveform while recording to give visual feedback as to what is happening.\n\n*Relevant Example Projects*\n- EZAudioRecordExample (iOS)\n- EZAudioRecordExample (OSX)\n\n####Creating A Recorder\n\nTo create an `EZRecorder` you must start with an AudioStreamBasicDescription, which is just a CoreAudio structure representing the audio format of a file. The `EZMicrophone` and `EZAudioFile` both provide the AudioStreamBasicDescription as properties (for the `EZAudioFile` use the clientFormat property) that you can use when initializing the `EZRecorder`.\n\n```objectivec\n// Declare the EZRecorder as a strong property\n@property (nonatomic,strong) EZRecorder *recorder;\n\n...\n\n// Here's how we would initialize the recorder for an EZMicrophone instance\nself.recorder = [EZRecorder recorderWithDestinationURL:[NSURL fileURLWithPath:@\"path/to/file.caf\"]\n                                       andSourceFormat:microphone.audioStreamBasicDescription];\n                                       \n// Here's how we would initialize the recorder for an EZAudioFile instance\nself.recorder = [EZRecorder recorderWithDestinationURL:[NSURL fileURLWithPath:@\"path/to/file.caf\"]\n                                       andSourceFormat:audioFile.clientFormat];\n```\n\n##Recording Some Audio\n\nOnce you've initialized your `EZRecorder` you can append data by passing in an AudioBufferList and its buffer size like so:\n```objectivec\n// Append the microphone data coming as a AudioBufferList with the specified buffer size to the recorder\n-(void)    microphone:(EZMicrophone *)microphone\n        hasBufferList:(AudioBufferList *)bufferList\n       withBufferSize:(UInt32)bufferSize\n withNumberOfChannels:(UInt32)numberOfChannels {\n  // Getting audio data as a buffer list that can be directly fed into the EZRecorder. This is happening on the audio thread - any UI updating needs a GCD main queue block.\n  if( self.isRecording ){\n    [self.recorder appendDataFromBufferList:bufferList\n                             withBufferSize:bufferSize];\n  } \n}\n```\n\n###Interface Components\n`EZAudio` currently offers two drop in audio waveform components that help simplify the process of visualizing audio.\n\n###<a name=\"EZAudioPlot\"></a>EZAudioPlot\nProvides an audio waveform plot that uses CoreGraphics to perform the drawing. On iOS this is a subclass of UIView while on OSX this is a subclass of NSView. Best used on OSX as the drawing falls on the CPU and needs to redisplay after every audio data update, but useful in iOS apps for displaying full, static waveforms.\n\n*Relevant Example Projects*\n- EZAudioCoreGraphicsWaveformExample (iOS)\n- EZAudioCoreGraphicsWaveformExample (OSX)\n\n####Creating An Audio Plot\n\nYou can create an audio plot in the interface builder by dragging in a UIView on iOS or an NSView on OSX onto your content area. Then change the custom class of the UIView/NSView to `EZAudioPlot`.\nSee full Getting Started page for how to: http://syedharisali.com/projects/EZAudio/getting-started\n\nAlternatively, you can could create the audio plot programmatically\n\n```objectivec\n// Programmatically create an audio plot\nEZAudioPlot *audioPlot = [[EZAudioPlot alloc] initWithFrame:self.view.frame];\n[self.view addSubview:audioPlot];\n```\n\n####Customizing The Audio Plot\n\nAll plots offer the ability to change the background color, waveform color, plot type (buffer or rolling), toggle between filled and stroked, and toggle between mirrored and unmirrored (about the x-axis). For iOS colors are of the type UIColor while on OSX colors are of the type NSColor.\n\n```objectivec\n// Background color (use UIColor for iOS)\naudioPlot.backgroundColor = [NSColor colorWithCalibratedRed:0.816 \n                                                      green:0.349 \n                                                       blue:0.255 \n                                                      alpha:1];\n// Waveform color (use UIColor for iOS)\naudioPlot.color = [NSColor colorWithCalibratedRed:1.000 \n                                            green:1.000 \n                                             blue:1.000\n                                            alpha:1];\n// Plot type\naudioPlot.plotType     = EZPlotTypeBuffer;\n// Fill\naudioPlot.shouldFill   = YES;\n// Mirror\naudioPlot.shouldMirror = YES;\n```\n\n####Updating The Audio Plot\n\nAll plots have only one update function, `updateBuffer:withBufferSize:`, which expects a float array and its length.\n```objectivec\n// The microphone component provides audio data to its delegate as an array of float buffer arrays.\n-(void)    microphone:(EZMicrophone *)microphone\n     hasAudioReceived:(float **)buffer\n       withBufferSize:(UInt32)bufferSize\n withNumberOfChannels:(UInt32)numberOfChannels {\n  /** \n   Update the audio plot using the float array provided by the microphone:\n     buffer[0] = left channel\n     buffer[1] = right channel\n   Note: Audio updates happen asynchronously so we need to make sure\n         sure to update the plot on the main thread\n   */\n  dispatch_async(dispatch_get_main_queue(),^{\n    [self.audioPlot updateBuffer:buffer[0] withBufferSize:bufferSize];\n  });\n}\n```\n\n###<a name=\"EZAudioPlotGL\"></a>EZAudioPlotGL\nProvides an audio waveform plot that uses OpenGL to perform the drawing. The API this class are exactly the same as those for the EZAudioPlot above. On iOS this is a subclass of the EZPlot and uses an embedded GLKViewController to perform the OpenGL drawing while on OSX this is a subclass of the NSOpenGLView. In most cases this is the plot you want to use, it's GPU-accelerated, has a low memory footprint, and performs amazingly on all devices.\n\n*Relevant Example Projects*\n- EZAudioOpenGLWaveformExample (iOS)\n- EZAudioOpenGLWaveformExample (OSX)\n\n####Creating An OpenGL Audio Plot\n\nYou can create an audio plot in the interface builder by dragging in a UIView on iOS or an NSOpenGLView on OSX onto your content area. Then change the custom class of the UIView/NSView to `EZAudioPlotGL`.\nSee full Getting Started page for how to: http://syedharisali.com/projects/EZAudio/getting-started\n\nAlternatively, you can could create the `EZAudioPlotGL` programmatically\n```objectivec\n// Programmatically create an audio plot\nEZAudioPlotGL *audioPlotGL = [[EZAudioPlotGL alloc] initWithFrame:self.view.frame];\n[self.view addSubview:audioPlotGL];\n```\n\n####Customizing The OpenGL Audio Plot\n\nAll plots offer the ability to change the background color, waveform color, plot type (buffer or rolling), toggle between filled and stroked, and toggle between mirrored and unmirrored (about the x-axis). For iOS colors are of the type UIColor while on OSX colors are of the type NSColor.\n```objectivec\n// Background color (use UIColor for iOS)\naudioPlotGL.backgroundColor = [NSColor colorWithCalibratedRed:0.816 \n                                                        green:0.349 \n                                                         blue:0.255 \n                                                        alpha:1];\n// Waveform color (use UIColor for iOS)\naudioPlotGL.color = [NSColor colorWithCalibratedRed:1.000 \n                                              green:1.000 \n                                               blue:1.000\n                                              alpha:1];\n// Plot type\naudioPlotGL.plotType     = EZPlotTypeBuffer;\n// Fill\naudioPlotGL.shouldFill   = YES;\n// Mirror\naudioPlotGL.shouldMirror = YES;\n```\n\n####Updating The OpenGL Audio Plot\n\nAll plots have only one update function, `updateBuffer:withBufferSize:`, which expects a float array and its length.\n```objectivec\n// The microphone component provides audio data to its delegate as an array of float buffer arrays.\n-(void)    microphone:(EZMicrophone *)microphone\n     hasAudioReceived:(float **)buffer\n       withBufferSize:(UInt32)bufferSize\n withNumberOfChannels:(UInt32)numberOfChannels {\n  /** \n   Update the audio plot using the float array provided by the microphone:\n     buffer[0] = left channel\n     buffer[1] = right channel\n   Note: Audio updates happen asynchronously so we need to make sure\n         sure to update the plot on the main thread\n   */\n  dispatch_async(dispatch_get_main_queue(),^{\n    [self.audioPlotGL updateBuffer:buffer[0] withBufferSize:bufferSize];\n  });\n}\n```\n\n##License\nEZAudio is available under the MIT license. See the LICENSE file for more info.\n\n##Contact & Contributers\nSyed Haris Ali<br>\nwww.syedharisali.com<br>\nsyedhali07[at]gmail.com\n\n##Acknowledgements\nEZAudio could not have been created without the invaluable help of:\n- <a href=\"http://atastypixel.com/blog/\">Michael Tyson</a> for creating the <a href=\"http://atastypixel.com/blog/a-simple-fast-circular-buffer-implementation-for-audio-processing/\">TPCircularBuffer</a> and the <a href=\"http://theamazingaudioengine.com/\">Amazing Audio Engine</a>'s `AEFloatConverter`.\n- Chris Adamson and Kevin Avila for writing the amazing book <a href=\"http://www.amazon.com/Learning-Core-Audio-Hands-On-Programming/dp/0321636848\">Learning Core Audio</a>\n"
  },
  {
    "path": "Sublime/Pods/Gifu/Carthage/Checkouts/Runes/Source/Runes.swift",
    "content": "/**\nmap a function over a value with context\n\nExpected function type: `(a -> b) -> f a -> f b`\n\n*/\ninfix operator <^> {\n    associativity left\n\n    // Same precedence as the equality operator (`==`)\n    precedence 130\n}\n\n/**\napply a function with context to a value with context\n\nExpected function type: `f (a -> b) -> f a -> f b`\n*/\ninfix operator <*> {\n    associativity left\n\n    // Same precedence as the equality operator (`==`)\n    precedence 130\n}\n\n/**\nmap a function over a value with context and flatten the result\n\nExpected function type: `m a -> (a -> m b) -> m b`\n*/\ninfix operator >>- {\n    associativity left\n\n    // Lower precedence than the logical comparison operators\n    // (`&&` and `||`), but higher precedence than the assignment\n    // operator (`=`)\n    precedence 100\n}\n\n/**\nmap a function over a value with context and flatten the result\n\nExpected function type: `(a -> m b) -> m a -> m b`\n*/\ninfix operator -<< {\n    associativity right\n\n    // Lower precedence than the logical comparison operators\n    // (`&&` and `||`), but higher precedence than the assignment\n    // operator (`=`)\n    precedence 100\n}\n"
  },
  {
    "path": "Sublime/Pods/Gifu/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Kaishin & Co.\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 of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject 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, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nThe name and characters used in the demo of this software are property of their\nrespective owners.\n\n"
  },
  {
    "path": "Sublime/Pods/Gifu/README.md",
    "content": "# ![Gifu](https://db.tt/mZ1iMNXO)\n\nAdds performant animated GIF support to UIKit. If you're looking for the Japanese prefecture, click [here](https://goo.gl/maps/CCeAc).\n\n#### How?\n\nGifu uses a `UIImageView` subclass and an animator that keeps track of frames and their durations.\n\nIt uses `CADisplayLink` to animate the view and only keeps a limited number of\nresized frames in-memory, which exponentially minimizes memory usage for large GIF files (+300 frames).\n\nThe figure below summarizes how this works in practice. Given an image\ncontaining 10 frames, Gifu will load the current frame (red), pre-load the next two frames in this example (orange), and nullify all the other frames to free up memory (gray):\n\n<img src=\"https://db.tt/ZLfx23hg\" width=\"300\" />\n\n#### Install\n#### [Carthage](https://github.com/Carthage/Carthage)\n\n- Add the following to your Cartfile: `github \"kaishin/Gifu\"`\n- Then run `carthage update`\n- Follow the current instructions in [Carthage's README][carthage-installation]\nfor up to date installation instructions.\n\n[carthage-installation]: https://github.com/Carthage/Carthage#adding-frameworks-to-an-application\n\n#### [CocoaPods](http://cocoapods.org)\n\n- Add the following to your [Podfile](http://guides.cocoapods.org/using/the-podfile.html): `pod 'Gifu'`\n- You will also need to make sure you're opting into using frameworks: `use_frameworks!`\n- Then run `pod install` with CocoaPods 0.36 or newer.\n\n#### Usage\n\nStart by instantiating an `AnimatableImageView` either in code or Interface Builder, then call `animateWithImage(named:)` or `animateWithImageData(data:)` on it.\n\n```swift\nlet imageView = AnimatableImageView(frame: CGRect(...))\nimageView.animateWithImage(named: \"mugen.gif\")\n```\nYou can stop the animation anytime using `imageView.stopAnimatingGIF()`, and resume\nit using `imageView.startAnimatingGIF()`.\n\nThe `isAnimatingGIF()` method returns the current animation state of the view if it has an animatable image.\n\nSee the [full documentation](http://kaishin.github.io/gifu/).\n\n#### Demo App\n\nClone or download the repository and open `Gifu.xcworkspace` to check out the demo app.\n\n#### Compatibility\n\n- iOS 8+\n\n#### Roadmap\n\n- Add ability to set the frame-rate\n\n#### Contributors\n\n- [Reda Lemeden](https://github.com/kaishin)\n- [Tony DiPasquale](https://github.com/tonyd256)\n\n#### Misc\n\n- The font used in the logo is [Azuki](http://www.myfonts.com/fonts/bluevinyl/azuki/)\n- The characters used in the icon and example image in the demo are from [Samurai Champloo](https://en.wikipedia.org/wiki/Samurai_Champloo).\n\n#### License\n\nSee LICENSE.\n"
  },
  {
    "path": "Sublime/Pods/Gifu/Source/AnimatableImageView.swift",
    "content": "import UIKit\n\n/// A subclass of `UIImageView` that can be animated using an image name string or raw data.\npublic class AnimatableImageView: UIImageView {\n  /// An `Animator` instance that holds the frames of a specific image in memory.\n  var animator: Animator?\n  /// A display link that keeps calling the `updateFrame` method on every screen refresh.\n  lazy var displayLink: CADisplayLink = CADisplayLink(target: self, selector: Selector(\"updateFrame\"))\n\n  /// The size of the frame cache.\n  public var framePreloadCount = 50\n\n  /// A computed property that returns whether the image view is animating.\n  public var isAnimatingGIF: Bool {\n    return !displayLink.paused\n  }\n\n  /// Prepares the frames using a GIF image file name, without starting the animation.\n  /// The file name should include the `.gif` extension.\n  ///\n  /// - parameter imageName: The name of the GIF file. The method looks for the file in the app bundle.\n  public func prepareForAnimation(imageNamed imageName: String) {\n    let imagePath = NSBundle.mainBundle().bundleURL.URLByAppendingPathComponent(imageName)\n    prepareForAnimation <^> NSData(contentsOfURL: imagePath)\n  }\n\n  /// Prepares the frames using raw GIF image data, without starting the animation.\n  ///\n  /// - parameter data: GIF image data.\n  public func prepareForAnimation(imageData data: NSData) {\n    image = UIImage(data: data)\n    animator = Animator(data: data, size: frame.size, contentMode: contentMode, framePreloadCount: framePreloadCount)\n    animator?.prepareFrames()\n    attachDisplayLink()\n  }\n\n  /// Prepares the frames using a GIF image file name and starts animating the image view.\n  ///\n  /// - parameter imageName: The name of the GIF file. The method looks for the file in the app bundle.\n  public func animateWithImage(named imageName: String) {\n    prepareForAnimation(imageNamed: imageName)\n    startAnimatingGIF()\n  }\n\n  /// Prepares the frames using raw GIF image data and starts animating the image view.\n  ///\n  /// - parameter data: GIF image data.\n  public func animateWithImageData(data: NSData) {\n    prepareForAnimation(imageData: data)\n    startAnimatingGIF()\n  }\n\n  /// Updates the `image` property of the image view if necessary. This method should not be called manually.\n  override public func displayLayer(layer: CALayer) {\n    image = animator?.currentFrame\n  }\n\n  /// Starts the image view animation.\n  public func startAnimatingGIF() {\n    if animator?.isAnimatable ?? false {\n      displayLink.paused = false\n    }\n  }\n\n  /// Stops the image view animation.\n  public func stopAnimatingGIF() {\n    displayLink.paused = true\n  }\n\n  /// Update the current frame with the displayLink duration\n  func updateFrame() {\n    if animator?.updateCurrentFrame(displayLink.duration) ?? false {\n      layer.setNeedsDisplay()\n    }\n  }\n\n  /// Invalidate the displayLink so it releases this object.\n  deinit {\n    displayLink.invalidate()\n  }\n\n  /// Attaches the display link.\n  func attachDisplayLink() {\n    displayLink.addToRunLoop(.mainRunLoop(), forMode: NSRunLoopCommonModes)\n  }\n}\n\n"
  },
  {
    "path": "Sublime/Pods/Gifu/Source/AnimatedFrame.swift",
    "content": "/// Keeps a reference to an `UIImage` instance and its duration as a GIF frame.\nstruct AnimatedFrame {\n  let image: UIImage?\n  let duration: NSTimeInterval\n\n  static func null() -> AnimatedFrame {\n    return AnimatedFrame(image: .None, duration: 0)\n  }\n}\n\n"
  },
  {
    "path": "Sublime/Pods/Gifu/Source/Animator.swift",
    "content": "import UIKit\nimport ImageIO\n\n/// Responsible for storing and updating the frames of a `AnimatableImageView` instance via delegation.\nclass Animator {\n  /// Maximum duration to increment the frame timer with.\n  let maxTimeStep = 1.0\n  /// An array of animated frames from a single GIF image.\n  var animatedFrames = [AnimatedFrame]()\n  /// The size to resize all frames to\n  let size: CGSize\n  /// The content mode to use when resizing\n  let contentMode: UIViewContentMode\n  /// Maximum number of frames to load at once\n  let maxFrameCount: Int\n  /// The total number of frames in the GIF.\n  var frameCount = 0\n  /// A reference to the original image source.\n  var imageSource: CGImageSourceRef\n  /// The index of the current GIF frame.\n  var currentFrameIndex = 0\n  /// The index of the current GIF frame from the source.\n  var currentPreloadIndex = 0\n  /// Time elapsed since the last frame change. Used to determine when the frame should be updated.\n  var timeSinceLastFrameChange: NSTimeInterval = 0.0\n\n  /// The current image frame to show.\n  var currentFrame: UIImage? {\n    return frameAtIndex(currentFrameIndex)\n  }\n\n  /// Is this image animatable?\n  var isAnimatable: Bool {\n    return imageSource.isAnimatedGIF\n  }\n\n  /// Initializes an animator instance from raw GIF image data and an `Animatable` delegate.\n  ///\n  /// - parameter data: The raw GIF image data.\n  /// - parameter delegate: An `Animatable` delegate.\n  init(data: NSData, size: CGSize, contentMode: UIViewContentMode, framePreloadCount: Int) {\n    let options = [String(kCGImageSourceShouldCache): kCFBooleanFalse]\n    self.imageSource = CGImageSourceCreateWithData(data, options) ?? CGImageSourceCreateIncremental(options)\n    self.size = size\n    self.contentMode = contentMode\n    self.maxFrameCount = framePreloadCount\n  }\n\n  // MARK: - Frames\n  /// Loads the frames from an image source, resizes them, then caches them in `animatedFrames`.\n  func prepareFrames() {\n    frameCount = Int(CGImageSourceGetCount(imageSource))\n    let framesToProcess = min(frameCount, maxFrameCount)\n    animatedFrames.reserveCapacity(framesToProcess)\n    animatedFrames = (0..<framesToProcess).reduce([]) { $0 + pure(prepareFrame($1)) }\n    currentPreloadIndex = framesToProcess\n  }\n\n  /// Loads a single frame from an image source, resizes it, then returns an `AnimatedFrame`.\n  ///\n  /// - parameter index: The index of the GIF image source to prepare\n  /// - returns: An AnimatedFrame object\n  func prepareFrame(index: Int) -> AnimatedFrame {\n    guard let frameImageRef = CGImageSourceCreateImageAtIndex(imageSource, index, nil) else {\n      return AnimatedFrame.null()\n    }\n\n    let frameDuration = CGImageSourceGIFFrameDuration(imageSource, index: index)\n    let image = UIImage(CGImage: frameImageRef)\n    let scaledImage: UIImage?\n\n    switch contentMode {\n    case .ScaleAspectFit: scaledImage = image.resizeAspectFit(size)\n    case .ScaleAspectFill: scaledImage = image.resizeAspectFill(size)\n    default: scaledImage = image.resize(size)\n    }\n\n    return AnimatedFrame(image: scaledImage, duration: frameDuration)\n  }\n\n  /// Returns the frame at a particular index.\n  ///\n  /// - parameter index: The index of the frame.\n  /// - returns: An optional image at a given frame.\n  func frameAtIndex(index: Int) -> UIImage? {\n    return animatedFrames[index].image\n  }\n\n  /// Updates the current frame if necessary using the frame timer and the duration of each frame in `animatedFrames`.\n  ///\n  /// - returns: An optional image at a given frame.\n  func updateCurrentFrame(duration: CFTimeInterval) -> Bool {\n    timeSinceLastFrameChange += min(maxTimeStep, duration)\n    guard let frameDuration = animatedFrames[safe:currentFrameIndex]?.duration where\n    frameDuration <= timeSinceLastFrameChange else { return false }\n\n    timeSinceLastFrameChange -= frameDuration\n    let lastFrameIndex = currentFrameIndex\n    currentFrameIndex = ++currentFrameIndex % animatedFrames.count\n    \n    // Loads the next needed frame for progressive loading\n    if animatedFrames.count < frameCount {\n      animatedFrames[lastFrameIndex] = prepareFrame(currentPreloadIndex)\n      currentPreloadIndex = ++currentPreloadIndex % frameCount\n    }\n    \n    return true\n  }\n}\n"
  },
  {
    "path": "Sublime/Pods/Gifu/Source/ArrayExtension.swift",
    "content": "extension Array {\n  subscript(safe index: Int) -> Element? {\n    return indices ~= index ? self[index] : .None\n  }\n}\n"
  },
  {
    "path": "Sublime/Pods/Gifu/Source/CGSizeExtension.swift",
    "content": "extension CGSize {\n  /// Calculates the aspect ratio of the size.\n  ///\n  /// - returns: aspectRatio The aspect ratio of the size.\n  var aspectRatio: CGFloat {\n    if height == 0 { return 1 }\n    return width / height\n  }\n\n  /// Finds a new size constrained by a size keeping the aspect ratio.\n  ///\n  /// - parameter size: The contraining size.\n  /// - returns: size A new size that fits inside the contraining size with the same aspect ratio.\n  func sizeConstrainedBySize(size: CGSize) -> CGSize {\n    let aspectWidth = round(aspectRatio * size.height)\n    let aspectHeight = round(size.width / aspectRatio)\n\n    if aspectWidth > size.width {\n      return CGSize(width: size.width, height: aspectHeight)\n    } else {\n      return CGSize(width: aspectWidth, height: size.height)\n    }\n  }\n\n  /// Finds a new size filling the given size while keeping the aspect ratio.\n  ///\n  /// - parameter size: The contraining size.\n  /// - returns: size A new size that fills the contraining size keeping the same aspect ratio.\n  func sizeFillingSize(size: CGSize) -> CGSize {\n    let aspectWidth = round(aspectRatio * size.height)\n    let aspectHeight = round(size.width / aspectRatio)\n\n    if aspectWidth > size.width {\n      return CGSize(width: aspectWidth, height: size.height)\n    } else {\n      return CGSize(width: size.width, height: aspectHeight)\n    }\n  }\n}\n"
  },
  {
    "path": "Sublime/Pods/Gifu/Source/FunctionalHelpers.swift",
    "content": "func <^> <T, U>(@noescape f: T -> U, a: T?) -> U? {\n  return a.map(f)\n}\nfunc <*> <T, U>(f: (T -> U)?, a: T?) -> U? {\n  return a.apply(f)\n}\n\nfunc >>- <T, U>(a: T?, @noescape f: T -> U?) -> U? {\n  return a.flatMap(f)\n}\n\nextension Optional {\n  func apply<U>(f: (Wrapped -> U)?) -> U? {\n    return f.flatMap { self.map($0) }\n  }\n}\n\nfunc pure<T>(a: T) -> [T] {\n  return [a]\n}\n"
  },
  {
    "path": "Sublime/Pods/Gifu/Source/Gifu.h",
    "content": "#import <UIKit/UIKit.h>\n\nFOUNDATION_EXPORT double GifuVersionNumber;\nFOUNDATION_EXPORT const unsigned char GifuVersionString[];\n"
  },
  {
    "path": "Sublime/Pods/Gifu/Source/ImageSourceHelpers.swift",
    "content": "import ImageIO\nimport MobileCoreServices\nimport UIKit\n\ntypealias GIFProperties = [String : Double]\nlet defaultDuration: Double = 0\n\n/// Retruns the duration of a frame at a specific index using an image source (an `CGImageSource` instance).\n///\n/// - returns: A frame duration.\nfunc CGImageSourceGIFFrameDuration(imageSource: CGImageSource, index: Int) -> NSTimeInterval {\n  if !imageSource.isAnimatedGIF { return 0.0 }\n\n  let duration = imageSource.GIFPropertiesAtIndex(index)\n    >>- durationFromGIFProperties\n    >>- capDuration\n\n  return duration ?? defaultDuration\n}\n\n/// Ensures that a duration is never smaller than a threshold value.\n///\n/// - returns: A capped frame duration.\nfunc capDuration(duration: Double) -> Double? {\n  if duration < 0 { return .None }\n  let threshold = 0.02 - Double(FLT_EPSILON)\n  let cappedDuration = duration < threshold ? 0.1 : duration\n  return cappedDuration\n}\n\n/// Returns a frame duration from a `GIFProperties` dictionary.\n///\n/// - returns: A frame duration.\nfunc durationFromGIFProperties(properties: GIFProperties) -> Double? {\n  let unclampedDelayTime = properties[String(kCGImagePropertyGIFUnclampedDelayTime)]\n  let delayTime = properties[String(kCGImagePropertyGIFDelayTime)]\n\n  return duration <^> unclampedDelayTime <*> delayTime\n}\n\n/// Calculates frame duration based on both clamped and unclamped times.\n///\n/// - returns: A frame duration.\nfunc duration(unclampedDelayTime: Double)(delayTime: Double) -> Double {\n  let delayArray = [unclampedDelayTime, delayTime]\n  return delayArray.filter(isPositive).first ?? defaultDuration\n}\n\n/// Checks if a `Double` value is positive.\n///\n/// - returns: A boolean value that is `true` if the tested value is positive.\nfunc isPositive(value: Double) -> Bool {\n  return value >= 0\n}\n\n/// An extension of `CGImageSourceRef` that add GIF introspection and easier property retrieval.\nextension CGImageSourceRef {\n  /// Returns whether the image source contains an animated GIF.\n  ///\n  /// - returns: A boolean value that is `true` if the image source contains animated GIF data.\n  var isAnimatedGIF: Bool {\n    let isTypeGIF = UTTypeConformsTo(CGImageSourceGetType(self) ?? \"\", kUTTypeGIF)\n    let imageCount = CGImageSourceGetCount(self)\n    return isTypeGIF != false && imageCount > 1\n  }\n\n  /// Returns the GIF properties at a specific index.\n  ///\n  /// - parameter index: The index of the GIF properties to retrieve.\n  /// - returns: A dictionary containing the GIF properties at the passed in index.\n  func GIFPropertiesAtIndex(index: Int) -> GIFProperties? {\n    let imageProperties = CGImageSourceCopyPropertiesAtIndex(self, index, nil) as Dictionary?\n    return imageProperties?[String(kCGImagePropertyGIFDictionary)] as? GIFProperties\n  }\n}\n"
  },
  {
    "path": "Sublime/Pods/Gifu/Source/UIImageExtension.swift",
    "content": "/// A `UIImage` extension that makes it easier to resize the image and inspect its size.\n\nextension UIImage {\n  /// Resizes an image instance.\n  ///\n  /// - parameter size: The new size of the image.\n  /// - returns: A new resized image instance.\n  func resize(size: CGSize) -> UIImage {\n    UIGraphicsBeginImageContextWithOptions(size, false, 0.0)\n    self.drawInRect(CGRect(origin: CGPointZero, size: size))\n    let newImage = UIGraphicsGetImageFromCurrentImageContext()\n    UIGraphicsEndImageContext()\n    return newImage ?? self\n  }\n\n  /// Resizes an image instance to fit inside a constraining size while keeping the aspect ratio.\n  ///\n  /// - parameter size: The constraining size of the image.\n  /// - returns: A new resized image instance.\n  func resizeAspectFit(size: CGSize) -> UIImage {\n    let newSize = self.size.sizeConstrainedBySize(size)\n    return resize(newSize)\n  }\n\n  /// Resizes an image instance to fill a constraining size while keeping the aspect ratio.\n  ///\n  /// - parameter size: The constraining size of the image.\n  /// - returns: A new resized image instance.\n  func resizeAspectFill(size: CGSize) -> UIImage {\n    let newSize = self.size.sizeFillingSize(size)\n    return resize(newSize)\n  }\n\n  /// Returns a new `UIImage` instance using raw image data and a size.\n  ///\n  /// - parameter data: Raw image data.\n  /// - parameter size: The size to be used to resize the new image instance.\n  /// - returns: A new image instance from the passed in data.\n  class func imageWithData(data: NSData, size: CGSize) -> UIImage? {\n    return UIImage(data: data)?.resize(size)\n  }\n\n  /// Returns an image size from raw image data.\n  ///\n  /// - parameter data: Raw image data.\n  /// - returns: The size of the image contained in the data.\n  class func sizeForImageData(data: NSData) -> CGSize? {\n    return UIImage(data: data)?.size\n  }\n}\n"
  },
  {
    "path": "Sublime/Pods/NMSSH/LICENSE",
    "content": "Copyright (c) 2013 Nine Muses AB\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": "Sublime/Pods/NMSSH/NMSSH/Config/NMSSH+Protected.h",
    "content": "#ifndef NMSSH_Protected_h\n#define NMSSH_Protected_h\n\n#import <CoreFoundation/CoreFoundation.h>\n#import <netinet/in.h>\n#import <sys/socket.h>\n#import <arpa/inet.h>\n#import \"socket_helper.h\"\n\n#define kNMSSHBufferSize (0x4000)\n\n#define NMSSHLogVerbose(frmt, ...) [[NMSSHLogger sharedLogger] logVerbose:[NSString stringWithFormat:frmt, ##__VA_ARGS__]]\n#define NMSSHLogInfo(frmt, ...) [[NMSSHLogger sharedLogger] logInfo:[NSString stringWithFormat:frmt, ##__VA_ARGS__]]\n#define NMSSHLogWarn(frmt, ...) [[NMSSHLogger sharedLogger] logWarn:[NSString stringWithFormat:frmt, ##__VA_ARGS__]]\n#define NMSSHLogError(frmt, ...) [[NMSSHLogger sharedLogger] logError:[NSString stringWithFormat:frmt, ##__VA_ARGS__]]\n\n#define strlen (unsigned int)strlen\n\n#endif\n"
  },
  {
    "path": "Sublime/Pods/NMSSH/NMSSH/Config/NMSSHLogger.h",
    "content": "#import \"NMSSH.h\"\n\ntypedef NS_OPTIONS(NSUInteger, NMSSHLogLevel) {\n    NMSSHLogLevelVerbose = (1 << 0 | 1 << 1 | 1 << 2 | 1 << 3),\n    NMSSHLogLevelInfo    = (1 << 1 | 1 << 2 | 1 << 3),\n    NMSSHLogLevelWarn    = (1 << 2 | 1 << 3),\n    NMSSHLogLevelError   = (1 << 3)\n};\n\n/**\n NMSSHLogger provides the functionality to customize the framework logging.\n */\n@interface NMSSHLogger : NSObject\n\n/// ----------------------------------------------------------------------------\n/// @name Retrieve the shared logger\n/// ----------------------------------------------------------------------------\n\n/**\n Retrieve the shared logger instance\n \n @returns Shared logger\n */\n+ (instancetype) sharedLogger;\n\n/// ----------------------------------------------------------------------------\n/// @name Logger settings\n/// ----------------------------------------------------------------------------\n\n/**\n The block called to print the log message.\n\n The default implementation print the log\n message using NSLog.\n\n The block takes two argument:\n\n _level_ - Log level<br>\n _format_ - Log message\n */\n@property (nonatomic, copy) void (^logBlock)(NMSSHLogLevel level, NSString *format);\n\n/** The maximum log level */\n@property (nonatomic, assign) NMSSHLogLevel logLevel;\n\n/** Enable or disable the logging feature */\n@property (nonatomic, assign, getter = isEnabled) BOOL enabled;\n\n/// ----------------------------------------------------------------------------\n/// @name Logging\n/// ----------------------------------------------------------------------------\n\n/**\n Log with verbose level\n\n @param format Log message\n */\n- (void)logVerbose:(NSString *)format;\n\n/**\n Log with info level\n\n @param format Log message\n */\n- (void)logInfo:(NSString *)format;\n\n/**\n Log with warn level\n\n @param format Log message\n */\n- (void)logWarn:(NSString *)format;\n\n/**\n Log with error level\n\n @param format Log message\n */\n- (void)logError:(NSString *)format;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/NMSSH/NMSSH/Config/NMSSHLogger.m",
    "content": "#import \"NMSSHLogger.h\"\n#import \"NMSSH+Protected.h\"\n\ntypedef NS_OPTIONS(NSUInteger, NMSSHLogFlag) {\n    NMSSHLogFlagVerbose = (1 << 0),\n    NMSSHLogFlagInfo    = (1 << 1),\n    NMSSHLogFlagWarn    = (1 << 2),\n    NMSSHLogFlagError   = (1 << 3)\n};\n\n@interface NMSSHLogger ()\n\n/**\n The shared logger instance, now private\n */\n+ (NMSSHLogger *)logger;\n\n#if OS_OBJECT_USE_OBJC\n@property (nonatomic, strong) dispatch_queue_t loggerQueue;\n#else\n@property (nonatomic, assign) dispatch_queue_t loggerQueue;\n#endif\n@end\n\n@implementation NMSSHLogger\n\n// -----------------------------------------------------------------------------\n#pragma mark - INITIALIZE THE LOGGER INSTANCE\n// -----------------------------------------------------------------------------\n\n+ (NMSSHLogger *)logger {\n    static NMSSHLogger *logger = nil;\n\n    static dispatch_once_t onceToken;\n    dispatch_once(&onceToken, ^{\n        logger = [[NMSSHLogger alloc] init];\n        [logger setEnabled:YES];\n        [logger setLogLevel:NMSSHLogLevelVerbose];\n        [logger setLogBlock:^(NMSSHLogLevel level, NSString *format) {\n            NSLog(@\"%@\", format);\n        }];\n        [logger setLoggerQueue:dispatch_queue_create(\"NMSSH.loggerQueue\", DISPATCH_QUEUE_SERIAL)];\n    });\n\n    return logger;\n}\n\n+ (instancetype) sharedLogger\n{\n    return NMSSHLogger.logger;\n}\n\n#if !(OS_OBJECT_USE_OBJC)\n- (void)dealloc {\n    dispatch_release(self.loggerQueue);\n}\n#endif\n\n// -----------------------------------------------------------------------------\n#pragma mark - LOGGING\n// -----------------------------------------------------------------------------\n\n- (void)log:(NSString *)format level:(NMSSHLogLevel)level flag:(NMSSHLogFlag)flag {\n    if (flag & self.logLevel && self.enabled && self.logBlock) {\n        dispatch_async(self.loggerQueue, ^{\n            self.logBlock(level, [NSString stringWithFormat:@\"NMSSH: %@\", format]);\n        });\n    }\n}\n\n- (void)logVerbose:(NSString *)format {\n    [self log:format level:NMSSHLogLevelVerbose flag:NMSSHLogFlagVerbose];\n}\n\n- (void)logInfo:(NSString *)format{\n    [self log:format level:NMSSHLogLevelInfo flag:NMSSHLogFlagInfo];\n}\n\n- (void)logWarn:(NSString *)format{\n    [self log:format level:NMSSHLogLevelWarn flag:NMSSHLogFlagWarn];\n}\n\n- (void)logError:(NSString *)format{\n    [self log:format level:NMSSHLogLevelError flag:NMSSHLogFlagError];\n}\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/NMSSH/NMSSH/Config/socket_helper.h",
    "content": "#import \"libssh2.h\"\n\nint waitsocket(int socket_fd, LIBSSH2_SESSION *session);"
  },
  {
    "path": "Sublime/Pods/NMSSH/NMSSH/Config/socket_helper.m",
    "content": "#import \"socket_helper.h\"\n#import <Foundation/Foundation.h>\n\nint waitsocket(int socket_fd, LIBSSH2_SESSION *session) {\n    struct timeval timeout;\n\n    fd_set fd;\n    fd_set *writefd = NULL;\n    fd_set *readfd = NULL;\n\n    int rc;\n    int dir;\n    timeout.tv_sec = 0;\n    timeout.tv_usec = 500000;\n\n    FD_ZERO(&fd);\n    FD_SET(socket_fd, &fd);\n\n    // Now make sure we wait in the correct direction\n    dir = libssh2_session_block_directions(session);\n\n    if (dir & LIBSSH2_SESSION_BLOCK_INBOUND) {\n        readfd = &fd;\n    }\n\n    if (dir & LIBSSH2_SESSION_BLOCK_OUTBOUND) {\n        writefd = &fd;\n    }\n\n    rc = select(socket_fd + 1, readfd, writefd, NULL, &timeout);\n    \n    return rc;\n}"
  },
  {
    "path": "Sublime/Pods/NMSSH/NMSSH/NMSFTP.h",
    "content": "#import \"NMSSH.h\"\n\n@class NMSSHSession, NMSFTPFile;\n\n/**\n NMSFTP provides functionality for working with SFTP servers.\n */\n@interface NMSFTP : NSObject\n\n/** A valid NMSSHSession instance */\n@property (nonatomic, readonly) NMSSHSession *session;\n\n/** Property that keeps track of connection status to the server */\n@property (nonatomic, readonly, getter = isConnected) BOOL connected;\n\n/** Property that set/get read buffer size */\n@property (nonatomic) NSUInteger bufferSize;\n\n///-----------------------------------------------------------------------------\n/// @name Initializer\n/// ----------------------------------------------------------------------------\n\n/**\n Create a new NMSFTP instance and connect it.\n\n @param session A valid, connected, NMSSHSession instance\n @returns Connected NMSFTP instance\n */\n+ (instancetype)connectWithSession:(NMSSHSession *)session;\n\n/**\n Create a new NMSFTP instance.\n\n @param session A valid, connected, NMSSHSession instance\n @returns New NMSFTP instance\n */\n- (instancetype)initWithSession:(NMSSHSession *)session;\n\n/// ----------------------------------------------------------------------------\n/// @name Connection\n/// ----------------------------------------------------------------------------\n\n/**\n Create and connect to a SFTP session\n\n @returns Connection status\n */\n- (BOOL)connect;\n\n/**\n Disconnect SFTP session\n */\n- (void)disconnect;\n\n/// ----------------------------------------------------------------------------\n/// @name Manipulate file system entries\n/// ----------------------------------------------------------------------------\n\n/**\n Move or rename an item\n\n @param sourcePath Item to move\n @param destPath Destination to move to\n @returns Move success\n */\n- (BOOL)moveItemAtPath:(NSString *)sourcePath toPath:(NSString *)destPath;\n\n/// ----------------------------------------------------------------------------\n/// @name Manipulate directories\n/// ----------------------------------------------------------------------------\n\n/**\n Test if a directory exists at the specified path.\n\n Note: Will return NO if a file exists at the path, but not a directory.\n\n @param path Path to check\n @returns YES if file exists\n */\n- (BOOL)directoryExistsAtPath:(NSString *)path;\n\n/**\n Create a directory at path\n\n @param path Path to directory\n @returns Creation success\n */\n- (BOOL)createDirectoryAtPath:(NSString *)path;\n\n/**\n Remove directory at path\n\n @param path Existing directory\n @returns Remove success\n */\n- (BOOL)removeDirectoryAtPath:(NSString *)path;\n\n/**\n Get a list of files for a directory path\n\n @param path Existing directory to list items from\n @returns List of relative paths\n */\n- (NSArray *)contentsOfDirectoryAtPath:(NSString *)path;\n\n/// ----------------------------------------------------------------------------\n/// @name Manipulate symlinks and files\n/// ----------------------------------------------------------------------------\n\n/**\n Reads the attributes from a file.\n\n @param path An existing file path\n @return A NMSFTPFile that contains the fetched file attributes.\n */\n- (NMSFTPFile *)infoForFileAtPath:(NSString *)path;\n\n/**\n Test if a file exists at the specified path.\n\n Note: Will return NO if a directory exists at the path, but not a file.\n\n @param path Path to check\n @returns YES if file exists\n */\n- (BOOL)fileExistsAtPath:(NSString *)path;\n\n/**\n Create a symbolic link\n\n @param linkPath Path that will be linked to\n @param destPath Path the link will be created at\n @returns Creation success\n */\n- (BOOL)createSymbolicLinkAtPath:(NSString *)linkPath\n             withDestinationPath:(NSString *)destPath;\n\n/**\n Remove file at path\n\n @param path Path to existing file\n @returns Remove success\n */\n- (BOOL)removeFileAtPath:(NSString *)path;\n\n/**\n Read the contents of a file\n\n @param path An existing file path\n @returns File contents\n */\n- (NSData *)contentsAtPath:(NSString *)path;\n\n/**\n Refer to contentsAtPath:\n\n This adds the ability to get periodic updates to bytes received.\n \n @param path An existing file path\n @param progress Method called periodically with number of bytes downloaded and total file size.\n        Returns NO to abort. \n @returns File contents\n */\n- (NSData *)contentsAtPath:(NSString *)path progress:(BOOL (^)(NSUInteger got, NSUInteger totalBytes))progress;\n\n/**\n Overwrite the contents of a file\n\n If no file exists, one is created.\n\n @param contents Bytes to write\n @param path File path to write bytes at\n @returns Write success\n */\n- (BOOL)writeContents:(NSData *)contents toFileAtPath:(NSString *)path;\n\n/**\n Refer to writeContents:toFileAtPath:\n \n This adds the ability to get periodic updates to bytes sent.\n \n @param contents Bytes to write\n @param path File path to write bytes at\n @param progress Method called periodically with number of bytes sent.\n        Returns NO to abort.\n @returns Write success\n */\n- (BOOL)writeContents:(NSData *)contents toFileAtPath:(NSString *)path progress:(BOOL (^)(NSUInteger sent))progress;\n\n/**\n Overwrite the contents of a file\n\n If no file exists, one is created.\n\n @param localPath File path to read bytes at\n @param path File path to write bytes at\n @returns Write success\n */\n- (BOOL)writeFileAtPath:(NSString *)localPath toFileAtPath:(NSString *)path;\n\n/**\n Refer to writeFileAtPath:toFileAtPath:\n \n This adds the ability to get periodic updates to bytes sent.\n \n @param localPath File path to read bytes at\n @param path File path to write bytes at\n @param progress Method called periodically with number of bytes sent.\n        Returns NO to abort.\n @returns Write success\n */\n- (BOOL)writeFileAtPath:(NSString *)localPath toFileAtPath:(NSString *)path progress:(BOOL (^)(NSUInteger sent))progress;\n\n/**\n Overwrite the contents of a file\n\n If no file exists, one is created.\n\n @param inputStream Stream to read bytes from\n @param path File path to write bytes at\n @returns Write success\n */\n- (BOOL)writeStream:(NSInputStream *)inputStream toFileAtPath:(NSString *)path;\n\n/**\n Refer to writeStream:toFileAtPath:\n \n This adds the ability to get periodic updates to bytes sent.\n \n @param inputStream Stream to read bytes from\n @param path File path to write bytes at\n @param progress Method called periodically with number of bytes sent.\n        Returns NO to abort.\n @returns Write success\n */\n- (BOOL)writeStream:(NSInputStream *)inputStream toFileAtPath:(NSString *)path progress:(BOOL (^)(NSUInteger sent))progress;\n\n/**\n Append contents to the end of a file\n\n If no file exists, one is created.\n\n @param contents Bytes to write\n @param path File path to write bytes at\n @returns Append success\n */\n- (BOOL)appendContents:(NSData *)contents toFileAtPath:(NSString *)path;\n\n/**\n Append contents to the end of a file\n\n If no file exists, one is created.\n\n @param inputStream Stream to write bytes from\n @param path File path to write bytes at\n @returns Append success\n */\n- (BOOL)appendStream:(NSInputStream *)inputStream toFileAtPath:(NSString *)path;\n\n/**\n Copy a file remotely.\n \n @param fromPath Path to copy from\n @param toPath Path to copy to\n */\n- (BOOL)copyContentsOfPath:(NSString *)fromPath toFileAtPath:(NSString *)toPath progress:(BOOL (^)(NSUInteger copied, NSUInteger totalBytes))progress;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/NMSSH/NMSSH/NMSFTP.m",
    "content": "#import \"NMSFTP.h\"\n#import \"NMSSH+Protected.h\"\n\n@interface NMSFTP ()\n@property (nonatomic, strong) NMSSHSession *session;\n@property (nonatomic, assign) LIBSSH2_SFTP *sftpSession;\n@property (nonatomic, readwrite, getter = isConnected) BOOL connected;\n\n- (BOOL)writeStream:(NSInputStream *)inputStream toSFTPHandle:(LIBSSH2_SFTP_HANDLE *)handle;\n- (BOOL)writeStream:(NSInputStream *)inputStream toSFTPHandle:(LIBSSH2_SFTP_HANDLE *)handle progress:(BOOL (^)(NSUInteger))progress;\n@end\n\n@implementation NMSFTP\n\n\n// -----------------------------------------------------------------------------\n#pragma mark - INITIALIZER\n// -----------------------------------------------------------------------------\n\n+ (instancetype)connectWithSession:(NMSSHSession *)session {\n    NMSFTP *sftp = [[NMSFTP alloc] initWithSession:session];\n    [sftp connect];\n\n    return sftp;\n}\n\n- (instancetype)initWithSession:(NMSSHSession *)session {\n    if ((self = [super init])) {\n        [self setSession:session];\n\n        // Make sure we were provided a valid session\n        if (![session isKindOfClass:[NMSSHSession class]]) {\n            @throw @\"You have to provide a valid NMSSHSession!\";\n        }\n    }\n\n    return self;\n}\n\n// -----------------------------------------------------------------------------\n#pragma mark - CONNECTION\n// -----------------------------------------------------------------------------\n\n- (BOOL)connect {\n    // Set blocking mode\n    libssh2_session_set_blocking(self.session.rawSession, 1);\n\n    [self setSftpSession:libssh2_sftp_init(self.session.rawSession)];\n\n    if (!self.sftpSession) {\n        NMSSHLogError(@\"Unable to init SFTP session\");\n        return NO;\n    }\n\n    [self setConnected:YES];\n    [self setBufferSize:kNMSSHBufferSize];\n\n    return self.isConnected;\n}\n\n- (void)disconnect {\n    libssh2_sftp_shutdown(self.sftpSession);\n    [self setConnected:NO];\n}\n\n// -----------------------------------------------------------------------------\n#pragma mark - MANIPULATE FILE SYSTEM ENTRIES\n// -----------------------------------------------------------------------------\n\n- (BOOL)moveItemAtPath:(NSString *)sourcePath toPath:(NSString *)destPath {\n    return libssh2_sftp_rename(self.sftpSession, [sourcePath UTF8String], [destPath UTF8String]) == 0;\n}\n\n// -----------------------------------------------------------------------------\n#pragma mark - MANIPULATE DIRECTORIES\n// -----------------------------------------------------------------------------\n\n- (LIBSSH2_SFTP_HANDLE *)openDirectoryAtPath:(NSString *)path {\n    LIBSSH2_SFTP_HANDLE *handle = libssh2_sftp_opendir(self.sftpSession, [path UTF8String]);\n\n    if (!handle) {\n        NSError *error = [self.session lastError];\n        NMSSHLogError(@\"Could not open directory at path %@ (Error %li: %@)\", path, (long)error.code, error.localizedDescription);\n\n        if ([error code] == LIBSSH2_ERROR_SFTP_PROTOCOL) {\n            NMSSHLogError(@\"SFTP error %lu\", libssh2_sftp_last_error(self.sftpSession));\n        }\n    }\n\n    return handle;\n}\n\n- (BOOL)directoryExistsAtPath:(NSString *)path {\n    LIBSSH2_SFTP_HANDLE *handle = [self openFileAtPath:path flags:LIBSSH2_FXF_READ mode:0];\n\n    if (!handle) {\n        return NO;\n    }\n\n    LIBSSH2_SFTP_ATTRIBUTES fileAttributes;\n    int rc = libssh2_sftp_fstat(handle, &fileAttributes);\n    libssh2_sftp_close(handle);\n\n    return rc == 0 && LIBSSH2_SFTP_S_ISDIR(fileAttributes.permissions);\n}\n\n- (BOOL)createDirectoryAtPath:(NSString *)path {\n    int rc = libssh2_sftp_mkdir(self.sftpSession, [path UTF8String],\n                                LIBSSH2_SFTP_S_IRWXU|\n                                LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IXGRP|\n                                LIBSSH2_SFTP_S_IROTH|LIBSSH2_SFTP_S_IXOTH);\n\n    return rc == 0;\n}\n\n- (BOOL)removeDirectoryAtPath:(NSString *)path {\n    return libssh2_sftp_rmdir(self.sftpSession, [path UTF8String]) == 0;\n}\n\n- (NSArray *)contentsOfDirectoryAtPath:(NSString *)path {\n    LIBSSH2_SFTP_HANDLE *handle = [self openDirectoryAtPath:path];\n\n    if (!handle) {\n        return nil;\n    }\n\n    NSArray *ignoredFiles = @[@\".\", @\"..\"];\n    NSMutableArray *contents = [NSMutableArray array];\n\n    int rc;\n    do {\n        char buffer[512];\n        LIBSSH2_SFTP_ATTRIBUTES fileAttributes;\n\n        rc = libssh2_sftp_readdir(handle, buffer, sizeof(buffer), &fileAttributes);\n\n        if (rc > 0) {\n            NSString *fileName = [[NSString alloc] initWithBytes:buffer length:rc encoding:NSUTF8StringEncoding];\n            if (![ignoredFiles containsObject:fileName]) {\n                // Append a \"/\" at the end of all directories\n                if (LIBSSH2_SFTP_S_ISDIR(fileAttributes.permissions)) {\n                    fileName = [fileName stringByAppendingString:@\"/\"];\n                }\n\n                NMSFTPFile *file = [[NMSFTPFile alloc] initWithFilename:fileName];\n                [file populateValuesFromSFTPAttributes:fileAttributes];\n                [contents addObject:file];\n            }\n        }\n    } while (rc > 0);\n\n    if (rc < 0) {\n        NMSSHLogError(@\"Unable to read directory\");\n    }\n\n    rc = libssh2_sftp_closedir(handle);\n\n    if (rc < 0) {\n        NMSSHLogError(@\"Failed to close directory\");\n    }\n\n    return [contents sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {\n        return [obj1 compare:obj2];\n    }];\n}\n\n// -----------------------------------------------------------------------------\n#pragma mark - MANIPULATE SYMLINKS AND FILES\n// -----------------------------------------------------------------------------\n\n- (NMSFTPFile *)infoForFileAtPath:(NSString *)path {\n    LIBSSH2_SFTP_HANDLE *handle = [self openFileAtPath:path flags:LIBSSH2_FXF_READ mode:0];\n\n    if (!handle) {\n        return nil;\n    }\n\n    LIBSSH2_SFTP_ATTRIBUTES fileAttributes;\n    ssize_t rc = libssh2_sftp_fstat(handle, &fileAttributes);\n    libssh2_sftp_close(handle);\n\n    if (rc < 0) {\n        return nil;\n    }\n\n    NMSFTPFile *file = [[NMSFTPFile alloc] initWithFilename:path.lastPathComponent];\n    [file populateValuesFromSFTPAttributes:fileAttributes];\n\n    return file;\n}\n\n- (LIBSSH2_SFTP_HANDLE *)openFileAtPath:(NSString *)path flags:(unsigned long)flags mode:(long)mode {\n    LIBSSH2_SFTP_HANDLE *handle = libssh2_sftp_open(self.sftpSession, [path UTF8String], flags, mode);\n\n    if (!handle) {\n        NSError *error = [self.session lastError];\n        NMSSHLogError(@\"Could not open file at path %@ (Error %li: %@)\", path, (long)error.code, error.localizedDescription);\n\n        if ([error code] == LIBSSH2_ERROR_SFTP_PROTOCOL) {\n            NMSSHLogError(@\"SFTP error %lu\", libssh2_sftp_last_error(self.sftpSession));\n        }\n    }\n\n    return handle;\n}\n\n- (BOOL)fileExistsAtPath:(NSString *)path {\n    LIBSSH2_SFTP_HANDLE *handle = [self openFileAtPath:path flags:LIBSSH2_FXF_READ mode:0];\n\n    if (!handle) {\n        return NO;\n    }\n\n    LIBSSH2_SFTP_ATTRIBUTES fileAttributes;\n    int rc = libssh2_sftp_fstat(handle, &fileAttributes);\n    libssh2_sftp_close(handle);\n\n    return rc == 0 && !LIBSSH2_SFTP_S_ISDIR(fileAttributes.permissions);\n}\n\n- (BOOL)createSymbolicLinkAtPath:(NSString *)linkPath\n             withDestinationPath:(NSString *)destPath {\n    int rc = libssh2_sftp_symlink(self.sftpSession, [destPath UTF8String], (char *)[linkPath UTF8String]);\n\n    return rc == 0;\n}\n\n- (BOOL)removeFileAtPath:(NSString *)path {\n    return libssh2_sftp_unlink(self.sftpSession, [path UTF8String]) == 0;\n}\n\n- (NSData *)contentsAtPath:(NSString *)path {\n    return [self contentsAtPath:path progress:nil];\n}\n\n- (NSData *)contentsAtPath:(NSString *)path progress:(BOOL (^)(NSUInteger, NSUInteger))progress {\n    LIBSSH2_SFTP_HANDLE *handle = [self openFileAtPath:path flags:LIBSSH2_FXF_READ mode:0];\n\n    if (!handle) {\n        return nil;\n    }\n\n    NMSFTPFile *file = [self infoForFileAtPath:path];\n    if (!file) {\n        NMSSHLogWarn(@\"contentsAtPath:progress: failed to get file attributes\");\n        return nil;\n    }\n    \n    char buffer[self.bufferSize];\n    NSMutableData *data = [[NSMutableData alloc] init];\n    ssize_t rc;\n    off_t got = 0;\n    while ((rc = libssh2_sftp_read(handle, buffer, (ssize_t)sizeof(buffer))) > 0) {\n        [data appendBytes:buffer length:rc];\n        got += rc;\n        if (progress && !progress((NSUInteger)got, (NSUInteger)[file.fileSize integerValue])) {\n            libssh2_sftp_close(handle);\n            return nil;\n        }\n    }\n\n    libssh2_sftp_close(handle);\n\n    if (rc < 0) {\n        return nil;\n    }\n\n    return [data copy];\n}\n\n- (BOOL)writeContents:(NSData *)contents toFileAtPath:(NSString *)path {\n    return [self writeContents:contents toFileAtPath:path progress:nil];\n}\n\n- (BOOL)writeContents:(NSData *)contents toFileAtPath:(NSString *)path progress:(BOOL (^)(NSUInteger))progress {\n    return [self writeStream:[NSInputStream inputStreamWithData:contents] toFileAtPath:path progress:progress];\n}\n\n- (BOOL)writeFileAtPath:(NSString *)localPath toFileAtPath:(NSString *)path {\n    return [self writeFileAtPath:localPath toFileAtPath:path progress:nil];\n}\n\n- (BOOL)writeFileAtPath:(NSString *)localPath toFileAtPath:(NSString *)path progress:(BOOL (^)(NSUInteger))progress {\n    return [self writeStream:[NSInputStream inputStreamWithFileAtPath:localPath] toFileAtPath:path progress:progress];\n}\n\n- (BOOL)writeStream:(NSInputStream *)inputStream toFileAtPath:(NSString *)path {\n    return [self writeStream:inputStream toFileAtPath:path progress:nil];\n}\n\n- (BOOL)writeStream:(NSInputStream *)inputStream toFileAtPath:(NSString *)path progress:(BOOL (^)(NSUInteger))progress {\n    if ([inputStream streamStatus] == NSStreamStatusNotOpen) {\n        [inputStream open];\n    }\n\n    if (![inputStream hasBytesAvailable]) {\n        NMSSHLogWarn(@\"No bytes available in the stream\");\n        return NO;\n    }\n\n    LIBSSH2_SFTP_HANDLE *handle = [self openFileAtPath:path\n                                                 flags:LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_TRUNC\n                                                  mode:LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR|LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH];\n\n    if (!handle) {\n        [inputStream close];\n        return NO;\n    }\n\n    BOOL success = [self writeStream:inputStream toSFTPHandle:handle progress:progress];\n\n    libssh2_sftp_close(handle);\n    [inputStream close];\n\n    return success;\n}\n\n- (BOOL)appendContents:(NSData *)contents toFileAtPath:(NSString *)path {\n    return [self appendStream:[NSInputStream inputStreamWithData:contents] toFileAtPath:path];\n}\n\n- (BOOL)appendStream:(NSInputStream *)inputStream toFileAtPath:(NSString *)path {\n    if ([inputStream streamStatus] == NSStreamStatusNotOpen) {\n        [inputStream open];\n    }\n\n    if (![inputStream hasBytesAvailable]) {\n        NMSSHLogWarn(@\"No bytes available in the stream\");\n        return NO;\n    }\n\n    LIBSSH2_SFTP_HANDLE *handle = [self openFileAtPath:path\n                                                 flags:LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_READ\n                                                  mode:LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR|LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH];\n\n    if (!handle) {\n        [inputStream close];\n        return NO;\n    }\n\n    LIBSSH2_SFTP_ATTRIBUTES attributes;\n    if (libssh2_sftp_fstat(handle, &attributes) < 0) {\n        [inputStream close];\n        NMSSHLogError(@\"Unable to get attributes of file %@\", path);\n        return NO;\n    }\n\n    libssh2_sftp_seek64(handle, attributes.filesize);\n    NMSSHLogVerbose(@\"Seek to position %ld\", (long)attributes.filesize);\n\n    BOOL success = [self writeStream:inputStream toSFTPHandle:handle];\n\n    libssh2_sftp_close(handle);\n    [inputStream close];\n\n    return success;\n}\n\n- (BOOL)writeStream:(NSInputStream *)inputStream toSFTPHandle:(LIBSSH2_SFTP_HANDLE *)handle {\n    return [self writeStream:inputStream toSFTPHandle:handle progress:nil];\n}\n\n- (BOOL)writeStream:(NSInputStream *)inputStream toSFTPHandle:(LIBSSH2_SFTP_HANDLE *)handle progress:(BOOL (^)(NSUInteger))progress {\n    uint8_t buffer[self.bufferSize];\n    NSInteger bytesRead = -1;\n    long rc = 0;\n    NSUInteger total = 0;\n    \n    while (rc >= 0 && [inputStream hasBytesAvailable]) {\n        bytesRead = [inputStream read:buffer maxLength:self.bufferSize];\n        if (bytesRead > 0) {\n            uint8_t *ptr = buffer;\n            do {\n                rc = libssh2_sftp_write(handle, (const char *)ptr, bytesRead);\n                if(rc < 0){\n                    NMSSHLogWarn(@\"libssh2_sftp_write failed (Error %li)\", rc);\n                    break;\n                }\n                total += rc;\n                ptr += rc;\n                bytesRead -= rc;\n                if (progress && !progress(total))\n                {\n                    return NO;\n                }\n            }while(bytesRead);\n        }\n    }\n\n    if (bytesRead < 0 || rc < 0) {\n        return NO;\n    }\n\n    return YES;\n}\n\n- (BOOL)copyContentsOfPath:(NSString *)fromPath toFileAtPath:(NSString *)toPath progress:(BOOL (^)(NSUInteger, NSUInteger))progress\n{\n    // Open handle for reading.\n    LIBSSH2_SFTP_HANDLE *fromHandle = [self openFileAtPath:fromPath flags:LIBSSH2_FXF_READ mode:0];\n    \n    // Open handle for writing.\n    LIBSSH2_SFTP_HANDLE *toHandle = [self openFileAtPath:toPath\n                                                 flags:LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_READ\n                                                  mode:LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR|LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH];\n    \n    // Get information about the file to copy.\n    NMSFTPFile *file = [self infoForFileAtPath:fromPath];\n    if (!file) {\n        NMSSHLogWarn(@\"contentsAtPath:progress: failed to get file attributes\");\n        return NO;\n    }\n    \n    char buffer[self.bufferSize];\n    ssize_t bytesRead;\n    off_t copied = 0;\n    long rc = 0;\n    while ((bytesRead = libssh2_sftp_read(fromHandle, buffer, (ssize_t)sizeof(buffer))) > 0) {\n        if (bytesRead > 0) {\n            char *ptr = buffer;\n            do {\n                rc = libssh2_sftp_write(toHandle, (const char *)ptr, (NSInteger)bytesRead);\n                if(rc < 0){\n                    NMSSHLogWarn(@\"libssh2_sftp_write failed (Error %li)\", rc);\n                    break;\n                }\n                copied += rc;\n                ptr += rc;\n                bytesRead -= rc;\n                if (progress && !progress((NSUInteger)copied, (NSUInteger)[file.fileSize integerValue])) {\n                    libssh2_sftp_close(fromHandle);\n                    libssh2_sftp_close(toHandle);\n                    return NO;\n                }\n            }while(bytesRead);\n        }\n    }\n    \n    libssh2_sftp_close(fromHandle);\n    libssh2_sftp_close(toHandle);\n    \n    return YES;\n}\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/NMSSH/NMSSH/NMSFTPFile.h",
    "content": "#import \"NMSSH.h\"\n\n/**\n The NMSFTPFile class provides an interface to store file attributes retrieved \n from a SFTP host.\n */\n@interface NMSFTPFile : NSObject <NSCopying>\n\n/**\n Property that stores the name of the underlaying file. \n Note that the file may also be a directory.\n */\n@property (nonatomic, readonly) NSString *filename;\n\n/** Property that declares whether the file is a directory or a regular file */\n@property (nonatomic, readonly) BOOL isDirectory;\n\n/** Returns the last modification date of the file */\n@property (nonatomic, readonly) NSDate *modificationDate;\n\n/** Returns the date of the last access to the file */\n@property (nonatomic, readonly) NSDate *lastAccess;\n\n/** Property that returns the file size in bytes */\n@property (nonatomic, readonly) NSNumber *fileSize;\n\n/** Returns the numeric identifier of the user that is the owner of the file */\n@property (nonatomic, readonly) unsigned long ownerUserID;\n\n/** Returns the numeric identifier of the group that is the owner of the file */\n@property (nonatomic, readonly) unsigned long ownerGroupID;\n\n/** Returns the file permissions in symbolic notation. E.g. drwxr-xr-x */\n@property (nonatomic, readonly) NSString *permissions;\n\n/** Returns the user defined flags for the file */\n@property (nonatomic, readonly) u_long flags;\n\n/**\n Initializes an NMSFTPFile instance and sets the filename.\n \n @param filename The name of the underlaying file.\n @return A new NMSFTPFile instance initialized with the corresponding filename.\n */\n- (instancetype)initWithFilename:(NSString *)filename;\n\n/**\n Convenience initializer for creating an NMSFTPFile instance with a defined filename.\n \n @param filename The name of the underlaying file.\n @return A new NMSFTPFile instance initialized with the corresponding filename.\n */\n+ (instancetype)fileWithName:(NSString *)filename;\n\n/**\n Populates the file properties with the attributes taken from the LIBSSH2_SFTP_ATTRIBUTES object.\n \n @param fileAttributes The LIBSSH2_SFTP_ATTRIBUTES object that contains the attributes that are being extracted.\n */\n- (void)populateValuesFromSFTPAttributes:(LIBSSH2_SFTP_ATTRIBUTES)fileAttributes;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/NMSSH/NMSSH/NMSFTPFile.m",
    "content": "#import \"NMSFTPFile.h\"\n#import \"NMSSH+Protected.h\"\n\n@interface NMSFTPFile ()\n@property (nonatomic, strong) NSString *filename;\n@property (nonatomic, readwrite) BOOL isDirectory;\n@property (nonatomic, strong) NSDate *modificationDate;\n@property (nonatomic, strong) NSDate *lastAccess;\n@property (nonatomic, strong) NSNumber *fileSize;\n@property (nonatomic, readwrite) unsigned long ownerUserID;\n@property (nonatomic, readwrite) unsigned long ownerGroupID;\n@property (nonatomic, strong) NSString *permissions;\n@property (nonatomic, readwrite) u_long flags;\n@end\n\n@implementation NMSFTPFile\n\n- (instancetype)initWithFilename:(NSString *)filename {\n    if ((self = [super init])) {\n        [self setFilename:filename];\n    }\n\n    return self;\n}\n\n+ (instancetype)fileWithName:(NSString *)filename {\n    return [[self alloc] initWithFilename:filename];\n}\n\n- (void)populateValuesFromSFTPAttributes:(LIBSSH2_SFTP_ATTRIBUTES)fileAttributes {\n    [self setModificationDate:[NSDate dateWithTimeIntervalSince1970:fileAttributes.mtime]];\n    [self setLastAccess:[NSDate dateWithTimeIntervalSinceNow:fileAttributes.atime]];\n    [self setFileSize:@(fileAttributes.filesize)];\n    [self setOwnerUserID:fileAttributes.uid];\n    [self setOwnerGroupID:fileAttributes.gid];\n    [self setPermissions:[self convertPermissionToSymbolicNotation:fileAttributes.permissions]];\n    [self setIsDirectory:LIBSSH2_SFTP_S_ISDIR(fileAttributes.permissions)];\n    [self setFlags:fileAttributes.flags];\n}\n\n\n#pragma mark - Comparison and Equality\n\n/**\n Ensures that the sorting of the files is according to their filenames.\n \n @param file The other file that it should be compared to.\n @return The comparison result that determins the order of the two files.\n */\n- (NSComparisonResult)compare:(NMSFTPFile *)file {\n    return [self.filename localizedCaseInsensitiveCompare:file.filename];\n}\n\n/**\n Defines that two NMSFTPFile objects are equal, if their filenames are equal.\n @param object The other file that it should be compared with\n @return YES in case the two objects are considered equal, NO otherwise.\n */\n- (BOOL)isEqual:(id)object {\n    if (![object isKindOfClass:[NMSFTPFile class]]) {\n        return NO;\n    }\n\n    return [self.filename isEqualToString:((NMSFTPFile *)object).filename];\n}\n\n\n#pragma mark - Permissions conversion methods\n\n/**\n Convert a mode field into \"ls -l\" type perms field. By courtesy of Jonathan Leffler\n http://stackoverflow.com/questions/10323060/printing-file-permissions-like-ls-l-using-stat2-in-c\n \n @param mode The numeric mode that is returned by the 'stat' function\n @return A string containing the symbolic representation of the file permissions.\n */\n- (NSString *)convertPermissionToSymbolicNotation:(unsigned long)mode {\n    static char *rwx[] = {\"---\", \"--x\", \"-w-\", \"-wx\", \"r--\", \"r-x\", \"rw-\", \"rwx\"};\n    char bits[11];\n    \n    bits[0] = [self filetypeletter:mode];\n    strcpy(&bits[1], rwx[(mode >> 6)& 7]);\n    strcpy(&bits[4], rwx[(mode >> 3)& 7]);\n    strcpy(&bits[7], rwx[(mode & 7)]);\n\n    if (mode & S_ISUID) {\n        bits[3] = (mode & 0100) ? 's' : 'S';\n    }\n\n    if (mode & S_ISGID) {\n        bits[6] = (mode & 0010) ? 's' : 'l';\n    }\n\n    if (mode & S_ISVTX) {\n        bits[9] = (mode & 0100) ? 't' : 'T';\n    }\n\n    bits[10] = '\\0';\n\n    return [NSString stringWithCString:bits encoding:NSUTF8StringEncoding];\n}\n\n/**\n Extracts the unix letter for the file type of the given permission value.\n \n @param mode The numeric mode that is returned by the 'stat' function\n @return A character that represents the given file type.\n */\n- (char)filetypeletter:(unsigned long)mode {\n    char c;\n    \n    if (S_ISREG(mode)) {\n        c = '-';\n    }\n    else if (S_ISDIR(mode)) {\n        c = 'd';\n    }\n    else if (S_ISBLK(mode)) {\n        c = 'b';\n    }\n    else if (S_ISCHR(mode)) {\n        c = 'c';\n    }\n#ifdef S_ISFIFO\n    else if (S_ISFIFO(mode)) {\n        c = 'p';\n    }\n#endif\n#ifdef S_ISLNK\n    else if (S_ISLNK(mode)) {\n        c = 'l';\n    }\n#endif\n#ifdef S_ISSOCK\n    else if (S_ISSOCK(mode)) {\n        c = 's';\n    }\n#endif\n#ifdef S_ISDOOR\n    // Solaris 2.6, etc.\n    else if (S_ISDOOR(mode)) {\n        c = 'D';\n    }\n#endif\n    else {\n        // Unknown type -- possibly a regular file?\n        c = '?';\n    }\n\n    return c;\n}\n\n- (NSString *)description {\n    return [NSString stringWithFormat:@\"<%@: %p> Filename: %@\", NSStringFromClass([self class]), self, self.filename];\n}\n\n- (id)copyWithZone:(NSZone *)zone {\n    NMSFTPFile *object = [[[self class] allocWithZone:zone] init];\n\n    if (object) {\n        object.filename = [self.filename copyWithZone:zone];\n        object.modificationDate = [self.modificationDate copyWithZone:zone];\n        object.lastAccess = [self.lastAccess copyWithZone:zone];\n        object.fileSize = [self.fileSize copyWithZone:zone];\n        object.permissions = [self.permissions copyWithZone:zone];\n        object.isDirectory = self.isDirectory;\n        object.ownerUserID = self.ownerUserID;\n        object.ownerGroupID = self.ownerGroupID;\n        object.flags = self.flags;\n    }\n\n    return object;\n}\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/NMSSH/NMSSH/NMSSH.h",
    "content": "#import <Foundation/Foundation.h>\n\n#ifndef _NMSSH_\n#define _NMSSH_\n\n#import \"libssh2.h\"\n#import \"libssh2_sftp.h\"\n\n#import \"NMSSHSessionDelegate.h\"\n#import \"NMSSHChannelDelegate.h\"\n\n#import \"NMSSHSession.h\"\n#import \"NMSSHChannel.h\"\n#import \"NMSFTP.h\"\n#import \"NMSFTPFile.h\"\n#import \"NMSSHConfig.h\"\n#import \"NMSSHHostConfig.h\"\n\n#import \"NMSSHLogger.h\"\n\n#endif"
  },
  {
    "path": "Sublime/Pods/NMSSH/NMSSH/NMSSHChannel.h",
    "content": "#import \"NMSSH.h\"\n\n@class NMSSHSession;\n@protocol NMSSHChannelDelegate;\n\ntypedef NS_ENUM(NSInteger, NMSSHChannelError) {\n    NMSSHChannelExecutionError,\n    NMSSHChannelExecutionResponseError,\n    NMSSHChannelRequestPtyError,\n    NMSSHChannelExecutionTimeout,\n    NMSSHChannelAllocationError,\n    NMSSHChannelRequestShellError,\n    NMSSHChannelWriteError,\n    NMSSHChannelReadError\n};\n\ntypedef NS_ENUM(NSInteger, NMSSHChannelPtyTerminal) {\n    NMSSHChannelPtyTerminalVanilla,\n    NMSSHChannelPtyTerminalVT100,\n    NMSSHChannelPtyTerminalVT102,\n    NMSSHChannelPtyTerminalVT220,\n    NMSSHChannelPtyTerminalAnsi,\n    NMSSHChannelPtyTerminalXterm\n};\n\ntypedef NS_ENUM(NSInteger, NMSSHChannelType)  {\n    NMSSHChannelTypeClosed, // Channel = NULL\n    NMSSHChannelTypeExec,\n    NMSSHChannelTypeShell,\n    NMSSHChannelTypeSCP,\n    NMSSHChannelTypeSubsystem // Not supported by NMSSH framework\n};\n\n/**\n NMSSHChannel provides functionality to work with SSH shells and SCP.\n */\n@interface NMSSHChannel : NSObject\n\n/** A valid NMSSHSession instance */\n@property (nonatomic, readonly) NMSSHSession *session;\n\n/** Size of the buffers used by the channel, defaults to 0x4000 */\n@property (nonatomic, assign) NSUInteger bufferSize;\n\n/// ----------------------------------------------------------------------------\n/// @name Setting the Delegate\n/// ----------------------------------------------------------------------------\n\n/**\n The receiver’s `delegate`.\n\n You can use the `delegate` to receive asynchronous read from a shell.\n */\n@property (nonatomic, weak) id<NMSSHChannelDelegate> delegate;\n\n/// ----------------------------------------------------------------------------\n/// @name Initializer\n/// ----------------------------------------------------------------------------\n\n/** Current channel type or `NMSSHChannelTypeClosed` if the channel is closed */\n@property (nonatomic, readonly) NMSSHChannelType type;\n\n/**\n Create a new NMSSHChannel instance.\n\n @param session A valid, connected, NMSSHSession instance\n @returns New NMSSHChannel instance\n */\n- (instancetype)initWithSession:(NMSSHSession *)session;\n\n/// ----------------------------------------------------------------------------\n/// @name Shell command execution\n/// ----------------------------------------------------------------------------\n\n/** The last response from a shell command execution */\n@property (nonatomic, readonly) NSString *lastResponse;\n\n/** Request a pseudo terminal before executing a command */\n@property (nonatomic, assign) BOOL requestPty;\n\n/** Terminal emulation mode if a PTY is requested, defaults to vanilla */\n@property (nonatomic, assign) NMSSHChannelPtyTerminal ptyTerminalType;\n\n/**\n Execute a shell command on the server.\n\n If an error occurs, it will return `nil` and populate the error object.\n If requestPty is enabled request a pseudo terminal before running the\n command.\n\n @param command Any shell script that is available on the server\n @param error Error handler\n @returns Shell command response\n */\n- (NSString *)execute:(NSString *)command error:(NSError **)error;\n\n/**\n Execute a shell command on the server with a given timeout.\n\n If an error occurs or the connection timed out, it will return `nil` and populate the error object.\n If requestPty is enabled request a pseudo terminal before running the\n command.\n\n @param command Any shell script that is available on the server\n @param error Error handler\n @param timeout The time to wait (in seconds) before giving up on the request\n @returns Shell command response\n */\n- (NSString *)execute:(NSString *)command error:(NSError **)error timeout:(NSNumber *)timeout;\n\n/// ----------------------------------------------------------------------------\n/// @name Remote shell session\n/// ----------------------------------------------------------------------------\n\n/** User-defined environment variables for the session, defaults to `nil` */\n@property (nonatomic, strong) NSDictionary *environmentVariables;\n\n/**\n Request a remote shell on the channel.\n\n If an error occurs, it will return NO and populate the error object.\n If requestPty is enabled request a pseudo terminal before running the\n command.\n\n @param error Error handler\n @returns Shell initialization success\n */\n- (BOOL)startShell:(NSError **)error;\n\n/**\n Close a remote shell on an active channel.\n */\n- (void)closeShell;\n\n/**\n Write a command on the remote shell.\n\n If an error occurs or the connection timed out, it will return NO and populate the error object.\n\n @param command Any command that is available on the server\n @param error Error handler\n @returns Shell write success\n */\n- (BOOL)write:(NSString *)command error:(NSError **)error;\n\n/**\n Write a command on the remote shell with a given timeout.\n\n If an error occurs or the connection timed out, it will return NO and populate the error object.\n\n @param command Any command that is available on the server\n @param error Error handler\n @param timeout The time to wait (in seconds) before giving up on the request\n @returns Shell write success\n */\n- (BOOL)write:(NSString *)command error:(NSError **)error timeout:(NSNumber *)timeout;\n\n/**\n Write data on the remote shell.\n\n If an error occurs or the connection timed out, it will return NO and populate the error object.\n\n @param data Any data\n @param error Error handler\n @returns Shell write success\n */\n- (BOOL)writeData:(NSData *)data error:(NSError **)error;\n\n/**\n Write data on the remote shell with a given timeout.\n\n If an error occurs or the connection timed out, it will return NO and populate the error object.\n\n @param data Any data\n @param error Error handler\n @param timeout The time to wait (in seconds) before giving up on the request\n @returns Shell write success\n */\n- (BOOL)writeData:(NSData *)data error:(NSError **)error timeout:(NSNumber *)timeout;\n\n/**\n Request size for the remote pseudo terminal.\n\n This method should be called only after startShell:\n\n @param width Width in characters for terminal\n @param height Height in characters for terminal\n @returns Size change success\n */\n- (BOOL)requestSizeWidth:(NSUInteger)width height:(NSUInteger)height;\n\n/// ----------------------------------------------------------------------------\n/// @name SCP file transfer\n/// ----------------------------------------------------------------------------\n\n/**\n Upload a local file to a remote server.\n\n If to: specifies a directory, the file name from the original file will be\n used.\n\n @param localPath Path to a file on the local computer\n @param remotePath Path to save the file to\n @returns SCP upload success\n */\n- (BOOL)uploadFile:(NSString *)localPath to:(NSString *)remotePath;\n\n/**\n Download a remote file to local the filesystem.\n\n If to: specifies a directory, the file name from the original file will be\n used.\n\n @param remotePath Path to a file on the remote server\n @param localPath Path to save the file to\n @returns SCP download success\n */\n- (BOOL)downloadFile:(NSString *)remotePath to:(NSString *)localPath;\n\n/**\n Download a remote file to local the filesystem.\n\n If to: specifies a directory, the file name from the original file will be\n used.\n\n @param remotePath Path to a file on the remote server\n @param localPath Path to save the file to\n @param progress Method called periodically with number of bytes downloaded and total file size.\n        Returns NO to abort.\n @returns SCP download success\n */\n- (BOOL)downloadFile:(NSString *)remotePath\n                  to:(NSString *)localPath\n            progress:(BOOL (^)(NSUInteger, NSUInteger))progress;\n\n/**\n Upload a local file to a remote server.\n\n If to: specifies a directory, the file name from the original file will be\n used.\n\n @param localPath Path to a file on the local computer\n @param remotePath Path to save the file to\n @param progress Method called periodically with number of bytes uploaded. Returns NO to abort.\n @returns SCP upload success\n */\n- (BOOL)uploadFile:(NSString *)localPath\n                to:(NSString *)remotePath\n          progress:(BOOL (^)(NSUInteger))progress;\n\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/NMSSH/NMSSH/NMSSHChannel.m",
    "content": "#import \"NMSSHChannel.h\"\n#import \"NMSSH+Protected.h\"\n\n@interface NMSSHChannel ()\n@property (nonatomic, strong) NMSSHSession *session;\n@property (nonatomic, assign) LIBSSH2_CHANNEL *channel;\n\n@property (nonatomic, readwrite) NMSSHChannelType type;\n@property (nonatomic, assign) const char *ptyTerminalName;\n@property (nonatomic, strong) NSString *lastResponse;\n\n#if OS_OBJECT_USE_OBJC\n@property (nonatomic, strong) dispatch_source_t source;\n#else\n@property (nonatomic, assign) dispatch_source_t source;\n#endif\n@end\n\n@implementation NMSSHChannel\n\n// -----------------------------------------------------------------------------\n#pragma mark - INITIALIZER\n// -----------------------------------------------------------------------------\n\n- (instancetype)initWithSession:(NMSSHSession *)session {\n    if ((self = [super init])) {\n        [self setSession:session];\n        [self setBufferSize:kNMSSHBufferSize];\n        [self setRequestPty:NO];\n        [self setPtyTerminalType:NMSSHChannelPtyTerminalVanilla];\n        [self setType:NMSSHChannelTypeClosed];\n\n        // Make sure we were provided a valid session\n        if (![self.session isKindOfClass:[NMSSHSession class]]) {\n            @throw @\"You have to provide a valid NMSSHSession!\";\n        }\n    }\n\n    return self;\n}\n\n- (BOOL)openChannel:(NSError *__autoreleasing *)error {\n    if (self.channel != NULL) {\n        NMSSHLogWarn(@\"The channel will be closed before continue\");\n        if (self.type == NMSSHChannelTypeShell) {\n            [self closeShell];\n        }\n        else {\n            [self closeChannel];\n        }\n    }\n\n    // Set blocking mode\n    libssh2_session_set_blocking(self.session.rawSession, 1);\n\n    // Open up the channel\n    LIBSSH2_CHANNEL *channel = libssh2_channel_open_session(self.session.rawSession);\n\n    if (channel == NULL){\n        NMSSHLogError(@\"Unable to open a session\");\n        if (error) {\n            *error = [NSError errorWithDomain:@\"NMSSH\"\n                                         code:NMSSHChannelAllocationError\n                                     userInfo:@{ NSLocalizedDescriptionKey : @\"Channel allocation error\" }];\n        }\n\n        return NO;\n    }\n\n    [self setChannel:channel];\n\n    // Try to set environment variables\n    if (self.environmentVariables) {\n        for (NSString *key in self.environmentVariables) {\n            if ([key isKindOfClass:[NSString class]] && [[self.environmentVariables objectForKey:key] isKindOfClass:[NSString class]]) {\n                libssh2_channel_setenv(self.channel, [key UTF8String], [[self.environmentVariables objectForKey:key] UTF8String]);\n            }\n        }\n    }\n\n    int rc = 0;\n\n    // If requested, try to allocate a pty\n    if (self.requestPty) {\n        rc = libssh2_channel_request_pty(self.channel, self.ptyTerminalName);\n\n        if (rc != 0) {\n            if (error) {\n                NSDictionary *userInfo = @{ NSLocalizedDescriptionKey : [NSString stringWithFormat:@\"Error requesting %s pty: %@\", self.ptyTerminalName, [[self.session lastError] localizedDescription]] };\n\n                *error = [NSError errorWithDomain:@\"NMSSH\"\n                                             code:NMSSHChannelRequestPtyError\n                                         userInfo:userInfo];\n            }\n\n            NMSSHLogError(@\"Error requesting pseudo terminal\");\n            [self closeChannel];\n\n            return NO;\n        }\n    }\n\n    return YES;\n}\n\n- (void)closeChannel {\n    // Set blocking mode\n    if (self.session.rawSession) {\n        libssh2_session_set_blocking(self.session.rawSession, 1);\n    }\n\n    if (self.channel) {\n        int rc;\n\n        rc = libssh2_channel_close(self.channel);\n\n        if (rc == 0) {\n            libssh2_channel_wait_closed(self.channel);\n        }\n\n        libssh2_channel_free(self.channel);\n        [self setType:NMSSHChannelTypeClosed];\n        [self setChannel:NULL];\n    }\n}\n\n- (BOOL)sendEOF {\n    int rc;\n\n    // Send EOF to host\n    rc = libssh2_channel_send_eof(self.channel);\n    NMSSHLogVerbose(@\"Sent EOF to host (return code = %i)\", rc);\n\n    return rc == 0;\n}\n\n- (void)waitEOF {\n    if (libssh2_channel_eof(self.channel) == 0) {\n        // Wait for host acknowledge\n        int rc = libssh2_channel_wait_eof(self.channel);\n        NMSSHLogVerbose(@\"Received host acknowledge for EOF (return code = %i)\", rc);\n    }\n}\n\n// -----------------------------------------------------------------------------\n#pragma mark - SHELL COMMAND EXECUTION\n// -----------------------------------------------------------------------------\n\n- (const char *)ptyTerminalName {\n    switch (self.ptyTerminalType) {\n        case NMSSHChannelPtyTerminalVanilla:\n            return \"vanilla\";\n\n        case NMSSHChannelPtyTerminalVT100:\n            return \"vt100\";\n\n        case NMSSHChannelPtyTerminalVT102:\n            return \"vt102\";\n\n        case NMSSHChannelPtyTerminalVT220:\n            return \"vt220\";\n\n        case NMSSHChannelPtyTerminalAnsi:\n            return \"ansi\";\n\n        case NMSSHChannelPtyTerminalXterm:\n            return \"xterm\";\n    }\n\n    // catch invalid values\n    return \"vanilla\";\n}\n\n- (NSString *)execute:(NSString *)command error:(NSError *__autoreleasing *)error {\n    return [self execute:command error:error timeout:@0];\n}\n\n- (NSString *)execute:(NSString *)command error:(NSError *__autoreleasing *)error timeout:(NSNumber *)timeout {\n    NMSSHLogInfo(@\"Exec command %@\", command);\n\n    // In case of error...\n    NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithObject:command forKey:@\"command\"];\n\n    if (![self openChannel:error]) {\n        return nil;\n    }\n\n    [self setLastResponse:nil];\n\n    int rc = 0;\n    [self setType:NMSSHChannelTypeExec];\n\n    // Try executing command\n    rc = libssh2_channel_exec(self.channel, [command UTF8String]);\n\n    if (rc != 0) {\n        if (error) {\n            [userInfo setObject:[[self.session lastError] localizedDescription] forKey:NSLocalizedDescriptionKey];\n            [userInfo setObject:[NSString stringWithFormat:@\"%zi\", rc] forKey:NSLocalizedFailureReasonErrorKey];\n\n            *error = [NSError errorWithDomain:@\"NMSSH\"\n                                         code:NMSSHChannelExecutionError\n                                     userInfo:userInfo];\n        }\n\n        NMSSHLogError(@\"Error executing command\");\n        [self closeChannel];\n        return nil;\n    }\n\n    // Set non-blocking mode\n    libssh2_session_set_blocking(self.session.rawSession, 0);\n\n    // Set the timeout for blocking session\n    CFAbsoluteTime time = CFAbsoluteTimeGetCurrent() + [timeout doubleValue];\n\n    // Fetch response from output buffer\n    NSMutableString *response = [[NSMutableString alloc] init];\n    for (;;) {\n        ssize_t rc;\n        char buffer[self.bufferSize];\n        char errorBuffer[self.bufferSize];\n\n        do {\n            rc = libssh2_channel_read(self.channel, buffer, (ssize_t)sizeof(buffer));\n\n            if (rc > 0) {\n                [response appendFormat:@\"%@\", [[NSString alloc] initWithBytes:buffer length:rc encoding:NSUTF8StringEncoding]];\n            }\n\n            // Store all errors that might occur\n            if (libssh2_channel_get_exit_status(self.channel)) {\n                if (error) {\n                    ssize_t erc = libssh2_channel_read_stderr(self.channel, errorBuffer, (ssize_t)sizeof(errorBuffer));\n\n                    NSString *desc = [[NSString alloc] initWithBytes:errorBuffer length:erc encoding:NSUTF8StringEncoding];\n                    if (!desc) {\n                        desc = @\"An unspecified error occurred\";\n                    }\n\n                    [userInfo setObject:desc forKey:NSLocalizedDescriptionKey];\n                    [userInfo setObject:[NSString stringWithFormat:@\"%zi\", erc] forKey:NSLocalizedFailureReasonErrorKey];\n\n                    *error = [NSError errorWithDomain:@\"NMSSH\"\n                                                 code:NMSSHChannelExecutionError\n                                             userInfo:userInfo];\n                }\n            }\n\n            if (libssh2_channel_eof(self.channel) == 1 || rc == 0) {\n                while ((rc  = libssh2_channel_read(self.channel, buffer, (ssize_t)sizeof(buffer))) > 0) {\n                    [response appendFormat:@\"%@\", [[NSString alloc] initWithBytes:buffer length:rc encoding:NSUTF8StringEncoding] ];\n                }\n\n                [self setLastResponse:[response copy]];\n                [self closeChannel];\n\n                return self.lastResponse;\n            }\n\n            // Check if the connection timed out\n            if ([timeout longValue] > 0 && time < CFAbsoluteTimeGetCurrent()) {\n                if (error) {\n                    NSString *desc = @\"Connection timed out\";\n\n                    [userInfo setObject:desc forKey:NSLocalizedDescriptionKey];\n\n                    *error = [NSError errorWithDomain:@\"NMSSH\"\n                                                 code:NMSSHChannelExecutionTimeout\n                                             userInfo:userInfo];\n                }\n\n                while ((rc  = libssh2_channel_read(self.channel, buffer, (ssize_t)sizeof(buffer))) > 0) {\n                    [response appendFormat:@\"%@\", [[NSString alloc] initWithBytes:buffer length:rc encoding:NSUTF8StringEncoding] ];\n                }\n\n                [self setLastResponse:[response copy]];\n                [self closeChannel];\n\n                return self.lastResponse;\n            }\n        } while (rc > 0);\n\n        if (rc != LIBSSH2_ERROR_EAGAIN) {\n            break;\n        }\n\n        waitsocket(CFSocketGetNative([self.session socket]), self.session.rawSession);\n    }\n\n    // If we've got this far, it means fetching execution response failed\n    if (error) {\n        [userInfo setObject:[[self.session lastError] localizedDescription] forKey:NSLocalizedDescriptionKey];\n        *error = [NSError errorWithDomain:@\"NMSSH\"\n                                     code:NMSSHChannelExecutionResponseError\n                                 userInfo:userInfo];\n    }\n\n    NMSSHLogError(@\"Error fetching response from command\");\n    [self closeChannel];\n\n    return nil;\n}\n\n// -----------------------------------------------------------------------------\n#pragma mark - REMOTE SHELL SESSION\n// -----------------------------------------------------------------------------\n\n- (BOOL)startShell:(NSError *__autoreleasing *)error  {\n    NMSSHLogInfo(@\"Starting shell\");\n\n    if (![self openChannel:error]) {\n        return NO;\n    }\n\n    // Set non-blocking mode\n    libssh2_session_set_blocking(self.session.rawSession, 0);\n\n    // Fetch response from output buffer\n#if !(OS_OBJECT_USE_OBJC)\n    if (self.source) {\n        dispatch_release(self.source);\n    }\n#endif\n\n    [self setLastResponse:nil];\n    [self setSource:dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, CFSocketGetNative([self.session socket]),\n                                           0, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0))];\n    dispatch_source_set_event_handler(self.source, ^{\n        NMSSHLogVerbose(@\"Data available on the socket!\");\n        ssize_t rc, erc=0;\n        char buffer[self.bufferSize];\n\n        while (self.channel != NULL) {\n\n            rc = libssh2_channel_read(self.channel, buffer, (ssize_t)sizeof(buffer));\n            erc = libssh2_channel_read_stderr(self.channel, buffer, (ssize_t)sizeof(buffer));\n\n            if (!(rc >=0 || erc >= 0)) {\n                NMSSHLogVerbose(@\"Return code of response %ld, error %ld\", (long)rc, (long)erc);\n\n                if (rc == LIBSSH2_ERROR_SOCKET_RECV || erc == LIBSSH2_ERROR_SOCKET_RECV) {\n                    NMSSHLogVerbose(@\"Error received, closing channel...\");\n                    [self closeShell];\n                }\n                return;\n            }\n            else if (rc > 0) {\n                NSData *data = [[NSData alloc] initWithBytes:buffer length:rc];\n                NSString *response = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];\n                [self setLastResponse:[response copy]];\n\n                if (response && self.delegate && [self.delegate respondsToSelector:@selector(channel:didReadData:)]) {\n                    [self.delegate channel:self didReadData:self.lastResponse];\n                }\n\n                if (self.delegate && [self.delegate respondsToSelector:@selector(channel:didReadRawData:)]) {\n                    [self.delegate channel:self didReadRawData:data];\n                }\n            }\n            else if (erc > 0) {\n                NSData *data = [[NSData alloc] initWithBytes:buffer length:erc];\n                NSString *response = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];\n\n                if (response && self.delegate && [self.delegate respondsToSelector:@selector(channel:didReadError:)]) {\n                    [self.delegate channel:self didReadError:response];\n                }\n\n                if (self.delegate && [self.delegate respondsToSelector:@selector(channel:didReadRawError:)]) {\n                    [self.delegate channel:self didReadRawError:data];\n                }\n            }\n            else if (libssh2_channel_eof(self.channel) == 1) {\n                NMSSHLogVerbose(@\"Host EOF received, closing channel...\");\n                [self closeShell];\n                return;\n            }\n        }\n    });\n\n    dispatch_source_set_cancel_handler(self.source, ^{\n        NMSSHLogVerbose(@\"Shell source cancelled\");\n\n        if (self.delegate && [self.delegate respondsToSelector:@selector(channelShellDidClose:)]) {\n            [self.delegate channelShellDidClose:self];\n        }\n    });\n\n    dispatch_resume(self.source);\n\n    int rc = 0;\n\n    // Try opening the shell\n    while ((rc = libssh2_channel_shell(self.channel)) == LIBSSH2_ERROR_EAGAIN) {\n        waitsocket(CFSocketGetNative([self.session socket]), [self.session rawSession]);\n    }\n\n    if (rc != 0) {\n        NMSSHLogError(@\"Shell request error\");\n        if (error) {\n            *error = [NSError errorWithDomain:@\"NMSSH\"\n                                         code:NMSSHChannelRequestShellError\n                                     userInfo:@{ NSLocalizedDescriptionKey : [[self.session lastError] localizedDescription] }];\n        }\n\n        [self closeShell];\n        return NO;\n    }\n\n    NMSSHLogVerbose(@\"Shell allocated\");\n    [self setType:NMSSHChannelTypeShell];\n\n    return YES;\n}\n\n- (void)closeShell {\n    if (self.source) {\n        dispatch_source_cancel(self.source);\n#if !(OS_OBJECT_USE_OBJC)\n        dispatch_release(self.source);\n#endif\n        [self setSource: nil];\n    }\n\n    if (self.type == NMSSHChannelTypeShell) {\n        // Set blocking mode\n        libssh2_session_set_blocking(self.session.rawSession, 1);\n\n        [self sendEOF];\n    }\n\n    [self closeChannel];\n}\n\n- (BOOL)write:(NSString *)command error:(NSError *__autoreleasing *)error {\n    return [self write:command error:error timeout:@0];\n}\n\n- (BOOL)write:(NSString *)command error:(NSError *__autoreleasing *)error timeout:(NSNumber *)timeout {\n    return [self writeData:[command dataUsingEncoding:NSUTF8StringEncoding] error:error timeout:timeout];\n}\n\n- (BOOL)writeData:(NSData *)data error:(NSError *__autoreleasing *)error {\n    return [self writeData:data error:error timeout:@0];\n}\n\n- (BOOL)writeData:(NSData *)data error:(NSError *__autoreleasing *)error timeout:(NSNumber *)timeout {\n    if (self.type != NMSSHChannelTypeShell) {\n        NMSSHLogError(@\"Shell required\");\n        return NO;\n    }\n\n    ssize_t rc;\n\n    // Set the timeout\n    CFAbsoluteTime time = CFAbsoluteTimeGetCurrent() + [timeout doubleValue];\n\n    // Try writing on shell\n    while ((rc = libssh2_channel_write(self.channel, [data bytes], [data length])) == LIBSSH2_ERROR_EAGAIN) {\n        // Check if the connection timed out\n        if ([timeout longValue] > 0 && time < CFAbsoluteTimeGetCurrent()) {\n            if (error) {\n                NSString *description = @\"Connection timed out\";\n\n                *error = [NSError errorWithDomain:@\"NMSSH\"\n                                             code:NMSSHChannelExecutionTimeout\n                                         userInfo:@{ NSLocalizedDescriptionKey : description }];\n            }\n\n            return NO;\n        }\n\n        waitsocket(CFSocketGetNative([self.session socket]), self.session.rawSession);\n    }\n\n    if (rc < 0) {\n        NMSSHLogError(@\"Error writing on the shell\");\n        if (error) {\n            NSString *command = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];\n            *error = [NSError errorWithDomain:@\"NMSSH\"\n                                         code:NMSSHChannelWriteError\n                                     userInfo:@{ NSLocalizedDescriptionKey : [[self.session lastError] localizedDescription],\n                                                 @\"command\"                : command }];\n        }\n    }\n\n    return YES;\n}\n\n- (BOOL)requestSizeWidth:(NSUInteger)width height:(NSUInteger)height {\n    int rc = libssh2_channel_request_pty_size(self.channel, (int)width, (int)height);\n    if (rc) {\n        NMSSHLogError(@\"Request size failed with error %i\", rc);\n    }\n\n    return rc == 0;\n}\n\n// -----------------------------------------------------------------------------\n#pragma mark - SCP FILE TRANSFER\n// -----------------------------------------------------------------------------\n\n- (BOOL)uploadFile:(NSString *)localPath to:(NSString *)remotePath {\n    return [self uploadFile:localPath to:remotePath progress:NULL];\n}\n\n- (BOOL)uploadFile:(NSString *)localPath to:(NSString *)remotePath progress:(BOOL (^)(NSUInteger))progress {\n    if (self.channel != NULL) {\n        NMSSHLogWarn(@\"The channel will be closed before continue\");\n\n        if (self.type == NMSSHChannelTypeShell) {\n            [self closeShell];\n        }\n        else {\n            [self closeChannel];\n        }\n    }\n\n    localPath = [localPath stringByExpandingTildeInPath];\n\n    // Inherit file name if to: contains a directory\n    if ([remotePath hasSuffix:@\"/\"]) {\n        remotePath = [remotePath stringByAppendingString:\n                      [[localPath componentsSeparatedByString:@\"/\"] lastObject]];\n    }\n\n    // Read local file\n    FILE *local = fopen([localPath UTF8String], \"rb\");\n    if (!local) {\n        NMSSHLogError(@\"Can't read local file\");\n        return NO;\n    }\n\n    // Set blocking mode\n    libssh2_session_set_blocking(self.session.rawSession, 1);\n\n    // Try to send a file via SCP.\n    struct stat fileinfo;\n    stat([localPath UTF8String], &fileinfo);\n    LIBSSH2_CHANNEL *channel = libssh2_scp_send64(self.session.rawSession, [remotePath UTF8String], fileinfo.st_mode & 0644,\n                                                  (unsigned long)fileinfo.st_size, 0, 0);;\n\n    if (channel == NULL) {\n        NMSSHLogError(@\"Unable to open SCP session\");\n        fclose(local);\n\n        return NO;\n    }\n\n    [self setChannel:channel];\n    [self setType:NMSSHChannelTypeSCP];\n\n    // Wait for file transfer to finish\n    char mem[self.bufferSize];\n    size_t nread;\n    char *ptr;\n    long rc;\n    NSUInteger total = 0;\n    BOOL abort = NO;\n    while (!abort && (nread = fread(mem, 1, sizeof(mem), local)) > 0) {\n        ptr = mem;\n\n        do {\n            // Write the same data over and over, until error or completion\n            rc = libssh2_channel_write(self.channel, ptr, nread);\n\n            if (rc < 0) {\n                NMSSHLogError(@\"Failed writing file\");\n                [self closeChannel];\n                return NO;\n            }\n            else {\n                // rc indicates how many bytes were written this time\n                total += rc;\n                if (progress && !progress(total)) {\n                    abort = YES;\n                    break;\n                }\n                ptr += rc;\n                nread -= rc;\n            }\n        } while (nread);\n    };\n\n    fclose(local);\n\n    if ([self sendEOF]) {\n        [self waitEOF];\n    }\n    [self closeChannel];\n\n    return !abort;\n}\n\n- (BOOL)downloadFile:(NSString *)remotePath to:(NSString *)localPath {\n    return [self downloadFile:remotePath to:localPath progress:NULL];\n}\n\n- (BOOL)downloadFile:(NSString *)remotePath to:(NSString *)localPath progress:(BOOL (^)(NSUInteger, NSUInteger))progress {\n    if (self.channel != NULL) {\n        NMSSHLogWarn(@\"The channel will be closed before continue\");\n\n        if (self.type == NMSSHChannelTypeShell) {\n            [self closeShell];\n        }\n        else {\n            [self closeChannel];\n        }\n    }\n\n    localPath = [localPath stringByExpandingTildeInPath];\n\n    // Inherit file name if to: contains a directory\n    if ([localPath hasSuffix:@\"/\"]) {\n        localPath = [localPath stringByAppendingString:[[remotePath componentsSeparatedByString:@\"/\"] lastObject]];\n    }\n\n    // Set blocking mode\n    libssh2_session_set_blocking(self.session.rawSession, 1);\n\n    // Request a file via SCP\n    struct stat fileinfo;\n    LIBSSH2_CHANNEL *channel = libssh2_scp_recv(self.session.rawSession, [remotePath UTF8String], &fileinfo);\n\n    if (channel == NULL) {\n        NMSSHLogError(@\"Unable to open SCP session\");\n        return NO;\n    }\n\n    [self setChannel:channel];\n    [self setType:NMSSHChannelTypeSCP];\n\n    if ([[NSFileManager defaultManager] fileExistsAtPath:localPath]) {\n        NMSSHLogInfo(@\"A file already exists at %@, it will be overwritten\", localPath);\n        [[NSFileManager defaultManager] removeItemAtPath:localPath error:nil];\n    }\n\n    // Open local file in order to write to it\n    int localFile = open([localPath UTF8String], O_WRONLY|O_CREAT, 0644);\n\n    // Save data to local file\n    off_t got = 0;\n    while (got < fileinfo.st_size) {\n        char mem[self.bufferSize];\n        size_t amount = sizeof(mem);\n\n        if ((fileinfo.st_size - got) < amount) {\n            amount = (size_t)(fileinfo.st_size - got);\n        }\n\n        ssize_t rc = libssh2_channel_read(self.channel, mem, amount);\n\n        if (rc > 0) {\n            size_t n = write(localFile, mem, rc);\n            if (n < rc) {\n                NMSSHLogError(@\"Failed to write to local file\");\n                close(localFile);\n                [self closeChannel];\n                return NO;\n            }\n            got += rc;\n            if (progress && !progress((NSUInteger)got, (NSUInteger)fileinfo.st_size)) {\n                close(localFile);\n                [self closeChannel];\n                return NO;\n            }\n        }\n        else if (rc < 0) {\n            NMSSHLogError(@\"Failed to read SCP data\");\n            close(localFile);\n            [self closeChannel];\n\n            return NO;\n        }\n\n        memset(mem, 0x0, sizeof(mem));\n    }\n\n    close(localFile);\n    [self closeChannel];\n\n    return YES;\n}\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/NMSSH/NMSSH/NMSSHConfig.h",
    "content": "#import \"NMSSH.h\"\n\n@class NMSSHHostConfig;\n\n/**\n NMSSHConfig parses ssh config files and returns matching entries for a given\n host name.\n */\n@interface NMSSHConfig : NSObject\n\n/** The array of parsed NMSSHHostConfig objects. */\n@property(nonatomic, readonly) NSArray *hostConfigs;\n\n/**\n Creates a new NMSSHConfig, reads the given {filename} and parses it.\n\n @param filename Path to an ssh config file.\n @returns NMSSHConfig instance or nil if the config file couldn't be parsed.\n */\n+ (instancetype)configFromFile:(NSString *)filename;\n\n/**\n Initializes an NMSSHConfig from a config file's contents in a string.\n\n @param contents A config file's contents.\n @returns An NMSSHConfig object or nil if the contents were malformed.\n */\n- (instancetype)initWithString:(NSString *)contents;\n\n/**\n Searches the config for an entry matching {host}.\n\n @param host A host name to search for.\n @returns An NMSSHHostConfig object whose patterns match host or nil if none is\n     found.\n */\n- (NMSSHHostConfig *)hostConfigForHost:(NSString *)host;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/NMSSH/NMSSH/NMSSHConfig.m",
    "content": "#import \"NMSSHConfig.h\"\n#import \"NMSSHHostConfig.h\"\n\n/** Describes how a host string matches a pattern in a NMSSHHostConfig. */\ntypedef enum {\n    /** Host matches a pattern */\n    NMSSHConfigMatchPositive,\n\n    /** Host matches a negated pattern */\n    NMSSHConfigMatchNegative,\n\n    /** Host matches no patterns */\n    NMSSHConfigMatchNone\n} NMSSHConfigMatch;\n\n@interface NMSSHConfig ()\n\n@property(nonatomic, strong) NSArray *hostConfigs;\n\n@end\n\n@implementation NMSSHConfig\n\n+ (instancetype)configFromFile:(NSString *)filename {\n  return [[self alloc] initWithFile:filename];\n}\n\n- (instancetype)initWithFile:(NSString *)filename {\n    NSString *contents = [NSString stringWithContentsOfFile:filename\n                                                   encoding:NSUTF8StringEncoding\n                                                      error:NULL];\n    return [self initWithString:contents];\n}\n\n- (instancetype)initWithString:(NSString *)contents {\n    if (contents == nil) {\n        return nil;\n    }\n\n    if ((self = [super init])) {\n        [self setHostConfigs:[self arrayFromString:contents]];\n        if (_hostConfigs == nil) {\n            return nil;\n        }\n    }\n\n    return self;\n}\n\n// -----------------------------------------------------------------------------\n#pragma mark - PARSING\n// -----------------------------------------------------------------------------\n\n- (NSArray *)arrayFromString:(NSString *)contents {\n    if (contents == nil) {\n        return nil;\n    }\n\n    contents = [contents stringByReplacingOccurrencesOfString:@\"\\r\\n\"\n                                                   withString:@\"\\n\"];\n    NSArray *lines = [contents componentsSeparatedByString:@\"\\n\"];\n\n    NSMutableArray *array = [NSMutableArray array];\n    for (NSString *line in lines) {\n        [self parseLine:line intoArray:array];\n    }\n\n    return [array copy];\n}\n\n- (void)parseLine:(NSString *)line intoArray:(NSMutableArray *)array {\n    // Trim spaces\n    line = [line stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];\n\n    // Pull out the range of the first token.\n    NSString *arguments;\n    NSRange range = [self rangeOfFirstTokenInString:line suffix:&arguments];\n    if (range.location == NSNotFound) {\n        return;\n    }\n\n    // Get the string value of the first token.\n    NSString *keyword = [line substringWithRange:range];\n    if ([keyword hasPrefix:@\"#\"] ||\n        [keyword length] == 0) {\n        return;\n    }\n\n    // Parse the line based on the first token.\n    if ([keyword localizedCaseInsensitiveCompare:@\"host\"] == NSOrderedSame) {\n        [self parseHostWithArguments:arguments intoArray:array];\n    }\n    else if ([keyword localizedCaseInsensitiveCompare:@\"hostname\"] == NSOrderedSame) {\n        [self parseHostNameWithArguments:arguments intoArray:array];\n    }\n    else if ([keyword localizedCaseInsensitiveCompare:@\"user\"] == NSOrderedSame) {\n        [self parseUserWithArguments:arguments intoArray:array];\n    }\n    else if ([keyword localizedCaseInsensitiveCompare:@\"port\"] == NSOrderedSame) {\n        [self parsePortWithArguments:arguments intoArray:array];\n    }\n    else if ([keyword localizedCaseInsensitiveCompare:@\"identityfile\"] == NSOrderedSame) {\n        [self parseIdentityFileWithArguments:arguments intoArray:array];\n    }\n}\n\n- (void)parseHostWithArguments:(NSString *)arguments intoArray:(NSMutableArray *)array {\n    NMSSHHostConfig *config = [[NMSSHHostConfig alloc] init];\n    NSString *next;\n\n    NSRange hostRange = [self rangeOfFirstTokenInString:arguments suffix:&next];\n    while (hostRange.location != NSNotFound) {\n        if (hostRange.length > 0) {\n            NSString *hostPattern = [arguments substringWithRange:hostRange];\n            [config setHostPatterns:[config.hostPatterns arrayByAddingObject:hostPattern]];\n        }\n\n        arguments = next;\n        hostRange = [self rangeOfFirstTokenInString:arguments suffix:&next];\n    }\n\n    if ([config.hostPatterns count] > 0) {\n        [array addObject:config];\n    }\n}\n\n- (void)parseHostNameWithArguments:(NSString *)arguments\n                         intoArray:(NSMutableArray *)array {\n    if ([array count] == 0) {\n        return;\n    }\n    NMSSHHostConfig *config = [array lastObject];\n    NSRange valueRange = [self rangeOfFirstTokenInString:arguments suffix:NULL];\n\n    if (valueRange.location != NSNotFound &&\n        valueRange.length > 0) {\n        [config setHostname:[arguments substringWithRange:valueRange]];\n    }\n}\n\n- (void)parseUserWithArguments:(NSString *)arguments\n                     intoArray:(NSMutableArray *)array {\n    if ([array count] == 0) {\n        return;\n    }\n    NMSSHHostConfig *config = [array lastObject];\n    NSRange valueRange = [self rangeOfFirstTokenInString:arguments suffix:NULL];\n\n    if (valueRange.location != NSNotFound &&\n        valueRange.length > 0) {\n        [config setUser:[arguments substringWithRange:valueRange]];\n    }\n}\n\n- (void)parsePortWithArguments:(NSString *)arguments\n                     intoArray:(NSMutableArray *)array {\n    if ([array count] == 0) {\n        return;\n    }\n    NMSSHHostConfig *config = [array lastObject];\n    NSRange valueRange = [self rangeOfFirstTokenInString:arguments suffix:NULL];\n\n    if (valueRange.location != NSNotFound &&\n        valueRange.length > 0) {\n        NSString *portString = [arguments substringWithRange:valueRange];\n        NSInteger port = [portString intValue];\n\n        if (port >= 0) {\n            [config setPort:@(port & 0xffff)];\n        }\n    }\n}\n\n- (void)parseIdentityFileWithArguments:(NSString *)arguments\n                     intoArray:(NSMutableArray *)array {\n    if ([array count] == 0) {\n        return;\n    }\n    NMSSHHostConfig *config = [array lastObject];\n    NSRange valueRange = [self rangeOfFirstTokenInString:arguments suffix:NULL];\n\n    if (valueRange.location != NSNotFound &&\n        valueRange.length > 0) {\n        NSString *identityFile =\n            [[arguments substringWithRange:valueRange] stringByExpandingTildeInPath];\n        [config setIdentityFiles:[config.identityFiles arrayByAddingObject:identityFile]];\n    }\n}\n\n- (NSCharacterSet *)blanksCharacterSet {\n    NSMutableCharacterSet *blanksCharacterSet = [[NSMutableCharacterSet alloc] init];\n    [blanksCharacterSet addCharactersInRange:NSMakeRange(' ', 1)];\n    [blanksCharacterSet addCharactersInRange:NSMakeRange('\\t', 1)];\n    return blanksCharacterSet;\n}\n\n// Returns the range of a quoted substring in line starting with a quote at location. If there is\n// no matching close quote then a location of NSNotFound is returned. Otherwise, the range of the\n// text inside the quotes (excluding the quotes) is returned.\n- (NSRange)rangeOfQuotedSubstringInString:(NSString *)line\n                          startingAtIndex:(NSUInteger)location {\n    NSUInteger start = location + 1;\n    NSRange possiblyQuotedRange = NSMakeRange(start,\n                                              [line length] - start);\n    NSRange rangeOfCloseQuote = [line rangeOfString:@\"\\\"\"\n                                            options:0\n                                              range:possiblyQuotedRange];\n\n    if (rangeOfCloseQuote.location == NSNotFound) {\n        return NSMakeRange(NSNotFound, 0);\n    }\n    else {\n        return NSMakeRange(start, rangeOfCloseQuote.location - start);\n    }\n}\n\n- (NSRange)rangeInString:(NSString *)line fromLocationUntilBlankOrEnd:(NSUInteger)location {\n    NSRange tailRange = NSMakeRange(location,\n                                    [line length] - location);\n    NSRange terminatingBlank = [line rangeOfCharacterFromSet:[self blanksCharacterSet]\n                                                     options:0\n                                                       range:tailRange];\n\n    if (terminatingBlank.location == NSNotFound) {\n        return tailRange;\n    }\n    else {\n        return NSMakeRange(location, NSMaxRange(terminatingBlank) - location - 1);\n    }\n}\n\n- (NSRange)rangeOfFirstTokenInString:(NSString *)line suffix:(NSString **)suffixPtr {\n    NSCharacterSet *blanksCharacterSet = [self blanksCharacterSet];\n    NSMutableCharacterSet *nonBlanksCharacterSet = [blanksCharacterSet mutableCopy];\n    [nonBlanksCharacterSet invert];\n\n    NSRange rangeOfFirstNonBlank = [line rangeOfCharacterFromSet:nonBlanksCharacterSet];\n    if (rangeOfFirstNonBlank.location == NSNotFound) {\n        return rangeOfFirstNonBlank;\n    }\n\n    if ([line characterAtIndex:rangeOfFirstNonBlank.location] == '\"') {\n        NSRange range = [self rangeOfQuotedSubstringInString:line\n                                             startingAtIndex:rangeOfFirstNonBlank.location];\n\n        if (suffixPtr != NULL && range.location != NSNotFound) {\n            *suffixPtr = [line substringFromIndex:NSMaxRange(range) + 1];\n        }\n        return range;\n    }\n    else {\n        NSRange range =\n            [self rangeInString:line fromLocationUntilBlankOrEnd:rangeOfFirstNonBlank.location];\n        if (suffixPtr != NULL) {\n            *suffixPtr = [line substringFromIndex:NSMaxRange(range)];\n        }\n        return range;\n    }\n}\n\n// -----------------------------------------------------------------------------\n#pragma mark - MATCHING\n// -----------------------------------------------------------------------------\n\n- (NMSSHHostConfig *)hostConfigForHost:(NSString *)host {\n    NMSSHHostConfig *combinedConfig = [[NMSSHHostConfig alloc] init];\n    BOOL foundAny = NO;\n\n    for (NMSSHHostConfig *config in _hostConfigs) {\n        NMSSHConfigMatch match = NMSSHConfigMatchNone;\n\n        for (NSString *pattern in config.hostPatterns) {\n            switch ([self host:host matchesPatternList:pattern]) {\n                case NMSSHConfigMatchPositive:\n                    match = NMSSHConfigMatchPositive;\n                    break;\n\n                case NMSSHConfigMatchNegative:\n                    match = NMSSHConfigMatchNegative;\n                    break;\n\n                case NMSSHConfigMatchNone:\n                    break;\n            }\n\n            if (match == NMSSHConfigMatchNegative) {\n                break;\n            }\n        }\n\n        if (match == NMSSHConfigMatchPositive) {\n            [combinedConfig mergeFrom:config];\n            foundAny = YES;\n        }\n    }\n\n    return foundAny ? combinedConfig : nil;\n}\n\n// A pattern list is a comma-delimited sequence of subpatterns. A subpattern is a string with\n// wildcards optionally preceded by an !. If the host matches any negated subpattern then it is a\n// negative match. Otherwise, if the host matches any non-negated subpattern then it is a positive\n// match. If the host matches no patterns then it is a None match.\n- (NMSSHConfigMatch)host:(NSString *)host matchesPatternList:(NSString *)patternList {\n    NSArray *patterns = [patternList componentsSeparatedByString:@\",\"];\n    NMSSHConfigMatch match = NMSSHConfigMatchNone;\n\n    for (NSString *mixedCasePattern in patterns) {\n        NSString *pattern = [mixedCasePattern lowercaseString];\n        BOOL negated = NO;\n\n        if ([pattern hasPrefix:@\"!\"]) {\n            negated = YES;\n            pattern = [pattern substringFromIndex:1];\n        }\n\n        if ([self host:host matchesSubpattern:pattern]) {\n            if (negated) {\n                return NMSSHConfigMatchNegative;\n            }\n            else {\n                match = NMSSHConfigMatchPositive;\n            }\n        }\n    }\n    return match;\n}\n\n- (BOOL)host:(NSString *)host matchesSubpattern:(NSString *)subPattern {\n    if (host == nil || subPattern == nil) {\n        return NO;\n    }\n\n    NSUInteger patternIndex = 0;\n    NSUInteger patternLength = subPattern.length;\n\n    NSUInteger hostIndex = 0;\n    NSUInteger hostLength = host.length;\n\n    while (1) {\n        if (patternIndex == patternLength) {\n            return hostIndex == hostLength;\n        }\n\n        unichar patternChar = [subPattern characterAtIndex:patternIndex];\n        if (patternChar == '*') {\n            ++patternIndex;\n\n            if (patternIndex == patternLength) {\n                // If at end of pattenr, accept immediately.\n                return YES;\n            }\n\n            // If next character in pattern is not a wildcard, optimize.\n            unichar patternPeek = [subPattern characterAtIndex:patternIndex];\n            if (patternPeek != '?' && patternPeek != '*') {\n                // Look for an instance in the host of the next char to match in the pattern.\n                for (; hostIndex < hostLength; hostIndex++) {\n                    unichar hostChar = [host characterAtIndex:hostIndex];\n\n                    if (hostChar == patternPeek) {\n                        NSString *tailHost = [host substringFromIndex:hostIndex + 1];\n                        NSString *tailSubpattern = [subPattern substringFromIndex:patternIndex + 1];\n\n                        if ([self host:tailHost matchesSubpattern:tailSubpattern]) {\n                            return YES;\n                        }\n                    }\n                }\n\n                // Failed.\n                return NO;\n            }\n\n            // Move ahead one char at a time and try to match at each position\n            for (; hostIndex < hostLength; ++hostIndex) {\n                NSString *tailHost = [host substringFromIndex:hostIndex];\n                NSString *tailPattern = [subPattern substringFromIndex:patternIndex];\n                if ([self host:tailHost matchesSubpattern:tailPattern]) {\n                    return YES;\n                }\n            }\n\n            // Failed\n            return NO;\n        }\n\n        // There must be at least one more char in the string. If we reached the end, then fail.\n        if (hostIndex == hostLength) {\n            return NO;\n        }\n\n        unichar hostChar = [host characterAtIndex:hostIndex];\n        // Check if the next character of the string is acceptable.\n        if (patternChar != '?' && patternChar != hostChar) {\n            return NO;\n        }\n\n        ++hostIndex;\n        ++patternIndex;\n    }\n\n    // Unreachable code.\n    return NO;\n}\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/NMSSH/NMSSH/NMSSHHostConfig.h",
    "content": "#import \"NMSSH.h\"\n\n/**\n NMSSHHostConfig describes a single host's configuration.\n */\n@interface NMSSHHostConfig : NSObject\n\n/**\n Patterns specified in the config file.\n */\n@property(nonatomic, strong) NSArray *hostPatterns;\n\n/**\n Specifies the real host name to log into. If the hostname contains the\n character sequence `%h', then the client should replace this with the\n user-specified host name (this is useful for manipulating unqualified names).\n This may be an IP address.\n */\n@property(nonatomic, strong) NSString *hostname;\n\n/**\n Specifies the user name to log in as.\n */\n@property(nonatomic, strong) NSString *user;\n\n/**\n Specifies the port number to connect on the remote host.\n */\n@property(nonatomic, strong) NSNumber *port;\n\n/**\n Specifies alist of file names from which the user's DSA, ECDSA or RSA\n authentication identity are read. It is empty by default. Tildes will be\n expanded to the user's home directory. The client should perform the following\n substitutions on each file name:\n   \"%d\" should be replaced with the local user home directory\n   \"%u\" should be replaced with the local user name\n   \"%l\" should be replaced with the local host name\n   \"%h\" should be replaced with the remote host name\n   \"%r\" should be replaced with the remote user name\n If multiple identities are provided, the client should try them in order.\n */\n@property(nonatomic, strong) NSArray *identityFiles;\n\n/**\n Values for {other} are copied to {self} if not already set. Arrays are\n appended from {other} without adding duplicates.\n */\n- (void)mergeFrom:(NMSSHHostConfig *)other;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/NMSSH/NMSSH/NMSSHHostConfig.m",
    "content": "#import \"NMSSHHostConfig.h\"\n\n@implementation NMSSHHostConfig\n\n- (id)init {\n    if ((self = [super init])) {\n        [self setHostPatterns:@[ ]];\n        [self setIdentityFiles:@[ ]];\n    }\n    return self;\n}\n\n- (NSArray *)arrayByRemovingDuplicateElementsFromArray:(NSArray *)array {\n    NSMutableArray *deduped = [NSMutableArray array];\n    for (NSObject *object in array) {\n        if (![deduped containsObject:object]) {\n            [deduped addObject:object];\n        }\n    }\n    return [deduped copy];\n}\n\n- (NSArray *)mergedArray:(NSArray *)firstArray withArray:(NSArray *)secondArray {\n    NSArray *concatenated = [firstArray arrayByAddingObjectsFromArray:secondArray];\n    return [self arrayByRemovingDuplicateElementsFromArray:concatenated];\n}\n\n- (void)mergeFrom:(NMSSHHostConfig *)other {\n    [self setHostPatterns:[self mergedArray:self.hostPatterns\n                                  withArray:other.hostPatterns]];\n    if (!self.hostname) {\n        [self setHostname:other.hostname];\n    }\n    if (!self.user) {\n        [self setUser:other.user];\n    }\n    if (!self.port) {\n        [self setPort:other.port];\n    }\n    [self setIdentityFiles:[self mergedArray:self.identityFiles\n                                   withArray:other.identityFiles]];\n}\n\n@end\n\n"
  },
  {
    "path": "Sublime/Pods/NMSSH/NMSSH/NMSSHSession.h",
    "content": "#import \"NMSSH.h\"\n\n@class NMSSHHostConfig, NMSFTP;\n@protocol NMSSHSessionDelegate;\n\ntypedef NS_ENUM(NSInteger, NMSSHSessionHash) {\n    NMSSHSessionHashMD5,\n    NMSSHSessionHashSHA1\n};\n\ntypedef NS_ENUM(NSInteger, NMSSHKnownHostStatus) {\n    NMSSHKnownHostStatusMatch,\n    NMSSHKnownHostStatusMismatch,\n    NMSSHKnownHostStatusNotFound,\n    NMSSHKnownHostStatusFailure\n};\n\n/**\n NMSSHSession provides the functionality required to setup a SSH connection\n and authorize against it.\n\n In its simplest form it works like this:\n\n    NMSSHSession *session = [NMSSHSession connectToHost:@\"127.0.0.1:22\"\n                                           withUsername:@\"user\"];\n\n    if (session.isConnected) {\n        NSLog(@\"Successfully created a new session\");\n    }\n\n    [session authenticateByPassword:@\"pass\"];\n\n    if (session.isAuthorized) {\n        NSLog(@\"Successfully authorized\");\n    }\n\n ## Thread safety\n\n NMSSH classes are not thread safe, you should use them from the same thread\n where you created the NMSSHSession instance.\n\n If you want to use multiple NMSSHSession instances at once you should implement\n the [crypto mutex callbacks](http://trac.libssh2.org/wiki/MultiThreading).\n */\n@interface NMSSHSession : NSObject\n\n/// ----------------------------------------------------------------------------\n/// @name Setting the Delegate\n/// ----------------------------------------------------------------------------\n\n/**\n The receiver’s `delegate`.\n\n The `delegate` is sent messages when content is loading.\n */\n@property (nonatomic, weak) id<NMSSHSessionDelegate> delegate;\n\n/**\n The synthesized config for the current host, produced by combining values from\n all configs in the chain by priority, plus client-provided defaults. This is\n only set if NMSSHSession was initialized with a config chain.\n */\n@property (nonatomic, readonly) NMSSHHostConfig *hostConfig;\n\n/// ----------------------------------------------------------------------------\n/// @name Initialize a new SSH session\n/// ----------------------------------------------------------------------------\n\n/**\n Shorthand method for initializing a NMSSHSession object and calling connect.\n\n @param host The server hostname (a port number can be specified by appending\n             `@\":{port}\"`; for IPv6 addresses with a port, use\n             `@\"[{host}]:{port}\"`.\n @param username A valid username the server will accept\n @returns NMSSHSession instance\n */\n+ (instancetype)connectToHost:(NSString *)host withUsername:(NSString *)username;\n\n/**\n Shorthand method for initializing a NMSSHSession object and calling connect,\n (explicitly setting a port number).\n\n @param host The server hostname\n @param port The port number\n @param username A valid username the server will accept\n @returns NMSSHSession instance\n */\n+ (instancetype)connectToHost:(NSString *)host port:(NSInteger)port withUsername:(NSString *)username;\n\n/**\n Create and setup a new NMSSH instance.\n\n @param host The server hostname (a port number can be specified by appending\n             `@\":{port}\"`; for IPv6 addresses with a port, use\n             `@\"[{host}]:{port}\"`.\n @param username A valid username the server will accept\n @returns NMSSHSession instance\n */\n- (instancetype)initWithHost:(NSString *)host andUsername:(NSString *)username;\n\n/**\n Create and setup a new NMSSH instance. This is the designated initializer.\n\n @param host The server hostname\n @param port The port number\n @param username A valid username the server will accept\n @returns NMSSHSession instance\n */\n- (instancetype)initWithHost:(NSString *)host port:(NSInteger)port andUsername:(NSString *)username;\n\n/**\n Create and setup a new NMSSH instance using a chain of config files.\n\n The {host} is used to perform a lookup in NMSSHConfig objects in the\n {configs} array, which may alias the hostname and provide a port number or user\n name. All information relevant to {host} in {configs} will be combined into\n a single NMSSHHostConfig and saved in {self.hostConfig}. A config-\n provided value will override {host}, {defaultUsername} or {defaultPort}. If no\n match is found then {host} is used as the host name.\n\n @param host Host to search {configs} with. If no matching config specifies a\n     hostname, then {host} is the server hostname.\n @param configs An array of NMSSHHostConfig objects ordered from highest to\n     lowest priority\n @param defaultPort The port number (may be overridden by a config)\n @param defaultUsername A valid username the server will accept (may be\n     overridden by a config)\n */\n- (instancetype)initWithHost:(NSString *)host\n                     configs:(NSArray *)configs\n             withDefaultPort:(NSInteger)defaultPort\n             defaultUsername:(NSString *)defaultUsername;\n\n/// ----------------------------------------------------------------------------\n/// @name Connection settings\n/// ----------------------------------------------------------------------------\n\n/** Full server hostname in the format `@\"{hostname}\"`. */\n@property (nonatomic, readonly) NSString *host;\n\n/** The server port to connect to. */\n@property (nonatomic, readonly) NSNumber *port;\n\n/** Username that will authenticate against the server. */\n@property (nonatomic, readonly) NSString *username;\n\n/** Timeout for libssh2 blocking functions. */\n@property (nonatomic, strong) NSNumber *timeout;\n\n/** Last session error. */\n@property (nonatomic, readonly) NSError *lastError;\n\n/** The hash algorithm to use to encode the fingerprint during connection, default value is NMSSHSessionHashMD5. */\n@property (nonatomic, assign) NMSSHSessionHash fingerprintHash;\n\n/** The banner that will be sent to the remote host when the SSH session is started. */\n@property (nonatomic, strong) NSString *banner;\n\n/** The remote host banner. */\n@property (nonatomic, readonly) NSString *remoteBanner;\n\n/// ----------------------------------------------------------------------------\n/// @name Raw libssh2 session and socket reference\n/// ----------------------------------------------------------------------------\n\n/** Raw libssh2 session instance. */\n@property (nonatomic, readonly, getter = rawSession) LIBSSH2_SESSION *session;\n\n/** Raw session socket. */\n@property (nonatomic, readonly) CFSocketRef socket;\n\n/// ----------------------------------------------------------------------------\n/// @name Open/Close a connection to the server\n/// ----------------------------------------------------------------------------\n\n/**\n A Boolean value indicating whether the session connected successfully\n (read-only).\n */\n@property (nonatomic, readonly, getter = isConnected) BOOL connected;\n\n/**\n Connect to the server using the default timeout (10 seconds)\n\n @returns Connection status\n */\n- (BOOL)connect;\n\n/**\n Connect to the server.\n\n @param timeout The time, in seconds, to wait before giving up.\n @returns Connection status\n */\n- (BOOL)connectWithTimeout:(NSNumber *)timeout;\n\n/**\n Close the session\n */\n- (void)disconnect;\n\n/// ----------------------------------------------------------------------------\n/// @name Authentication\n/// ----------------------------------------------------------------------------\n\n/**\n A Boolean value indicating whether the session is successfully authorized\n (read-only).\n */\n@property (nonatomic, readonly, getter = isAuthorized) BOOL authorized;\n\n/**\n Authenticate by password\n\n @param password Password for connected user\n @returns Authentication success\n */\n- (BOOL)authenticateByPassword:(NSString *)password;\n\n/**\n Authenticate by private key pair from file(s)\n\n Use password:nil when the key is unencrypted\n\n @param publicKey Filepath to public key\n @param privateKey Filepath to private key\n @param password Password for encrypted private key\n @returns Authentication success\n */\n- (BOOL)authenticateByPublicKey:(NSString *)publicKey\n                     privateKey:(NSString *)privateKey\n                    andPassword:(NSString *)password;\n\n/**\n Authenticate by private key pair\n\n Use password:nil when the key is unencrypted\n\n @param publicKey public key\n @param privateKey private key\n @param password Password for encrypted private key\n @returns Authentication success\n */\n- (BOOL)authenticateByInMemoryPublicKey:(NSString *)publicKey\n                             privateKey:(NSString *)privateKey\n                            andPassword:(NSString *)password;\n\n/**\n Authenticate by keyboard-interactive using delegate.\n\n @returns Authentication success\n */\n- (BOOL)authenticateByKeyboardInteractive;\n\n/**\n Authenticate by keyboard-interactive using block.\n\n @param authenticationBlock The block to apply to server requests.\n     The block takes one argument:\n\n     _request_ - Question from server<br>\n     The block returns a NSString object that represents a valid response\n     to the given question.\n @returns Authentication success\n */\n- (BOOL)authenticateByKeyboardInteractiveUsingBlock:(NSString *(^)(NSString *request))authenticationBlock;\n\n/**\n Setup and connect to an SSH agent\n\n @returns Authentication success\n */\n- (BOOL)connectToAgent;\n\n/**\n Get supported authentication methods\n\n @returns Array of string descripting supported authentication methods\n */\n- (NSArray *)supportedAuthenticationMethods;\n\n/**\n Get the fingerprint of the remote host.\n The session must be connected to an host.\n\n @param hashType The hash algorithm to use to encode the fingerprint\n @returns The host's fingerprint\n */\n- (NSString *)fingerprint:(NMSSHSessionHash)hashType;\n\n/// ----------------------------------------------------------------------------\n/// @name Known hosts\n/// ----------------------------------------------------------------------------\n\n/**\n Checks if the hosts's key is recognized.\n\n The session must be connected. Each file is checked in order,\n returning as soon as the host is found.\n\n @warning In a sandboxed Mac app or iOS app, _files_ must not be `nil` as the default files are not accessible.\n\n @param files An array of filenames to check, or `nil` to use the default paths.\n @returns Known host status for current host.\n */\n- (NMSSHKnownHostStatus)knownHostStatusInFiles:(NSArray *)files;\n\n/**\n Adds the passed-in host to the user's known hosts file.\n\n _hostName_ may be a numerical IP address or a full name. If it includes\n a port number, it should be formatted as `@\"[{host}]:{port}\"` (e.g., `@\"[example.com]:2222\"`).\n If _salt_ is set, then _hostName_ must contain a hostname salted and hashed with SHA1 and then base64-encoded.\n\n A simple example:\n\n    [session addKnownHostName:session.host\n                         port:[session.port intValue]\n                       toFile:nil\n                     withSalt:nil];\n\n @warning  On Mac OS, the default filename is `~/.ssh/known_hosts`, and will not be writable in a sandboxed environment.\n\n @param hostName The hostname or IP address to add.\n @param port The port number of the host to add.\n @param fileName The path to the known_hosts file, or `nil` for the default.\n @param salt The base64-encoded salt used for hashing. May be `nil`.\n @returns Success status.\n */\n- (BOOL)addKnownHostName:(NSString *)hostName\n                    port:(NSInteger)port\n                  toFile:(NSString *)fileName\n                withSalt:(NSString *)salt;\n\n/// ----------------------------------------------------------------------------\n/// @name Quick channel/sftp access\n/// ----------------------------------------------------------------------------\n\n/** Get a pre-configured NMSSHChannel object for the current session (read-only). */\n@property (nonatomic, readonly) NMSSHChannel *channel;\n\n/** Get a pre-configured NMSFTP object for the current session (read-only). */\n@property (nonatomic, readonly) NMSFTP *sftp;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/NMSSH/NMSSH/NMSSHSession.m",
    "content": "#import \"NMSSHSession.h\"\n#import \"NMSSH+Protected.h\"\n#import \"NMSSHConfig.h\"\n#import \"NMSSHHostConfig.h\"\n\n@interface NMSSHSession ()\n@property (nonatomic, assign) LIBSSH2_AGENT *agent;\n\n@property (nonatomic, assign, getter = rawSession) LIBSSH2_SESSION *session;\n@property (nonatomic, readwrite, getter = isConnected) BOOL connected;\n@property (nonatomic, strong) NSString *host;\n@property (nonatomic, strong) NSString *username;\n\n@property (nonatomic, copy) NSString *(^kbAuthenticationBlock)(NSString *);\n\n@property (nonatomic, strong) NMSSHChannel *channel;\n@property (nonatomic, strong) NMSFTP *sftp;\n@property (nonatomic, strong) NSNumber *port;\n@property (nonatomic, strong) NMSSHHostConfig *hostConfig;\n@property (nonatomic, assign) LIBSSH2_SESSION *sessionToFree;\n@end\n\n@implementation NMSSHSession\n\n// -----------------------------------------------------------------------------\n#pragma mark - INITIALIZE A NEW SSH SESSION\n// -----------------------------------------------------------------------------\n\n+ (instancetype)connectToHost:(NSString *)host port:(NSInteger)port withUsername:(NSString *)username {\n    NMSSHSession *session = [[NMSSHSession alloc] initWithHost:host\n                                                          port:port\n                                                   andUsername:username];\n    [session connect];\n\n    return session;\n}\n\n+ (instancetype)connectToHost:(NSString *)host withUsername:(NSString *)username {\n    NMSSHSession *session = [[NMSSHSession alloc] initWithHost:host\n                                                   andUsername:username];\n    [session connect];\n\n    return session;\n}\n\n- (instancetype)initWithHost:(NSString *)host port:(NSInteger)port andUsername:(NSString *)username {\n    if ((self = [super init])) {\n        [self setHost:host];\n        [self setPort:@(port)];\n        [self setUsername:username];\n        [self setConnected:NO];\n        [self setFingerprintHash:NMSSHSessionHashMD5];\n    }\n\n    return self;\n}\n\n- (instancetype)initWithHost:(NSString *)host\n                     configs:(NSArray *)configs\n             withDefaultPort:(NSInteger)defaultPort\n             defaultUsername:(NSString *)defaultUsername {\n    // Merge matching entries from configs together.\n    NMSSHHostConfig *hostConfig = [[NMSSHHostConfig alloc] init];\n    for (NMSSHConfig *config in configs) {\n        NMSSHHostConfig *matchingHostConfig = [config hostConfigForHost:host];\n        if (matchingHostConfig) {\n            [hostConfig mergeFrom:matchingHostConfig];\n        }\n    }\n\n    // Merge in defaults.\n    NMSSHHostConfig *defaultHostConfig = [[NMSSHHostConfig alloc] init];\n    [defaultHostConfig setHostname:host];\n    [defaultHostConfig setPort:@(defaultPort)];\n    [defaultHostConfig setUser:defaultUsername];\n    [hostConfig mergeFrom:defaultHostConfig];\n\n    // Initialize with resulting config.\n    self = [self initWithHost:hostConfig.hostname\n                         port:[hostConfig.port integerValue]\n                  andUsername:hostConfig.user];\n    if (self) {\n        [self setHostConfig:hostConfig];\n    }\n\n    return self;\n}\n\n- (instancetype)initWithHost:(NSString *)host andUsername:(NSString *)username {\n    NSURL *url = [[self class] URLForHost:host];\n    return [self initWithHost:[url host]\n                         port:[([url port] ?: @22) intValue]\n                  andUsername:username];\n}\n\n+ (NSURL *)URLForHost:(NSString *)host {\n    // Check if host is IPv6 and wrap in square brackets.\n    if ([[host componentsSeparatedByString:@\":\"] count] >= 3 &&\n        ![host hasPrefix:@\"[\"]) {\n        host = [NSString stringWithFormat:@\"[%@]\", host];\n    }\n\n    return [NSURL URLWithString:[@\"ssh://\" stringByAppendingString:host]];\n}\n\n- (void)dealloc {\n    if (self.sessionToFree) {\n        libssh2_session_free(self.sessionToFree);\n    }\n}\n\n// -----------------------------------------------------------------------------\n#pragma mark - CONNECTION SETTINGS\n// -----------------------------------------------------------------------------\n\n- (NSArray *)hostIPAddresses {\n    NSArray *hostComponents = [_host componentsSeparatedByString:@\":\"];\n    NSInteger components = [hostComponents count];\n    NSString *address = hostComponents[0];\n\n    // Check if the host is [{IPv6}]:{port}\n    if (components >= 4 && [hostComponents[0] hasPrefix:@\"[\"] && [hostComponents[components-2] hasSuffix:@\"]\"]) {\n        address = [_host substringWithRange:NSMakeRange(1, [_host rangeOfString:@\"]\" options:NSBackwardsSearch].location-1)];\n    } // Check if the host is {IPv6}\n    else if (components >= 3) {\n        address = _host;\n    }\n\n    CFHostRef host = CFHostCreateWithName(kCFAllocatorDefault, (__bridge CFStringRef)address);\n    CFStreamError error;\n    NSArray *addresses = nil;\n\n    if (host) {\n        NMSSHLogVerbose(@\"Start %@ resolution\", address);\n\n        if (CFHostStartInfoResolution(host, kCFHostAddresses, &error)) {\n            addresses = (__bridge NSArray *)(CFHostGetAddressing(host, NULL));\n        }\n        else {\n            NMSSHLogError(@\"Unable to resolve host %@\", address);\n        }\n\n        CFRelease(host);\n    }\n    else {\n        NMSSHLogError(@\"Error allocating CFHost for %@\", address);\n    }\n\n    return addresses;\n}\n\n- (NSNumber *)timeout {\n    if (self.session) {\n        return @(libssh2_session_get_timeout(self.session) / 1000);\n    }\n\n    return @0;\n}\n\n- (void)setTimeout:(NSNumber *)timeout {\n    if (self.session) {\n        libssh2_session_set_timeout(self.session, [timeout longValue] * 1000);\n    }\n}\n\n- (NSError *)lastError {\n    if(!self.rawSession) {\n        return [NSError errorWithDomain:@\"libssh2\" code:LIBSSH2_ERROR_NONE userInfo:@{NSLocalizedDescriptionKey : @\"Error retrieving last session error due to absence of an active session.\"}];\n    }\n    \n    char *message;\n    int error = libssh2_session_last_error(self.rawSession, &message, NULL, 0);\n\n    return [NSError errorWithDomain:@\"libssh2\"\n                               code:error\n                           userInfo:@{ NSLocalizedDescriptionKey: [NSString stringWithUTF8String:message] }];\n}\n\n- (NSString *)remoteBanner {\n    const char *banner = libssh2_session_banner_get(self.session);\n\n    if (!banner) {\n        return nil;\n    }\n\n    return [[NSString alloc] initWithCString:banner encoding:NSUTF8StringEncoding];\n}\n\n// -----------------------------------------------------------------------------\n#pragma mark - OPEN/CLOSE A CONNECTION TO THE SERVER\n// -----------------------------------------------------------------------------\n\n- (BOOL)connect {\n    return [self connectWithTimeout:[NSNumber numberWithLong:10]];\n}\n\n- (BOOL)connectWithTimeout:(NSNumber *)timeout {\n    if (self.isConnected) {\n        [self disconnect];\n    }\n\n    __block BOOL initialized = YES;\n    static dispatch_once_t onceToken;\n    dispatch_once(&onceToken, ^{\n        // Try to initialize libssh2\n        if (libssh2_init(0) != 0) {\n            NMSSHLogError(@\"libssh2 initialization failed\");\n            initialized = NO;\n        }\n\n        NMSSHLogVerbose(@\"libssh2 (v%s) initialized\", libssh2_version(0));\n    });\n\n    if (!initialized) {\n        return NO;\n    }\n    // Try to establish a connection to the server\n    NSUInteger index = -1;\n    NSInteger port = [self.port integerValue];\n    NSArray *addresses = [self hostIPAddresses];\n    CFSocketError error = 1;\n    struct sockaddr_storage *address = NULL;\n\n    SInt32 addressFamily;\n\n    while (addresses && ++index < [addresses count] && error) {\n        NSData *addressData = addresses[index];\n        NSString *ipAddress;\n\n        // IPv4\n        if ([addressData length] == sizeof(struct sockaddr_in)) {\n            struct sockaddr_in address4;\n            [addressData getBytes:&address4 length:sizeof(address4)];\n            address4.sin_port = htons(port);\n\n            address = (struct sockaddr_storage *)(&address4);\n            address->ss_len = sizeof(address4);\n\n            char str[INET_ADDRSTRLEN];\n            inet_ntop(AF_INET, &(address4.sin_addr), str, INET_ADDRSTRLEN);\n            ipAddress = [NSString stringWithCString:str encoding:NSUTF8StringEncoding];\n            addressFamily = AF_INET;\n        } // IPv6\n        else if([addressData length] == sizeof(struct sockaddr_in6)) {\n            struct sockaddr_in6 address6;\n            [addressData getBytes:&address6 length:sizeof(address6)];\n            address6.sin6_port = htons(port);\n\n            address = (struct sockaddr_storage *)(&address6);\n            address->ss_len = sizeof(address6);\n\n            char str[INET6_ADDRSTRLEN];\n            inet_ntop(AF_INET6, &(address6.sin6_addr), str, INET6_ADDRSTRLEN);\n            ipAddress = [NSString stringWithCString:str encoding:NSUTF8StringEncoding];\n            addressFamily = AF_INET6;\n            \n        }\n        else {\n            NMSSHLogVerbose(@\"Unknown address, it's not IPv4 or IPv6!\");\n            continue;\n        }\n        \n        // Try to create the socket\n        _socket = CFSocketCreate(kCFAllocatorDefault, addressFamily, SOCK_STREAM, IPPROTO_IP, kCFSocketNoCallBack, NULL, NULL);\n        if (!_socket) {\n            NMSSHLogError(@\"Error creating the socket\");\n            return NO;\n        }\n        \n        // Set NOSIGPIPE\n        int set = 1;\n        if (setsockopt(CFSocketGetNative(_socket), SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(set)) != 0) {\n            NMSSHLogError(@\"Error setting socket option\");\n            [self disconnect];\n            return NO;\n        }\n        \n        \n        error = CFSocketConnectToAddress(_socket, (__bridge CFDataRef)[NSData dataWithBytes:address length:address->ss_len], [timeout doubleValue]);\n\n        if (error) {\n            NMSSHLogVerbose(@\"Socket connection to %@ on port %ld failed with reason %li, trying next address...\", ipAddress, (long)port, error);\n        }\n        else {\n            NMSSHLogInfo(@\"Socket connection to %@ on port %ld succesful\", ipAddress, (long)port);\n        }\n    }\n\n    if (error) {\n        NMSSHLogError(@\"Failure establishing socket connection\");\n        [self disconnect];\n\n        return NO;\n    }\n\n    // Create a session instance\n    [self setSession:libssh2_session_init_ex(NULL, NULL, NULL, (__bridge void *)(self))];\n\n    // Set a callback for disconnection\n    libssh2_session_callback_set(self.session, LIBSSH2_CALLBACK_DISCONNECT, &disconnect_callback);\n\n    // Set blocking mode\n    libssh2_session_set_blocking(self.session, 1);\n\n    // Set the custom banner\n    if (self.banner && libssh2_session_banner_set(self.session, [self.banner UTF8String])) {\n        NMSSHLogError(@\"Failure setting the banner\");\n    }\n\n    // Start the session\n    if (libssh2_session_handshake(self.session, CFSocketGetNative(_socket))) {\n        NMSSHLogError(@\"Failure establishing SSH session\");\n        [self disconnect];\n\n        return NO;\n    }\n\n    NMSSHLogVerbose(@\"Remote host banner is %@\", [self remoteBanner]);\n\n    // Get the fingerprint of the host\n    NSString *fingerprint = [self fingerprint:self.fingerprintHash];\n    NMSSHLogInfo(@\"The host's fingerprint is %@\", fingerprint);\n\n    if (self.delegate && [self.delegate respondsToSelector:@selector(session:shouldConnectToHostWithFingerprint:)] &&\n        ![self.delegate session:self shouldConnectToHostWithFingerprint:fingerprint]) {\n        NMSSHLogWarn(@\"Fingerprint refused, aborting connection...\");\n        [self disconnect];\n\n        return NO;\n    }\n\n    NMSSHLogVerbose(@\"SSH session started\");\n\n    // We managed to successfully setup a connection\n    [self setConnected:YES];\n\n    return self.isConnected;\n}\n\n\n- (void)disconnect {\n    if (_channel) {\n        [_channel closeShell];\n        [self setChannel:nil];\n    }\n\n    if (_sftp) {\n        if ([_sftp isConnected]) {\n            [_sftp disconnect];\n        }\n        [self setSftp:nil];\n    }\n\n    if (self.agent) {\n        libssh2_agent_disconnect(self.agent);\n        libssh2_agent_free(self.agent);\n        [self setAgent:NULL];\n    }\n\n    if (self.session) {\n        libssh2_session_disconnect(self.session, \"NMSSH: Disconnect\");\n        [self setSessionToFree:self.session];\n        [self setSession:NULL];\n    }\n\n    if (_socket) {\n        CFSocketInvalidate(_socket);\n        CFRelease(_socket);\n        _socket = NULL;\n    }\n\n    NMSSHLogVerbose(@\"Disconnected\");\n    [self setConnected:NO];\n}\n\n// -----------------------------------------------------------------------------\n#pragma mark - AUTHENTICATION\n// -----------------------------------------------------------------------------\n\n- (BOOL)isAuthorized {\n    if (self.session) {\n        return libssh2_userauth_authenticated(self.session) == 1;\n    }\n\n    return NO;\n}\n\n- (BOOL)authenticateByPassword:(NSString *)password {\n\n    if (!password) {\n        return NO;\n    }\n\n    if (![self supportsAuthenticationMethod:@\"password\"]) {\n        return NO;\n    }\n\n    // Try to authenticate by password\n    int error = libssh2_userauth_password(self.session, [self.username UTF8String], [password UTF8String]);\n    if (error) {\n        NMSSHLogError(@\"Password authentication failed with reason %i\", error);\n        return NO;\n    }\n\n    NMSSHLogVerbose(@\"Password authentication succeeded.\");\n\n    return self.isAuthorized;\n}\n\n- (BOOL)authenticateByPublicKey:(NSString *)publicKey\n                     privateKey:(NSString *)privateKey\n                    andPassword:(NSString *)password {\n    if (![self supportsAuthenticationMethod:@\"publickey\"]) {\n        return NO;\n    }\n\n    if (password == nil) {\n        password = @\"\";\n    }\n\n    // Get absolute paths for private/public key pair\n    const char *pubKey = [[publicKey stringByExpandingTildeInPath] UTF8String] ?: NULL;\n    const char *privKey = [[privateKey stringByExpandingTildeInPath] UTF8String] ?: NULL;\n\n    // Try to authenticate with key pair and password\n    int error = libssh2_userauth_publickey_fromfile(self.session,\n                                                    [self.username UTF8String],\n                                                    pubKey,\n                                                    privKey,\n                                                    [password UTF8String]);\n\n    if (error) {\n        NMSSHLogError(@\"Public key authentication failed with reason %i\", error);\n        return NO;\n    }\n\n    NMSSHLogVerbose(@\"Public key authentication succeeded.\");\n\n    return self.isAuthorized;\n}\n\n- (BOOL)authenticateByInMemoryPublicKey:(NSString *)publicKey\n                             privateKey:(NSString *)privateKey\n                            andPassword:(NSString *)password {\n    if (![self supportsAuthenticationMethod:@\"publickey\"]) {\n        return NO;\n    }\n\n    if (password == nil) {\n        password = @\"\";\n    }\n\n    // Try to authenticate with key pair and password\n    int error = libssh2_userauth_publickey_frommemory(self.session,\n                                                    [self.username UTF8String],\n                                                    [self.username length],\n                                                    [publicKey UTF8String] ?: nil,\n                                                    [publicKey length] ?: 0,\n                                                    [privateKey UTF8String] ?: nil,\n                                                    [privateKey length] ?: 0,\n                                                    [password UTF8String]);\n\n    if (error) {\n        NMSSHLogError(@\"Public key authentication failed with reason %i\", error);\n        return NO;\n    }\n\n    NMSSHLogVerbose(@\"Public key authentication succeeded.\");\n\n    return self.isAuthorized;\n}\n\n- (BOOL)authenticateByKeyboardInteractive {\n    return [self authenticateByKeyboardInteractiveUsingBlock:nil];\n}\n\n- (BOOL)authenticateByKeyboardInteractiveUsingBlock:(NSString *(^)(NSString *request))authenticationBlock {\n    if (![self supportsAuthenticationMethod:@\"keyboard-interactive\"]) {\n        return NO;\n    }\n\n    self.kbAuthenticationBlock = authenticationBlock;\n    int rc = libssh2_userauth_keyboard_interactive(self.session, [self.username UTF8String], &kb_callback);\n    self.kbAuthenticationBlock = nil;\n\n    if (rc != 0) {\n        NMSSHLogError(@\"Keyboard-interactive authentication failed with reason %i\", rc);\n        return NO;\n    }\n\n    NMSSHLogVerbose(@\"Keyboard-interactive authentication succeeded.\");\n\n    return self.isAuthorized;\n}\n\n- (BOOL)connectToAgent {\n    if (![self supportsAuthenticationMethod:@\"publickey\"]) {\n        return NO;\n    }\n\n    // Try to setup a connection to the SSH-agent\n    [self setAgent:libssh2_agent_init(self.session)];\n    if (!self.agent) {\n        NMSSHLogError(@\"Could not start a new agent\");\n        return NO;\n    }\n\n    // Try connecting to the agent\n    if (libssh2_agent_connect(self.agent)) {\n        NMSSHLogError(@\"Failed connection to agent\");\n        return NO;\n    }\n\n    // Try to fetch available SSH identities\n    if (libssh2_agent_list_identities(self.agent)) {\n        NMSSHLogError(@\"Failed to request agent identities\");\n        return NO;\n    }\n\n    // Search for the correct identity and try to authenticate\n    struct libssh2_agent_publickey *identity, *prev_identity = NULL;\n    while (1) {\n        int error = libssh2_agent_get_identity(self.agent, &identity, prev_identity);\n        if (error) {\n            NMSSHLogError(@\"Failed to find a valid identity for the agent\");\n            return NO;\n        }\n\n        error = libssh2_agent_userauth(self.agent, [self.username UTF8String], identity);\n        if (!error) {\n            return self.isAuthorized;\n        }\n\n        prev_identity = identity;\n    }\n\n    return NO;\n}\n\n- (NSArray *)supportedAuthenticationMethods {\n    char *userauthlist = libssh2_userauth_list(self.session, [self.username UTF8String],\n                                               (unsigned int)strlen([self.username UTF8String]));\n    if (userauthlist == NULL){\n        NMSSHLogInfo(@\"Failed to get authentication method for host %@:%@\", self.host, self.port);\n        return nil;\n    }\n\n    NSString *authList = [NSString stringWithCString:userauthlist encoding:NSUTF8StringEncoding];\n    NMSSHLogVerbose(@\"User auth list: %@\", authList);\n\n    return [authList componentsSeparatedByString:@\",\"];\n}\n\n- (BOOL)supportsAuthenticationMethod:(NSString *)method {\n    return [[self supportedAuthenticationMethods] containsObject:method];\n}\n\n- (NSString *)fingerprint:(NMSSHSessionHash)hashType {\n    if (!self.session) {\n        return nil;\n    }\n\n    int libssh2_hash, hashLength;\n    switch (hashType) {\n        case NMSSHSessionHashMD5:\n            libssh2_hash = LIBSSH2_HOSTKEY_HASH_MD5;\n            hashLength = 16;\n            break;\n\n        case NMSSHSessionHashSHA1:\n            libssh2_hash = LIBSSH2_HOSTKEY_HASH_SHA1;\n            hashLength = 20;\n            break;\n    }\n\n    const char *hash = libssh2_hostkey_hash(self.session, libssh2_hash);\n    if (!hash) {\n        NMSSHLogWarn(@\"Unable to retrive host's fingerprint\");\n        return nil;\n    }\n\n    NSMutableString *fingerprint = [[NSMutableString alloc] initWithFormat:@\"%02X\", (unsigned char)hash[0]];\n\n    for (int i = 1; i < hashLength; i++) {\n        [fingerprint appendFormat:@\":%02X\", (unsigned char)hash[i]];\n    }\n\n    return [fingerprint copy];\n}\n\n// -----------------------------------------------------------------------------\n#pragma mark - KNOWN HOSTS\n// -----------------------------------------------------------------------------\n\n- (NSString *)applicationSupportDirectory {\n    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);\n    NSString *applicationSupportDirectory = paths[0];\n    NSString *nmsshDirectory = [applicationSupportDirectory stringByAppendingPathComponent:@\"NMSSH\"];\n\n    if (![[NSFileManager defaultManager] fileExistsAtPath:nmsshDirectory]) {\n        [[NSFileManager defaultManager] createDirectoryAtPath:nmsshDirectory\n                                  withIntermediateDirectories:YES\n                                                   attributes:nil\n                                                        error:NULL];\n    }\n\n    return nmsshDirectory;\n}\n\n- (NSString *)userKnownHostsFileName {\n#if TARGET_OS_IPHONE\n    return [[self applicationSupportDirectory] stringByAppendingPathComponent:@\"known_hosts\"];\n#else\n    return [@\"~/.ssh/known_hosts\" stringByExpandingTildeInPath];\n#endif\n}\n\n#if !TARGET_OS_IPHONE\n- (NSString *)systemKnownHostsFileName {\n    return @\"/etc/ssh/ssh_known_hosts\";\n}\n#endif\n\n- (NMSSHKnownHostStatus)knownHostStatusInFiles:(NSArray *)files {\n    if (!files) {\n#if TARGET_OS_IPHONE\n        files = @[[self userKnownHostsFileName]];\n#else\n        files = @[[self systemKnownHostsFileName], [self userKnownHostsFileName]];\n#endif\n    }\n\n    NMSSHKnownHostStatus status = NMSSHKnownHostStatusFailure;\n    for (NSString *filename in files) {\n        status = [self knownHostStatusWithFile:filename];\n\n        if (status != NMSSHKnownHostStatusNotFound && status != NMSSHKnownHostStatusFailure) {\n            return status;\n        }\n    }\n\n    return status;\n}\n\n- (NMSSHKnownHostStatus)knownHostStatusWithFile:(NSString *)filename {\n    LIBSSH2_KNOWNHOSTS *knownHosts = libssh2_knownhost_init(self.session);\n    if (!knownHosts) {\n        return NMSSHKnownHostStatusFailure;\n    }\n\n    int rc = libssh2_knownhost_readfile(knownHosts,\n                                        [filename UTF8String],\n                                        LIBSSH2_KNOWNHOST_FILE_OPENSSH);\n    if (rc < 0) {\n        libssh2_knownhost_free(knownHosts);\n\n        if (rc == LIBSSH2_ERROR_FILE) {\n            NMSSHLogInfo(@\"No known hosts file %@.\", filename);\n            return NMSSHKnownHostStatusNotFound;\n        }\n        else {\n            NMSSHLogError(@\"Failed to read known hosts file %@.\", filename);\n            return NMSSHKnownHostStatusFailure;\n        }\n    }\n\n    int keytype;\n    size_t keylen;\n    const char *remotekey = libssh2_session_hostkey(self.session, &keylen, &keytype);\n    if (!remotekey) {\n        NMSSHLogError(@\"Failed to get host key.\");\n        libssh2_knownhost_free(knownHosts);\n\n        return NMSSHKnownHostStatusFailure;\n    }\n\n    int keybit = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA ? LIBSSH2_KNOWNHOST_KEY_SSHRSA : LIBSSH2_KNOWNHOST_KEY_SSHDSS);\n    struct libssh2_knownhost *host;\n    NMSSHLogInfo(@\"Check for host %@, port %@ in file %@\", self.host, self.port, filename);\n    int check = libssh2_knownhost_checkp(knownHosts,\n                                         [self.host UTF8String],\n                                         [self.port intValue],\n                                         remotekey,\n                                         keylen,\n                                         (LIBSSH2_KNOWNHOST_TYPE_PLAIN |\n                                          LIBSSH2_KNOWNHOST_KEYENC_RAW |\n                                          keybit),\n                                         &host);\n\n    libssh2_knownhost_free(knownHosts);\n\n    switch (check) {\n        case LIBSSH2_KNOWNHOST_CHECK_MATCH:\n            NMSSHLogInfo(@\"Match\");\n            return NMSSHKnownHostStatusMatch;\n\n        case LIBSSH2_KNOWNHOST_CHECK_MISMATCH:\n            NMSSHLogInfo(@\"Mismatch\");\n            return NMSSHKnownHostStatusMismatch;\n\n        case LIBSSH2_KNOWNHOST_CHECK_NOTFOUND:\n            NMSSHLogInfo(@\"Not found\");\n            return NMSSHKnownHostStatusNotFound;\n\n        case LIBSSH2_KNOWNHOST_CHECK_FAILURE:\n        default:\n            NMSSHLogInfo(@\"Failure\");\n            return NMSSHKnownHostStatusFailure;\n    }\n}\n\n- (BOOL)addKnownHostName:(NSString *)host port:(NSInteger)port toFile:(NSString *)fileName withSalt:(NSString *)salt {\n    const char *hostkey;\n    size_t hklen;\n    int hktype;\n    NSString *hostname;  // Formatted as {host} or [{host}]:{port}.\n\n    if (port == 22) {\n        hostname = host;\n    }\n    else {\n        hostname = [NSString stringWithFormat:@\"[%@]:%d\", host, (int)port];\n    }\n\n    if (!fileName) {\n        fileName = [self userKnownHostsFileName];\n    }\n\n    hostkey = libssh2_session_hostkey(self.session, &hklen, &hktype);\n    if (!hostkey) {\n        NMSSHLogError(@\"Failed to get host key.\");\n        return NO;\n    }\n\n    LIBSSH2_KNOWNHOSTS *knownHosts = libssh2_knownhost_init(self.session);\n    if (!knownHosts) {\n        NMSSHLogError(@\"Failed to initialize knownhosts.\");\n        return NO;\n    }\n\n    int rc = libssh2_knownhost_readfile(knownHosts, [fileName UTF8String], LIBSSH2_KNOWNHOST_FILE_OPENSSH);\n    if (rc < 0 && rc != LIBSSH2_ERROR_FILE) {\n        NMSSHLogError(@\"Failed to read known hosts file.\");\n        libssh2_knownhost_free(knownHosts);\n\n        return NO;\n    }\n\n    int keybit = LIBSSH2_KNOWNHOST_KEYENC_RAW;\n    if (hktype == LIBSSH2_HOSTKEY_TYPE_RSA) {\n        keybit |= LIBSSH2_KNOWNHOST_KEY_SSHRSA;\n    }\n    else {\n        keybit |= LIBSSH2_KNOWNHOST_KEY_SSHDSS;\n    }\n\n    if (salt) {\n        keybit |= LIBSSH2_KNOWNHOST_TYPE_SHA1;\n    }\n    else {\n        keybit |= LIBSSH2_KNOWNHOST_TYPE_PLAIN;\n    }\n\n    int result = libssh2_knownhost_addc(knownHosts,\n                                        [hostname UTF8String],\n                                        [salt UTF8String],\n                                        hostkey,\n                                        hklen,\n                                        NULL,\n                                        0,\n                                        keybit,\n                                        NULL);\n    if (result) {\n        NMSSHLogError(@\"Failed to add host to known hosts: error %d (%@)\",\n                      result,\n                      [self lastError]);\n    }\n    else {\n        result = libssh2_knownhost_writefile(knownHosts,\n                                             [fileName UTF8String],\n                                             LIBSSH2_KNOWNHOST_FILE_OPENSSH);\n        if (result < 0) {\n            NMSSHLogError(@\"Couldn't write to %@: %@\",\n                          [self userKnownHostsFileName], [self lastError]);\n        }\n        else {\n            NMSSHLogInfo(@\"Host added to known hosts.\");\n        }\n    }\n\n    libssh2_knownhost_free(knownHosts);\n    return result == 0;\n}\n\n- (NSString *)keyboardInteractiveRequest:(NSString *)request {\n    NMSSHLogVerbose(@\"Server request '%@'\", request);\n\n    if (self.kbAuthenticationBlock) {\n        return self.kbAuthenticationBlock(request);\n    }\n    else if (self.delegate && [self.delegate respondsToSelector:@selector(session:keyboardInteractiveRequest:)]) {\n        return [self.delegate session:self keyboardInteractiveRequest:request];\n    }\n\n    NMSSHLogWarn(@\"Keyboard interactive requires a delegate that responds to session:keyboardInteractiveRequest: or a block!\");\n\n    return @\"\";\n}\n\nvoid kb_callback(const char *name, int name_len, const char *instr, int instr_len,\n                 int num_prompts, const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts, LIBSSH2_USERAUTH_KBDINT_RESPONSE *res, void **abstract) {\n    int i;\n\n    NMSSHSession *self = (__bridge NMSSHSession *)*abstract;\n\n    for (i = 0; i < num_prompts; i++) {\n        NSString *request = [[NSString alloc] initWithBytes:prompts[i].text length:prompts[i].length encoding:NSUTF8StringEncoding];\n        NSString *response = [self keyboardInteractiveRequest:request];\n\n        if (!response) {\n            response = @\"\";\n        }\n\n        res[i].text = strdup([response UTF8String]);\n        res[i].length = (unsigned int)strlen([response UTF8String]);\n    }\n}\n\nvoid disconnect_callback(LIBSSH2_SESSION *session, int reason, const char *message, int message_len, const char *language, int language_len, void **abstract) {\n    NMSSHSession *self = (__bridge NMSSHSession *)*abstract;\n\n    // Build a raw error to encapsulate the disconnect\n    NSMutableDictionary *userInfo = [[NSMutableDictionary alloc] initWithCapacity:2];\n    if (message) {\n        NSString *string = [[NSString alloc] initWithBytes:message length:message_len encoding:NSUTF8StringEncoding];\n        [userInfo setObject:string forKey:NSLocalizedDescriptionKey];\n    }\n\n    if (language) {\n        NSString *string = [[NSString alloc] initWithBytes:language length:language_len encoding:NSUTF8StringEncoding];\n        [userInfo setObject:string forKey:@\"language\"];\n    }\n\n    NSError *error = [NSError errorWithDomain:@\"NMSSH\" code:reason userInfo:userInfo];\n    if (self.delegate && [self.delegate respondsToSelector:@selector(session:didDisconnectWithError:)]) {\n        [self.delegate session:self didDisconnectWithError:error];\n    }\n\n    [self disconnect];\n}\n\n// -----------------------------------------------------------------------------\n#pragma mark - QUICK CHANNEL/SFTP ACCESS\n// -----------------------------------------------------------------------------\n\n- (NMSSHChannel *)channel {\n    if (!_channel) {\n        _channel = [[NMSSHChannel alloc] initWithSession:self];\n    }\n\n    return _channel;\n}\n\n- (NMSFTP *)sftp {\n    if (!_sftp) {\n        _sftp = [[NMSFTP alloc] initWithSession:self];\n    }\n\n    return _sftp;\n}\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/NMSSH/NMSSH/Protocols/NMSSHChannelDelegate.h",
    "content": "#import \"NMSSH.h\"\n\n@class NMSSHChannel;\n\n/**\n Protocol for registering to receive messages from an active NMSSHChannel.\n */\n@protocol NMSSHChannelDelegate <NSObject>\n\n@optional\n\n/**\n Called when a channel read new data on the socket.\n\n @param channel The channel that read the message\n @param message The message that the channel has read\n */\n- (void)channel:(NMSSHChannel *)channel didReadData:(NSString *)message;\n\n/**\n Called when a channel read new error on the socket.\n\n @param channel The channel that read the error\n @param error The error that the channel has read\n */\n- (void)channel:(NMSSHChannel *)channel didReadError:(NSString *)error;\n\n/**\n Called when a channel read new data on the socket.\n\n @param channel The channel that read the message\n @param data The bytes that the channel has read\n */\n- (void)channel:(NMSSHChannel *)channel didReadRawData:(NSData *)data;\n\n/**\n Called when a channel read new error on the socket.\n\n @param channel The channel that read the error\n @param error The error that the channel has read\n */\n- (void)channel:(NMSSHChannel *)channel didReadRawError:(NSData *)error;\n\n/**\n Called when a channel in shell mode has been closed.\n\n @param channel The channel that has been closed\n */\n- (void)channelShellDidClose:(NMSSHChannel *)channel;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/NMSSH/NMSSH/Protocols/NMSSHSessionDelegate.h",
    "content": "#import \"NMSSH.h\"\n\n@class NMSSHSession;\n\n/**\n Protocol for registering to receive messages from an active NMSSHSession.\n */\n@protocol NMSSHSessionDelegate <NSObject>\n@optional\n\n/**\n Called when the session is setup to use keyboard interactive authentication,\n and the server is sending back a question (e.g. a password request).\n\n @param session The session that is asking\n @param request Question from server\n @returns A valid response to the given question\n */\n- (NSString *)session:(NMSSHSession *)session keyboardInteractiveRequest:(NSString *)request;\n\n/**\n Called when a session has failed and disconnected.\n\n @param session The session that was disconnected\n @param error A description of the error that caused the disconnect\n */\n- (void)session:(NMSSHSession *)session didDisconnectWithError:(NSError *)error;\n\n/**\n Called when a session is connecting to a host, the fingerprint is used\n to verify the authenticity of the host.\n\n @param session The session that is connecting\n @param fingerprint The host's fingerprint\n @returns YES if the session should trust the host, otherwise NO.\n */\n- (BOOL)session:(NMSSHSession *)session shouldConnectToHostWithFingerprint:(NSString *)fingerprint;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/NMSSH/NMSSH-iOS/Libraries/include/libssh2/libssh2.h",
    "content": "/* Copyright (c) 2004-2009, Sara Golemon <sarag@libssh2.org>\n * Copyright (c) 2009-2015 Daniel Stenberg\n * Copyright (c) 2010 Simon Josefsson <simon@josefsson.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#ifndef LIBSSH2_H\n#define LIBSSH2_H 1\n\n#define LIBSSH2_COPYRIGHT \"2004-2015 The libssh2 project and its contributors.\"\n\n/* We use underscore instead of dash when appending DEV in dev versions just\n   to make the BANNER define (used by src/session.c) be a valid SSH\n   banner. Release versions have no appended strings and may of course not\n   have dashes either. */\n#define LIBSSH2_VERSION \"1.6.0\"\n\n/* The numeric version number is also available \"in parts\" by using these\n   defines: */\n#define LIBSSH2_VERSION_MAJOR 1\n#define LIBSSH2_VERSION_MINOR 6\n#define LIBSSH2_VERSION_PATCH 0\n\n/* This is the numeric version of the libssh2 version number, meant for easier\n   parsing and comparions by programs. The LIBSSH2_VERSION_NUM define will\n   always follow this syntax:\n\n         0xXXYYZZ\n\n   Where XX, YY and ZZ are the main version, release and patch numbers in\n   hexadecimal (using 8 bits each). All three numbers are always represented\n   using two digits.  1.2 would appear as \"0x010200\" while version 9.11.7\n   appears as \"0x090b07\".\n\n   This 6-digit (24 bits) hexadecimal number does not show pre-release number,\n   and it is always a greater number in a more recent release. It makes\n   comparisons with greater than and less than work.\n*/\n#define LIBSSH2_VERSION_NUM 0x010600\n\n/*\n * This is the date and time when the full source package was created. The\n * timestamp is not stored in the source code repo, as the timestamp is\n * properly set in the tarballs by the maketgz script.\n *\n * The format of the date should follow this template:\n *\n * \"Mon Feb 12 11:35:33 UTC 2007\"\n */\n#define LIBSSH2_TIMESTAMP \"Fri Jun 12 06:58:26 UTC 2015\"\n\n#ifndef RC_INVOKED\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n#ifdef _WIN32\n# include <basetsd.h>\n# include <winsock2.h>\n#endif\n\n#include <stddef.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n\n/* Allow alternate API prefix from CFLAGS or calling app */\n#ifndef LIBSSH2_API\n# ifdef LIBSSH2_WIN32\n#  ifdef _WINDLL\n#   ifdef LIBSSH2_LIBRARY\n#    define LIBSSH2_API __declspec(dllexport)\n#   else\n#    define LIBSSH2_API __declspec(dllimport)\n#   endif /* LIBSSH2_LIBRARY */\n#  else\n#   define LIBSSH2_API\n#  endif\n# else /* !LIBSSH2_WIN32 */\n#  define LIBSSH2_API\n# endif /* LIBSSH2_WIN32 */\n#endif /* LIBSSH2_API */\n\n#ifdef HAVE_SYS_UIO_H\n# include <sys/uio.h>\n#endif\n\n#if (defined(NETWARE) && !defined(__NOVELL_LIBC__))\n# include <sys/bsdskt.h>\ntypedef unsigned char uint8_t;\ntypedef unsigned int uint32_t;\n#endif\n\n#ifdef _MSC_VER\ntypedef unsigned char uint8_t;\ntypedef unsigned int uint32_t;\ntypedef unsigned __int64 libssh2_uint64_t;\ntypedef __int64 libssh2_int64_t;\n#ifndef ssize_t\ntypedef SSIZE_T ssize_t;\n#endif\n#else\ntypedef unsigned long long libssh2_uint64_t;\ntypedef long long libssh2_int64_t;\n#endif\n\n#ifdef WIN32\ntypedef SOCKET libssh2_socket_t;\n#define LIBSSH2_INVALID_SOCKET INVALID_SOCKET\n#else /* !WIN32 */\ntypedef int libssh2_socket_t;\n#define LIBSSH2_INVALID_SOCKET -1\n#endif /* WIN32 */\n\n/* Part of every banner, user specified or not */\n#define LIBSSH2_SSH_BANNER                  \"SSH-2.0-libssh2_\" LIBSSH2_VERSION\n\n/* We *could* add a comment here if we so chose */\n#define LIBSSH2_SSH_DEFAULT_BANNER                  LIBSSH2_SSH_BANNER\n#define LIBSSH2_SSH_DEFAULT_BANNER_WITH_CRLF        LIBSSH2_SSH_DEFAULT_BANNER \"\\r\\n\"\n\n/* Default generate and safe prime sizes for diffie-hellman-group-exchange-sha1 */\n#define LIBSSH2_DH_GEX_MINGROUP     1024\n#define LIBSSH2_DH_GEX_OPTGROUP     1536\n#define LIBSSH2_DH_GEX_MAXGROUP     2048\n\n/* Defaults for pty requests */\n#define LIBSSH2_TERM_WIDTH      80\n#define LIBSSH2_TERM_HEIGHT     24\n#define LIBSSH2_TERM_WIDTH_PX   0\n#define LIBSSH2_TERM_HEIGHT_PX  0\n\n/* 1/4 second */\n#define LIBSSH2_SOCKET_POLL_UDELAY      250000\n/* 0.25 * 120 == 30 seconds */\n#define LIBSSH2_SOCKET_POLL_MAXLOOPS    120\n\n/* Maximum size to allow a payload to compress to, plays it safe by falling\n   short of spec limits */\n#define LIBSSH2_PACKET_MAXCOMP      32000\n\n/* Maximum size to allow a payload to deccompress to, plays it safe by\n   allowing more than spec requires */\n#define LIBSSH2_PACKET_MAXDECOMP    40000\n\n/* Maximum size for an inbound compressed payload, plays it safe by\n   overshooting spec limits */\n#define LIBSSH2_PACKET_MAXPAYLOAD   40000\n\n/* Malloc callbacks */\n#define LIBSSH2_ALLOC_FUNC(name)   void *name(size_t count, void **abstract)\n#define LIBSSH2_REALLOC_FUNC(name) void *name(void *ptr, size_t count, \\\n                                              void **abstract)\n#define LIBSSH2_FREE_FUNC(name)    void name(void *ptr, void **abstract)\n\ntypedef struct _LIBSSH2_USERAUTH_KBDINT_PROMPT\n{\n    char* text;\n    unsigned int length;\n    unsigned char echo;\n} LIBSSH2_USERAUTH_KBDINT_PROMPT;\n\ntypedef struct _LIBSSH2_USERAUTH_KBDINT_RESPONSE\n{\n    char* text;\n    unsigned int length;\n} LIBSSH2_USERAUTH_KBDINT_RESPONSE;\n\n/* 'publickey' authentication callback */\n#define LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC(name) \\\n  int name(LIBSSH2_SESSION *session, unsigned char **sig, size_t *sig_len, \\\n           const unsigned char *data, size_t data_len, void **abstract)\n\n/* 'keyboard-interactive' authentication callback */\n#define LIBSSH2_USERAUTH_KBDINT_RESPONSE_FUNC(name_) \\\n void name_(const char* name, int name_len, const char* instruction, \\\n            int instruction_len, int num_prompts, \\\n            const LIBSSH2_USERAUTH_KBDINT_PROMPT* prompts, \\\n            LIBSSH2_USERAUTH_KBDINT_RESPONSE* responses, void **abstract)\n\n/* Callbacks for special SSH packets */\n#define LIBSSH2_IGNORE_FUNC(name) \\\n void name(LIBSSH2_SESSION *session, const char *message, int message_len, \\\n           void **abstract)\n\n#define LIBSSH2_DEBUG_FUNC(name) \\\n void name(LIBSSH2_SESSION *session, int always_display, const char *message, \\\n           int message_len, const char *language, int language_len, \\\n           void **abstract)\n\n#define LIBSSH2_DISCONNECT_FUNC(name) \\\n void name(LIBSSH2_SESSION *session, int reason, const char *message, \\\n           int message_len, const char *language, int language_len, \\\n           void **abstract)\n\n#define LIBSSH2_PASSWD_CHANGEREQ_FUNC(name) \\\n void name(LIBSSH2_SESSION *session, char **newpw, int *newpw_len, \\\n           void **abstract)\n\n#define LIBSSH2_MACERROR_FUNC(name) \\\n int name(LIBSSH2_SESSION *session, const char *packet, int packet_len, \\\n          void **abstract)\n\n#define LIBSSH2_X11_OPEN_FUNC(name) \\\n void name(LIBSSH2_SESSION *session, LIBSSH2_CHANNEL *channel, \\\n           const char *shost, int sport, void **abstract)\n\n#define LIBSSH2_CHANNEL_CLOSE_FUNC(name) \\\n  void name(LIBSSH2_SESSION *session, void **session_abstract, \\\n            LIBSSH2_CHANNEL *channel, void **channel_abstract)\n\n/* I/O callbacks */\n#define LIBSSH2_RECV_FUNC(name)  ssize_t name(libssh2_socket_t socket, \\\n                                              void *buffer, size_t length, \\\n                                              int flags, void **abstract)\n#define LIBSSH2_SEND_FUNC(name)  ssize_t name(libssh2_socket_t socket, \\\n                                              const void *buffer, size_t length,\\\n                                              int flags, void **abstract)\n\n/* libssh2_session_callback_set() constants */\n#define LIBSSH2_CALLBACK_IGNORE             0\n#define LIBSSH2_CALLBACK_DEBUG              1\n#define LIBSSH2_CALLBACK_DISCONNECT         2\n#define LIBSSH2_CALLBACK_MACERROR           3\n#define LIBSSH2_CALLBACK_X11                4\n#define LIBSSH2_CALLBACK_SEND               5\n#define LIBSSH2_CALLBACK_RECV               6\n\n/* libssh2_session_method_pref() constants */\n#define LIBSSH2_METHOD_KEX          0\n#define LIBSSH2_METHOD_HOSTKEY      1\n#define LIBSSH2_METHOD_CRYPT_CS     2\n#define LIBSSH2_METHOD_CRYPT_SC     3\n#define LIBSSH2_METHOD_MAC_CS       4\n#define LIBSSH2_METHOD_MAC_SC       5\n#define LIBSSH2_METHOD_COMP_CS      6\n#define LIBSSH2_METHOD_COMP_SC      7\n#define LIBSSH2_METHOD_LANG_CS      8\n#define LIBSSH2_METHOD_LANG_SC      9\n\n/* flags */\n#define LIBSSH2_FLAG_SIGPIPE        1\n#define LIBSSH2_FLAG_COMPRESS       2\n\ntypedef struct _LIBSSH2_SESSION                     LIBSSH2_SESSION;\ntypedef struct _LIBSSH2_CHANNEL                     LIBSSH2_CHANNEL;\ntypedef struct _LIBSSH2_LISTENER                    LIBSSH2_LISTENER;\ntypedef struct _LIBSSH2_KNOWNHOSTS                  LIBSSH2_KNOWNHOSTS;\ntypedef struct _LIBSSH2_AGENT                       LIBSSH2_AGENT;\n\ntypedef struct _LIBSSH2_POLLFD {\n    unsigned char type; /* LIBSSH2_POLLFD_* below */\n\n    union {\n        libssh2_socket_t socket; /* File descriptors -- examined with\n                                    system select() call */\n        LIBSSH2_CHANNEL *channel; /* Examined by checking internal state */\n        LIBSSH2_LISTENER *listener; /* Read polls only -- are inbound\n                                       connections waiting to be accepted? */\n    } fd;\n\n    unsigned long events; /* Requested Events */\n    unsigned long revents; /* Returned Events */\n} LIBSSH2_POLLFD;\n\n/* Poll FD Descriptor Types */\n#define LIBSSH2_POLLFD_SOCKET       1\n#define LIBSSH2_POLLFD_CHANNEL      2\n#define LIBSSH2_POLLFD_LISTENER     3\n\n/* Note: Win32 Doesn't actually have a poll() implementation, so some of these\n   values are faked with select() data */\n/* Poll FD events/revents -- Match sys/poll.h where possible */\n#define LIBSSH2_POLLFD_POLLIN           0x0001 /* Data available to be read or\n                                                  connection available --\n                                                  All */\n#define LIBSSH2_POLLFD_POLLPRI          0x0002 /* Priority data available to\n                                                  be read -- Socket only */\n#define LIBSSH2_POLLFD_POLLEXT          0x0002 /* Extended data available to\n                                                  be read -- Channel only */\n#define LIBSSH2_POLLFD_POLLOUT          0x0004 /* Can may be written --\n                                                  Socket/Channel */\n/* revents only */\n#define LIBSSH2_POLLFD_POLLERR          0x0008 /* Error Condition -- Socket */\n#define LIBSSH2_POLLFD_POLLHUP          0x0010 /* HangUp/EOF -- Socket */\n#define LIBSSH2_POLLFD_SESSION_CLOSED   0x0010 /* Session Disconnect */\n#define LIBSSH2_POLLFD_POLLNVAL         0x0020 /* Invalid request -- Socket\n                                                  Only */\n#define LIBSSH2_POLLFD_POLLEX           0x0040 /* Exception Condition --\n                                                  Socket/Win32 */\n#define LIBSSH2_POLLFD_CHANNEL_CLOSED   0x0080 /* Channel Disconnect */\n#define LIBSSH2_POLLFD_LISTENER_CLOSED  0x0080 /* Listener Disconnect */\n\n#define HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION\n/* Block Direction Types */\n#define LIBSSH2_SESSION_BLOCK_INBOUND                  0x0001\n#define LIBSSH2_SESSION_BLOCK_OUTBOUND                 0x0002\n\n/* Hash Types */\n#define LIBSSH2_HOSTKEY_HASH_MD5                            1\n#define LIBSSH2_HOSTKEY_HASH_SHA1                           2\n\n/* Hostkey Types */\n#define LIBSSH2_HOSTKEY_TYPE_UNKNOWN\t\t\t    0\n#define LIBSSH2_HOSTKEY_TYPE_RSA\t\t\t    1\n#define LIBSSH2_HOSTKEY_TYPE_DSS\t\t\t    2\n\n/* Disconnect Codes (defined by SSH protocol) */\n#define SSH_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT          1\n#define SSH_DISCONNECT_PROTOCOL_ERROR                       2\n#define SSH_DISCONNECT_KEY_EXCHANGE_FAILED                  3\n#define SSH_DISCONNECT_RESERVED                             4\n#define SSH_DISCONNECT_MAC_ERROR                            5\n#define SSH_DISCONNECT_COMPRESSION_ERROR                    6\n#define SSH_DISCONNECT_SERVICE_NOT_AVAILABLE                7\n#define SSH_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED       8\n#define SSH_DISCONNECT_HOST_KEY_NOT_VERIFIABLE              9\n#define SSH_DISCONNECT_CONNECTION_LOST                      10\n#define SSH_DISCONNECT_BY_APPLICATION                       11\n#define SSH_DISCONNECT_TOO_MANY_CONNECTIONS                 12\n#define SSH_DISCONNECT_AUTH_CANCELLED_BY_USER               13\n#define SSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE       14\n#define SSH_DISCONNECT_ILLEGAL_USER_NAME                    15\n\n/* Error Codes (defined by libssh2) */\n#define LIBSSH2_ERROR_NONE                      0\n\n/* The library once used -1 as a generic error return value on numerous places\n   through the code, which subsequently was converted to\n   LIBSSH2_ERROR_SOCKET_NONE uses over time. As this is a generic error code,\n   the goal is to never ever return this code but instead make sure that a\n   more accurate and descriptive error code is used. */\n#define LIBSSH2_ERROR_SOCKET_NONE               -1\n\n#define LIBSSH2_ERROR_BANNER_RECV               -2\n#define LIBSSH2_ERROR_BANNER_SEND               -3\n#define LIBSSH2_ERROR_INVALID_MAC               -4\n#define LIBSSH2_ERROR_KEX_FAILURE               -5\n#define LIBSSH2_ERROR_ALLOC                     -6\n#define LIBSSH2_ERROR_SOCKET_SEND               -7\n#define LIBSSH2_ERROR_KEY_EXCHANGE_FAILURE      -8\n#define LIBSSH2_ERROR_TIMEOUT                   -9\n#define LIBSSH2_ERROR_HOSTKEY_INIT              -10\n#define LIBSSH2_ERROR_HOSTKEY_SIGN              -11\n#define LIBSSH2_ERROR_DECRYPT                   -12\n#define LIBSSH2_ERROR_SOCKET_DISCONNECT         -13\n#define LIBSSH2_ERROR_PROTO                     -14\n#define LIBSSH2_ERROR_PASSWORD_EXPIRED          -15\n#define LIBSSH2_ERROR_FILE                      -16\n#define LIBSSH2_ERROR_METHOD_NONE               -17\n#define LIBSSH2_ERROR_AUTHENTICATION_FAILED     -18\n#define LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED    LIBSSH2_ERROR_AUTHENTICATION_FAILED\n#define LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED      -19\n#define LIBSSH2_ERROR_CHANNEL_OUTOFORDER        -20\n#define LIBSSH2_ERROR_CHANNEL_FAILURE           -21\n#define LIBSSH2_ERROR_CHANNEL_REQUEST_DENIED    -22\n#define LIBSSH2_ERROR_CHANNEL_UNKNOWN           -23\n#define LIBSSH2_ERROR_CHANNEL_WINDOW_EXCEEDED   -24\n#define LIBSSH2_ERROR_CHANNEL_PACKET_EXCEEDED   -25\n#define LIBSSH2_ERROR_CHANNEL_CLOSED            -26\n#define LIBSSH2_ERROR_CHANNEL_EOF_SENT          -27\n#define LIBSSH2_ERROR_SCP_PROTOCOL              -28\n#define LIBSSH2_ERROR_ZLIB                      -29\n#define LIBSSH2_ERROR_SOCKET_TIMEOUT            -30\n#define LIBSSH2_ERROR_SFTP_PROTOCOL             -31\n#define LIBSSH2_ERROR_REQUEST_DENIED            -32\n#define LIBSSH2_ERROR_METHOD_NOT_SUPPORTED      -33\n#define LIBSSH2_ERROR_INVAL                     -34\n#define LIBSSH2_ERROR_INVALID_POLL_TYPE         -35\n#define LIBSSH2_ERROR_PUBLICKEY_PROTOCOL        -36\n#define LIBSSH2_ERROR_EAGAIN                    -37\n#define LIBSSH2_ERROR_BUFFER_TOO_SMALL          -38\n#define LIBSSH2_ERROR_BAD_USE                   -39\n#define LIBSSH2_ERROR_COMPRESS                  -40\n#define LIBSSH2_ERROR_OUT_OF_BOUNDARY           -41\n#define LIBSSH2_ERROR_AGENT_PROTOCOL            -42\n#define LIBSSH2_ERROR_SOCKET_RECV               -43\n#define LIBSSH2_ERROR_ENCRYPT                   -44\n#define LIBSSH2_ERROR_BAD_SOCKET                -45\n#define LIBSSH2_ERROR_KNOWN_HOSTS               -46\n\n/* this is a define to provide the old (<= 1.2.7) name */\n#define LIBSSH2_ERROR_BANNER_NONE LIBSSH2_ERROR_BANNER_RECV\n\n/* Global API */\n#define LIBSSH2_INIT_NO_CRYPTO        0x0001\n\n/*\n * libssh2_init()\n *\n * Initialize the libssh2 functions.  This typically initialize the\n * crypto library.  It uses a global state, and is not thread safe --\n * you must make sure this function is not called concurrently.\n *\n * Flags can be:\n * 0:                              Normal initialize\n * LIBSSH2_INIT_NO_CRYPTO:         Do not initialize the crypto library (ie.\n *                                 OPENSSL_add_cipher_algoritms() for OpenSSL\n *\n * Returns 0 if succeeded, or a negative value for error.\n */\nLIBSSH2_API int libssh2_init(int flags);\n\n/*\n * libssh2_exit()\n *\n * Exit the libssh2 functions and free's all memory used internal.\n */\nLIBSSH2_API void libssh2_exit(void);\n\n/*\n * libssh2_free()\n *\n * Deallocate memory allocated by earlier call to libssh2 functions.\n */\nLIBSSH2_API void libssh2_free(LIBSSH2_SESSION *session, void *ptr);\n\n/*\n * libssh2_session_supported_algs()\n *\n * Fills algs with a list of supported acryptographic algorithms. Returns a\n * non-negative number (number of supported algorithms) on success or a\n * negative number (an eror code) on failure.\n *\n * NOTE: on success, algs must be deallocated (by calling libssh2_free) when\n * not needed anymore\n */\nLIBSSH2_API int libssh2_session_supported_algs(LIBSSH2_SESSION* session,\n                                               int method_type,\n                                               const char*** algs);\n\n/* Session API */\nLIBSSH2_API LIBSSH2_SESSION *\nlibssh2_session_init_ex(LIBSSH2_ALLOC_FUNC((*my_alloc)),\n                        LIBSSH2_FREE_FUNC((*my_free)),\n                        LIBSSH2_REALLOC_FUNC((*my_realloc)), void *abstract);\n#define libssh2_session_init() libssh2_session_init_ex(NULL, NULL, NULL, NULL)\n\nLIBSSH2_API void **libssh2_session_abstract(LIBSSH2_SESSION *session);\n\nLIBSSH2_API void *libssh2_session_callback_set(LIBSSH2_SESSION *session,\n                                               int cbtype, void *callback);\nLIBSSH2_API int libssh2_session_banner_set(LIBSSH2_SESSION *session,\n                                           const char *banner);\nLIBSSH2_API int libssh2_banner_set(LIBSSH2_SESSION *session,\n                                   const char *banner);\n\nLIBSSH2_API int libssh2_session_startup(LIBSSH2_SESSION *session, int sock);\nLIBSSH2_API int libssh2_session_handshake(LIBSSH2_SESSION *session,\n                                          libssh2_socket_t sock);\nLIBSSH2_API int libssh2_session_disconnect_ex(LIBSSH2_SESSION *session,\n                                              int reason,\n                                              const char *description,\n                                              const char *lang);\n#define libssh2_session_disconnect(session, description) \\\n  libssh2_session_disconnect_ex((session), SSH_DISCONNECT_BY_APPLICATION, \\\n                                (description), \"\")\n\nLIBSSH2_API int libssh2_session_free(LIBSSH2_SESSION *session);\n\nLIBSSH2_API const char *libssh2_hostkey_hash(LIBSSH2_SESSION *session,\n                                             int hash_type);\n\nLIBSSH2_API const char *libssh2_session_hostkey(LIBSSH2_SESSION *session,\n                                                size_t *len, int *type);\n\nLIBSSH2_API int libssh2_session_method_pref(LIBSSH2_SESSION *session,\n                                            int method_type,\n                                            const char *prefs);\nLIBSSH2_API const char *libssh2_session_methods(LIBSSH2_SESSION *session,\n                                                int method_type);\nLIBSSH2_API int libssh2_session_last_error(LIBSSH2_SESSION *session,\n                                           char **errmsg,\n                                           int *errmsg_len, int want_buf);\nLIBSSH2_API int libssh2_session_last_errno(LIBSSH2_SESSION *session);\nLIBSSH2_API int libssh2_session_block_directions(LIBSSH2_SESSION *session);\n\nLIBSSH2_API int libssh2_session_flag(LIBSSH2_SESSION *session, int flag,\n                                     int value);\nLIBSSH2_API const char *libssh2_session_banner_get(LIBSSH2_SESSION *session);\n\n/* Userauth API */\nLIBSSH2_API char *libssh2_userauth_list(LIBSSH2_SESSION *session,\n                                        const char *username,\n                                        unsigned int username_len);\nLIBSSH2_API int libssh2_userauth_authenticated(LIBSSH2_SESSION *session);\n\nLIBSSH2_API int libssh2_userauth_password_ex(LIBSSH2_SESSION *session,\n                                             const char *username,\n                                             unsigned int username_len,\n                                             const char *password,\n                                             unsigned int password_len,\n                                             LIBSSH2_PASSWD_CHANGEREQ_FUNC((*passwd_change_cb)));\n\n#define libssh2_userauth_password(session, username, password) \\\n libssh2_userauth_password_ex((session), (username),           \\\n                              (unsigned int)strlen(username),  \\\n                              (password), (unsigned int)strlen(password), NULL)\n\nLIBSSH2_API int\nlibssh2_userauth_publickey_fromfile_ex(LIBSSH2_SESSION *session,\n                                       const char *username,\n                                       unsigned int username_len,\n                                       const char *publickey,\n                                       const char *privatekey,\n                                       const char *passphrase);\n\n#define libssh2_userauth_publickey_fromfile(session, username, publickey, \\\n                                            privatekey, passphrase)     \\\n    libssh2_userauth_publickey_fromfile_ex((session), (username),       \\\n                                           (unsigned int)strlen(username), \\\n                                           (publickey),                 \\\n                                           (privatekey), (passphrase))\n\nLIBSSH2_API int\nlibssh2_userauth_publickey(LIBSSH2_SESSION *session,\n                           const char *username,\n                           const unsigned char *pubkeydata,\n                           size_t pubkeydata_len,\n                           LIBSSH2_USERAUTH_PUBLICKEY_SIGN_FUNC((*sign_callback)),\n                           void **abstract);\n\nLIBSSH2_API int\nlibssh2_userauth_hostbased_fromfile_ex(LIBSSH2_SESSION *session,\n                                       const char *username,\n                                       unsigned int username_len,\n                                       const char *publickey,\n                                       const char *privatekey,\n                                       const char *passphrase,\n                                       const char *hostname,\n                                       unsigned int hostname_len,\n                                       const char *local_username,\n                                       unsigned int local_username_len);\n\n#define libssh2_userauth_hostbased_fromfile(session, username, publickey, \\\n                                            privatekey, passphrase, hostname) \\\n libssh2_userauth_hostbased_fromfile_ex((session), (username), \\\n                                        (unsigned int)strlen(username), \\\n                                        (publickey),                    \\\n                                        (privatekey), (passphrase),     \\\n                                        (hostname),                     \\\n                                        (unsigned int)strlen(hostname), \\\n                                        (username),                     \\\n                                        (unsigned int)strlen(username))\n\nLIBSSH2_API int\nlibssh2_userauth_publickey_frommemory(LIBSSH2_SESSION *session,\n                                      const char *username,\n                                      size_t username_len,\n                                      const char *publickeyfiledata,\n                                      size_t publickeyfiledata_len,\n                                      const char *privatekeyfiledata,\n                                      size_t privatekeyfiledata_len,\n                                      const char *passphrase);\n\n/*\n * response_callback is provided with filled by library prompts array,\n * but client must allocate and fill individual responses. Responses\n * array is already allocated. Responses data will be freed by libssh2\n * after callback return, but before subsequent callback invokation.\n */\nLIBSSH2_API int\nlibssh2_userauth_keyboard_interactive_ex(LIBSSH2_SESSION* session,\n                                         const char *username,\n                                         unsigned int username_len,\n                                         LIBSSH2_USERAUTH_KBDINT_RESPONSE_FUNC((*response_callback)));\n\n#define libssh2_userauth_keyboard_interactive(session, username,        \\\n                                              response_callback)        \\\n    libssh2_userauth_keyboard_interactive_ex((session), (username),     \\\n                                             (unsigned int)strlen(username), \\\n                                             (response_callback))\n\nLIBSSH2_API int libssh2_poll(LIBSSH2_POLLFD *fds, unsigned int nfds,\n                             long timeout);\n\n/* Channel API */\n#define LIBSSH2_CHANNEL_WINDOW_DEFAULT  (2*1024*1024)\n#define LIBSSH2_CHANNEL_PACKET_DEFAULT  32768\n#define LIBSSH2_CHANNEL_MINADJUST       1024\n\n/* Extended Data Handling */\n#define LIBSSH2_CHANNEL_EXTENDED_DATA_NORMAL        0\n#define LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE        1\n#define LIBSSH2_CHANNEL_EXTENDED_DATA_MERGE         2\n\n#define SSH_EXTENDED_DATA_STDERR 1\n\n/* Returned by any function that would block during a read/write opperation */\n#define LIBSSH2CHANNEL_EAGAIN LIBSSH2_ERROR_EAGAIN\n\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_channel_open_ex(LIBSSH2_SESSION *session, const char *channel_type,\n                        unsigned int channel_type_len,\n                        unsigned int window_size, unsigned int packet_size,\n                        const char *message, unsigned int message_len);\n\n#define libssh2_channel_open_session(session) \\\n  libssh2_channel_open_ex((session), \"session\", sizeof(\"session\") - 1, \\\n                          LIBSSH2_CHANNEL_WINDOW_DEFAULT, \\\n                          LIBSSH2_CHANNEL_PACKET_DEFAULT, NULL, 0)\n\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_channel_direct_tcpip_ex(LIBSSH2_SESSION *session, const char *host,\n                                int port, const char *shost, int sport);\n#define libssh2_channel_direct_tcpip(session, host, port) \\\n  libssh2_channel_direct_tcpip_ex((session), (host), (port), \"127.0.0.1\", 22)\n\nLIBSSH2_API LIBSSH2_LISTENER *\nlibssh2_channel_forward_listen_ex(LIBSSH2_SESSION *session, const char *host,\n                                  int port, int *bound_port, int queue_maxsize);\n#define libssh2_channel_forward_listen(session, port) \\\n libssh2_channel_forward_listen_ex((session), NULL, (port), NULL, 16)\n\nLIBSSH2_API int libssh2_channel_forward_cancel(LIBSSH2_LISTENER *listener);\n\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_channel_forward_accept(LIBSSH2_LISTENER *listener);\n\nLIBSSH2_API int libssh2_channel_setenv_ex(LIBSSH2_CHANNEL *channel,\n                                          const char *varname,\n                                          unsigned int varname_len,\n                                          const char *value,\n                                          unsigned int value_len);\n\n#define libssh2_channel_setenv(channel, varname, value)                 \\\n    libssh2_channel_setenv_ex((channel), (varname),                     \\\n                              (unsigned int)strlen(varname), (value),   \\\n                              (unsigned int)strlen(value))\n\nLIBSSH2_API int libssh2_channel_request_pty_ex(LIBSSH2_CHANNEL *channel,\n                                               const char *term,\n                                               unsigned int term_len,\n                                               const char *modes,\n                                               unsigned int modes_len,\n                                               int width, int height,\n                                               int width_px, int height_px);\n#define libssh2_channel_request_pty(channel, term)                      \\\n    libssh2_channel_request_pty_ex((channel), (term),                   \\\n                                   (unsigned int)strlen(term),          \\\n                                   NULL, 0,                             \\\n                                   LIBSSH2_TERM_WIDTH, LIBSSH2_TERM_HEIGHT, \\\n                                   LIBSSH2_TERM_WIDTH_PX, LIBSSH2_TERM_HEIGHT_PX)\n\nLIBSSH2_API int libssh2_channel_request_pty_size_ex(LIBSSH2_CHANNEL *channel,\n                                                    int width, int height,\n                                                    int width_px,\n                                                    int height_px);\n#define libssh2_channel_request_pty_size(channel, width, height) \\\n  libssh2_channel_request_pty_size_ex( (channel), (width), (height), 0, 0)\n\nLIBSSH2_API int libssh2_channel_x11_req_ex(LIBSSH2_CHANNEL *channel,\n                                           int single_connection,\n                                           const char *auth_proto,\n                                           const char *auth_cookie,\n                                           int screen_number);\n#define libssh2_channel_x11_req(channel, screen_number) \\\n libssh2_channel_x11_req_ex((channel), 0, NULL, NULL, (screen_number))\n\nLIBSSH2_API int libssh2_channel_process_startup(LIBSSH2_CHANNEL *channel,\n                                                const char *request,\n                                                unsigned int request_len,\n                                                const char *message,\n                                                unsigned int message_len);\n#define libssh2_channel_shell(channel) \\\n  libssh2_channel_process_startup((channel), \"shell\", sizeof(\"shell\") - 1, \\\n                                  NULL, 0)\n#define libssh2_channel_exec(channel, command) \\\n  libssh2_channel_process_startup((channel), \"exec\", sizeof(\"exec\") - 1, \\\n                                  (command), (unsigned int)strlen(command))\n#define libssh2_channel_subsystem(channel, subsystem) \\\n  libssh2_channel_process_startup((channel), \"subsystem\",              \\\n                                  sizeof(\"subsystem\") - 1, (subsystem), \\\n                                  (unsigned int)strlen(subsystem))\n\nLIBSSH2_API ssize_t libssh2_channel_read_ex(LIBSSH2_CHANNEL *channel,\n                                            int stream_id, char *buf,\n                                            size_t buflen);\n#define libssh2_channel_read(channel, buf, buflen) \\\n  libssh2_channel_read_ex((channel), 0, (buf), (buflen))\n#define libssh2_channel_read_stderr(channel, buf, buflen) \\\n  libssh2_channel_read_ex((channel), SSH_EXTENDED_DATA_STDERR, (buf), (buflen))\n\nLIBSSH2_API int libssh2_poll_channel_read(LIBSSH2_CHANNEL *channel,\n                                          int extended);\n\nLIBSSH2_API unsigned long\nlibssh2_channel_window_read_ex(LIBSSH2_CHANNEL *channel,\n                               unsigned long *read_avail,\n                               unsigned long *window_size_initial);\n#define libssh2_channel_window_read(channel) \\\n  libssh2_channel_window_read_ex((channel), NULL, NULL)\n\n/* libssh2_channel_receive_window_adjust is DEPRECATED, do not use! */\nLIBSSH2_API unsigned long\nlibssh2_channel_receive_window_adjust(LIBSSH2_CHANNEL *channel,\n                                      unsigned long adjustment,\n                                      unsigned char force);\n\nLIBSSH2_API int\nlibssh2_channel_receive_window_adjust2(LIBSSH2_CHANNEL *channel,\n                                       unsigned long adjustment,\n                                       unsigned char force,\n                                       unsigned int *storewindow);\n\nLIBSSH2_API ssize_t libssh2_channel_write_ex(LIBSSH2_CHANNEL *channel,\n                                             int stream_id, const char *buf,\n                                             size_t buflen);\n\n#define libssh2_channel_write(channel, buf, buflen) \\\n  libssh2_channel_write_ex((channel), 0, (buf), (buflen))\n#define libssh2_channel_write_stderr(channel, buf, buflen)  \\\n  libssh2_channel_write_ex((channel), SSH_EXTENDED_DATA_STDERR, (buf), (buflen))\n\nLIBSSH2_API unsigned long\nlibssh2_channel_window_write_ex(LIBSSH2_CHANNEL *channel,\n                                unsigned long *window_size_initial);\n#define libssh2_channel_window_write(channel) \\\n  libssh2_channel_window_write_ex((channel), NULL)\n\nLIBSSH2_API void libssh2_session_set_blocking(LIBSSH2_SESSION* session,\n                                              int blocking);\nLIBSSH2_API int libssh2_session_get_blocking(LIBSSH2_SESSION* session);\n\nLIBSSH2_API void libssh2_channel_set_blocking(LIBSSH2_CHANNEL *channel,\n                                              int blocking);\n\nLIBSSH2_API void libssh2_session_set_timeout(LIBSSH2_SESSION* session,\n                                             long timeout);\nLIBSSH2_API long libssh2_session_get_timeout(LIBSSH2_SESSION* session);\n\n/* libssh2_channel_handle_extended_data is DEPRECATED, do not use! */\nLIBSSH2_API void libssh2_channel_handle_extended_data(LIBSSH2_CHANNEL *channel,\n                                                      int ignore_mode);\nLIBSSH2_API int libssh2_channel_handle_extended_data2(LIBSSH2_CHANNEL *channel,\n                                                      int ignore_mode);\n\n/* libssh2_channel_ignore_extended_data() is defined below for BC with version\n * 0.1\n *\n * Future uses should use libssh2_channel_handle_extended_data() directly if\n * LIBSSH2_CHANNEL_EXTENDED_DATA_MERGE is passed, extended data will be read\n * (FIFO) from the standard data channel\n */\n/* DEPRECATED */\n#define libssh2_channel_ignore_extended_data(channel, ignore) \\\n  libssh2_channel_handle_extended_data((channel),                       \\\n                                       (ignore) ?                       \\\n                                       LIBSSH2_CHANNEL_EXTENDED_DATA_IGNORE : \\\n                                       LIBSSH2_CHANNEL_EXTENDED_DATA_NORMAL )\n\n#define LIBSSH2_CHANNEL_FLUSH_EXTENDED_DATA     -1\n#define LIBSSH2_CHANNEL_FLUSH_ALL               -2\nLIBSSH2_API int libssh2_channel_flush_ex(LIBSSH2_CHANNEL *channel,\n                                         int streamid);\n#define libssh2_channel_flush(channel) libssh2_channel_flush_ex((channel), 0)\n#define libssh2_channel_flush_stderr(channel) \\\n libssh2_channel_flush_ex((channel), SSH_EXTENDED_DATA_STDERR)\n\nLIBSSH2_API int libssh2_channel_get_exit_status(LIBSSH2_CHANNEL* channel);\nLIBSSH2_API int libssh2_channel_get_exit_signal(LIBSSH2_CHANNEL* channel,\n                                                char **exitsignal,\n                                                size_t *exitsignal_len,\n                                                char **errmsg,\n                                                size_t *errmsg_len,\n                                                char **langtag,\n                                                size_t *langtag_len);\nLIBSSH2_API int libssh2_channel_send_eof(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API int libssh2_channel_eof(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API int libssh2_channel_wait_eof(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API int libssh2_channel_close(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API int libssh2_channel_wait_closed(LIBSSH2_CHANNEL *channel);\nLIBSSH2_API int libssh2_channel_free(LIBSSH2_CHANNEL *channel);\n\nLIBSSH2_API LIBSSH2_CHANNEL *libssh2_scp_recv(LIBSSH2_SESSION *session,\n                                              const char *path,\n                                              struct stat *sb);\nLIBSSH2_API LIBSSH2_CHANNEL *libssh2_scp_send_ex(LIBSSH2_SESSION *session,\n                                                 const char *path, int mode,\n                                                 size_t size, long mtime,\n                                                 long atime);\nLIBSSH2_API LIBSSH2_CHANNEL *\nlibssh2_scp_send64(LIBSSH2_SESSION *session, const char *path, int mode,\n                   libssh2_int64_t size, time_t mtime, time_t atime);\n\n#define libssh2_scp_send(session, path, mode, size) \\\n  libssh2_scp_send_ex((session), (path), (mode), (size), 0, 0)\n\nLIBSSH2_API int libssh2_base64_decode(LIBSSH2_SESSION *session, char **dest,\n                                      unsigned int *dest_len,\n                                      const char *src, unsigned int src_len);\n\nLIBSSH2_API\nconst char *libssh2_version(int req_version_num);\n\n#define HAVE_LIBSSH2_KNOWNHOST_API 0x010101 /* since 1.1.1 */\n#define HAVE_LIBSSH2_VERSION_API   0x010100 /* libssh2_version since 1.1 */\n\nstruct libssh2_knownhost {\n    unsigned int magic;  /* magic stored by the library */\n    void *node; /* handle to the internal representation of this host */\n    char *name; /* this is NULL if no plain text host name exists */\n    char *key;  /* key in base64/printable format */\n    int typemask;\n};\n\n/*\n * libssh2_knownhost_init\n *\n * Init a collection of known hosts. Returns the pointer to a collection.\n *\n */\nLIBSSH2_API LIBSSH2_KNOWNHOSTS *\nlibssh2_knownhost_init(LIBSSH2_SESSION *session);\n\n/*\n * libssh2_knownhost_add\n *\n * Add a host and its associated key to the collection of known hosts.\n *\n * The 'type' argument specifies on what format the given host and keys are:\n *\n * plain  - ascii \"hostname.domain.tld\"\n * sha1   - SHA1(<salt> <host>) base64-encoded!\n * custom - another hash\n *\n * If 'sha1' is selected as type, the salt must be provided to the salt\n * argument. This too base64 encoded.\n *\n * The SHA-1 hash is what OpenSSH can be told to use in known_hosts files.  If\n * a custom type is used, salt is ignored and you must provide the host\n * pre-hashed when checking for it in the libssh2_knownhost_check() function.\n *\n * The keylen parameter may be omitted (zero) if the key is provided as a\n * NULL-terminated base64-encoded string.\n */\n\n/* host format (2 bits) */\n#define LIBSSH2_KNOWNHOST_TYPE_MASK    0xffff\n#define LIBSSH2_KNOWNHOST_TYPE_PLAIN   1\n#define LIBSSH2_KNOWNHOST_TYPE_SHA1    2 /* always base64 encoded */\n#define LIBSSH2_KNOWNHOST_TYPE_CUSTOM  3\n\n/* key format (2 bits) */\n#define LIBSSH2_KNOWNHOST_KEYENC_MASK     (3<<16)\n#define LIBSSH2_KNOWNHOST_KEYENC_RAW      (1<<16)\n#define LIBSSH2_KNOWNHOST_KEYENC_BASE64   (2<<16)\n\n/* type of key (2 bits) */\n#define LIBSSH2_KNOWNHOST_KEY_MASK     (7<<18)\n#define LIBSSH2_KNOWNHOST_KEY_SHIFT    18\n#define LIBSSH2_KNOWNHOST_KEY_RSA1     (1<<18)\n#define LIBSSH2_KNOWNHOST_KEY_SSHRSA   (2<<18)\n#define LIBSSH2_KNOWNHOST_KEY_SSHDSS   (3<<18)\n#define LIBSSH2_KNOWNHOST_KEY_UNKNOWN  (7<<18)\n\nLIBSSH2_API int\nlibssh2_knownhost_add(LIBSSH2_KNOWNHOSTS *hosts,\n                      const char *host,\n                      const char *salt,\n                      const char *key, size_t keylen, int typemask,\n                      struct libssh2_knownhost **store);\n\n/*\n * libssh2_knownhost_addc\n *\n * Add a host and its associated key to the collection of known hosts.\n *\n * Takes a comment argument that may be NULL.  A NULL comment indicates\n * there is no comment and the entry will end directly after the key\n * when written out to a file.  An empty string \"\" comment will indicate an\n * empty comment which will cause a single space to be written after the key.\n *\n * The 'type' argument specifies on what format the given host and keys are:\n *\n * plain  - ascii \"hostname.domain.tld\"\n * sha1   - SHA1(<salt> <host>) base64-encoded!\n * custom - another hash\n *\n * If 'sha1' is selected as type, the salt must be provided to the salt\n * argument. This too base64 encoded.\n *\n * The SHA-1 hash is what OpenSSH can be told to use in known_hosts files.  If\n * a custom type is used, salt is ignored and you must provide the host\n * pre-hashed when checking for it in the libssh2_knownhost_check() function.\n *\n * The keylen parameter may be omitted (zero) if the key is provided as a\n * NULL-terminated base64-encoded string.\n */\n\nLIBSSH2_API int\nlibssh2_knownhost_addc(LIBSSH2_KNOWNHOSTS *hosts,\n                       const char *host,\n                       const char *salt,\n                       const char *key, size_t keylen,\n                       const char *comment, size_t commentlen, int typemask,\n                       struct libssh2_knownhost **store);\n\n/*\n * libssh2_knownhost_check\n *\n * Check a host and its associated key against the collection of known hosts.\n *\n * The type is the type/format of the given host name.\n *\n * plain  - ascii \"hostname.domain.tld\"\n * custom - prehashed base64 encoded. Note that this cannot use any salts.\n *\n *\n * 'knownhost' may be set to NULL if you don't care about that info.\n *\n * Returns:\n *\n * LIBSSH2_KNOWNHOST_CHECK_* values, see below\n *\n */\n\n#define LIBSSH2_KNOWNHOST_CHECK_MATCH    0\n#define LIBSSH2_KNOWNHOST_CHECK_MISMATCH 1\n#define LIBSSH2_KNOWNHOST_CHECK_NOTFOUND 2\n#define LIBSSH2_KNOWNHOST_CHECK_FAILURE  3\n\nLIBSSH2_API int\nlibssh2_knownhost_check(LIBSSH2_KNOWNHOSTS *hosts,\n                        const char *host, const char *key, size_t keylen,\n                        int typemask,\n                        struct libssh2_knownhost **knownhost);\n\n/* this function is identital to the above one, but also takes a port\n   argument that allows libssh2 to do a better check */\nLIBSSH2_API int\nlibssh2_knownhost_checkp(LIBSSH2_KNOWNHOSTS *hosts,\n                         const char *host, int port,\n                         const char *key, size_t keylen,\n                         int typemask,\n                         struct libssh2_knownhost **knownhost);\n\n/*\n * libssh2_knownhost_del\n *\n * Remove a host from the collection of known hosts. The 'entry' struct is\n * retrieved by a call to libssh2_knownhost_check().\n *\n */\nLIBSSH2_API int\nlibssh2_knownhost_del(LIBSSH2_KNOWNHOSTS *hosts,\n                      struct libssh2_knownhost *entry);\n\n/*\n * libssh2_knownhost_free\n *\n * Free an entire collection of known hosts.\n *\n */\nLIBSSH2_API void\nlibssh2_knownhost_free(LIBSSH2_KNOWNHOSTS *hosts);\n\n/*\n * libssh2_knownhost_readline()\n *\n * Pass in a line of a file of 'type'. It makes libssh2 read this line.\n *\n * LIBSSH2_KNOWNHOST_FILE_OPENSSH is the only supported type.\n *\n */\nLIBSSH2_API int\nlibssh2_knownhost_readline(LIBSSH2_KNOWNHOSTS *hosts,\n                           const char *line, size_t len, int type);\n\n/*\n * libssh2_knownhost_readfile\n *\n * Add hosts+key pairs from a given file.\n *\n * Returns a negative value for error or number of successfully added hosts.\n *\n * This implementation currently only knows one 'type' (openssh), all others\n * are reserved for future use.\n */\n\n#define LIBSSH2_KNOWNHOST_FILE_OPENSSH 1\n\nLIBSSH2_API int\nlibssh2_knownhost_readfile(LIBSSH2_KNOWNHOSTS *hosts,\n                           const char *filename, int type);\n\n/*\n * libssh2_knownhost_writeline()\n *\n * Ask libssh2 to convert a known host to an output line for storage.\n *\n * Note that this function returns LIBSSH2_ERROR_BUFFER_TOO_SMALL if the given\n * output buffer is too small to hold the desired output.\n *\n * This implementation currently only knows one 'type' (openssh), all others\n * are reserved for future use.\n *\n */\nLIBSSH2_API int\nlibssh2_knownhost_writeline(LIBSSH2_KNOWNHOSTS *hosts,\n                            struct libssh2_knownhost *known,\n                            char *buffer, size_t buflen,\n                            size_t *outlen, /* the amount of written data */\n                            int type);\n\n/*\n * libssh2_knownhost_writefile\n *\n * Write hosts+key pairs to a given file.\n *\n * This implementation currently only knows one 'type' (openssh), all others\n * are reserved for future use.\n */\n\nLIBSSH2_API int\nlibssh2_knownhost_writefile(LIBSSH2_KNOWNHOSTS *hosts,\n                            const char *filename, int type);\n\n/*\n * libssh2_knownhost_get()\n *\n * Traverse the internal list of known hosts. Pass NULL to 'prev' to get\n * the first one. Or pass a poiner to the previously returned one to get the\n * next.\n *\n * Returns:\n * 0 if a fine host was stored in 'store'\n * 1 if end of hosts\n * [negative] on errors\n */\nLIBSSH2_API int\nlibssh2_knownhost_get(LIBSSH2_KNOWNHOSTS *hosts,\n                      struct libssh2_knownhost **store,\n                      struct libssh2_knownhost *prev);\n\n#define HAVE_LIBSSH2_AGENT_API 0x010202 /* since 1.2.2 */\n\nstruct libssh2_agent_publickey {\n    unsigned int magic;              /* magic stored by the library */\n    void *node;     /* handle to the internal representation of key */\n    unsigned char *blob;           /* public key blob */\n    size_t blob_len;               /* length of the public key blob */\n    char *comment;                 /* comment in printable format */\n};\n\n/*\n * libssh2_agent_init\n *\n * Init an ssh-agent handle. Returns the pointer to the handle.\n *\n */\nLIBSSH2_API LIBSSH2_AGENT *\nlibssh2_agent_init(LIBSSH2_SESSION *session);\n\n/*\n * libssh2_agent_connect()\n *\n * Connect to an ssh-agent.\n *\n * Returns 0 if succeeded, or a negative value for error.\n */\nLIBSSH2_API int\nlibssh2_agent_connect(LIBSSH2_AGENT *agent);\n\n/*\n * libssh2_agent_list_identities()\n *\n * Request an ssh-agent to list identities.\n *\n * Returns 0 if succeeded, or a negative value for error.\n */\nLIBSSH2_API int\nlibssh2_agent_list_identities(LIBSSH2_AGENT *agent);\n\n/*\n * libssh2_agent_get_identity()\n *\n * Traverse the internal list of public keys. Pass NULL to 'prev' to get\n * the first one. Or pass a poiner to the previously returned one to get the\n * next.\n *\n * Returns:\n * 0 if a fine public key was stored in 'store'\n * 1 if end of public keys\n * [negative] on errors\n */\nLIBSSH2_API int\nlibssh2_agent_get_identity(LIBSSH2_AGENT *agent,\n               struct libssh2_agent_publickey **store,\n               struct libssh2_agent_publickey *prev);\n\n/*\n * libssh2_agent_userauth()\n *\n * Do publickey user authentication with the help of ssh-agent.\n *\n * Returns 0 if succeeded, or a negative value for error.\n */\nLIBSSH2_API int\nlibssh2_agent_userauth(LIBSSH2_AGENT *agent,\n               const char *username,\n               struct libssh2_agent_publickey *identity);\n\n/*\n * libssh2_agent_disconnect()\n *\n * Close a connection to an ssh-agent.\n *\n * Returns 0 if succeeded, or a negative value for error.\n */\nLIBSSH2_API int\nlibssh2_agent_disconnect(LIBSSH2_AGENT *agent);\n\n/*\n * libssh2_agent_free()\n *\n * Free an ssh-agent handle.  This function also frees the internal\n * collection of public keys.\n */\nLIBSSH2_API void\nlibssh2_agent_free(LIBSSH2_AGENT *agent);\n\n\n/*\n * libssh2_keepalive_config()\n *\n * Set how often keepalive messages should be sent.  WANT_REPLY\n * indicates whether the keepalive messages should request a response\n * from the server.  INTERVAL is number of seconds that can pass\n * without any I/O, use 0 (the default) to disable keepalives.  To\n * avoid some busy-loop corner-cases, if you specify an interval of 1\n * it will be treated as 2.\n *\n * Note that non-blocking applications are responsible for sending the\n * keepalive messages using libssh2_keepalive_send().\n */\nLIBSSH2_API void libssh2_keepalive_config (LIBSSH2_SESSION *session,\n                                           int want_reply,\n                                           unsigned interval);\n\n/*\n * libssh2_keepalive_send()\n *\n * Send a keepalive message if needed.  SECONDS_TO_NEXT indicates how\n * many seconds you can sleep after this call before you need to call\n * it again.  Returns 0 on success, or LIBSSH2_ERROR_SOCKET_SEND on\n * I/O errors.\n */\nLIBSSH2_API int libssh2_keepalive_send (LIBSSH2_SESSION *session,\n                                        int *seconds_to_next);\n\n/* NOTE NOTE NOTE\n   libssh2_trace() has no function in builds that aren't built with debug\n   enabled\n */\nLIBSSH2_API int libssh2_trace(LIBSSH2_SESSION *session, int bitmask);\n#define LIBSSH2_TRACE_TRANS (1<<1)\n#define LIBSSH2_TRACE_KEX   (1<<2)\n#define LIBSSH2_TRACE_AUTH  (1<<3)\n#define LIBSSH2_TRACE_CONN  (1<<4)\n#define LIBSSH2_TRACE_SCP   (1<<5)\n#define LIBSSH2_TRACE_SFTP  (1<<6)\n#define LIBSSH2_TRACE_ERROR (1<<7)\n#define LIBSSH2_TRACE_PUBLICKEY (1<<8)\n#define LIBSSH2_TRACE_SOCKET (1<<9)\n\ntypedef void (*libssh2_trace_handler_func)(LIBSSH2_SESSION*,\n                                           void*,\n                                           const char *,\n                                           size_t);\nLIBSSH2_API int libssh2_trace_sethandler(LIBSSH2_SESSION *session,\n                                         void* context,\n                                         libssh2_trace_handler_func callback);\n\n#ifdef __cplusplus\n} /* extern \"C\" */\n#endif\n\n#endif /* !RC_INVOKED */\n\n#endif /* LIBSSH2_H */\n"
  },
  {
    "path": "Sublime/Pods/NMSSH/NMSSH-iOS/Libraries/include/libssh2/libssh2_publickey.h",
    "content": "/* Copyright (c) 2004-2006, Sara Golemon <sarag@libssh2.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n/* Note: This include file is only needed for using the\n * publickey SUBSYSTEM which is not the same as publickey\n * authentication.  For authentication you only need libssh2.h\n *\n * For more information on the publickey subsystem,\n * refer to IETF draft: secsh-publickey\n */\n\n#ifndef LIBSSH2_PUBLICKEY_H\n#define LIBSSH2_PUBLICKEY_H 1\n\n#include \"libssh2.h\"\n\ntypedef struct _LIBSSH2_PUBLICKEY               LIBSSH2_PUBLICKEY;\n\ntypedef struct _libssh2_publickey_attribute {\n    const char *name;\n    unsigned long name_len;\n    const char *value;\n    unsigned long value_len;\n    char mandatory;\n} libssh2_publickey_attribute;\n\ntypedef struct _libssh2_publickey_list {\n    unsigned char *packet; /* For freeing */\n\n    const unsigned char *name;\n    unsigned long name_len;\n    const unsigned char *blob;\n    unsigned long blob_len;\n    unsigned long num_attrs;\n    libssh2_publickey_attribute *attrs; /* free me */\n} libssh2_publickey_list;\n\n/* Generally use the first macro here, but if both name and value are string literals, you can use _fast() to take advantage of preprocessing */\n#define libssh2_publickey_attribute(name, value, mandatory) \\\n  { (name), strlen(name), (value), strlen(value), (mandatory) },\n#define libssh2_publickey_attribute_fast(name, value, mandatory) \\\n  { (name), sizeof(name) - 1, (value), sizeof(value) - 1, (mandatory) },\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Publickey Subsystem */\nLIBSSH2_API LIBSSH2_PUBLICKEY *libssh2_publickey_init(LIBSSH2_SESSION *session);\n\nLIBSSH2_API int libssh2_publickey_add_ex(LIBSSH2_PUBLICKEY *pkey,\n                                         const unsigned char *name,\n                                         unsigned long name_len,\n                                         const unsigned char *blob,\n                                         unsigned long blob_len, char overwrite,\n                                         unsigned long num_attrs,\n                                         const libssh2_publickey_attribute attrs[]);\n#define libssh2_publickey_add(pkey, name, blob, blob_len, overwrite, \\\n                              num_attrs, attrs)                         \\\n  libssh2_publickey_add_ex((pkey), (name), strlen(name), (blob), (blob_len), \\\n                           (overwrite), (num_attrs), (attrs))\n\nLIBSSH2_API int libssh2_publickey_remove_ex(LIBSSH2_PUBLICKEY *pkey,\n                                            const unsigned char *name,\n                                            unsigned long name_len,\n                                            const unsigned char *blob,\n                                            unsigned long blob_len);\n#define libssh2_publickey_remove(pkey, name, blob, blob_len) \\\n  libssh2_publickey_remove_ex((pkey), (name), strlen(name), (blob), (blob_len))\n\nLIBSSH2_API int\nlibssh2_publickey_list_fetch(LIBSSH2_PUBLICKEY *pkey,\n                             unsigned long *num_keys,\n                             libssh2_publickey_list **pkey_list);\nLIBSSH2_API void libssh2_publickey_list_free(LIBSSH2_PUBLICKEY *pkey,\n                                             libssh2_publickey_list *pkey_list);\n\nLIBSSH2_API int libssh2_publickey_shutdown(LIBSSH2_PUBLICKEY *pkey);\n\n#ifdef __cplusplus\n} /* extern \"C\" */\n#endif\n\n#endif /* ifndef: LIBSSH2_PUBLICKEY_H */\n"
  },
  {
    "path": "Sublime/Pods/NMSSH/NMSSH-iOS/Libraries/include/libssh2/libssh2_sftp.h",
    "content": "/* Copyright (c) 2004-2008, Sara Golemon <sarag@libssh2.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms,\n * with or without modification, are permitted provided\n * that the following conditions are met:\n *\n *   Redistributions of source code must retain the above\n *   copyright notice, this list of conditions and the\n *   following disclaimer.\n *\n *   Redistributions in binary form must reproduce the above\n *   copyright notice, this list of conditions and the following\n *   disclaimer in the documentation and/or other materials\n *   provided with the distribution.\n *\n *   Neither the name of the copyright holder nor the names\n *   of any other contributors may be used to endorse or\n *   promote products derived from this software without\n *   specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n */\n\n#ifndef LIBSSH2_SFTP_H\n#define LIBSSH2_SFTP_H 1\n\n#include \"libssh2.h\"\n\n#ifndef WIN32\n#include <unistd.h>\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Note: Version 6 was documented at the time of writing\n * However it was marked as \"DO NOT IMPLEMENT\" due to pending changes\n *\n * Let's start with Version 3 (The version found in OpenSSH) and go from there\n */\n#define LIBSSH2_SFTP_VERSION        3\n\ntypedef struct _LIBSSH2_SFTP                LIBSSH2_SFTP;\ntypedef struct _LIBSSH2_SFTP_HANDLE         LIBSSH2_SFTP_HANDLE;\ntypedef struct _LIBSSH2_SFTP_ATTRIBUTES     LIBSSH2_SFTP_ATTRIBUTES;\ntypedef struct _LIBSSH2_SFTP_STATVFS        LIBSSH2_SFTP_STATVFS;\n\n/* Flags for open_ex() */\n#define LIBSSH2_SFTP_OPENFILE           0\n#define LIBSSH2_SFTP_OPENDIR            1\n\n/* Flags for rename_ex() */\n#define LIBSSH2_SFTP_RENAME_OVERWRITE   0x00000001\n#define LIBSSH2_SFTP_RENAME_ATOMIC      0x00000002\n#define LIBSSH2_SFTP_RENAME_NATIVE      0x00000004\n\n/* Flags for stat_ex() */\n#define LIBSSH2_SFTP_STAT               0\n#define LIBSSH2_SFTP_LSTAT              1\n#define LIBSSH2_SFTP_SETSTAT            2\n\n/* Flags for symlink_ex() */\n#define LIBSSH2_SFTP_SYMLINK            0\n#define LIBSSH2_SFTP_READLINK           1\n#define LIBSSH2_SFTP_REALPATH           2\n\n/* SFTP attribute flag bits */\n#define LIBSSH2_SFTP_ATTR_SIZE              0x00000001\n#define LIBSSH2_SFTP_ATTR_UIDGID            0x00000002\n#define LIBSSH2_SFTP_ATTR_PERMISSIONS       0x00000004\n#define LIBSSH2_SFTP_ATTR_ACMODTIME         0x00000008\n#define LIBSSH2_SFTP_ATTR_EXTENDED          0x80000000\n\n/* SFTP statvfs flag bits */\n#define LIBSSH2_SFTP_ST_RDONLY              0x00000001\n#define LIBSSH2_SFTP_ST_NOSUID              0x00000002\n\nstruct _LIBSSH2_SFTP_ATTRIBUTES {\n    /* If flags & ATTR_* bit is set, then the value in this struct will be\n     * meaningful Otherwise it should be ignored\n     */\n    unsigned long flags;\n\n    libssh2_uint64_t filesize;\n    unsigned long uid, gid;\n    unsigned long permissions;\n    unsigned long atime, mtime;\n};\n\nstruct _LIBSSH2_SFTP_STATVFS {\n    libssh2_uint64_t  f_bsize;    /* file system block size */\n    libssh2_uint64_t  f_frsize;   /* fragment size */\n    libssh2_uint64_t  f_blocks;   /* size of fs in f_frsize units */\n    libssh2_uint64_t  f_bfree;    /* # free blocks */\n    libssh2_uint64_t  f_bavail;   /* # free blocks for non-root */\n    libssh2_uint64_t  f_files;    /* # inodes */\n    libssh2_uint64_t  f_ffree;    /* # free inodes */\n    libssh2_uint64_t  f_favail;   /* # free inodes for non-root */\n    libssh2_uint64_t  f_fsid;     /* file system ID */\n    libssh2_uint64_t  f_flag;     /* mount flags */\n    libssh2_uint64_t  f_namemax;  /* maximum filename length */\n};\n\n/* SFTP filetypes */\n#define LIBSSH2_SFTP_TYPE_REGULAR           1\n#define LIBSSH2_SFTP_TYPE_DIRECTORY         2\n#define LIBSSH2_SFTP_TYPE_SYMLINK           3\n#define LIBSSH2_SFTP_TYPE_SPECIAL           4\n#define LIBSSH2_SFTP_TYPE_UNKNOWN           5\n#define LIBSSH2_SFTP_TYPE_SOCKET            6\n#define LIBSSH2_SFTP_TYPE_CHAR_DEVICE       7\n#define LIBSSH2_SFTP_TYPE_BLOCK_DEVICE      8\n#define LIBSSH2_SFTP_TYPE_FIFO              9\n\n/*\n * Reproduce the POSIX file modes here for systems that are not POSIX\n * compliant.\n *\n * These is used in \"permissions\" of \"struct _LIBSSH2_SFTP_ATTRIBUTES\"\n */\n/* File type */\n#define LIBSSH2_SFTP_S_IFMT         0170000     /* type of file mask */\n#define LIBSSH2_SFTP_S_IFIFO        0010000     /* named pipe (fifo) */\n#define LIBSSH2_SFTP_S_IFCHR        0020000     /* character special */\n#define LIBSSH2_SFTP_S_IFDIR        0040000     /* directory */\n#define LIBSSH2_SFTP_S_IFBLK        0060000     /* block special */\n#define LIBSSH2_SFTP_S_IFREG        0100000     /* regular */\n#define LIBSSH2_SFTP_S_IFLNK        0120000     /* symbolic link */\n#define LIBSSH2_SFTP_S_IFSOCK       0140000     /* socket */\n\n/* File mode */\n/* Read, write, execute/search by owner */\n#define LIBSSH2_SFTP_S_IRWXU        0000700     /* RWX mask for owner */\n#define LIBSSH2_SFTP_S_IRUSR        0000400     /* R for owner */\n#define LIBSSH2_SFTP_S_IWUSR        0000200     /* W for owner */\n#define LIBSSH2_SFTP_S_IXUSR        0000100     /* X for owner */\n/* Read, write, execute/search by group */\n#define LIBSSH2_SFTP_S_IRWXG        0000070     /* RWX mask for group */\n#define LIBSSH2_SFTP_S_IRGRP        0000040     /* R for group */\n#define LIBSSH2_SFTP_S_IWGRP        0000020     /* W for group */\n#define LIBSSH2_SFTP_S_IXGRP        0000010     /* X for group */\n/* Read, write, execute/search by others */\n#define LIBSSH2_SFTP_S_IRWXO        0000007     /* RWX mask for other */\n#define LIBSSH2_SFTP_S_IROTH        0000004     /* R for other */\n#define LIBSSH2_SFTP_S_IWOTH        0000002     /* W for other */\n#define LIBSSH2_SFTP_S_IXOTH        0000001     /* X for other */\n\n/* macros to check for specific file types, added in 1.2.5 */\n#define LIBSSH2_SFTP_S_ISLNK(m) \\\n  (((m) & LIBSSH2_SFTP_S_IFMT) == LIBSSH2_SFTP_S_IFLNK)\n#define LIBSSH2_SFTP_S_ISREG(m) \\\n  (((m) & LIBSSH2_SFTP_S_IFMT) == LIBSSH2_SFTP_S_IFREG)\n#define LIBSSH2_SFTP_S_ISDIR(m) \\\n  (((m) & LIBSSH2_SFTP_S_IFMT) == LIBSSH2_SFTP_S_IFDIR)\n#define LIBSSH2_SFTP_S_ISCHR(m) \\\n  (((m) & LIBSSH2_SFTP_S_IFMT) == LIBSSH2_SFTP_S_IFCHR)\n#define LIBSSH2_SFTP_S_ISBLK(m) \\\n  (((m) & LIBSSH2_SFTP_S_IFMT) == LIBSSH2_SFTP_S_IFBLK)\n#define LIBSSH2_SFTP_S_ISFIFO(m) \\\n  (((m) & LIBSSH2_SFTP_S_IFMT) == LIBSSH2_SFTP_S_IFIFO)\n#define LIBSSH2_SFTP_S_ISSOCK(m) \\\n  (((m) & LIBSSH2_SFTP_S_IFMT) == LIBSSH2_SFTP_S_IFSOCK)\n\n/* SFTP File Transfer Flags -- (e.g. flags parameter to sftp_open())\n * Danger will robinson... APPEND doesn't have any effect on OpenSSH servers */\n#define LIBSSH2_FXF_READ                        0x00000001\n#define LIBSSH2_FXF_WRITE                       0x00000002\n#define LIBSSH2_FXF_APPEND                      0x00000004\n#define LIBSSH2_FXF_CREAT                       0x00000008\n#define LIBSSH2_FXF_TRUNC                       0x00000010\n#define LIBSSH2_FXF_EXCL                        0x00000020\n\n/* SFTP Status Codes (returned by libssh2_sftp_last_error() ) */\n#define LIBSSH2_FX_OK                       0\n#define LIBSSH2_FX_EOF                      1\n#define LIBSSH2_FX_NO_SUCH_FILE             2\n#define LIBSSH2_FX_PERMISSION_DENIED        3\n#define LIBSSH2_FX_FAILURE                  4\n#define LIBSSH2_FX_BAD_MESSAGE              5\n#define LIBSSH2_FX_NO_CONNECTION            6\n#define LIBSSH2_FX_CONNECTION_LOST          7\n#define LIBSSH2_FX_OP_UNSUPPORTED           8\n#define LIBSSH2_FX_INVALID_HANDLE           9\n#define LIBSSH2_FX_NO_SUCH_PATH             10\n#define LIBSSH2_FX_FILE_ALREADY_EXISTS      11\n#define LIBSSH2_FX_WRITE_PROTECT            12\n#define LIBSSH2_FX_NO_MEDIA                 13\n#define LIBSSH2_FX_NO_SPACE_ON_FILESYSTEM   14\n#define LIBSSH2_FX_QUOTA_EXCEEDED           15\n#define LIBSSH2_FX_UNKNOWN_PRINCIPLE        16 /* Initial mis-spelling */\n#define LIBSSH2_FX_UNKNOWN_PRINCIPAL        16\n#define LIBSSH2_FX_LOCK_CONFlICT            17 /* Initial mis-spelling */\n#define LIBSSH2_FX_LOCK_CONFLICT            17\n#define LIBSSH2_FX_DIR_NOT_EMPTY            18\n#define LIBSSH2_FX_NOT_A_DIRECTORY          19\n#define LIBSSH2_FX_INVALID_FILENAME         20\n#define LIBSSH2_FX_LINK_LOOP                21\n\n/* Returned by any function that would block during a read/write opperation */\n#define LIBSSH2SFTP_EAGAIN LIBSSH2_ERROR_EAGAIN\n\n/* SFTP API */\nLIBSSH2_API LIBSSH2_SFTP *libssh2_sftp_init(LIBSSH2_SESSION *session);\nLIBSSH2_API int libssh2_sftp_shutdown(LIBSSH2_SFTP *sftp);\nLIBSSH2_API unsigned long libssh2_sftp_last_error(LIBSSH2_SFTP *sftp);\nLIBSSH2_API LIBSSH2_CHANNEL *libssh2_sftp_get_channel(LIBSSH2_SFTP *sftp);\n\n/* File / Directory Ops */\nLIBSSH2_API LIBSSH2_SFTP_HANDLE *libssh2_sftp_open_ex(LIBSSH2_SFTP *sftp,\n                                                      const char *filename,\n                                                      unsigned int filename_len,\n                                                      unsigned long flags,\n                                                      long mode, int open_type);\n#define libssh2_sftp_open(sftp, filename, flags, mode) \\\n    libssh2_sftp_open_ex((sftp), (filename), strlen(filename), (flags), \\\n                         (mode), LIBSSH2_SFTP_OPENFILE)\n#define libssh2_sftp_opendir(sftp, path) \\\n    libssh2_sftp_open_ex((sftp), (path), strlen(path), 0, 0, \\\n                         LIBSSH2_SFTP_OPENDIR)\n\nLIBSSH2_API ssize_t libssh2_sftp_read(LIBSSH2_SFTP_HANDLE *handle,\n                                      char *buffer, size_t buffer_maxlen);\n\nLIBSSH2_API int libssh2_sftp_readdir_ex(LIBSSH2_SFTP_HANDLE *handle, \\\n                                        char *buffer, size_t buffer_maxlen,\n                                        char *longentry,\n                                        size_t longentry_maxlen,\n                                        LIBSSH2_SFTP_ATTRIBUTES *attrs);\n#define libssh2_sftp_readdir(handle, buffer, buffer_maxlen, attrs)      \\\n    libssh2_sftp_readdir_ex((handle), (buffer), (buffer_maxlen), NULL, 0, \\\n                            (attrs))\n\nLIBSSH2_API ssize_t libssh2_sftp_write(LIBSSH2_SFTP_HANDLE *handle,\n                                       const char *buffer, size_t count);\nLIBSSH2_API int libssh2_sftp_fsync(LIBSSH2_SFTP_HANDLE *handle);\n\nLIBSSH2_API int libssh2_sftp_close_handle(LIBSSH2_SFTP_HANDLE *handle);\n#define libssh2_sftp_close(handle) libssh2_sftp_close_handle(handle)\n#define libssh2_sftp_closedir(handle) libssh2_sftp_close_handle(handle)\n\nLIBSSH2_API void libssh2_sftp_seek(LIBSSH2_SFTP_HANDLE *handle, size_t offset);\nLIBSSH2_API void libssh2_sftp_seek64(LIBSSH2_SFTP_HANDLE *handle,\n                                     libssh2_uint64_t offset);\n#define libssh2_sftp_rewind(handle) libssh2_sftp_seek64((handle), 0)\n\nLIBSSH2_API size_t libssh2_sftp_tell(LIBSSH2_SFTP_HANDLE *handle);\nLIBSSH2_API libssh2_uint64_t libssh2_sftp_tell64(LIBSSH2_SFTP_HANDLE *handle);\n\nLIBSSH2_API int libssh2_sftp_fstat_ex(LIBSSH2_SFTP_HANDLE *handle,\n                                      LIBSSH2_SFTP_ATTRIBUTES *attrs,\n                                      int setstat);\n#define libssh2_sftp_fstat(handle, attrs) \\\n    libssh2_sftp_fstat_ex((handle), (attrs), 0)\n#define libssh2_sftp_fsetstat(handle, attrs) \\\n    libssh2_sftp_fstat_ex((handle), (attrs), 1)\n\n/* Miscellaneous Ops */\nLIBSSH2_API int libssh2_sftp_rename_ex(LIBSSH2_SFTP *sftp,\n                                       const char *source_filename,\n                                       unsigned int srouce_filename_len,\n                                       const char *dest_filename,\n                                       unsigned int dest_filename_len,\n                                       long flags);\n#define libssh2_sftp_rename(sftp, sourcefile, destfile) \\\n    libssh2_sftp_rename_ex((sftp), (sourcefile), strlen(sourcefile), \\\n                           (destfile), strlen(destfile),                \\\n                           LIBSSH2_SFTP_RENAME_OVERWRITE | \\\n                           LIBSSH2_SFTP_RENAME_ATOMIC | \\\n                           LIBSSH2_SFTP_RENAME_NATIVE)\n\nLIBSSH2_API int libssh2_sftp_unlink_ex(LIBSSH2_SFTP *sftp,\n                                       const char *filename,\n                                       unsigned int filename_len);\n#define libssh2_sftp_unlink(sftp, filename) \\\n    libssh2_sftp_unlink_ex((sftp), (filename), strlen(filename))\n\nLIBSSH2_API int libssh2_sftp_fstatvfs(LIBSSH2_SFTP_HANDLE *handle,\n                                      LIBSSH2_SFTP_STATVFS *st);\n\nLIBSSH2_API int libssh2_sftp_statvfs(LIBSSH2_SFTP *sftp,\n                                     const char *path,\n                                     size_t path_len,\n                                     LIBSSH2_SFTP_STATVFS *st);\n\nLIBSSH2_API int libssh2_sftp_mkdir_ex(LIBSSH2_SFTP *sftp,\n                                      const char *path,\n                                      unsigned int path_len, long mode);\n#define libssh2_sftp_mkdir(sftp, path, mode) \\\n    libssh2_sftp_mkdir_ex((sftp), (path), strlen(path), (mode))\n\nLIBSSH2_API int libssh2_sftp_rmdir_ex(LIBSSH2_SFTP *sftp,\n                                      const char *path,\n                                      unsigned int path_len);\n#define libssh2_sftp_rmdir(sftp, path) \\\n    libssh2_sftp_rmdir_ex((sftp), (path), strlen(path))\n\nLIBSSH2_API int libssh2_sftp_stat_ex(LIBSSH2_SFTP *sftp,\n                                     const char *path,\n                                     unsigned int path_len,\n                                     int stat_type,\n                                     LIBSSH2_SFTP_ATTRIBUTES *attrs);\n#define libssh2_sftp_stat(sftp, path, attrs) \\\n    libssh2_sftp_stat_ex((sftp), (path), strlen(path), LIBSSH2_SFTP_STAT, \\\n                         (attrs))\n#define libssh2_sftp_lstat(sftp, path, attrs) \\\n    libssh2_sftp_stat_ex((sftp), (path), strlen(path), LIBSSH2_SFTP_LSTAT, \\\n                         (attrs))\n#define libssh2_sftp_setstat(sftp, path, attrs) \\\n    libssh2_sftp_stat_ex((sftp), (path), strlen(path), LIBSSH2_SFTP_SETSTAT, \\\n                         (attrs))\n\nLIBSSH2_API int libssh2_sftp_symlink_ex(LIBSSH2_SFTP *sftp,\n                                        const char *path,\n                                        unsigned int path_len,\n                                        char *target,\n                                        unsigned int target_len, int link_type);\n#define libssh2_sftp_symlink(sftp, orig, linkpath) \\\n    libssh2_sftp_symlink_ex((sftp), (orig), strlen(orig), (linkpath), \\\n                            strlen(linkpath), LIBSSH2_SFTP_SYMLINK)\n#define libssh2_sftp_readlink(sftp, path, target, maxlen) \\\n    libssh2_sftp_symlink_ex((sftp), (path), strlen(path), (target), (maxlen), \\\n    LIBSSH2_SFTP_READLINK)\n#define libssh2_sftp_realpath(sftp, path, target, maxlen) \\\n    libssh2_sftp_symlink_ex((sftp), (path), strlen(path), (target), (maxlen), \\\n                            LIBSSH2_SFTP_REALPATH)\n\n#ifdef __cplusplus\n} /* extern \"C\" */\n#endif\n\n#endif /* LIBSSH2_SFTP_H */\n"
  },
  {
    "path": "Sublime/Pods/NMSSH/NMSSH-iOS/NMSSH.h",
    "content": "#import <UIKit/UIKit.h>\n\n//! Project version number for NMSSH.\nFOUNDATION_EXPORT double NMSSHVersionNumber;\n\n//! Project version string for NMSSH.\nFOUNDATION_EXPORT const unsigned char NMSSHVersionString[];\n\n// In this header, you should import all the public headers of your framework using statements like #import <NMSSH/PublicHeader.h>\n#import \"libssh2.h\"\n#import \"libssh2_sftp.h\"\n\n#import \"NMSSHSessionDelegate.h\"\n#import \"NMSSHChannelDelegate.h\"\n\n#import \"NMSSHSession.h\"\n#import \"NMSSHChannel.h\"\n#import \"NMSFTP.h\"\n#import \"NMSFTPFile.h\"\n#import \"NMSSHConfig.h\"\n#import \"NMSSHHostConfig.h\"\n\n#import \"NMSSHLogger.h\"\n\n"
  },
  {
    "path": "Sublime/Pods/NMSSH/README.md",
    "content": "# NMSSH\n\nNMSSH is a clean, easy-to-use, unit tested framework for iOS and OSX that wraps libssh2.\n\n## Questions & Issues\n\nIf you encounter an issue or have any questions about implementing NMSSH, please post them in [the issue tracker](https://github.com/NMSSH/NMSSH/issues) – we do not offer free support via email.\n\n## Installation\n\n### CocoaPods\n\n    pod 'NMSSH'\n\n### Build from source\n\nConsult the Wiki for detailed information about how to:\n\n* [Build for OSX](https://github.com/NMSSH/NMSSH/wiki/Build-and-use-in-your-OSX-project) or\n* [Build for iOS](https://github.com/NMSSH/NMSSH/wiki/Build-and-use-in-your-iOS-project).\n\n### Include it in your project\n\nAdd `#import <NMSSH/NMSSH.h>` to your source file.\n\n## What does it look like?\n\n```objc\nNMSSHSession *session = [NMSSHSession connectToHost:@\"127.0.0.1:22\"\n                                       withUsername:@\"user\"];\n\nif (session.isConnected) {\n    [session authenticateByPassword:@\"pass\"];\n\n    if (session.isAuthorized) {\n        NSLog(@\"Authentication succeeded\");\n    }\n}\n    \nNSError *error = nil;\nNSString *response = [session.channel execute:@\"ls -l /var/www/\" error:&error];\nNSLog(@\"List of my sites: %@\", response);\n    \nBOOL success = [session.channel uploadFile:@\"~/index.html\" to:@\"/var/www/9muses.se/\"];\n\n[session disconnect];\n```\n\n## API Documentation\n\nAPI documentation for NMSSH is available at [http://cocoadocs.org/docsets/NMSSH/](http://cocoadocs.org/docsets/NMSSH/).\n\n## Guidelines for contributions\n\n* Follow the [code conventions](https://github.com/Lejdborg/cocoa-conventions/).\n* Fork NMSSH and create a feature branch. Develop your feature.\n* Open a pull request.\n\n**Note:** Make sure that you have _documented your code_ and that you _follow the code conventions_ before opening a pull request.\n\n## NMSSH is used in\n\n* [iTerm2](https://github.com/gnachman/iTerm2)\n* [DogeWallet](https://github.com/SlayterDev/DogeWallet)\n\n## Developed by\n\n### Core team\n\n* [Christoffer Lejdborg (@Lejdborg)](https://github.com/Lejdborg) (creator)\n* [Tommaso Madonia (@Frugghi)](https://github.com/Frugghi)\n\n### Contributors\n\n* [Sebastian Hunkeler (@lightforce)](https://github.com/lightforce)\n* [Endika Gutiérrez (@endSly)](https://github.com/endSly)\n* [Clemens Gruber (@clemensg)](https://github.com/clemensg)\n* [@gnachman](https://github.com/gnachman)\n* [@Shirk](https://github.com/Shirk)\n* [@touta](https://github.com/touta)\n\n## License\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": "Sublime/Pods/Pods.xcodeproj/project.pbxproj",
    "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>archiveVersion</key>\n\t<string>1</string>\n\t<key>classes</key>\n\t<dict/>\n\t<key>objectVersion</key>\n\t<string>46</string>\n\t<key>objects</key>\n\t<dict>\n\t\t<key>003EBB47E856DBB92F4A63FC2AD8C892</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>C989B85CAE2F73F5FFAA2EFB44C56081</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>009369000D8CF5B8C1E3E6BF283CA73A</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts-dummy.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>00ED322AD74E086D0DBE4FAC8A72856D</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>59639868BF0B29D1419BB3F9312567AF</string>\n\t\t\t\t<string>6BAE05E7054A14414B907DD7F37AC8B7</string>\n\t\t\t\t<string>B02BF2860C124E9C66C26D2E4913EC5B</string>\n\t\t\t\t<string>4620E80B337EA9F040BEB93DF08BD134</string>\n\t\t\t\t<string>5FA31142FE846A63B3CDCF338C03AF0F</string>\n\t\t\t\t<string>6B173C46DF90109FE17024B11AD202E2</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Support Files</string>\n\t\t\t<key>path</key>\n\t\t\t<string>../Target Support Files/ZLSinusWaveView</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>01776C25A5DB30E5FB22DABA2D28B271</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>C7B98156605B0AC4C70830469ABB06A4</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>0256D63626119843AC1248D91D38C551</key>\n\t\t<dict>\n\t\t\t<key>containerPortal</key>\n\t\t\t<string>D41D8CD98F00B204E9800998ECF8427E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXContainerItemProxy</string>\n\t\t\t<key>proxyType</key>\n\t\t\t<string>1</string>\n\t\t\t<key>remoteGlobalIDString</key>\n\t\t\t<string>F49E17CE595BF7A7A46139779E891F78</string>\n\t\t\t<key>remoteInfo</key>\n\t\t\t<string>SSZipArchive</string>\n\t\t</dict>\n\t\t<key>02787AB0F80C11B895A72337338D4CB7</key>\n\t\t<dict>\n\t\t\t<key>explicitFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Gifu.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Gifu.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>BUILT_PRODUCTS_DIR</string>\n\t\t</dict>\n\t\t<key>0282FE2D0C3A9B3705A974193237B978</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXTargetDependency</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Alamofire</string>\n\t\t\t<key>target</key>\n\t\t\t<string>79C040AFDDCE1BCBF6D8B5EB0B85887F</string>\n\t\t\t<key>targetProxy</key>\n\t\t\t<string>FB8A97E23B00E9EE80BB504728D87825</string>\n\t\t</dict>\n\t\t<key>0294DCA76D64937CF8D8ADF477A4FA11</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>pwd2key.c</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/aes/pwd2key.c</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>02C1BEA6FE84433F6C6A713533B7B9BD</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>BE3F1A095E8DF60F568AC3C16C9CD9CC</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>02E32AEB8ABF1AF925416098365CE932</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>78FCECFF404AD0FD74BACA1C1FC9FFBE</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>033590E1C2397DA8E570B55810775B8E</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>IBarLineScatterCandleBubbleChartDataSet.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Interfaces/IBarLineScatterCandleBubbleChartDataSet.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>034548B827C03622818B97E6F50C78EC</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.xcconfig</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Swifter.xcconfig</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>0354751919E03C8001824EA2F707F272</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>DGElasticPullToRefresh-umbrella.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>035FEBC2FF9B0AA63626D2CB12316222</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.plist.xml</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Info.plist</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>0380D2B912CDE029522351D67E39310E</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>D5F44E638D27C282B496D1999C8B754A</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>03F0D41F8726403C1B0B5F3D93915906</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>HttpServerIO.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Sources/HttpServerIO.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>03FC642C1EF0F16D7AB31F4AC6D6F719</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NMSFTPFile.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH/NMSFTPFile.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>040B16E53C2CBFE2007A0A70EE690D77</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Alamofire.modulemap</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>04A4F1E8E6A3624871B2EE0C687248B2</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>C29238134AE5C4B8C2352C6C11C495EB</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/ZLMusicFlowWaveView/ZLMusicFlowWaveView-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/ZLMusicFlowWaveView/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/ZLMusicFlowWaveView/ZLMusicFlowWaveView.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>ZLMusicFlowWaveView</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Debug</string>\n\t\t</dict>\n\t\t<key>05B129043462F91B458D18AFB8F529C2</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.plist.xml</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Info.plist</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>05BA62425D43DD87EC6390A0FAE74D1E</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartAnimationEasing.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Animation/ChartAnimationEasing.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>05D9707C1A350638ECD52006A481F077</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ParameterEncoding.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/ParameterEncoding.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>06FD8F213BF2DF4860A3890A3F6C9943</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>HttpServer.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Sources/HttpServer.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>0727A4243F3B7D3216AAC08CA047DA60</key>\n\t\t<dict>\n\t\t\t<key>explicitFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ZLMusicFlowWaveView.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>ZLMusicFlowWaveView.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>BUILT_PRODUCTS_DIR</string>\n\t\t</dict>\n\t\t<key>07C1897D80CE662EEE2BB582594B5752</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>D7C1E15DAA48F123231A498172D38967</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>07F0E71CC75B65CD371F8F56F53D86F0</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>53F1005ADB78F4613F8C29A68E8B9909</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>0832C378A14BA80BA5856826F1530746</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>CYRTextView-prefix.pch</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>087A04860A4A8EC54E6A1A5AF7F73E23</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ScatterChartRenderer.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Renderers/ScatterChartRenderer.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>095406039B4D371E48D08B38A2975AC8</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>86A4F33244B76027A52DC18FE83F6FA8</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>095B4CA441317582AEAB49625A56CC8D</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>17E57B8F489EA569011B8678EC392493</string>\n\t\t\t\t<string>AE9410D9B1C05916CA1D2817FB0F45F1</string>\n\t\t\t\t<string>29FE1468A9F2C8D913EAD260E4E8B852</string>\n\t\t\t\t<string>A0688D041EA5E1060A50787E5D0A8B88</string>\n\t\t\t\t<string>82D6671E6434CBE40C23F48ECD063E9B</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ZLMusicFlowWaveView</string>\n\t\t\t<key>path</key>\n\t\t\t<string>ZLMusicFlowWaveView</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>0A0B1AD12AF0AAF31F2FE461AEDD6AC9</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NMSSHSession.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH/NMSSHSession.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>0A3248BA59E025188FAAD1071189AA40</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurations</key>\n\t\t\t<array>\n\t\t\t\t<string>3E5B420A73875137D4437E73149DCAEA</string>\n\t\t\t\t<string>5F0A3448A6BD1FAE4B4F4E61EFD3DDCF</string>\n\t\t\t</array>\n\t\t\t<key>defaultConfigurationIsVisible</key>\n\t\t\t<string>0</string>\n\t\t\t<key>defaultConfigurationName</key>\n\t\t\t<string>Release</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCConfigurationList</string>\n\t\t</dict>\n\t\t<key>0A55876558D0DC9160E5F6D64ADBA9F8</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>69FC867B9095871D1CDC05702AD7F41B</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFrameworksBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>0B180880779669D029654CA4D9E08852</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.plist.xml</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Info.plist</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>0B93148101A5531681949F675D41538E</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>IRadarChartDataSet.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Interfaces/IRadarChartDataSet.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>0BD8E73E6A192F43B39F876E1E07146C</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NMSSHConfig.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH/NMSSHConfig.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>0BDAAEDEF5A3BBD3D36419ADBC621E43</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>36D90A99286A433572F91AB604418967</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>AlamofireRSS</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>WRAPPER_EXTENSION</key>\n\t\t\t\t<string>bundle</string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Release</string>\n\t\t</dict>\n\t\t<key>0BE89C1211FB9D34E28695028E028BC5</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>PieChartData.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/PieChartData.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>0C2C052032470959CD56614BF9453DC8</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>4ED7C61B5475997505191F07F768B0E2</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>0C8EFD8D5CCE9A85C27C92ACCD85C521</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>2E7E02258E9A5195895517F8E2465FB8</string>\n\t\t\t\t<string>E5055FEB2A2A322A90311B7874DC9092</string>\n\t\t\t\t<string>146F9CE3135B0F3E12EAB93142B6C6DC</string>\n\t\t\t\t<string>12E1D0B1AD9B09A7E6ED15D5F09F4FAB</string>\n\t\t\t\t<string>0354751919E03C8001824EA2F707F272</string>\n\t\t\t\t<string>0B180880779669D029654CA4D9E08852</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Support Files</string>\n\t\t\t<key>path</key>\n\t\t\t<string>../Target Support Files/DGElasticPullToRefresh</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>0CCE916C80D42C6943D73D1A829DA787</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SJCSimplePDFView-umbrella.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>0CFA654DBD993FD0F891ECD3B7432064</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NMSSHChannel.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH/NMSSHChannel.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>0D30D4EC5DBB217F591F99D492225B04</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>entropy.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/aes/entropy.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>0D9E3E8557D628F179DC72179BE68873</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>DGElasticPullToRefreshView.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>DGElasticPullToRefresh/DGElasticPullToRefreshView.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>0DD8F6D8387DB0C06C39A8FA16AB65F2</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurations</key>\n\t\t\t<array>\n\t\t\t\t<string>B90A6C426043472FEECCAD567C74CD38</string>\n\t\t\t\t<string>9D4F76E63FE32EDCFE411B47AADE7C20</string>\n\t\t\t</array>\n\t\t\t<key>defaultConfigurationIsVisible</key>\n\t\t\t<string>0</string>\n\t\t\t<key>defaultConfigurationName</key>\n\t\t\t<string>Release</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCConfigurationList</string>\n\t\t</dict>\n\t\t<key>0E579C8B6EC88FD31F0C2B47C9058B48</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurationList</key>\n\t\t\t<string>BFBFE3DE50EEDD42B2CC58CF2F499BCE</string>\n\t\t\t<key>buildPhases</key>\n\t\t\t<array>\n\t\t\t\t<string>453AE9B30136CD292073FFCB386A111C</string>\n\t\t\t\t<string>A46427534DD269E2ED45FE9190F4F819</string>\n\t\t\t\t<string>A001EF9508D510E336B414095A84EC0F</string>\n\t\t\t</array>\n\t\t\t<key>buildRules</key>\n\t\t\t<array/>\n\t\t\t<key>dependencies</key>\n\t\t\t<array/>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXNativeTarget</string>\n\t\t\t<key>name</key>\n\t\t\t<string>AASquaresLoading</string>\n\t\t\t<key>productName</key>\n\t\t\t<string>AASquaresLoading</string>\n\t\t\t<key>productReference</key>\n\t\t\t<string>2993BE53CEB9368C1FD283A26A8DC3CF</string>\n\t\t\t<key>productType</key>\n\t\t\t<string>com.apple.product-type.framework</string>\n\t\t</dict>\n\t\t<key>0E5DECF96C58C0F18CD5F7C5221CC7A7</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartDataBaseFilter.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Filters/ChartDataBaseFilter.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>0F92FE99CE8E162CBD0DC7F965008A6E</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>0BD8E73E6A192F43B39F876E1E07146C</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>0FAAC91F636F7A42B8D0A2D53351CB33</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>SwiftyJSON.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/SwiftyJSON.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>0FBCB9B828FF98812A1EE98817048C46</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ILineRadarChartDataSet.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Interfaces/ILineRadarChartDataSet.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>0FCE52111ED6A874AB515E76EA8BF894</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>EF2C26926BC90B457BF77F1F5C3864A5</string>\n\t\t\t\t<string>40F968A172478FA1FF7BC61E5E43A165</string>\n\t\t\t\t<string>2A54E14C2D0994A8370C91E5B536A105</string>\n\t\t\t\t<string>E1802D1110A2554B9624857DFBA4126A</string>\n\t\t\t\t<string>FFCB6492484858E07ECCD87017C470A1</string>\n\t\t\t\t<string>80DD5455D2185F4B63EC6AFA95A51E88</string>\n\t\t\t\t<string>7404D532E36CB49046A6B5F2B4CB9E68</string>\n\t\t\t\t<string>9B4184FC9E303824C5756A811AB09E31</string>\n\t\t\t\t<string>5C5512B13DBD171651F6D19C66DCBB1B</string>\n\t\t\t\t<string>997199E72131063A4BBCAE8FBC3CAECC</string>\n\t\t\t\t<string>2B7CE3EB8CB44E72DC0954A7CCE3CD35</string>\n\t\t\t\t<string>1877516BBE621827BE92D407A3C73851</string>\n\t\t\t\t<string>DCE911485FE993C88C00E6FC8F301448</string>\n\t\t\t\t<string>74CDEF8BA057A6BB4453A748E70EA142</string>\n\t\t\t\t<string>095B4CA441317582AEAB49625A56CC8D</string>\n\t\t\t\t<string>ADD71B1DEF5A923A72F5BD91617A3BFA</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Pods</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>0FDD62CA863BD5DBE7F5C375C207C7EF</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZAudioPlotGLKViewController.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/EZAudioPlotGLKViewController.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>10DA9C9D58BDE4AEBC101C70A645E315</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>B88349DF809DD951EF76B2B561C15983</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>114543CA2F4712B855C440FC1C01B461</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>278A8E9A676F2861EE04688763C40773</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Project</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>115824B7CB2E76E5ACB836A251E79404</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurationList</key>\n\t\t\t<string>74DF8A9CBE6EAEB8C19105D047645443</string>\n\t\t\t<key>buildPhases</key>\n\t\t\t<array>\n\t\t\t\t<string>3943D764C0D525CFAF94F943648E17BE</string>\n\t\t\t\t<string>9E138A11AB568FDD962F892987F6F048</string>\n\t\t\t\t<string>F60BC667495022BB71DE0C146D3C99EA</string>\n\t\t\t</array>\n\t\t\t<key>buildRules</key>\n\t\t\t<array/>\n\t\t\t<key>dependencies</key>\n\t\t\t<array/>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXNativeTarget</string>\n\t\t\t<key>name</key>\n\t\t\t<string>DGElasticPullToRefresh</string>\n\t\t\t<key>productName</key>\n\t\t\t<string>DGElasticPullToRefresh</string>\n\t\t\t<key>productReference</key>\n\t\t\t<string>F7852FD543BD5C8EEF81095A19EAD332</string>\n\t\t\t<key>productType</key>\n\t\t\t<string>com.apple.product-type.framework</string>\n\t\t</dict>\n\t\t<key>1167F2A0B491A489F337578AC16A5F11</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartXAxisRendererBarChart.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Renderers/ChartXAxisRendererBarChart.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>11BA64BC0B2FE8DDB41883B7241A8C49</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>146F9CE3135B0F3E12EAB93142B6C6DC</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>11F862EDC00E98340C3E6E46BA922E26</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>B990718DD6D67073DBCDCF8E6ABED5A5</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>124CC709A273ED2691A47C5CEA065111</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>5FF6421A0B1404F43C1F56F99853EC96</string>\n\t\t\t\t<string>3A06439A9A5AE0F27374CF4A27AB4A0B</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXSourcesBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>124D0BAABE6160B5E0B6ADC527C58418</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>78A8CAE0A08DC8E818F6E7C79557A27D</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>1260E1D284190E2A3D00903698C9D2F3</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.xcconfig</string>\n\t\t\t<key>path</key>\n\t\t\t<string>CYRTextView.xcconfig</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>1268FBA2F4CEE4DC3577E8DD52D25975</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>22059022078636D0B5F42A74AF4B5A22</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>127AB4661AC9A5832C3D5A4077C1A58C</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>55AB31E45DC84ECFF7CC6FC6AB1ACC81</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>129963BBCBF40DB2189A0EB7993EDF12</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZAudioPlayer.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/EZAudioPlayer.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>12E1D0B1AD9B09A7E6ED15D5F09F4FAB</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>DGElasticPullToRefresh-prefix.pch</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>131D95D3FCDF7799E1D69213A378638E</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>40043CBCDD93A301F8437421D53D02A3</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>136FA39293487CFA2EA9129427511420</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>HttpHandlers+WebSockets.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Sources/HttpHandlers+WebSockets.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>137FDB371251B06FCC2593DBA88272D2</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurationList</key>\n\t\t\t<string>0DD8F6D8387DB0C06C39A8FA16AB65F2</string>\n\t\t\t<key>buildPhases</key>\n\t\t\t<array>\n\t\t\t\t<string>809023B98C9FF6044DF1314603EE8B91</string>\n\t\t\t\t<string>2F9FD76D50F8510D46C22FB03BF984DF</string>\n\t\t\t\t<string>DD3A008898F33BA6A93E536EF2E82A41</string>\n\t\t\t</array>\n\t\t\t<key>buildRules</key>\n\t\t\t<array/>\n\t\t\t<key>dependencies</key>\n\t\t\t<array>\n\t\t\t\t<string>6357E4DF80060A4CD9B6E9B06D5DBFE3</string>\n\t\t\t\t<string>269A73CB99FCBCBFAB8CFE698D4AEFB0</string>\n\t\t\t\t<string>6C4C1217EC8BF9E5E6DC8386FEAA0C3A</string>\n\t\t\t\t<string>4D8F6F5FDD8AE252C8D21C76F72CEC9F</string>\n\t\t\t\t<string>D903133FE593BA39A527BFD1887D43BE</string>\n\t\t\t\t<string>CB8943577E424C7F4E953DE7A18FA12C</string>\n\t\t\t\t<string>76820BB8A343CE818398366E3787913C</string>\n\t\t\t\t<string>FC9D79D0CC991302B49BFA48C4BE2AB9</string>\n\t\t\t\t<string>1F8A1467F981A8E370A8939AA38A7367</string>\n\t\t\t\t<string>E714E7EE552ED72453DB7F1AB1FE9DC9</string>\n\t\t\t\t<string>409962F3CD08FB4947DAEFF94EDEFC86</string>\n\t\t\t\t<string>ABFB4E32ADD23D5E47758C89919D0EAD</string>\n\t\t\t\t<string>976A24EA83BF3467025D3580ED456D06</string>\n\t\t\t\t<string>38C869AE53183F93DD743ED2C7192EB8</string>\n\t\t\t\t<string>8F96B72A2D016C2925132ED704A6D6F4</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXNativeTarget</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Pods</string>\n\t\t\t<key>productName</key>\n\t\t\t<string>Pods</string>\n\t\t\t<key>productReference</key>\n\t\t\t<string>1A85B3DEA68DBE452583A860BFC25D68</string>\n\t\t\t<key>productType</key>\n\t\t\t<string>com.apple.product-type.framework</string>\n\t\t</dict>\n\t\t<key>146F9CE3135B0F3E12EAB93142B6C6DC</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>path</key>\n\t\t\t<string>DGElasticPullToRefresh-dummy.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>14E2A18762B2C933AF7EF481D1079936</key>\n\t\t<dict>\n\t\t\t<key>explicitFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Alamofire.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Alamofire.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>BUILT_PRODUCTS_DIR</string>\n\t\t</dict>\n\t\t<key>1568D9F321313FECF78F199CE4E7B442</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>4E2E3D5588060B9FF52974B06D2DB9B7</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>15796F12649F437721B9C3177EE84A7F</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>aescrypt.c</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/aes/aescrypt.c</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>158958FF49153EA1D61DF28C680C441B</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>EFAF93ECA6E252EF29AB51A210E6D8E4</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>15AD01DB1A64F162CCBC2E4D02B1458A</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>2A19DB845AD3D3E62C87A8183C450FC5</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>16102E4E35FAA0FC4161282FECE56469</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>B5EEC8A63E90F6F8F85DEF5514D52ED8</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>161961ABCAFC8D944C13F6B003163607</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>fileenc.c</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/aes/fileenc.c</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>163CCB0ED553E79B03AC5CE313F1DD77</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>CE787D2E7219B1CE32FB1F9F3BB56BC6</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Project</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>16707D24276E0D4BA984EAD7829AFC3B</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NMSSHLogger.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH/Config/NMSSHLogger.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>1677FAD2A148DA1DDE73736B4848878B</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>46E1873E64EC87857800E9B2C2A793A7</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>169B552578427611CD64555A461D8A88</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>HttpParser.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Sources/HttpParser.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>16B29AE122AF64257C643FA13FBBA52B</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>BD11BD25E12B54CC641E519B27C11B66</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>16BED61439C924D34FF25EC21932E8AF</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>zip.c</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/minizip/zip.c</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>1711226039A0CD668F7DBEEE45D9E238</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>1167F2A0B491A489F337578AC16A5F11</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>1792949332E845FCE9745F455932668C</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>2A6A25FC0A0B5FF53D4D6302464DF0A2</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>17C4E6CB67D0446387655B959DA3A951</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>15796F12649F437721B9C3177EE84A7F</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>COMPILER_FLAGS</key>\n\t\t\t\t<string>-DOS_OBJECT_USE_OBJC=0</string>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>17C841636A1F7BAB561CE0585060E01F</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>423A9BA046AD7AEAED121ABE70F42763</string>\n\t\t\t\t<string>511493881CA40859A5E2279BD386A7AB</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFrameworksBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>17E57B8F489EA569011B8678EC392493</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ZLMusicFlowDecorativeView.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>ZLMusicFlowWaveView/ZLMusicFlowDecorativeView.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>17E8ECFF7879DDE903F47869DEBAA874</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>4FF58A41D7B6111B458ADE82268C1178</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>17F30271B79E8344F95C3FA89632ADC8</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.plist.xml</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Info.plist</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>17FA4A36C2BDDC132AF9A0B1CE9E02F4</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>DCECD6AAC84A0BDBE43081FFF891F3FF</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Project</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>1845D98CE7CF2F3174B2E68C1E535445</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>BubbleChartView.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Charts/BubbleChartView.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>1877516BBE621827BE92D407A3C73851</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>4E488569CDEF3276C1BC982119CE0914</string>\n\t\t\t\t<string>278A8E9A676F2861EE04688763C40773</string>\n\t\t\t\t<string>15796F12649F437721B9C3177EE84A7F</string>\n\t\t\t\t<string>CEEC903A8A88FC7DAC58821172A38152</string>\n\t\t\t\t<string>B801611949F9A65BDAD1BA9E75AC4B43</string>\n\t\t\t\t<string>BFE4C92C7B56F5BE2EDB6693B5B01F06</string>\n\t\t\t\t<string>86662528AE34D79C3BA78439C0D9D01E</string>\n\t\t\t\t<string>71C68E3AFFC61709566D8EA695CFB5E7</string>\n\t\t\t\t<string>2E0EC03652FA915F8E96EFC2558A5439</string>\n\t\t\t\t<string>C832BE8F84718CAD9B5B7A0F2296F628</string>\n\t\t\t\t<string>F3E8A533B0FA4678233C985618BEEEA6</string>\n\t\t\t\t<string>67016485CE0220DF8AF0DDC343E3F51C</string>\n\t\t\t\t<string>0D30D4EC5DBB217F591F99D492225B04</string>\n\t\t\t\t<string>161961ABCAFC8D944C13F6B003163607</string>\n\t\t\t\t<string>DC0D405095C90FB4035A2F0243192579</string>\n\t\t\t\t<string>86909353BB4657C029BB5008942330ED</string>\n\t\t\t\t<string>DFCF6A958A237C3D561F2830085A3000</string>\n\t\t\t\t<string>87D7DAF7937EAF3CF65F1B022D9A8BDB</string>\n\t\t\t\t<string>22B30496E9D4C59ABF59F254C49FF122</string>\n\t\t\t\t<string>35D6A246A5B602182B55996C79DEC3B7</string>\n\t\t\t\t<string>9D7EF092E912A37841FC7F3316B1EE46</string>\n\t\t\t\t<string>66289F09E2686DE08ED6DE071A0D5077</string>\n\t\t\t\t<string>CE787D2E7219B1CE32FB1F9F3BB56BC6</string>\n\t\t\t\t<string>0294DCA76D64937CF8D8ADF477A4FA11</string>\n\t\t\t\t<string>DCECD6AAC84A0BDBE43081FFF891F3FF</string>\n\t\t\t\t<string>BB8BF3A20530EBB622CA33D5AEFB739D</string>\n\t\t\t\t<string>ED50758E863F122346C9C2E1873E53DE</string>\n\t\t\t\t<string>3A04E2A8DAC2E69D929439C0D50562D4</string>\n\t\t\t\t<string>CE9719F08048A9825AEAE45D13A0F9DF</string>\n\t\t\t\t<string>A1B31917F302790BEE2C7CA37EFBA0DF</string>\n\t\t\t\t<string>31A8AB41E1FF5C54D0970DF38969E324</string>\n\t\t\t\t<string>16BED61439C924D34FF25EC21932E8AF</string>\n\t\t\t\t<string>216C34E27969A0794EC8C460C31FA2CE</string>\n\t\t\t\t<string>DA3C0B91AFC44531B8A01A3F0562457C</string>\n\t\t\t\t<string>F1022A0213E11D4057BBBF840A3B335C</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>SSZipArchive</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>1891931FD0A3F4CC78749D9E977A8505</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Result.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/Result.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>191955118642709970DA6F35F57D57A6</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>71E013AE8742AF9DE782F24E90B5E1DB</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>191F7183D2E17767A8B14716B9453747</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartYAxisRendererHorizontalBarChart.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Renderers/ChartYAxisRendererHorizontalBarChart.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>19318C4AE0C9FF87FDC7C34424E9305F</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartXAxisRendererRadarChart.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Renderers/ChartXAxisRendererRadarChart.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>1946E9116D8062A9DA249B5276ECE602</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>7F87651AE9B6CA0E7F4A0114F19A7924</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/AASquaresLoading/AASquaresLoading-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/AASquaresLoading/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/AASquaresLoading/AASquaresLoading.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>AASquaresLoading</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>SWIFT_OPTIMIZATION_LEVEL</key>\n\t\t\t\t<string>-Onone</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Debug</string>\n\t\t</dict>\n\t\t<key>1966257DFF573B123534D86FB2A461BE</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>71023FBED2BFC50D42DB8F5E48E31B48</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>1976D47319F44DDEB11B1DB5E28BEC84</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXTargetDependency</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ZLSinusWaveView</string>\n\t\t\t<key>target</key>\n\t\t\t<string>ADD0B8D536C47FE797C15119D29AFC71</string>\n\t\t\t<key>targetProxy</key>\n\t\t\t<string>6789ABF735324868C1342E25DEC4AF09</string>\n\t\t</dict>\n\t\t<key>19954D5FC84330E551F6CF2AECCCEC23</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.plist.xml</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Info.plist</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>1A576993F97A4BD21C20CE9685D55B45</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>3127828983CBDF4E8CBE8579564A7ACC</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>1A7CD22F5ED03019E906E471DD59388F</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartViewPortJob.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Jobs/ChartViewPortJob.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>1A85B3DEA68DBE452583A860BFC25D68</key>\n\t\t<dict>\n\t\t\t<key>explicitFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Pods.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Pods.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>BUILT_PRODUCTS_DIR</string>\n\t\t</dict>\n\t\t<key>1AA2BFF6AAA29B3C65D9109C6D89B631</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>F38A27EE294EDDE1BCEA87D82E418D06</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>1AC2B93F71120CA50074113DD62725AC</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CombinedHighlighter.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Highlight/CombinedHighlighter.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>1B09B90650E7E94D067EEA465021ECFC</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>86662528AE34D79C3BA78439C0D9D01E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Project</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>1B8C2B556D484533F17C49F31CFE9279</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>BarChartDataEntry.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/BarChartDataEntry.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>1B8D79A74968EFE68A03C339F93BE40A</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ScatterChartDataSet.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/ScatterChartDataSet.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>1C13EE24977DA9B45CDE1309CB51D90E</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ResponseSerialization.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/ResponseSerialization.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>1CF9B76B2F64B9518142C0E419278E19</key>\n\t\t<dict>\n\t\t\t<key>containerPortal</key>\n\t\t\t<string>D41D8CD98F00B204E9800998ECF8427E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXContainerItemProxy</string>\n\t\t\t<key>proxyType</key>\n\t\t\t<string>1</string>\n\t\t\t<key>remoteGlobalIDString</key>\n\t\t\t<string>115824B7CB2E76E5ACB836A251E79404</string>\n\t\t\t<key>remoteInfo</key>\n\t\t\t<string>DGElasticPullToRefresh</string>\n\t\t</dict>\n\t\t<key>1D0D77460730EC30F5AFC5241DE8C317</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>87D7DAF7937EAF3CF65F1B022D9A8BDB</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>COMPILER_FLAGS</key>\n\t\t\t\t<string>-DOS_OBJECT_USE_OBJC=0</string>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>1D0F56E661286DC8431D8887DD690692</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>HttpHandlers+Files.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Sources/HttpHandlers+Files.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>1D80AF552B91E3AC0E007F8B3D1C423B</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>8F7A7A4CBF39B0995A17F5F10F25F3A1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>1E5B2E2366403FF3F48D14E0344AB088</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurations</key>\n\t\t\t<array>\n\t\t\t\t<string>9F898C8AC3124C1B95F382C093800963</string>\n\t\t\t\t<string>2375931066B859121A3D2FE02DE198F9</string>\n\t\t\t</array>\n\t\t\t<key>defaultConfigurationIsVisible</key>\n\t\t\t<string>0</string>\n\t\t\t<key>defaultConfigurationName</key>\n\t\t\t<string>Release</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCConfigurationList</string>\n\t\t</dict>\n\t\t<key>1E99A621975C1DDBF7CD0F92C076D716</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>AC2EF1AE40274FFDC401667516F473E2</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>1ED95865A0F35E6479942C08DC17E359</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>009369000D8CF5B8C1E3E6BF283CA73A</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>1EF3386A084C9BF7F3B05704CD56DBE6</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio-dummy.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>1F2A324FC0B075A00AEE84CC028D8F1F</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>libssh2.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH-iOS/Libraries/include/libssh2/libssh2.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>1F8A1467F981A8E370A8939AA38A7367</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXTargetDependency</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NMSSH</string>\n\t\t\t<key>target</key>\n\t\t\t<string>3881764D412915AEE2FDC3677F741D9A</string>\n\t\t\t<key>targetProxy</key>\n\t\t\t<string>DD7AF476E0F820613312BA057B209D07</string>\n\t\t</dict>\n\t\t<key>1F8B22539695E07FA9762AFF2D92CB5A</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NMSSHHostConfig.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH/NMSSHHostConfig.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>1FFA88C4B3A1DAF8DA3FBD1FB22358B5</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>1B8C2B556D484533F17C49F31CFE9279</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>2070C04C1ABE2C3A69159596D2E1DF51</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>1F2A324FC0B075A00AEE84CC028D8F1F</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>20C5E87C1DF07DEA65CD74B8D07D6D1C</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>0354751919E03C8001824EA2F707F272</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>20DCE1442556CA5F41805570F5B5844F</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>UIImageExtension.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/UIImageExtension.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>211BF217FEF65CFAFA0595009B57B795</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>A0718C652496BAA16F3007BE63680091</string>\n\t\t\t\t<string>78905BC064EA7CAE6515516D704002CF</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXHeadersBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>216C34E27969A0794EC8C460C31FA2CE</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>zip.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/minizip/zip.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>21B7F68E83AB3158AC18BB512498ECE0</key>\n\t\t<dict>\n\t\t\t<key>explicitFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>SJCSimplePDFView.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SJCSimplePDFView.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>BUILT_PRODUCTS_DIR</string>\n\t\t</dict>\n\t\t<key>22059022078636D0B5F42A74AF4B5A22</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartDataEntry.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/ChartDataEntry.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>223648D2D9A87589BDD0F2446CC1BF2A</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>AlamofireRSSParser-umbrella.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>224F8C8DCD27EA9658A028C095C4F275</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>6DC1C46D160F2B2BB3AA0C6940A03914</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>228471249CCDB44C2C2793EFEAF06C43</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>ZLMusicFlowWaveView-umbrella.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>22B30496E9D4C59ABF59F254C49FF122</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ioapi.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/minizip/ioapi.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>22CC997358A22BFFD42637B6A1E3868C</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>RadarChartData.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/RadarChartData.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>2375931066B859121A3D2FE02DE198F9</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>8EC66117408FE5D27B57F58550E978C0</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/SwiftyJSON/SwiftyJSON-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/SwiftyJSON/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/SwiftyJSON/SwiftyJSON.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>SwiftyJSON</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Release</string>\n\t\t</dict>\n\t\t<key>23EB4B1F1FB528E10C5030501D4C3454</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.xcconfig</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Alamofire.xcconfig</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>241D3259D8743003561A971C917C0C14</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>66289F09E2686DE08ED6DE071A0D5077</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>COMPILER_FLAGS</key>\n\t\t\t\t<string>-DOS_OBJECT_USE_OBJC=0</string>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>242B71AC1ED8BF10BFB8883D7A043B57</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>BarChartView.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Charts/BarChartView.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>243E707501F994F3795FFB8D67694A89</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>2E0EC03652FA915F8E96EFC2558A5439</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Project</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>24A9C720DFCC621D045671BF48493E8A</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>4D08E45167845B9A49C6D44EB035AEE6</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>254EA72DFADAB5F3286B8726A554C9E6</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurationList</key>\n\t\t\t<string>0A3248BA59E025188FAAD1071189AA40</string>\n\t\t\t<key>buildPhases</key>\n\t\t\t<array>\n\t\t\t\t<string>B50658E33EBBEE7C9364A18D8514154E</string>\n\t\t\t\t<string>9303B618AC39FB9AC08C2C49BF74EB55</string>\n\t\t\t\t<string>AAD9F83548ADC849E712A6A4D7A6D789</string>\n\t\t\t</array>\n\t\t\t<key>buildRules</key>\n\t\t\t<array/>\n\t\t\t<key>dependencies</key>\n\t\t\t<array/>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXNativeTarget</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZAudio</string>\n\t\t\t<key>productName</key>\n\t\t\t<string>EZAudio</string>\n\t\t\t<key>productReference</key>\n\t\t\t<string>870CD4D0ED37DE3295E8E96C29756E48</string>\n\t\t\t<key>productType</key>\n\t\t\t<string>com.apple.product-type.framework</string>\n\t\t</dict>\n\t\t<key>25502F3A70A00FFB9812245EC0ECD0F6</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>D09B82E039368828B6E7C5FE88975F8F</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>25E5BE8AC9996AEF5235FB7EEB1A801D</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurations</key>\n\t\t\t<array>\n\t\t\t\t<string>F818CCD384C18AFDD6BDA68C6D1C19A0</string>\n\t\t\t\t<string>E4097C8AD80F7FA95C14816874CD3B28</string>\n\t\t\t</array>\n\t\t\t<key>defaultConfigurationIsVisible</key>\n\t\t\t<string>0</string>\n\t\t\t<key>defaultConfigurationName</key>\n\t\t\t<string>Release</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCConfigurationList</string>\n\t\t</dict>\n\t\t<key>268957DD1BCCEB3ABCE0BA4DED45EA01</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>D40D65B89CE20F485FF2173D31AF3853</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>268C17FB4A1B500FAE4A02E1F7D87D5C</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>46D3F6AF317B0CA613B0F2C91085FBED</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>269A73CB99FCBCBFAB8CFE698D4AEFB0</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXTargetDependency</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Alamofire</string>\n\t\t\t<key>target</key>\n\t\t\t<string>79C040AFDDCE1BCBF6D8B5EB0B85887F</string>\n\t\t\t<key>targetProxy</key>\n\t\t\t<string>6DD9C4273AD1566E52B7A375025B0C89</string>\n\t\t</dict>\n\t\t<key>26CA2DF100EC60422EB34B611F67ACD6</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>HttpHandlers.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Sources/HttpHandlers.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>272BAEFC0F1D27DEF0B82A5B2705399E</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>BubbleChartData.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/BubbleChartData.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>27801E482F53A81CBFF8F018F3A098C6</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZMicrophone.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/EZMicrophone.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>278A8E9A676F2861EE04688763C40773</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>aes_via_ace.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/aes/aes_via_ace.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>284973C8BAF3B75F23E5BF288A890A05</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts.modulemap</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>290CE55BDCD4E03FA2A31B6B142A4F4C</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>DFCF6A958A237C3D561F2830085A3000</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Project</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>2993BE53CEB9368C1FD283A26A8DC3CF</key>\n\t\t<dict>\n\t\t\t<key>explicitFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>AASquaresLoading.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>AASquaresLoading.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>BUILT_PRODUCTS_DIR</string>\n\t\t</dict>\n\t\t<key>29FE1468A9F2C8D913EAD260E4E8B852</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ZLMusicFlowWaveView.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>ZLMusicFlowWaveView/ZLMusicFlowWaveView.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>2A19DB845AD3D3E62C87A8183C450FC5</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartColorTemplates.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Utils/ChartColorTemplates.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>2A54E14C2D0994A8370C91E5B536A105</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>D5F44E638D27C282B496D1999C8B754A</string>\n\t\t\t\t<string>6EA1BE8E8A6172B255E1C74432F2F569</string>\n\t\t\t\t<string>FA6606E69ACCD1B09D98F9CC5F9A98C3</string>\n\t\t\t\t<string>3CB03ADC16519670885B618511A8CFED</string>\n\t\t\t\t<string>791E8610412F77070BC5BCD5A394FEAF</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>AlamofireRSSParser</string>\n\t\t\t<key>path</key>\n\t\t\t<string>AlamofireRSSParser</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>2A6A25FC0A0B5FF53D4D6302464DF0A2</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>LineScatterCandleRadarChartDataSet.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/LineScatterCandleRadarChartDataSet.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>2AF403E88078E69FABBBF24E83B55823</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio-umbrella.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>2B44A572F8A1ACA0F3964493F4D3228D</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>34DCEA82E5AD0D0D34C17E1A5C318343</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>2B478D3A308B7A2B85319239F72DE289</key>\n\t\t<dict>\n\t\t\t<key>containerPortal</key>\n\t\t\t<string>D41D8CD98F00B204E9800998ECF8427E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXContainerItemProxy</string>\n\t\t\t<key>proxyType</key>\n\t\t\t<string>1</string>\n\t\t\t<key>remoteGlobalIDString</key>\n\t\t\t<string>F60C777A2655795B8C4DD4476D3522F5</string>\n\t\t\t<key>remoteInfo</key>\n\t\t\t<string>SJCSimplePDFView</string>\n\t\t</dict>\n\t\t<key>2B5256614B1DBAD79986FA7800D8B7E9</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>36D90A99286A433572F91AB604418967</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>AlamofireRSS</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>WRAPPER_EXTENSION</key>\n\t\t\t\t<string>bundle</string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Debug</string>\n\t\t</dict>\n\t\t<key>2B7CE3EB8CB44E72DC0954A7CCE3CD35</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>8F7A7A4CBF39B0995A17F5F10F25F3A1</string>\n\t\t\t\t<string>6DA6701753BDEEF59EA50F2CB8CDC7EC</string>\n\t\t\t\t<string>49F9110F9B868DCF1D1E766EDDDBD25E</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>SJCSimplePDFView</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SJCSimplePDFView</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>2BCC458FDD5F692BBB2BFC64BB5701FC</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Pods-umbrella.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>2C7B70526524E165EB80DFFC1D36CFF2</key>\n\t\t<dict>\n\t\t\t<key>containerPortal</key>\n\t\t\t<string>D41D8CD98F00B204E9800998ECF8427E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXContainerItemProxy</string>\n\t\t\t<key>proxyType</key>\n\t\t\t<string>1</string>\n\t\t\t<key>remoteGlobalIDString</key>\n\t\t\t<string>254EA72DFADAB5F3286B8726A554C9E6</string>\n\t\t\t<key>remoteInfo</key>\n\t\t\t<string>EZAudio</string>\n\t\t</dict>\n\t\t<key>2D3405986FC586FA6C0A5E0B6BA7E64E</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>B76F74C8F9438C97CE81DA0817A9D699</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>2D8E8EC45A3A1A1D94AE762CB5028504</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurations</key>\n\t\t\t<array>\n\t\t\t\t<string>A70CDAD61F90AC503C7D04CC22DA2923</string>\n\t\t\t\t<string>FB45FFD90572718D82AB9092B750F0CA</string>\n\t\t\t</array>\n\t\t\t<key>defaultConfigurationIsVisible</key>\n\t\t\t<string>0</string>\n\t\t\t<key>defaultConfigurationName</key>\n\t\t\t<string>Release</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCConfigurationList</string>\n\t\t</dict>\n\t\t<key>2D987F8F1DA56251215C8670CD1FA485</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>HorizontalBarChartRenderer.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Renderers/HorizontalBarChartRenderer.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>2DDDE6A2D911CE26FD721A694DA7D986</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>AnimatedMoveViewJob.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Jobs/AnimatedMoveViewJob.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>2DFEDFAB407EBB39DF8E289418A7BE63</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>2D987F8F1DA56251215C8670CD1FA485</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>2E0EC03652FA915F8E96EFC2558A5439</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>brg_types.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/aes/brg_types.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>2E176E84663592A2EB1DF3E23B6D3225</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>44CD3303CF2B64BFC1180928240316D4</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>2E6846DB220C35EF387C119161A37580</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>B80A7F9A2E84C0DE81E907E12076A4A1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>2E70CA0E5B5063FA1695EC714491B22A</key>\n\t\t<dict>\n\t\t\t<key>explicitFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Charts.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>BUILT_PRODUCTS_DIR</string>\n\t\t</dict>\n\t\t<key>2E7E02258E9A5195895517F8E2465FB8</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>path</key>\n\t\t\t<string>DGElasticPullToRefresh.modulemap</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>2EBAA77DF6F106BCE20CADC931D8C84F</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>E8F096851EC41151C5B6B0F804F678F0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>2EC5A9E72CC8EBAA5DC6255EB89C5879</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>9D98F0DEB1F6A637347AA210314D3648</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>2F9E24C3EB88806401EAEE690D73F1A1</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>AASquaresLoading-prefix.pch</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>2F9FD76D50F8510D46C22FB03BF984DF</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>55BDB9FB19967DED8857D3A0749C44B9</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFrameworksBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>30092F63FB79CD827CB85D797464FB40</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>C5CF886AF69707824E7BE68FCA944D76</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>3103D8A7D64FE15C94380056D5AB453E</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ScatterChartData.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/ScatterChartData.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>3127828983CBDF4E8CBE8579564A7ACC</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>LineChartDataSet.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/LineChartDataSet.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>317A3E7B043018C7BD7F857B76FE1462</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>D3602C188ACB17FC40AC72FB96C5EB35</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>31A8AB41E1FF5C54D0970DF38969E324</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>unzip.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/minizip/unzip.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>32146DB6CF24E5D003FAB31AC7628C3E</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>DGElasticPullToRefreshExtensions.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>DGElasticPullToRefresh/DGElasticPullToRefreshExtensions.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>3262168D3B02149E7F1E85F8F5095D73</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>38A041658F28816244E23069CB89C403</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>329F9F0BFAE5C4683145EC1BA2C6C00C</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>3EB5F541CA07593B3D83A2457671CAB8</string>\n\t\t\t\t<string>114543CA2F4712B855C440FC1C01B461</string>\n\t\t\t\t<string>ACE29C6EE9323028266DA51A3449336F</string>\n\t\t\t\t<string>1B09B90650E7E94D067EEA465021ECFC</string>\n\t\t\t\t<string>F90D7168D47857A3578EC1A796A202DB</string>\n\t\t\t\t<string>243E707501F994F3795FFB8D67694A89</string>\n\t\t\t\t<string>97B071F74774C182E2EBD5319D1F565F</string>\n\t\t\t\t<string>D8A45F2D53B5C2246CB9D246A16F678F</string>\n\t\t\t\t<string>C8D8C67006FDDEAC7E7CCB7553FFB573</string>\n\t\t\t\t<string>7CE91BF36DAB7B3EE3B25D14480AFC34</string>\n\t\t\t\t<string>290CE55BDCD4E03FA2A31B6B142A4F4C</string>\n\t\t\t\t<string>9B0170C2DE85A2CED19A6FB95B59CD25</string>\n\t\t\t\t<string>4C339F83D74F78D45E8C20728644C28C</string>\n\t\t\t\t<string>163CCB0ED553E79B03AC5CE313F1DD77</string>\n\t\t\t\t<string>17FA4A36C2BDDC132AF9A0B1CE9E02F4</string>\n\t\t\t\t<string>6BC72123E48899694DE9CDD0C31A175C</string>\n\t\t\t\t<string>CDD0E4686262A0C5C4CBF479DA08F122</string>\n\t\t\t\t<string>67E7A49B20A3F7CCEAC2BBE05281DFA8</string>\n\t\t\t\t<string>E618C6E4AE74F180898BC4052A0BA056</string>\n\t\t\t\t<string>F14AEB3CA1EC057579980D73111BA153</string>\n\t\t\t\t<string>F16A3CAE58D32CAAECC25DDD2BEEA158</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXHeadersBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>32BAF7044096F3B8947FFBDDEBDF5E04</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>E56EA2D2498EDB9C4058F8E9A8989FAE</string>\n\t\t\t\t<string>79081B3C3FFC3A41C57FF8AE876CAEE7</string>\n\t\t\t\t<string>F2F301CD8741E18EEB9C1AA349323CFC</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXHeadersBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>339174A0A2DC9E27C74F079867D82284</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurationList</key>\n\t\t\t<string>5809E9CAB89A9C5C7FD30607412F4301</string>\n\t\t\t<key>buildPhases</key>\n\t\t\t<array>\n\t\t\t\t<string>B90D9DCA72327E7BB3D9A76CD30DF985</string>\n\t\t\t\t<string>7055AA29B8603B5BE107C3CB363252C9</string>\n\t\t\t\t<string>4930899EE714CB61540C9EFC03EFA944</string>\n\t\t\t</array>\n\t\t\t<key>buildRules</key>\n\t\t\t<array/>\n\t\t\t<key>dependencies</key>\n\t\t\t<array/>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXNativeTarget</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CYRTextView</string>\n\t\t\t<key>productName</key>\n\t\t\t<string>CYRTextView</string>\n\t\t\t<key>productReference</key>\n\t\t\t<string>83D33D34F7967099E1E8112180FB7D03</string>\n\t\t\t<key>productType</key>\n\t\t\t<string>com.apple.product-type.framework</string>\n\t\t</dict>\n\t\t<key>33B9BFC9E784B2CD678E24E68652504C</key>\n\t\t<dict>\n\t\t\t<key>containerPortal</key>\n\t\t\t<string>D41D8CD98F00B204E9800998ECF8427E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXContainerItemProxy</string>\n\t\t\t<key>proxyType</key>\n\t\t\t<string>1</string>\n\t\t\t<key>remoteGlobalIDString</key>\n\t\t\t<string>6DCD8E0D46E3E688EABD466D9ECB53BE</string>\n\t\t\t<key>remoteInfo</key>\n\t\t\t<string>AlamofireRSSParser-AlamofireRSS</string>\n\t\t</dict>\n\t\t<key>33CB5E4C130C28C458CD4F7AA1DF99E6</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>C617DC78B1A377E48CF0C244D1511F26</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>3425AFC5A5E5B97A4E085DC58D7BDE5C</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>988F0BEB31938ED3D03BD2F30C2178DF</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>34CCDCA848A701466256BC2927DA8856</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>8BB0BD9B1B6EB8ABF67E29EED3D628B6</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>34CEA003BE26A7286C83A2E59C4A7A2F</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CYRLayoutManager.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>CYRTextView/CYRLayoutManager.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>34DCEA82E5AD0D0D34C17E1A5C318343</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartDefaultFillFormatter.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Formatters/ChartDefaultFillFormatter.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>3519CBA7EE38A591227561F3B974D709</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>5EB6FE7C7C16E4C6E5B20F2437CB1D4F</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>35220F594E860391A0ED1DF9ECA6EBCA</key>\n\t\t<dict>\n\t\t\t<key>explicitFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Swifter.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Swifter.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>BUILT_PRODUCTS_DIR</string>\n\t\t</dict>\n\t\t<key>352EF1AF94125D67FEAA040F32449B24</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>56FE5CA50503474A58BE5ECE692210F7</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>3584EC2F1BC97974759791C0DAA32891</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Upload.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/Upload.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>35D6A246A5B602182B55996C79DEC3B7</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>mztools.c</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/minizip/mztools.c</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>361CB8CE5FB0F7E9DADD6D243BA09A05</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>BCD583736D388CAD44C261B79972B86B</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>362C15B9D5B743CE94949C267A11A11F</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>B8024D22C71DD62C706C2DA89005F3EE</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>366B695AE31536E5AB0C83E287A6DBC6</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>67016485CE0220DF8AF0DDC343E3F51C</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>COMPILER_FLAGS</key>\n\t\t\t\t<string>-DOS_OBJECT_USE_OBJC=0</string>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>36D90A99286A433572F91AB604418967</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.xcconfig</string>\n\t\t\t<key>path</key>\n\t\t\t<string>AlamofireRSSParser.xcconfig</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>371FCB701E2FA5156BA218C0C95A1C5E</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>699DF9D7711902133747EB23BB003CD3</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>37F47C35B2ADE059B4D7AF6334776FC9</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SwiftyJSON-dummy.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>38482CD39B3757452D67AE22C1DA5F29</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>85822A6D7AF455601F1786BFBCCDCDC3</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>384EFED9AD5C956EA205110FCC14C384</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CombinedChartData.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/CombinedChartData.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>3873DACF51A2F4E637F48FC9EE28FAA0</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>ZLMusicFlowWaveView-prefix.pch</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>3881764D412915AEE2FDC3677F741D9A</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurationList</key>\n\t\t\t<string>B497794704BDE793D7B8264F55B3EC9F</string>\n\t\t\t<key>buildPhases</key>\n\t\t\t<array>\n\t\t\t\t<string>755AFCA09D3807CB6C260E7115234963</string>\n\t\t\t\t<string>CDE3C54614B1F64A979844A035DA0BA6</string>\n\t\t\t\t<string>6CFD8C2D899AC6725E477D0BF4033CE2</string>\n\t\t\t</array>\n\t\t\t<key>buildRules</key>\n\t\t\t<array/>\n\t\t\t<key>dependencies</key>\n\t\t\t<array/>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXNativeTarget</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NMSSH</string>\n\t\t\t<key>productName</key>\n\t\t\t<string>NMSSH</string>\n\t\t\t<key>productReference</key>\n\t\t\t<string>94914325FB30736386431FA57CAE5AE4</string>\n\t\t\t<key>productType</key>\n\t\t\t<string>com.apple.product-type.framework</string>\n\t\t</dict>\n\t\t<key>38A041658F28816244E23069CB89C403</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CYRLayoutManager.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>CYRTextView/CYRLayoutManager.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>38C869AE53183F93DD743ED2C7192EB8</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXTargetDependency</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ZLMusicFlowWaveView</string>\n\t\t\t<key>target</key>\n\t\t\t<string>F8C233736FECBA33C0E71D949DF017CA</string>\n\t\t\t<key>targetProxy</key>\n\t\t\t<string>86ACE2887B0A55399595618D8A2A847D</string>\n\t\t</dict>\n\t\t<key>38E5AE8278D6C47639BB70049876C110</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>83CE5B92F7A625F5DAF1A110BF2F174D</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>391D473F1E22B03F1E1DA498562A0F38</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Alamofire-dummy.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>39225A7983DD89DC9CD0F0A9DE3F508A</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>PieChartRenderer.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Renderers/PieChartRenderer.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>3943D764C0D525CFAF94F943648E17BE</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>11BA64BC0B2FE8DDB41883B7241A8C49</string>\n\t\t\t\t<string>7A88BF95853A69E550E9F63A060BED12</string>\n\t\t\t\t<string>6B058FB2BD6B6B55995F631EE4B61D8E</string>\n\t\t\t\t<string>B2F9711D635766F4754D415B41FFC818</string>\n\t\t\t\t<string>ECDF2C04EED904A4AFC64DED8EA45544</string>\n\t\t\t\t<string>501198AA5B6723D71C0194BAD075BF02</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXSourcesBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>395E75AD0A89CABE845F7299D0509640</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>2DDDE6A2D911CE26FD721A694DA7D986</string>\n\t\t\t\t<string>BD8D5708635D65BB93AC3037C5DCA03E</string>\n\t\t\t\t<string>E42B1F498AF0874C6DE8124BB795F15E</string>\n\t\t\t\t<string>91827F8492FCBB8348FC58AEF693B03A</string>\n\t\t\t\t<string>1B8C2B556D484533F17C49F31CFE9279</string>\n\t\t\t\t<string>8F13815876589E1C113CACCF6B677AF1</string>\n\t\t\t\t<string>48F9BF534FE68A179559BAE0103EED67</string>\n\t\t\t\t<string>4A95A4BFE3F28F360C93177FFB7FF31D</string>\n\t\t\t\t<string>4313A1E9F9BFAE03053BBCE38418C9AB</string>\n\t\t\t\t<string>242B71AC1ED8BF10BFB8883D7A043B57</string>\n\t\t\t\t<string>56FE5CA50503474A58BE5ECE692210F7</string>\n\t\t\t\t<string>BE3F1A095E8DF60F568AC3C16C9CD9CC</string>\n\t\t\t\t<string>B972BD02DECCFEB0CD404ED449764022</string>\n\t\t\t\t<string>7D7776EE0E7EB45C6F665800D9385648</string>\n\t\t\t\t<string>272BAEFC0F1D27DEF0B82A5B2705399E</string>\n\t\t\t\t<string>A1E5E540A44850D55021393D3B56D093</string>\n\t\t\t\t<string>F7B3565EFC793DB0CE40900A2C1F3244</string>\n\t\t\t\t<string>768CC1338D4B027D4517DD3611152862</string>\n\t\t\t\t<string>E2F0E619F4A90A088378D7A28F583D02</string>\n\t\t\t\t<string>1845D98CE7CF2F3174B2E68C1E535445</string>\n\t\t\t\t<string>B7931B4F53CD6EDE5CF224FA1404C794</string>\n\t\t\t\t<string>80875D1812BC200BAB068CBC75B74E7A</string>\n\t\t\t\t<string>5259950BB229583DFC6DD1984E696407</string>\n\t\t\t\t<string>B80A7F9A2E84C0DE81E907E12076A4A1</string>\n\t\t\t\t<string>BA7AA59D2E9F556A528840EA05378089</string>\n\t\t\t\t<string>44CD3303CF2B64BFC1180928240316D4</string>\n\t\t\t\t<string>05BA62425D43DD87EC6390A0FAE74D1E</string>\n\t\t\t\t<string>E56D64DF36156ED67576CCA614D0618F</string>\n\t\t\t\t<string>ED3BCC1E1780692338F70AA5634917DF</string>\n\t\t\t\t<string>D21CB11D4389FD174002BD2E4714DF56</string>\n\t\t\t\t<string>398AF30D80C1481DE30A977A180903ED</string>\n\t\t\t\t<string>2A19DB845AD3D3E62C87A8183C450FC5</string>\n\t\t\t\t<string>D40D65B89CE20F485FF2173D31AF3853</string>\n\t\t\t\t<string>83CE5B92F7A625F5DAF1A110BF2F174D</string>\n\t\t\t\t<string>C989B85CAE2F73F5FFAA2EFB44C56081</string>\n\t\t\t\t<string>0E5DECF96C58C0F18CD5F7C5221CC7A7</string>\n\t\t\t\t<string>22059022078636D0B5F42A74AF4B5A22</string>\n\t\t\t\t<string>877DB484F7698974CCC1D66B51116FE1</string>\n\t\t\t\t<string>4FF58A41D7B6111B458ADE82268C1178</string>\n\t\t\t\t<string>78A8CAE0A08DC8E818F6E7C79557A27D</string>\n\t\t\t\t<string>34DCEA82E5AD0D0D34C17E1A5C318343</string>\n\t\t\t\t<string>6B53E7009C09C0B74CCBE630C56B20C1</string>\n\t\t\t\t<string>FFAF70D9A0BFA84F517D08E78C3A8EF4</string>\n\t\t\t\t<string>6DC1C46D160F2B2BB3AA0C6940A03914</string>\n\t\t\t\t<string>631FB7E22898D4FDDBEB4FF4CC88BD80</string>\n\t\t\t\t<string>6C4D119999C4945F085509808EEAD9CA</string>\n\t\t\t\t<string>B70483F68DA580907714FF534F1A20DA</string>\n\t\t\t\t<string>D7D019D2275A7A64B3188D36B0F5F8F4</string>\n\t\t\t\t<string>50C1B0FE72BD421266EBFB4B2B74F13B</string>\n\t\t\t\t<string>EA714E8F4EBC70B2C11E2BCA2854D037</string>\n\t\t\t\t<string>48B20F6AB1D5D3424D043726D66C8BC0</string>\n\t\t\t\t<string>4D08E45167845B9A49C6D44EB035AEE6</string>\n\t\t\t\t<string>57231F627385962A90CE6C6BC2D18C38</string>\n\t\t\t\t<string>699DF9D7711902133747EB23BB003CD3</string>\n\t\t\t\t<string>F5A144C28EEF910B35FCD66B9ACB13AE</string>\n\t\t\t\t<string>C9B9AD22764D9774AC7E4C72CEE64C60</string>\n\t\t\t\t<string>7D67EB40B9B5DAC7A2A758E1C8EEF4BC</string>\n\t\t\t\t<string>D3602C188ACB17FC40AC72FB96C5EB35</string>\n\t\t\t\t<string>C5CF886AF69707824E7BE68FCA944D76</string>\n\t\t\t\t<string>1A7CD22F5ED03019E906E471DD59388F</string>\n\t\t\t\t<string>7E299BF9A615998682A1A05F5F0E42EE</string>\n\t\t\t\t<string>761F2AE2A08681D34B98C5205A398BF9</string>\n\t\t\t\t<string>1167F2A0B491A489F337578AC16A5F11</string>\n\t\t\t\t<string>85822A6D7AF455601F1786BFBCCDCDC3</string>\n\t\t\t\t<string>19318C4AE0C9FF87FDC7C34424E9305F</string>\n\t\t\t\t<string>A99843CE4BE0995346C06785127AB91C</string>\n\t\t\t\t<string>46E1873E64EC87857800E9B2C2A793A7</string>\n\t\t\t\t<string>6C61009912177D3D77B80D65EC5B2AA4</string>\n\t\t\t\t<string>191F7183D2E17767A8B14716B9453747</string>\n\t\t\t\t<string>7E387B67B1AB63AFDB74AEAA00DD821D</string>\n\t\t\t\t<string>384EFED9AD5C956EA205110FCC14C384</string>\n\t\t\t\t<string>B06192AD341CDBCD0D19BD7B8DCF3B4E</string>\n\t\t\t\t<string>C0FF762D04F76D834E1291819067E12A</string>\n\t\t\t\t<string>1AC2B93F71120CA50074113DD62725AC</string>\n\t\t\t\t<string>BE0A3BFD226BAF44617BFBB3DB345624</string>\n\t\t\t\t<string>2D987F8F1DA56251215C8670CD1FA485</string>\n\t\t\t\t<string>534D8D488609E2DA3DBE7CA778E2D5DC</string>\n\t\t\t\t<string>9F45FA658BE59059A916A5F98B6F70A7</string>\n\t\t\t\t<string>033590E1C2397DA8E570B55810775B8E</string>\n\t\t\t\t<string>BE6178583E3411E5621C8AB2CB79014F</string>\n\t\t\t\t<string>5EB6FE7C7C16E4C6E5B20F2437CB1D4F</string>\n\t\t\t\t<string>5C0B9516684CF8E715F8B7D047F76709</string>\n\t\t\t\t<string>E6CC8802D5BE9DF62F444322062597D0</string>\n\t\t\t\t<string>0FBCB9B828FF98812A1EE98817048C46</string>\n\t\t\t\t<string>543700860208A4CDC32C58B8636E5827</string>\n\t\t\t\t<string>DA3AA58FE349027A794BEA3358EED800</string>\n\t\t\t\t<string>0B93148101A5531681949F675D41538E</string>\n\t\t\t\t<string>CC1086A80586AA695872978B4DCA7686</string>\n\t\t\t\t<string>72DC6BB442C0770DBB5A839ECD805ADB</string>\n\t\t\t\t<string>E8F096851EC41151C5B6B0F804F678F0</string>\n\t\t\t\t<string>3127828983CBDF4E8CBE8579564A7ACC</string>\n\t\t\t\t<string>9A72A7D51819C4D550B5473E909F71FF</string>\n\t\t\t\t<string>B85E049096D02564EBABAB2D5BF6B6BE</string>\n\t\t\t\t<string>4E2E3D5588060B9FF52974B06D2DB9B7</string>\n\t\t\t\t<string>D170993D4633F76FF548FD13C3B84EC3</string>\n\t\t\t\t<string>2A6A25FC0A0B5FF53D4D6302464DF0A2</string>\n\t\t\t\t<string>6CDE7B54911112B22403C6B83659EE77</string>\n\t\t\t\t<string>8621EC900E9540E855F2A45193465CE6</string>\n\t\t\t\t<string>0BE89C1211FB9D34E28695028E028BC5</string>\n\t\t\t\t<string>B88349DF809DD951EF76B2B561C15983</string>\n\t\t\t\t<string>39225A7983DD89DC9CD0F0A9DE3F508A</string>\n\t\t\t\t<string>50DD5592D089DE7626D6837A4E9EA1AC</string>\n\t\t\t\t<string>55AB31E45DC84ECFF7CC6FC6AB1ACC81</string>\n\t\t\t\t<string>22CC997358A22BFFD42637B6A1E3868C</string>\n\t\t\t\t<string>BF20B8C23E028DAAB8B003D153FABE87</string>\n\t\t\t\t<string>63B79EFF01B2EE5390F1C6930E5D9E13</string>\n\t\t\t\t<string>C6DC7B869C1C73B1B12FFF994EEFAAA3</string>\n\t\t\t\t<string>3103D8A7D64FE15C94380056D5AB453E</string>\n\t\t\t\t<string>F38A27EE294EDDE1BCEA87D82E418D06</string>\n\t\t\t\t<string>1B8D79A74968EFE68A03C339F93BE40A</string>\n\t\t\t\t<string>087A04860A4A8EC54E6A1A5AF7F73E23</string>\n\t\t\t\t<string>69FE1C8A369E61A2B5F16F781CC4C612</string>\n\t\t\t\t<string>FD194E12D7F3D8DAA667A3A52EB221CA</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Core</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>398AF30D80C1481DE30A977A180903ED</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartBaseDataSet.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/ChartBaseDataSet.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>3993828B63B3AC6BE59C92C303685F61</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.plist.xml</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Info.plist</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>39E179F4DAB57EC19626D1DCC4F5F007</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Stream.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/Stream.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>3A04E2A8DAC2E69D929439C0D50562D4</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>SSZipArchive.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/SSZipArchive.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>3A06439A9A5AE0F27374CF4A27AB4A0B</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>EB00AA6939C22D418E0231F5C736BC44</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>3B1F9EB02DD6CBB544A332E7F8A4A716</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>75671DCD2C65E9A11B1E6F09B6854AA0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>3B2ED386492166C28D7631B4488EA230</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>48B20F6AB1D5D3424D043726D66C8BC0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>3C50B55F32F9344B641ACF672F0220A4</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>6C4D119999C4945F085509808EEAD9CA</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>3CB03ADC16519670885B618511A8CFED</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>RSSItem.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Pod/Classes/RSSItem.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>3CFB42910790CF0BDBCCEBAACD6B9367</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurations</key>\n\t\t\t<array>\n\t\t\t\t<string>C3746E36F91278C40D0DCBA78D124E88</string>\n\t\t\t\t<string>74F7FAC78E5CB4D327B99F47BF099326</string>\n\t\t\t</array>\n\t\t\t<key>defaultConfigurationIsVisible</key>\n\t\t\t<string>0</string>\n\t\t\t<key>defaultConfigurationName</key>\n\t\t\t<string>Release</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCConfigurationList</string>\n\t\t</dict>\n\t\t<key>3D8DDA0FEB1A3AFF6643F9121E19D044</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>C6DC7B869C1C73B1B12FFF994EEFAAA3</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>3DB99C22AB1CE344BFE50941C299F2AB</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>9A72A7D51819C4D550B5473E909F71FF</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>3E5B420A73875137D4437E73149DCAEA</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>DCC866ED59787599F6878FA3408C9E43</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/EZAudio/EZAudio-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/EZAudio/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/EZAudio/EZAudio.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>EZAudio</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Debug</string>\n\t\t</dict>\n\t\t<key>3E620824BFA4001189C1AA5EEE595C67</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>5EFA7A6FD03F0353C6F5CA04653120C7</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>3E678AB82500885E6B28B0A982617ED8</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>928CDEDEA8EC3C437DB27409A17C998B</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFrameworksBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>3EA8F215C9C1432D74E5CCA4834AA8C0</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>1C13EE24977DA9B45CDE1309CB51D90E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>3EB5F541CA07593B3D83A2457671CAB8</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>4E488569CDEF3276C1BC982119CE0914</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Project</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>3EED0E841D10FEAA033A3C645CB219D3</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>761F2AE2A08681D34B98C5205A398BF9</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>3EF3C6E2D5466E70A62B0CE90DA2604C</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>8F13815876589E1C113CACCF6B677AF1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>3F35D9D6BE5B906A940193BD32AEA736</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>BB8BF3A20530EBB622CA33D5AEFB739D</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>COMPILER_FLAGS</key>\n\t\t\t\t<string>-DOS_OBJECT_USE_OBJC=0</string>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>3F37EE1C6EE59F78A3A5E60EF31FFA3A</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZPlot.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/EZPlot.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>3F853DCA000D97FD5D823E8C262B2A64</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>D7AC85CBA5CACB37DD2CDA0B13E3DC0D</string>\n\t\t\t\t<string>8ACA70A9D45E782647B8995535544861</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFrameworksBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>40043CBCDD93A301F8437421D53D02A3</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Foundation.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/Foundation.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>DEVELOPER_DIR</string>\n\t\t</dict>\n\t\t<key>4081EA628AF0B73AC51FFB9D7AB3B89E</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>CDD10EA7FDB7BA6CF457E5EC0E4174A3</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>409737D7933980737EC1592FBD4AAADE</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>1D0F56E661286DC8431D8887DD690692</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>409962F3CD08FB4947DAEFF94EDEFC86</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXTargetDependency</string>\n\t\t\t<key>name</key>\n\t\t\t<string>SSZipArchive</string>\n\t\t\t<key>target</key>\n\t\t\t<string>F49E17CE595BF7A7A46139779E891F78</string>\n\t\t\t<key>targetProxy</key>\n\t\t\t<string>0256D63626119843AC1248D91D38C551</string>\n\t\t</dict>\n\t\t<key>40F968A172478FA1FF7BC61E5E43A165</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>8EA7C01FA9014E4AC4EB52DEBC568005</string>\n\t\t\t\t<string>B4E6B408AA61BA919AA4B1D77012E3F6</string>\n\t\t\t\t<string>86A4F33244B76027A52DC18FE83F6FA8</string>\n\t\t\t\t<string>CDD10EA7FDB7BA6CF457E5EC0E4174A3</string>\n\t\t\t\t<string>776ECCE5529B00F6D7F372E0F8AB6002</string>\n\t\t\t\t<string>8BB0BD9B1B6EB8ABF67E29EED3D628B6</string>\n\t\t\t\t<string>9AB9C30C29CCEEC9315ABE415511676B</string>\n\t\t\t\t<string>05D9707C1A350638ECD52006A481F077</string>\n\t\t\t\t<string>A792226DBE4257340C826C75A0DC208F</string>\n\t\t\t\t<string>854D9C81549E59B2145F57291D9C9E01</string>\n\t\t\t\t<string>1C13EE24977DA9B45CDE1309CB51D90E</string>\n\t\t\t\t<string>1891931FD0A3F4CC78749D9E977A8505</string>\n\t\t\t\t<string>B756C6158B1743F24242A4F20F07ECCA</string>\n\t\t\t\t<string>39E179F4DAB57EC19626D1DCC4F5F007</string>\n\t\t\t\t<string>B5EEC8A63E90F6F8F85DEF5514D52ED8</string>\n\t\t\t\t<string>3584EC2F1BC97974759791C0DAA32891</string>\n\t\t\t\t<string>B76F74C8F9438C97CE81DA0817A9D699</string>\n\t\t\t\t<string>7EE6C232195755A42DEAECB46E888B18</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Alamofire</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Alamofire</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>421EC967AD86F44E9BDB88301D94B33B</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>FFAF70D9A0BFA84F517D08E78C3A8EF4</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>423A9BA046AD7AEAED121ABE70F42763</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>40043CBCDD93A301F8437421D53D02A3</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>4276EB8AC31314ED23699BF489AAA02A</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SwiftyJSON.modulemap</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>42787649B04F8FCB3363DE9C7642B645</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CGSizeExtension.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/CGSizeExtension.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>4313A1E9F9BFAE03053BBCE38418C9AB</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>BarChartRenderer.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Renderers/BarChartRenderer.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>43FD5AF8E2E268BB58C2BEE180302F51</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurationList</key>\n\t\t\t<string>D24B9254E2DE0C6C7A2339323E1BF0A4</string>\n\t\t\t<key>buildPhases</key>\n\t\t\t<array>\n\t\t\t\t<string>98760AA9A7D6FB3DA51581FB5D81023D</string>\n\t\t\t\t<string>3F853DCA000D97FD5D823E8C262B2A64</string>\n\t\t\t\t<string>616D4647E855D8293CF8A0E0A253D067</string>\n\t\t\t\t<string>9D4E866B71A9C1336273DDC9164734A2</string>\n\t\t\t</array>\n\t\t\t<key>buildRules</key>\n\t\t\t<array/>\n\t\t\t<key>dependencies</key>\n\t\t\t<array>\n\t\t\t\t<string>0282FE2D0C3A9B3705A974193237B978</string>\n\t\t\t\t<string>C69E27AE1864F2E73BFE3829B41BFE3F</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXNativeTarget</string>\n\t\t\t<key>name</key>\n\t\t\t<string>AlamofireRSSParser</string>\n\t\t\t<key>productName</key>\n\t\t\t<string>AlamofireRSSParser</string>\n\t\t\t<key>productReference</key>\n\t\t\t<string>86D972F433A3176BF77299B3526C71AF</string>\n\t\t\t<key>productType</key>\n\t\t\t<string>com.apple.product-type.framework</string>\n\t\t</dict>\n\t\t<key>4458DADC90FBB23CF881C195DC1D4980</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>String+BASE64.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Sources/String+BASE64.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>44CD3303CF2B64BFC1180928240316D4</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CandleStickChartView.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Charts/CandleStickChartView.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>450044A6490A439394B0F3A67CCFBD00</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>CF9D51D988643E797BAE8A9A54D9F2CD</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>453AE9B30136CD292073FFCB386A111C</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>B5971F611DFCB1DBE9E29202C26D4163</string>\n\t\t\t\t<string>268C17FB4A1B500FAE4A02E1F7D87D5C</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXSourcesBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>4544CA2498B23C5B3295862D2F20901A</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>626CCE81FCEDAE7AEF6B6A9403E58F03</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>4567150A2B071C2DA321F4CE18FF8364</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Animator.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/Animator.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>45B1D072665424E0D9FEAA51DE27E6E3</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.plist.xml</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Info.plist</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>45DA8587F08705657CBBFF27A51A0143</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>40043CBCDD93A301F8437421D53D02A3</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>45DDC4029E0C5A71CC9136854BFC8AB1</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>ECB77A2F7E083C88A4C9EAEF40CB8D17</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>45FA3456C69B0437B37A006EFB69674D</key>\n\t\t<dict>\n\t\t\t<key>containerPortal</key>\n\t\t\t<string>D41D8CD98F00B204E9800998ECF8427E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXContainerItemProxy</string>\n\t\t\t<key>proxyType</key>\n\t\t\t<string>1</string>\n\t\t\t<key>remoteGlobalIDString</key>\n\t\t\t<string>FB6A25C88BCCDB159C1C71A2C484100D</string>\n\t\t\t<key>remoteInfo</key>\n\t\t\t<string>SwiftyJSON</string>\n\t\t</dict>\n\t\t<key>4620E80B337EA9F040BEB93DF08BD134</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>path</key>\n\t\t\t<string>ZLSinusWaveView-dummy.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>465CB044A4902D7BAA80597E096B0E67</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>4A95A4BFE3F28F360C93177FFB7FF31D</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>4684964FE77650C6E9F3ED93AC79C87D</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>EAF5382389A29BF0B9ECFE46E3F5AC4D</string>\n\t\t\t\t<string>DC9FDA0AFC976AC147511622F5DB1860</string>\n\t\t\t\t<string>87FEA49CACDD9BA7901D248871C94118</string>\n\t\t\t\t<string>61C249EB2452D0503C05988D568A9C4D</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Resources</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>46D3F6AF317B0CA613B0F2C91085FBED</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>AASquaresLoading.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/AASquaresLoading.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>46E1873E64EC87857800E9B2C2A793A7</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartYAxis.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Components/ChartYAxis.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>46EC9DD508AF1269E9D7DAB50594AB66</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>AEFloatConverter.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/AEFloatConverter.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>470A19320682236DEF0633151EF7F01C</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>86909353BB4657C029BB5008942330ED</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>COMPILER_FLAGS</key>\n\t\t\t\t<string>-DOS_OBJECT_USE_OBJC=0</string>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>4846448B6998275139FBF24E87C11D42</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>57231F627385962A90CE6C6BC2D18C38</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>4888A76CCC22B207C2B0D3B6741688DA</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>20DCE1442556CA5F41805570F5B5844F</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>48B20F6AB1D5D3424D043726D66C8BC0</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartPlatform.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Utils/ChartPlatform.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>48F9BF534FE68A179559BAE0103EED67</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>BarChartDataSet.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/BarChartDataSet.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>490570C4EC2C7DD9D5FCA37164C6442D</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>F0230F9740EC7A507AC92A65994E63C9</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>4930899EE714CB61540C9EFC03EFA944</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>3262168D3B02149E7F1E85F8F5095D73</string>\n\t\t\t\t<string>5E569414E49052AC549E22C1B4C794E7</string>\n\t\t\t\t<string>5526DF3081392B7D302F2574F8844AA6</string>\n\t\t\t\t<string>DD7D8BD19010A140BBD01B5E92541182</string>\n\t\t\t\t<string>4B3340DEA17E06019D3C98663AC362D6</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXHeadersBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>49459EAB6B6631BA931AAD932786D029</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>DemoServer.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Sources/DemoServer.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>49F9110F9B868DCF1D1E766EDDDBD25E</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>97CA0B8036338914727FF40447D5C34C</string>\n\t\t\t\t<string>826CDEA3F474B8670FB6244F7842DE73</string>\n\t\t\t\t<string>A16184B99AC1C6FBC8F177C124589651</string>\n\t\t\t\t<string>F5C563FFB56C2F264F8F6B3EF31B074F</string>\n\t\t\t\t<string>E0CAE9A4EC3948A0E48F0096EAF93132</string>\n\t\t\t\t<string>0CCE916C80D42C6943D73D1A829DA787</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Support Files</string>\n\t\t\t<key>path</key>\n\t\t\t<string>../Target Support Files/SJCSimplePDFView</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>4A10B4FB2E8D14A92065018A75A6EEF1</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array/>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXResourcesBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>4A649E5F7B4737DC7A6645E6EBE61690</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>42787649B04F8FCB3363DE9C7642B645</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>4A95A4BFE3F28F360C93177FFB7FF31D</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>BarChartHighlighter.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Highlight/BarChartHighlighter.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>4ABE19F043A4FECE8C2A3F1F72AB3F7F</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>B972BD02DECCFEB0CD404ED449764022</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>4ADAD0E91F5DCCDC1EEF2C11C99034AC</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NMSSHSessionDelegate.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH/Protocols/NMSSHSessionDelegate.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>4AF8AA804B2142B26DC1B5186720048A</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>path</key>\n\t\t\t<string>AlamofireRSSParser.modulemap</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>4B3340DEA17E06019D3C98663AC362D6</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>62FD1B17D0F7FFDE4730993A41302A52</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>4BABE59E39A193B562EFEBE6E5626154</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>CYRTextView-umbrella.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>4BD7EE6ED468BE4A70A0739940369D7D</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>C0FF762D04F76D834E1291819067E12A</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>4C339F83D74F78D45E8C20728644C28C</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>9D7EF092E912A37841FC7F3316B1EE46</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Project</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>4CDBCAF32D84C52F6A5CD9D53D1C8686</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>284973C8BAF3B75F23E5BF288A890A05</string>\n\t\t\t\t<string>C0964599C373EAF8F5D4F77150B2E585</string>\n\t\t\t\t<string>009369000D8CF5B8C1E3E6BF283CA73A</string>\n\t\t\t\t<string>7E24079B28DAF8D9128CA7E7D33E6F7C</string>\n\t\t\t\t<string>BCD583736D388CAD44C261B79972B86B</string>\n\t\t\t\t<string>19954D5FC84330E551F6CF2AECCCEC23</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Support Files</string>\n\t\t\t<key>path</key>\n\t\t\t<string>../Target Support Files/Charts</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>4D08E45167845B9A49C6D44EB035AEE6</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartRange.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Highlight/ChartRange.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>4D8F6F5FDD8AE252C8D21C76F72CEC9F</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXTargetDependency</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CYRTextView</string>\n\t\t\t<key>target</key>\n\t\t\t<string>339174A0A2DC9E27C74F079867D82284</string>\n\t\t\t<key>targetProxy</key>\n\t\t\t<string>FE7F3C43D504E49A918DA967538283F8</string>\n\t\t</dict>\n\t\t<key>4E2E3D5588060B9FF52974B06D2DB9B7</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>LineRadarChartDataSet.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/LineRadarChartDataSet.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>4E488569CDEF3276C1BC982119CE0914</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>aes.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/aes/aes.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>4EAAC8A84A3397BCC528C8DAC72AE2F9</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>1260E1D284190E2A3D00903698C9D2F3</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/CYRTextView/CYRTextView-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/CYRTextView/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/CYRTextView/CYRTextView.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>CYRTextView</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Debug</string>\n\t\t</dict>\n\t\t<key>4EBF65047A668987D122EE46E359FF4D</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>61441E6010D0E49F26DDACBC74B8FCC2</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>4EC9879E9DEB9D169929ADA6EEFB18FD</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>BD8D5708635D65BB93AC3037C5DCA03E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>4ED7C61B5475997505191F07F768B0E2</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CYRTextView.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>CYRTextView/CYRTextView.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>4EEF9EF82DBD9FA2F25E1ABDE291AC02</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>91827F8492FCBB8348FC58AEF693B03A</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>4FF58A41D7B6111B458ADE82268C1178</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartDataRendererBase.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Renderers/ChartDataRendererBase.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>501198AA5B6723D71C0194BAD075BF02</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>0D9E3E8557D628F179DC72179BE68873</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>5016FC849FB311577714D8BF17D07034</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>EC840730B431C4C5CCBC36514D28D17A</string>\n\t\t\t\t<string>D879768BF616B126D71B6BA5F638D96A</string>\n\t\t\t\t<string>8AF188560381C1B97D9E46B09B146DE0</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXSourcesBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>50AE3A2D24BA4DE093FC4BD2657AC1FB</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>C9B9AD22764D9774AC7E4C72CEE64C60</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>50C1B0FE72BD421266EBFB4B2B74F13B</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartLimitLine.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Components/ChartLimitLine.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>50DD5592D089DE7626D6837A4E9EA1AC</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>PieChartView.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Charts/PieChartView.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>511493881CA40859A5E2279BD386A7AB</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>F31DF6C5B30A988A0B2DB360615D985B</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>51F55670AE3232AEAA1C0CE9575ACACC</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>A16184B99AC1C6FBC8F177C124589651</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/SJCSimplePDFView/SJCSimplePDFView-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/SJCSimplePDFView/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/SJCSimplePDFView/SJCSimplePDFView.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>SJCSimplePDFView</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Release</string>\n\t\t</dict>\n\t\t<key>52136F9F39CC2759B6CC1922BCB1AB41</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>57723204FBD830B51D546A0059298711</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>52183AB70293B3C29450264A392FA4F5</key>\n\t\t<dict>\n\t\t\t<key>containerPortal</key>\n\t\t\t<string>D41D8CD98F00B204E9800998ECF8427E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXContainerItemProxy</string>\n\t\t\t<key>proxyType</key>\n\t\t\t<string>1</string>\n\t\t\t<key>remoteGlobalIDString</key>\n\t\t\t<string>254EA72DFADAB5F3286B8726A554C9E6</string>\n\t\t\t<key>remoteInfo</key>\n\t\t\t<string>EZAudio</string>\n\t\t</dict>\n\t\t<key>522FF8BB85FE7B2A94BB4A2EBACA89AB</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>ECA049105DF827404AAEC0CD3E189C64</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Private</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>52349732EBA58888E9A0DBEB887F361B</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>B8CDE1803E298A956357E75C96E49EE7</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>5259950BB229583DFC6DD1984E696407</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CandleChartDataProvider.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Interfaces/CandleChartDataProvider.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>52ADA7A4A97CBF5879F6167136D1E715</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>35D6A246A5B602182B55996C79DEC3B7</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>COMPILER_FLAGS</key>\n\t\t\t\t<string>-DOS_OBJECT_USE_OBJC=0</string>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>5334BFFDC74B5BC33AB2F29E413CD99A</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive-prefix.pch</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>534D8D488609E2DA3DBE7CA778E2D5DC</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>HorizontalBarChartView.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Charts/HorizontalBarChartView.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>53F1005ADB78F4613F8C29A68E8B9909</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZRecorder.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/EZRecorder.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>543700860208A4CDC32C58B8636E5827</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ILineScatterCandleRadarChartDataSet.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Interfaces/ILineScatterCandleRadarChartDataSet.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>54E862294530B7914A37F408C0DFF74C</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>ED3BCC1E1780692338F70AA5634917DF</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>5526DF3081392B7D302F2574F8844AA6</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>4BABE59E39A193B562EFEBE6E5626154</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>552BBD1E199D776755E294481BAE70BD</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>name</key>\n\t\t\t<string>RongIMKit.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>556344573F293DFD06C18EC7B51B812B</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>6EA1BE8E8A6172B255E1C74432F2F569</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>55AB31E45DC84ECFF7CC6FC6AB1ACC81</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>PieRadarChartViewBase.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Charts/PieRadarChartViewBase.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>55BDB9FB19967DED8857D3A0749C44B9</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>40043CBCDD93A301F8437421D53D02A3</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>56942D4AE3FE1A0B97040C17F2AAA7BD</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>6A2D73BF1B684C56E7FEF0F452537CCF</string>\n\t\t\t\t<string>A89C4B4FA34F489CCA9D61165EA98AF9</string>\n\t\t\t\t<string>F31DF6C5B30A988A0B2DB360615D985B</string>\n\t\t\t\t<string>6FD6A0D37E4C38641DCB2885397E1488</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Frameworks</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>56E802F711F304E380A745ED755A25F2</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurations</key>\n\t\t\t<array>\n\t\t\t\t<string>2B5256614B1DBAD79986FA7800D8B7E9</string>\n\t\t\t\t<string>0BDAAEDEF5A3BBD3D36419ADBC621E43</string>\n\t\t\t</array>\n\t\t\t<key>defaultConfigurationIsVisible</key>\n\t\t\t<string>0</string>\n\t\t\t<key>defaultConfigurationName</key>\n\t\t\t<string>Release</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCConfigurationList</string>\n\t\t</dict>\n\t\t<key>56FE5CA50503474A58BE5ECE692210F7</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>BarLineChartViewBase.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Charts/BarLineChartViewBase.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>5721DA804A3926404ADB80D27EB9D7F2</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>B02BF2860C124E9C66C26D2E4913EC5B</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/ZLSinusWaveView/ZLSinusWaveView-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/ZLSinusWaveView/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/ZLSinusWaveView/ZLSinusWaveView.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>ZLSinusWaveView</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Release</string>\n\t\t</dict>\n\t\t<key>57231F627385962A90CE6C6BC2D18C38</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartRendererBase.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Renderers/ChartRendererBase.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>5768DCD828BCB3B8A372407BA137B249</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>A481946E2B03D2D461A9D9942194D32C</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>57723204FBD830B51D546A0059298711</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>HttpRouter.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Sources/HttpRouter.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>5798CFA7BDB78019CBD837FA245CCF7C</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>libssh2_sftp.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH-iOS/Libraries/include/libssh2/libssh2_sftp.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>57D859C2DD2A786A0EC902A7DE9F864C</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>A1B31917F302790BEE2C7CA37EFBA0DF</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>COMPILER_FLAGS</key>\n\t\t\t\t<string>-DOS_OBJECT_USE_OBJC=0</string>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>57EB7F801E937056D8EA61707A156023</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>69E2158C4EE02BF8D175828AD9D93C69</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>5809E9CAB89A9C5C7FD30607412F4301</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurations</key>\n\t\t\t<array>\n\t\t\t\t<string>4EAAC8A84A3397BCC528C8DAC72AE2F9</string>\n\t\t\t\t<string>8849F4F8A02D3B41E46CF24A28485E5B</string>\n\t\t\t</array>\n\t\t\t<key>defaultConfigurationIsVisible</key>\n\t\t\t<string>0</string>\n\t\t\t<key>defaultConfigurationName</key>\n\t\t\t<string>Release</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCConfigurationList</string>\n\t\t</dict>\n\t\t<key>586EA2D58EF199363C2C23823C092089</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>C5AA30790616DFD31FB6E41D32920A1A</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>59639868BF0B29D1419BB3F9312567AF</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.plist.xml</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Info.plist</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>5A7F1D5307EAD796E3AA22EA222AA8FA</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive-umbrella.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>5BAE1115B0F38B2B700C84FCE61FDD87</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>archive.ar</string>\n\t\t\t<key>name</key>\n\t\t\t<string>libssh2.a</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH-iOS/Libraries/lib/libssh2.a</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>5BBC00FA891515A4337DFE7D18C0BD00</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>95C3D67F3A2378FDCAD498AF576A36D7</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/Gifu/Gifu-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/Gifu/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/Gifu/Gifu.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>Gifu</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>SWIFT_OPTIMIZATION_LEVEL</key>\n\t\t\t\t<string>-Onone</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Debug</string>\n\t\t</dict>\n\t\t<key>5BC19E6E0F199276003F0AF96838BCE5</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>3584EC2F1BC97974759791C0DAA32891</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>5C0B9516684CF8E715F8B7D047F76709</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>IChartDataSet.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Interfaces/IChartDataSet.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>5C4566FE7B7461D8601278AE68C50358</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>40043CBCDD93A301F8437421D53D02A3</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>5C5512B13DBD171651F6D19C66DCBB1B</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>1F2A324FC0B075A00AEE84CC028D8F1F</string>\n\t\t\t\t<string>A020A04A30303EBCC97F078481030B44</string>\n\t\t\t\t<string>5798CFA7BDB78019CBD837FA245CCF7C</string>\n\t\t\t\t<string>988F0BEB31938ED3D03BD2F30C2178DF</string>\n\t\t\t\t<string>F0230F9740EC7A507AC92A65994E63C9</string>\n\t\t\t\t<string>03FC642C1EF0F16D7AB31F4AC6D6F719</string>\n\t\t\t\t<string>638DF91968A81A91C75221EC0671A73C</string>\n\t\t\t\t<string>95A51226875B54D2C24099FABD65F9A4</string>\n\t\t\t\t<string>E349CFCDAD29F7182C472495FBBFCF0F</string>\n\t\t\t\t<string>ECA049105DF827404AAEC0CD3E189C64</string>\n\t\t\t\t<string>74190DEE29D1C7C27FD494EE3CB59F14</string>\n\t\t\t\t<string>0CFA654DBD993FD0F891ECD3B7432064</string>\n\t\t\t\t<string>7394AB9A3BB12133D1798B57561E2552</string>\n\t\t\t\t<string>0BD8E73E6A192F43B39F876E1E07146C</string>\n\t\t\t\t<string>79AF06EC7F78F59EDAC780C88DB961AE</string>\n\t\t\t\t<string>D7C1E15DAA48F123231A498172D38967</string>\n\t\t\t\t<string>1F8B22539695E07FA9762AFF2D92CB5A</string>\n\t\t\t\t<string>EFAF93ECA6E252EF29AB51A210E6D8E4</string>\n\t\t\t\t<string>16707D24276E0D4BA984EAD7829AFC3B</string>\n\t\t\t\t<string>F6A855C0E5EE0EC482325EB94815F74A</string>\n\t\t\t\t<string>0A0B1AD12AF0AAF31F2FE461AEDD6AC9</string>\n\t\t\t\t<string>4ADAD0E91F5DCCDC1EEF2C11C99034AC</string>\n\t\t\t\t<string>8353E819C2C6AE2417C900DE0705D1A8</string>\n\t\t\t\t<string>71023FBED2BFC50D42DB8F5E48E31B48</string>\n\t\t\t\t<string>E14C8107646EC3F8588ED97956DCC65A</string>\n\t\t\t\t<string>93E203BDEABA3092CDF443A1AA4202FD</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NMSSH</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>5C8F85E0EEBB7F9DDADE1D67E310ACAF</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>2AF403E88078E69FABBBF24E83B55823</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>5CB05FBCB32D21E194B5ECF680CB6AE0</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>B4E6B408AA61BA919AA4B1D77012E3F6</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>5D33D52D318CF2F7B66A1D73DDCE436D</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>9B8983A42745CE241C8FE81ADFB76218</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>5D48CB591598D53251BDB48146F61D43</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>0FAAC91F636F7A42B8D0A2D53351CB33</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>5DCEC268DB930EF58F5B13FE3A59EC8B</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>7394AB9A3BB12133D1798B57561E2552</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>5E2CC216EEF82AC984AE8D61A9177113</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>638DF91968A81A91C75221EC0671A73C</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>5E3EC164F92FFE16F448E27839FDFF32</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>BA48D6CA288389ECA1569120A6333992</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXHeadersBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>5E49AAF37C2B40CB0957F56DF1A3E620</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>E2FAD92811C5785C55D927D4BBF05C68</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>5E569414E49052AC549E22C1B4C794E7</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>E772910ED9BD048407A4D78E5020A45F</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>5E8334E4B9A3934776155BFEA1ADCCC7</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SwiftyJSON-umbrella.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>5EA97C7D866AB0A63806FDC3C86EDCFE</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZAudioPlot.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/EZAudioPlot.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>5EB6FE7C7C16E4C6E5B20F2437CB1D4F</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ICandleChartDataSet.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Interfaces/ICandleChartDataSet.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>5EFA7A6FD03F0353C6F5CA04653120C7</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZAudioPlotGLKViewController.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/EZAudioPlotGLKViewController.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>5F0A3448A6BD1FAE4B4F4E61EFD3DDCF</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>DCC866ED59787599F6878FA3408C9E43</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/EZAudio/EZAudio-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/EZAudio/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/EZAudio/EZAudio.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>EZAudio</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Release</string>\n\t\t</dict>\n\t\t<key>5F74650537FAFA0C20CFECF3870638C4</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>archive.ar</string>\n\t\t\t<key>name</key>\n\t\t\t<string>libcrypto.a</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH-iOS/Libraries/lib/libcrypto.a</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>5FA31142FE846A63B3CDCF338C03AF0F</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>ZLSinusWaveView-prefix.pch</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>5FF6421A0B1404F43C1F56F99853EC96</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>4620E80B337EA9F040BEB93DF08BD134</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>604D5A1EF4ABD6E0ACB3B5C820C9F841</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>B85E049096D02564EBABAB2D5BF6B6BE</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>61441E6010D0E49F26DDACBC74B8FCC2</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ZLSinusWaveView.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>ZLSinusWaveView/ZLSinusWaveView.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>616D4647E855D8293CF8A0E0A253D067</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>72168557B70D4C7AFD3AD754069E2370</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXResourcesBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>61C249EB2452D0503C05988D568A9C4D</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>zh-Hans.lproj</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/zh-Hans.lproj</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>620860DD966F93A5BB284ECA65E3FF68</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>7D7776EE0E7EB45C6F665800D9385648</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>626CCE81FCEDAE7AEF6B6A9403E58F03</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZPlot.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/EZPlot.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>62BD10A1EFF551EEE3D51229E3A5A135</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>TPCircularBuffer.c</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/TPCircularBuffer.c</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>62D919A2C9C2C955FA825CB474A9F16B</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>AnimatedFrame.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/AnimatedFrame.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>62E8346F03C03E7F4D631361F325689E</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>854D9C81549E59B2145F57291D9C9E01</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>62FD1B17D0F7FFDE4730993A41302A52</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CYRToken.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>CYRTextView/CYRToken.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>63002BFF3EE441011E71DD87CDA49484</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Swifter.modulemap</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>631BAC0B955DDA472F2092F853D8624D</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>72DC6BB442C0770DBB5A839ECD805ADB</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>631FB7E22898D4FDDBEB4FF4CC88BD80</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartHighlight.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Highlight/ChartHighlight.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>63537D19F4231AD1D75CAAD2AFE1EC84</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>74190DEE29D1C7C27FD494EE3CB59F14</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>6357E4DF80060A4CD9B6E9B06D5DBFE3</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXTargetDependency</string>\n\t\t\t<key>name</key>\n\t\t\t<string>AASquaresLoading</string>\n\t\t\t<key>target</key>\n\t\t\t<string>0E579C8B6EC88FD31F0C2B47C9058B48</string>\n\t\t\t<key>targetProxy</key>\n\t\t\t<string>998667BFE20E591A5EF6D4412B709E4B</string>\n\t\t</dict>\n\t\t<key>638DF91968A81A91C75221EC0671A73C</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NMSFTPFile.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH/NMSFTPFile.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>63A42196CB86BF9D7F26EC16B135E0CF</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Alamofire-umbrella.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>63B79EFF01B2EE5390F1C6930E5D9E13</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>RadarChartRenderer.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Renderers/RadarChartRenderer.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>655EC23C173F625425EFCDC75BE0A4D2</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>B3C1BBCF776752C05DDE5AAFAF11F696</string>\n\t\t\t\t<string>1D80AF552B91E3AC0E007F8B3D1C423B</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXHeadersBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>65C7C81B8FCE42F70895210309838E7D</key>\n\t\t<dict>\n\t\t\t<key>containerPortal</key>\n\t\t\t<string>D41D8CD98F00B204E9800998ECF8427E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXContainerItemProxy</string>\n\t\t\t<key>proxyType</key>\n\t\t\t<string>1</string>\n\t\t\t<key>remoteGlobalIDString</key>\n\t\t\t<string>C6828C2508515BC0428D6BDAA1292DC9</string>\n\t\t\t<key>remoteInfo</key>\n\t\t\t<string>Charts</string>\n\t\t</dict>\n\t\t<key>65FB4C3B9C6D3DF8ED9A60732536021D</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>EA714E8F4EBC70B2C11E2BCA2854D037</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>6626187A5C620C82B45EA50B60E531EC</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.plist.xml</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Info.plist</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>66289F09E2686DE08ED6DE071A0D5077</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>prng.c</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/aes/prng.c</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>667AE18ABE1BD4A574755ED111198F89</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>path</key>\n\t\t\t<string>ZLMusicFlowWaveView-dummy.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>66F42930FE68C6E4BD9E882D382F237C</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>5EA97C7D866AB0A63806FDC3C86EDCFE</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>67016485CE0220DF8AF0DDC343E3F51C</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>entropy.c</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/aes/entropy.c</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>67184F1852A59AB997108F4DB5AF70B0</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>40043CBCDD93A301F8437421D53D02A3</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>6744F19C73C44705160ECB1E7C7FB733</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>22CC997358A22BFFD42637B6A1E3868C</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>6789ABF735324868C1342E25DEC4AF09</key>\n\t\t<dict>\n\t\t\t<key>containerPortal</key>\n\t\t\t<string>D41D8CD98F00B204E9800998ECF8427E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXContainerItemProxy</string>\n\t\t\t<key>proxyType</key>\n\t\t\t<string>1</string>\n\t\t\t<key>remoteGlobalIDString</key>\n\t\t\t<string>ADD0B8D536C47FE797C15119D29AFC71</string>\n\t\t\t<key>remoteInfo</key>\n\t\t\t<string>ZLSinusWaveView</string>\n\t\t</dict>\n\t\t<key>679ABE39538CF97A7B169D851D0D472D</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>A962F3A2F35704A852AC7D38910200D9</string>\n\t\t\t\t<string>552BBD1E199D776755E294481BAE70BD</string>\n\t\t\t\t<string>AF2CF0BAA5DF6BABFC217F2495AD6FBA</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Frameworks</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>67E7A49B20A3F7CCEAC2BBE05281DFA8</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>3A04E2A8DAC2E69D929439C0D50562D4</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>69693BA8A71B1AB49790F1AEA9F54D84</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>7F87651AE9B6CA0E7F4A0114F19A7924</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/AASquaresLoading/AASquaresLoading-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/AASquaresLoading/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/AASquaresLoading/AASquaresLoading.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>AASquaresLoading</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Release</string>\n\t\t</dict>\n\t\t<key>698765A4EF927BBD85BC37EE2FF01903</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Socket.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Sources/Socket.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>699DF9D7711902133747EB23BB003CD3</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartSelectionDetail.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Utils/ChartSelectionDetail.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>69B023D17AE27F4AFA2514F22965C5D0</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH-umbrella.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>69E2158C4EE02BF8D175828AD9D93C69</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>FunctionalHelpers.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/FunctionalHelpers.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>69FC867B9095871D1CDC05702AD7F41B</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>40043CBCDD93A301F8437421D53D02A3</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>69FE1C8A369E61A2B5F16F781CC4C612</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ScatterChartView.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Charts/ScatterChartView.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>6A2D73BF1B684C56E7FEF0F452537CCF</key>\n\t\t<dict>\n\t\t\t<key>explicitFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Alamofire.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>BUILT_PRODUCTS_DIR</string>\n\t\t</dict>\n\t\t<key>6B058FB2BD6B6B55995F631EE4B61D8E</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>32146DB6CF24E5D003FAB31AC7628C3E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>6B173C46DF90109FE17024B11AD202E2</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>ZLSinusWaveView-umbrella.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>6B53E7009C09C0B74CCBE630C56B20C1</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartDefaultXAxisValueFormatter.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Formatters/ChartDefaultXAxisValueFormatter.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>6BAE05E7054A14414B907DD7F37AC8B7</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>path</key>\n\t\t\t<string>ZLSinusWaveView.modulemap</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>6BC72123E48899694DE9CDD0C31A175C</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>ED50758E863F122346C9C2E1873E53DE</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Project</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>6C3C1BD7C759507F7AE5B2380506F232</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>F7210A9C5D404BB2ED9A06FE29F3AC73</string>\n\t\t\t\t<string>DCC866ED59787599F6878FA3408C9E43</string>\n\t\t\t\t<string>1EF3386A084C9BF7F3B05704CD56DBE6</string>\n\t\t\t\t<string>7783EB9441B8701156D49F3429E4F627</string>\n\t\t\t\t<string>2AF403E88078E69FABBBF24E83B55823</string>\n\t\t\t\t<string>035FEBC2FF9B0AA63626D2CB12316222</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Support Files</string>\n\t\t\t<key>path</key>\n\t\t\t<string>../Target Support Files/EZAudio</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>6C4C1217EC8BF9E5E6DC8386FEAA0C3A</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXTargetDependency</string>\n\t\t\t<key>name</key>\n\t\t\t<string>AlamofireRSSParser</string>\n\t\t\t<key>target</key>\n\t\t\t<string>43FD5AF8E2E268BB58C2BEE180302F51</string>\n\t\t\t<key>targetProxy</key>\n\t\t\t<string>B8E903F30171A1D853877248B25C11D5</string>\n\t\t</dict>\n\t\t<key>6C4D119999C4945F085509808EEAD9CA</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartHighlighter.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Highlight/ChartHighlighter.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>6C61009912177D3D77B80D65EC5B2AA4</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartYAxisRenderer.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Renderers/ChartYAxisRenderer.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>6C77A1B3D784E94C0A704E5758AF6E14</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>DA3AA58FE349027A794BEA3358EED800</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>6CDE7B54911112B22403C6B83659EE77</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>LineScatterCandleRadarChartRenderer.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Renderers/LineScatterCandleRadarChartRenderer.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>6CFD8C2D899AC6725E477D0BF4033CE2</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>2070C04C1ABE2C3A69159596D2E1DF51</string>\n\t\t\t\t<string>BFEF228FE25034EB7CF784D634E0B10E</string>\n\t\t\t\t<string>8D0C814DACA85184D823E6AD381D5A78</string>\n\t\t\t\t<string>3425AFC5A5E5B97A4E085DC58D7BDE5C</string>\n\t\t\t\t<string>87DC6F96269BFB9C6744C1089FC0E92E</string>\n\t\t\t\t<string>522FF8BB85FE7B2A94BB4A2EBACA89AB</string>\n\t\t\t\t<string>C17EA91E38478C5DF425AFCDBDFBB3A1</string>\n\t\t\t\t<string>87647570FDAA4D851BD145A8FECA08D4</string>\n\t\t\t\t<string>AC8B33D9041AD680F9D5317FAAF423E0</string>\n\t\t\t\t<string>63537D19F4231AD1D75CAAD2AFE1EC84</string>\n\t\t\t\t<string>5DCEC268DB930EF58F5B13FE3A59EC8B</string>\n\t\t\t\t<string>0F92FE99CE8E162CBD0DC7F965008A6E</string>\n\t\t\t\t<string>07C1897D80CE662EEE2BB582594B5752</string>\n\t\t\t\t<string>158958FF49153EA1D61DF28C680C441B</string>\n\t\t\t\t<string>F0C215D509673D9BE13B73AC1B1CCB15</string>\n\t\t\t\t<string>D5AB4F80FDD82F7FD614CB3F000E615B</string>\n\t\t\t\t<string>8D8C1022173EA10270DC8917557A6AFC</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXHeadersBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>6DA6701753BDEEF59EA50F2CB8CDC7EC</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>SJCSimplePDFView.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SJCSimplePDFView/SJCSimplePDFView.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>6DC1C46D160F2B2BB3AA0C6940A03914</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartFillFormatter.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Formatters/ChartFillFormatter.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>6DCD8E0D46E3E688EABD466D9ECB53BE</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurationList</key>\n\t\t\t<string>56E802F711F304E380A745ED755A25F2</string>\n\t\t\t<key>buildPhases</key>\n\t\t\t<array>\n\t\t\t\t<string>9A33333E6963F5910C2F9B4A21ED1C16</string>\n\t\t\t\t<string>B76F8A1C0154EDBE0747BBB72FE5E62B</string>\n\t\t\t\t<string>4A10B4FB2E8D14A92065018A75A6EEF1</string>\n\t\t\t</array>\n\t\t\t<key>buildRules</key>\n\t\t\t<array/>\n\t\t\t<key>dependencies</key>\n\t\t\t<array/>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXNativeTarget</string>\n\t\t\t<key>name</key>\n\t\t\t<string>AlamofireRSSParser-AlamofireRSS</string>\n\t\t\t<key>productName</key>\n\t\t\t<string>AlamofireRSSParser-AlamofireRSS</string>\n\t\t\t<key>productReference</key>\n\t\t\t<string>A868E1FE16614BD1F1336EC1C9D8A8A8</string>\n\t\t\t<key>productType</key>\n\t\t\t<string>com.apple.product-type.bundle</string>\n\t\t</dict>\n\t\t<key>6DD9C4273AD1566E52B7A375025B0C89</key>\n\t\t<dict>\n\t\t\t<key>containerPortal</key>\n\t\t\t<string>D41D8CD98F00B204E9800998ECF8427E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXContainerItemProxy</string>\n\t\t\t<key>proxyType</key>\n\t\t\t<string>1</string>\n\t\t\t<key>remoteGlobalIDString</key>\n\t\t\t<string>79C040AFDDCE1BCBF6D8B5EB0B85887F</string>\n\t\t\t<key>remoteInfo</key>\n\t\t\t<string>Alamofire</string>\n\t\t</dict>\n\t\t<key>6EA1BE8E8A6172B255E1C74432F2F569</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>AlamofireRSSParser.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Pod/Classes/AlamofireRSSParser.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>6EC148C19BB64CE3477E95F7CA39F711</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Gifu-prefix.pch</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>6F27F0A0E87FC39880EE7BC442E7525C</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>1845D98CE7CF2F3174B2E68C1E535445</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>6F68A3567B15E1ECA46E4CF4E50A7211</key>\n\t\t<dict>\n\t\t\t<key>containerPortal</key>\n\t\t\t<string>D41D8CD98F00B204E9800998ECF8427E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXContainerItemProxy</string>\n\t\t\t<key>proxyType</key>\n\t\t\t<string>1</string>\n\t\t\t<key>remoteGlobalIDString</key>\n\t\t\t<string>ADD0B8D536C47FE797C15119D29AFC71</string>\n\t\t\t<key>remoteInfo</key>\n\t\t\t<string>ZLSinusWaveView</string>\n\t\t</dict>\n\t\t<key>6F96FF4172FE4DDDA8BB660DD50ABA6A</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>EA55530B8CFA1390B85AD2EAE503944D</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/SSZipArchive/SSZipArchive-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/SSZipArchive/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/SSZipArchive/SSZipArchive.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>SSZipArchive</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Debug</string>\n\t\t</dict>\n\t\t<key>6FB01F35A58B096070AD063AE6B3459A</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>path</key>\n\t\t\t<string>AASquaresLoading.modulemap</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>6FD6A0D37E4C38641DCB2885397E1488</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>98D75CBF835E0513551169EAFCDB35B3</string>\n\t\t\t\t<string>A28C94FC58D7492A6E64E2C97EBAFE0B</string>\n\t\t\t\t<string>F209FD4822C5866ECCA569B37842FBBA</string>\n\t\t\t\t<string>CFA3D4558500E9CC96C07F908B66D6B5</string>\n\t\t\t\t<string>40043CBCDD93A301F8437421D53D02A3</string>\n\t\t\t\t<string>A3415EFF6AEA35162B52EC0734DE1761</string>\n\t\t\t\t<string>71E013AE8742AF9DE782F24E90B5E1DB</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>iOS</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>70073C35619976BCC6D659E523A9375E</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>5259950BB229583DFC6DD1984E696407</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>702840BAC90AC4754E17FD68C4B8DEAC</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>EA55530B8CFA1390B85AD2EAE503944D</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/SSZipArchive/SSZipArchive-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/SSZipArchive/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/SSZipArchive/SSZipArchive.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>SSZipArchive</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Release</string>\n\t\t</dict>\n\t\t<key>70525166CB057B3EDE7449F355542038</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>DGElasticPullToRefreshLoadingView.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>DGElasticPullToRefresh/DGElasticPullToRefreshLoadingView.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>7055AA29B8603B5BE107C3CB363252C9</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>F27960E09751B596BEBF7019989E8BA3</string>\n\t\t\t\t<string>83C6D53EFB4BAFB4A64B3E76D664197B</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFrameworksBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>70A566A1797B301E45BC4F43633CF81A</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>99901C3BB68EEFED23AD5D68A6D00DD9</string>\n\t\t\t\t<string>1260E1D284190E2A3D00903698C9D2F3</string>\n\t\t\t\t<string>C617DC78B1A377E48CF0C244D1511F26</string>\n\t\t\t\t<string>0832C378A14BA80BA5856826F1530746</string>\n\t\t\t\t<string>4BABE59E39A193B562EFEBE6E5626154</string>\n\t\t\t\t<string>B8BBF24C6E5985DBBE1D91820E19E613</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Support Files</string>\n\t\t\t<key>path</key>\n\t\t\t<string>../Target Support Files/CYRTextView</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>71023FBED2BFC50D42DB8F5E48E31B48</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>socket_helper.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH/Config/socket_helper.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>717A214D47C4467FB7418FB121F803FD</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CYRTextStorage.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>CYRTextView/CYRTextStorage.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>71C68E3AFFC61709566D8EA695CFB5E7</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>brg_endian.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/aes/brg_endian.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>71E013AE8742AF9DE782F24E90B5E1DB</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>name</key>\n\t\t\t<string>UIKit.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/UIKit.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>DEVELOPER_DIR</string>\n\t\t</dict>\n\t\t<key>71EB9AFCBF7ABE58DCC9C10DEB02906A</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>A16184B99AC1C6FBC8F177C124589651</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/SJCSimplePDFView/SJCSimplePDFView-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/SJCSimplePDFView/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/SJCSimplePDFView/SJCSimplePDFView.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>SJCSimplePDFView</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Debug</string>\n\t\t</dict>\n\t\t<key>72085F8624E47C76F715EBE276B125EB</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>27801E482F53A81CBFF8F018F3A098C6</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>72168557B70D4C7AFD3AD754069E2370</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>A868E1FE16614BD1F1336EC1C9D8A8A8</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>729F9E9B68A861150F91F93D765BD254</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>9F45FA658BE59059A916A5F98B6F70A7</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>72C2EC0D8143C4CE2FF8091B233306BF</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CYRToken.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>CYRTextView/CYRToken.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>72DC6BB442C0770DBB5A839ECD805ADB</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>LineChartData.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/LineChartData.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>7394AB9A3BB12133D1798B57561E2552</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NMSSHChannelDelegate.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH/Protocols/NMSSHChannelDelegate.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>7404D532E36CB49046A6B5F2B4CB9E68</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>AE6C6B2C0EB874E9337C85BFF8DC4358</string>\n\t\t\t\t<string>46EC9DD508AF1269E9D7DAB50594AB66</string>\n\t\t\t\t<string>C5AA30790616DFD31FB6E41D32920A1A</string>\n\t\t\t\t<string>B28621795FA91577FCF3525D161A891E</string>\n\t\t\t\t<string>CF9D51D988643E797BAE8A9A54D9F2CD</string>\n\t\t\t\t<string>B8024D22C71DD62C706C2DA89005F3EE</string>\n\t\t\t\t<string>ECB77A2F7E083C88A4C9EAEF40CB8D17</string>\n\t\t\t\t<string>129963BBCBF40DB2189A0EB7993EDF12</string>\n\t\t\t\t<string>5EA97C7D866AB0A63806FDC3C86EDCFE</string>\n\t\t\t\t<string>75671DCD2C65E9A11B1E6F09B6854AA0</string>\n\t\t\t\t<string>F298F979D3ED9894044C72F2C66925E6</string>\n\t\t\t\t<string>FD04474CE1E00D47F9010D3A6526EA81</string>\n\t\t\t\t<string>0FDD62CA863BD5DBE7F5C375C207C7EF</string>\n\t\t\t\t<string>5EFA7A6FD03F0353C6F5CA04653120C7</string>\n\t\t\t\t<string>C7B98156605B0AC4C70830469ABB06A4</string>\n\t\t\t\t<string>27801E482F53A81CBFF8F018F3A098C6</string>\n\t\t\t\t<string>BD11BD25E12B54CC641E519B27C11B66</string>\n\t\t\t\t<string>78FCECFF404AD0FD74BACA1C1FC9FFBE</string>\n\t\t\t\t<string>626CCE81FCEDAE7AEF6B6A9403E58F03</string>\n\t\t\t\t<string>3F37EE1C6EE59F78A3A5E60EF31FFA3A</string>\n\t\t\t\t<string>DA8F020D6AA506F0106F80186BDA93E4</string>\n\t\t\t\t<string>53F1005ADB78F4613F8C29A68E8B9909</string>\n\t\t\t\t<string>62BD10A1EFF551EEE3D51229E3A5A135</string>\n\t\t\t\t<string>74118FFA1C9E2B5C51D5D121489141E7</string>\n\t\t\t\t<string>6C3C1BD7C759507F7AE5B2380506F232</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZAudio</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>74118FFA1C9E2B5C51D5D121489141E7</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>TPCircularBuffer.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/TPCircularBuffer.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>74190DEE29D1C7C27FD494EE3CB59F14</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NMSSHChannel.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH/NMSSHChannel.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>74A1509B9BC47C1B4C479FB033E06B24</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>74118FFA1C9E2B5C51D5D121489141E7</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>74CDEF8BA057A6BB4453A748E70EA142</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>0FAAC91F636F7A42B8D0A2D53351CB33</string>\n\t\t\t\t<string>B1AC36AEB4A84D49B74BB6F8E0AEF018</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>SwiftyJSON</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SwiftyJSON</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>74DAF567B850F3FC5893C8CBDB828616</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>40043CBCDD93A301F8437421D53D02A3</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>74DF8A9CBE6EAEB8C19105D047645443</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurations</key>\n\t\t\t<array>\n\t\t\t\t<string>9AC1C9FD1210EC02AAB22EE0DE3F2B60</string>\n\t\t\t\t<string>9F67093900083070A89BDF2635A435DB</string>\n\t\t\t</array>\n\t\t\t<key>defaultConfigurationIsVisible</key>\n\t\t\t<string>0</string>\n\t\t\t<key>defaultConfigurationName</key>\n\t\t\t<string>Release</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCConfigurationList</string>\n\t\t</dict>\n\t\t<key>74F7FAC78E5CB4D327B99F47BF099326</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>23EB4B1F1FB528E10C5030501D4C3454</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/Alamofire/Alamofire-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/Alamofire/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/Alamofire/Alamofire.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>Alamofire</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Release</string>\n\t\t</dict>\n\t\t<key>755AFCA09D3807CB6C260E7115234963</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>490570C4EC2C7DD9D5FCA37164C6442D</string>\n\t\t\t\t<string>5E2CC216EEF82AC984AE8D61A9177113</string>\n\t\t\t\t<string>5E49AAF37C2B40CB0957F56DF1A3E620</string>\n\t\t\t\t<string>FA3529BA5DD86B6E59A2A2C589EA5884</string>\n\t\t\t\t<string>C85C98983FF1862632F74F4104DB6E68</string>\n\t\t\t\t<string>D7292846D89C548856055AEC24A11827</string>\n\t\t\t\t<string>F36B8EEC5A75332E7C25AF70B7FF19EF</string>\n\t\t\t\t<string>9E03F9A988688B18599B93160471758E</string>\n\t\t\t\t<string>1966257DFF573B123534D86FB2A461BE</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXSourcesBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>75671DCD2C65E9A11B1E6F09B6854AA0</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZAudioPlot.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/EZAudioPlot.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>75694EB52988796CCDEC1C4A50560B6D</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>698765A4EF927BBD85BC37EE2FF01903</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>75B5B409862E7A82A20C878277D303AF</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH-prefix.pch</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>75D98FF52E597A11900E131B6C4E1ADA</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>E8446514FBAD26C0E18F24A5715AEF67</string>\n\t\t\t\t<string>79A9DEDC89FE8336BF5FEDAAF75BF7FC</string>\n\t\t\t\t<string>D0405803033A2A777B8E4DFA0C1800ED</string>\n\t\t\t\t<string>87B213035BAC5F75386F62D3C75D2342</string>\n\t\t\t\t<string>894E5DA93A9F359521A89826BE6DA777</string>\n\t\t\t\t<string>E7F21354943D9F42A70697D5A5EF72E9</string>\n\t\t\t\t<string>CBC0F7C552B739C909B650A0F42F7F38</string>\n\t\t\t\t<string>2BCC458FDD5F692BBB2BFC64BB5701FC</string>\n\t\t\t\t<string>977577C045EDA9D9D1F46E2598D19FC7</string>\n\t\t\t\t<string>DA312349A49333542E6F4B36B329960E</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Pods</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Target Support Files/Pods</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>761F2AE2A08681D34B98C5205A398BF9</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartXAxisRenderer.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Renderers/ChartXAxisRenderer.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>7643F494404131680430018F7EC92AE2</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXTargetDependency</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZAudio</string>\n\t\t\t<key>target</key>\n\t\t\t<string>254EA72DFADAB5F3286B8726A554C9E6</string>\n\t\t\t<key>targetProxy</key>\n\t\t\t<string>52183AB70293B3C29450264A392FA4F5</string>\n\t\t</dict>\n\t\t<key>76820BB8A343CE818398366E3787913C</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXTargetDependency</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZAudio</string>\n\t\t\t<key>target</key>\n\t\t\t<string>254EA72DFADAB5F3286B8726A554C9E6</string>\n\t\t\t<key>targetProxy</key>\n\t\t\t<string>2C7B70526524E165EB80DFFC1D36CFF2</string>\n\t\t</dict>\n\t\t<key>768CC1338D4B027D4517DD3611152862</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>BubbleChartDataSet.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/BubbleChartDataSet.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>770318C2100C2A9A4D14D224B041B0E5</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>384EFED9AD5C956EA205110FCC14C384</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>776ECCE5529B00F6D7F372E0F8AB6002</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>MultipartFormData.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/MultipartFormData.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>778126769FD6E223F9574C2E19DD5453</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>D7D019D2275A7A64B3188D36B0F5F8F4</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>7783EB9441B8701156D49F3429E4F627</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio-prefix.pch</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>783C44EF16D4C79ADC985C8C86C458D5</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>F5A144C28EEF910B35FCD66B9ACB13AE</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>784DED0AA95B4F0087AD1FCA0D438BE0</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.plist.xml</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Info.plist</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>78905BC064EA7CAE6515516D704002CF</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>D07DAD252FED8A056A4085E49639E5D7</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>78A8CAE0A08DC8E818F6E7C79557A27D</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartDataSet.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/ChartDataSet.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>78FCECFF404AD0FD74BACA1C1FC9FFBE</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZOutput.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/EZOutput.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>79081B3C3FFC3A41C57FF8AE876CAEE7</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>228471249CCDB44C2C2793EFEAF06C43</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>791E8610412F77070BC5BCD5A394FEAF</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>4AF8AA804B2142B26DC1B5186720048A</string>\n\t\t\t\t<string>36D90A99286A433572F91AB604418967</string>\n\t\t\t\t<string>AF04A68FC019D3EAB4159D21638A42F1</string>\n\t\t\t\t<string>A2F9F4EDE9E30138049A5CE2A7BDE3A5</string>\n\t\t\t\t<string>223648D2D9A87589BDD0F2446CC1BF2A</string>\n\t\t\t\t<string>ADDD22883EB4304A18264D3F48B70486</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Support Files</string>\n\t\t\t<key>path</key>\n\t\t\t<string>../Target Support Files/AlamofireRSSParser</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>797C9F2528F449390500C4FECCBAA135</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>50C1B0FE72BD421266EBFB4B2B74F13B</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>79A9DEDC89FE8336BF5FEDAAF75BF7FC</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Pods.modulemap</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>79AF06EC7F78F59EDAC780C88DB961AE</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NMSSHConfig.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH/NMSSHConfig.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>79C040AFDDCE1BCBF6D8B5EB0B85887F</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurationList</key>\n\t\t\t<string>3CFB42910790CF0BDBCCEBAACD6B9367</string>\n\t\t\t<key>buildPhases</key>\n\t\t\t<array>\n\t\t\t\t<string>95CC2C7E06DC188A05DAAEE9CAA555A3</string>\n\t\t\t\t<string>B1729F851F648EC60EE93CDB3C8BAEAD</string>\n\t\t\t\t<string>EFDF3B631BBB965A372347705CA14854</string>\n\t\t\t</array>\n\t\t\t<key>buildRules</key>\n\t\t\t<array/>\n\t\t\t<key>dependencies</key>\n\t\t\t<array/>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXNativeTarget</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Alamofire</string>\n\t\t\t<key>productName</key>\n\t\t\t<string>Alamofire</string>\n\t\t\t<key>productReference</key>\n\t\t\t<string>14E2A18762B2C933AF7EF481D1079936</string>\n\t\t\t<key>productType</key>\n\t\t\t<string>com.apple.product-type.framework</string>\n\t\t</dict>\n\t\t<key>7A88BF95853A69E550E9F63A060BED12</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>B2C2A2977AC39FB8A1FC7FAE64E26072</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>7B234F4406FD51E392E7B688A295E8FB</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>0B93148101A5531681949F675D41538E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>7B48852C4D848FA2DA416A98F6425869</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>B756C6158B1743F24242A4F20F07ECCA</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>7C204B9F7D811C860F446BAB1575C344</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>0E5DECF96C58C0F18CD5F7C5221CC7A7</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>7CE0E9D851E9395C41EF6AFA7AE47423</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>B28621795FA91577FCF3525D161A891E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>7CE91BF36DAB7B3EE3B25D14480AFC34</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>DC0D405095C90FB4035A2F0243192579</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Project</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>7D67EB40B9B5DAC7A2A758E1C8EEF4BC</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartUtils.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Utils/ChartUtils.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>7D70BAF35B5E41ECAA00CC8B49CAF3FB</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>36D90A99286A433572F91AB604418967</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/AlamofireRSSParser/AlamofireRSSParser-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/AlamofireRSSParser/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/AlamofireRSSParser/AlamofireRSSParser.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>AlamofireRSSParser</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Release</string>\n\t\t</dict>\n\t\t<key>7D7776EE0E7EB45C6F665800D9385648</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>BarLineScatterCandleBubbleChartDataSet.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/BarLineScatterCandleBubbleChartDataSet.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>7DB346D0F39D3F0E887471402A8071AB</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>BA6428E9F66FD5A23C0A2E06ED26CD2F</string>\n\t\t\t\t<string>56942D4AE3FE1A0B97040C17F2AAA7BD</string>\n\t\t\t\t<string>0FCE52111ED6A874AB515E76EA8BF894</string>\n\t\t\t\t<string>92151B6A7B2524A1BABEEE69E0CA7861</string>\n\t\t\t\t<string>B7B80995527643776607AFFA75B91E24</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>7E24079B28DAF8D9128CA7E7D33E6F7C</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts-prefix.pch</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>7E299BF9A615998682A1A05F5F0E42EE</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartXAxis.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Components/ChartXAxis.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>7E387B67B1AB63AFDB74AEAA00DD821D</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartYAxisRendererRadarChart.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Renderers/ChartYAxisRendererRadarChart.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>7E3FD9DA3AAA3363CA2108CF49E0D9BE</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive.modulemap</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>7E65716D77F599EDDB5E6EA1E6734088</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.plist.xml</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Info.plist</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>7E9DCF48CA71A987E38B65E8EA1BC65E</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ArrayExtension.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/ArrayExtension.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>7EE6C232195755A42DEAECB46E888B18</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>040B16E53C2CBFE2007A0A70EE690D77</string>\n\t\t\t\t<string>23EB4B1F1FB528E10C5030501D4C3454</string>\n\t\t\t\t<string>391D473F1E22B03F1E1DA498562A0F38</string>\n\t\t\t\t<string>CBC7A5017D4527A9E94D74915C54ACB8</string>\n\t\t\t\t<string>63A42196CB86BF9D7F26EC16B135E0CF</string>\n\t\t\t\t<string>3993828B63B3AC6BE59C92C303685F61</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Support Files</string>\n\t\t\t<key>path</key>\n\t\t\t<string>../Target Support Files/Alamofire</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>7F87651AE9B6CA0E7F4A0114F19A7924</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.xcconfig</string>\n\t\t\t<key>path</key>\n\t\t\t<string>AASquaresLoading.xcconfig</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>80109CAB3AB2A64C968C7FE0171B89F1</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>FA6606E69ACCD1B09D98F9CC5F9A98C3</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>80875D1812BC200BAB068CBC75B74E7A</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CandleChartDataEntry.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/CandleChartDataEntry.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>809023B98C9FF6044DF1314603EE8B91</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>FA6B4510586447CB081BC8FA92CE4357</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXSourcesBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>80DD5455D2185F4B63EC6AFA95A51E88</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>B2C2A2977AC39FB8A1FC7FAE64E26072</string>\n\t\t\t\t<string>32146DB6CF24E5D003FAB31AC7628C3E</string>\n\t\t\t\t<string>70525166CB057B3EDE7449F355542038</string>\n\t\t\t\t<string>94FA3A77E6FC614EA18C169BA609056E</string>\n\t\t\t\t<string>0D9E3E8557D628F179DC72179BE68873</string>\n\t\t\t\t<string>0C8EFD8D5CCE9A85C27C92ACCD85C521</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>DGElasticPullToRefresh</string>\n\t\t\t<key>path</key>\n\t\t\t<string>DGElasticPullToRefresh</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>821EB8A5F1FC9B2F4EAB51C67F4DE2C6</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>D170993D4633F76FF548FD13C3B84EC3</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>826CDEA3F474B8670FB6244F7842DE73</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SJCSimplePDFView.modulemap</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>82D6671E6434CBE40C23F48ECD063E9B</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>7E65716D77F599EDDB5E6EA1E6734088</string>\n\t\t\t\t<string>C9E6D695EAE6C1062DEA079BB751B87F</string>\n\t\t\t\t<string>C29238134AE5C4B8C2352C6C11C495EB</string>\n\t\t\t\t<string>667AE18ABE1BD4A574755ED111198F89</string>\n\t\t\t\t<string>3873DACF51A2F4E637F48FC9EE28FAA0</string>\n\t\t\t\t<string>228471249CCDB44C2C2793EFEAF06C43</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Support Files</string>\n\t\t\t<key>path</key>\n\t\t\t<string>../Target Support Files/ZLMusicFlowWaveView</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>83489AF05AC1B719AA183B3AFC2BE3AA</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>98D75CBF835E0513551169EAFCDB35B3</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>8353E819C2C6AE2417C900DE0705D1A8</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>socket_helper.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH/Config/socket_helper.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>8364C5015494EEDBFB7AC551266741BB</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>E74514FEF953E9C25CBFE0645FADFC41</string>\n\t\t\t\t<string>E7BD9D0FF2125D7C3A92D70C380B3261</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXSourcesBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>83C6D53EFB4BAFB4A64B3E76D664197B</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>40043CBCDD93A301F8437421D53D02A3</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>83CE5B92F7A625F5DAF1A110BF2F174D</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartData.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/ChartData.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>83D33D34F7967099E1E8112180FB7D03</key>\n\t\t<dict>\n\t\t\t<key>explicitFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CYRTextView.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>CYRTextView.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>BUILT_PRODUCTS_DIR</string>\n\t\t</dict>\n\t\t<key>854D9C81549E59B2145F57291D9C9E01</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Response.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/Response.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>85822A6D7AF455601F1786BFBCCDCDC3</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartXAxisRendererHorizontalBarChart.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Renderers/ChartXAxisRendererHorizontalBarChart.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>85F1FA1A04887000AE6D42617A155669</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>361CB8CE5FB0F7E9DADD6D243BA09A05</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXHeadersBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>8621EC900E9540E855F2A45193465CE6</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>MoveChartViewJob.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Jobs/MoveChartViewJob.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>86662528AE34D79C3BA78439C0D9D01E</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>aestab.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/aes/aestab.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>86712FE294355019927A4B113B072F63</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>0FBCB9B828FF98812A1EE98817048C46</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>86909353BB4657C029BB5008942330ED</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>hmac.c</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/aes/hmac.c</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>86A4F33244B76027A52DC18FE83F6FA8</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Error.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/Error.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>86ACE2887B0A55399595618D8A2A847D</key>\n\t\t<dict>\n\t\t\t<key>containerPortal</key>\n\t\t\t<string>D41D8CD98F00B204E9800998ECF8427E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXContainerItemProxy</string>\n\t\t\t<key>proxyType</key>\n\t\t\t<string>1</string>\n\t\t\t<key>remoteGlobalIDString</key>\n\t\t\t<string>F8C233736FECBA33C0E71D949DF017CA</string>\n\t\t\t<key>remoteInfo</key>\n\t\t\t<string>ZLMusicFlowWaveView</string>\n\t\t</dict>\n\t\t<key>86D56E9B7AD7546729AD442A3D02478A</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.xcconfig</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH.xcconfig</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>86D972F433A3176BF77299B3526C71AF</key>\n\t\t<dict>\n\t\t\t<key>explicitFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>AlamofireRSSParser.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>AlamofireRSSParser.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>BUILT_PRODUCTS_DIR</string>\n\t\t</dict>\n\t\t<key>86F265DD248E17D2B6A3C5E4AA8B6800</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>BA7AA59D2E9F556A528840EA05378089</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>870CD4D0ED37DE3295E8E96C29756E48</key>\n\t\t<dict>\n\t\t\t<key>explicitFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZAudio.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>BUILT_PRODUCTS_DIR</string>\n\t\t</dict>\n\t\t<key>87647570FDAA4D851BD145A8FECA08D4</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>E349CFCDAD29F7182C472495FBBFCF0F</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>877DB484F7698974CCC1D66B51116FE1</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartDataProvider.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Interfaces/ChartDataProvider.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>87B213035BAC5F75386F62D3C75D2342</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.plist.xml</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Pods-acknowledgements.plist</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>87D7DAF7937EAF3CF65F1B022D9A8BDB</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ioapi.c</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/minizip/ioapi.c</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>87DC6F96269BFB9C6744C1089FC0E92E</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>03FC642C1EF0F16D7AB31F4AC6D6F719</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>87FEA49CACDD9BA7901D248871C94118</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>wrapper.plug-in</string>\n\t\t\t<key>name</key>\n\t\t\t<string>RongCloud.bundle</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongCloud.bundle</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>8849F4F8A02D3B41E46CF24A28485E5B</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>1260E1D284190E2A3D00903698C9D2F3</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/CYRTextView/CYRTextView-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/CYRTextView/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/CYRTextView/CYRTextView.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>CYRTextView</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Release</string>\n\t\t</dict>\n\t\t<key>894E5DA93A9F359521A89826BE6DA777</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Pods-dummy.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>897752D9150F684990F930BCC8BD5619</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>62BD10A1EFF551EEE3D51229E3A5A135</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>89CC9FB44A3C41E010E2D4EE388B8D07</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurations</key>\n\t\t\t<array>\n\t\t\t\t<string>EFC93C11F16B90228BA386D77AA69400</string>\n\t\t\t\t<string>5721DA804A3926404ADB80D27EB9D7F2</string>\n\t\t\t</array>\n\t\t\t<key>defaultConfigurationIsVisible</key>\n\t\t\t<string>0</string>\n\t\t\t<key>defaultConfigurationName</key>\n\t\t\t<string>Release</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCConfigurationList</string>\n\t\t</dict>\n\t\t<key>8ACA70A9D45E782647B8995535544861</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>40043CBCDD93A301F8437421D53D02A3</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>8AF188560381C1B97D9E46B09B146DE0</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>A0688D041EA5E1060A50787E5D0A8B88</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>8B6EF9C34F1E4597938A09B5A8086C08</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>E51BBFF2074DA4267B550E1D58ADF58A</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>8BB0BD9B1B6EB8ABF67E29EED3D628B6</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NetworkReachabilityManager.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/NetworkReachabilityManager.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>8BCFC48792C0183444EC97C43A6E3BB4</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>717A214D47C4467FB7418FB121F803FD</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>8C29735442BC85B0F88470642089405D</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>C29238134AE5C4B8C2352C6C11C495EB</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/ZLMusicFlowWaveView/ZLMusicFlowWaveView-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/ZLMusicFlowWaveView/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/ZLMusicFlowWaveView/ZLMusicFlowWaveView.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>ZLMusicFlowWaveView</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Release</string>\n\t\t</dict>\n\t\t<key>8D0C814DACA85184D823E6AD381D5A78</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>5798CFA7BDB78019CBD837FA245CCF7C</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>8D8C1022173EA10270DC8917557A6AFC</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>8353E819C2C6AE2417C900DE0705D1A8</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Private</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>8D901D00C6FF59773C631FE0557B8845</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>archive.ar</string>\n\t\t\t<key>name</key>\n\t\t\t<string>libssl.a</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH-iOS/Libraries/lib/libssl.a</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>8E8CBDC117A589EB2A32FDEE22A5921C</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>DA8F020D6AA506F0106F80186BDA93E4</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>8EA7C01FA9014E4AC4EB52DEBC568005</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Alamofire.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/Alamofire.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>8EB11202167FCDDF1257AAAB1D1FB244</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>8EA7C01FA9014E4AC4EB52DEBC568005</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>8EC66117408FE5D27B57F58550E978C0</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.xcconfig</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SwiftyJSON.xcconfig</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>8EDF3AE7833D667E4C4D8478FD4B5447</key>\n\t\t<dict>\n\t\t\t<key>explicitFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>SSZipArchive.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>BUILT_PRODUCTS_DIR</string>\n\t\t</dict>\n\t\t<key>8F13815876589E1C113CACCF6B677AF1</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>BarChartDataProvider.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Interfaces/BarChartDataProvider.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>8F77C82F0C8760528390313D44756D9B</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>67184F1852A59AB997108F4DB5AF70B0</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFrameworksBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>8F7A7A4CBF39B0995A17F5F10F25F3A1</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>SJCSimplePDFView.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SJCSimplePDFView/SJCSimplePDFView.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>8F96B72A2D016C2925132ED704A6D6F4</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXTargetDependency</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ZLSinusWaveView</string>\n\t\t\t<key>target</key>\n\t\t\t<string>ADD0B8D536C47FE797C15119D29AFC71</string>\n\t\t\t<key>targetProxy</key>\n\t\t\t<string>6F68A3567B15E1ECA46E4CF4E50A7211</string>\n\t\t</dict>\n\t\t<key>8FC086E0146293F873A3FA450C0C3731</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>6B173C46DF90109FE17024B11AD202E2</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>905C0B7980F791438B4754D9AB323CBE</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>40043CBCDD93A301F8437421D53D02A3</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>9151874C2B5F097360208EB0315C6297</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>E80999E723F79EDC7D4FD8BF79BCA5F5</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>9181C57B0D5E511D518D6ED675AC30A6</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>5C0B9516684CF8E715F8B7D047F76709</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>91827F8492FCBB8348FC58AEF693B03A</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>BarChartData.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/BarChartData.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>92151B6A7B2524A1BABEEE69E0CA7861</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>2993BE53CEB9368C1FD283A26A8DC3CF</string>\n\t\t\t\t<string>14E2A18762B2C933AF7EF481D1079936</string>\n\t\t\t\t<string>A868E1FE16614BD1F1336EC1C9D8A8A8</string>\n\t\t\t\t<string>86D972F433A3176BF77299B3526C71AF</string>\n\t\t\t\t<string>2E70CA0E5B5063FA1695EC714491B22A</string>\n\t\t\t\t<string>83D33D34F7967099E1E8112180FB7D03</string>\n\t\t\t\t<string>F7852FD543BD5C8EEF81095A19EAD332</string>\n\t\t\t\t<string>870CD4D0ED37DE3295E8E96C29756E48</string>\n\t\t\t\t<string>02787AB0F80C11B895A72337338D4CB7</string>\n\t\t\t\t<string>94914325FB30736386431FA57CAE5AE4</string>\n\t\t\t\t<string>1A85B3DEA68DBE452583A860BFC25D68</string>\n\t\t\t\t<string>21B7F68E83AB3158AC18BB512498ECE0</string>\n\t\t\t\t<string>8EDF3AE7833D667E4C4D8478FD4B5447</string>\n\t\t\t\t<string>35220F594E860391A0ED1DF9ECA6EBCA</string>\n\t\t\t\t<string>F51D8948E1F5D0E0FA3161D641164C0E</string>\n\t\t\t\t<string>0727A4243F3B7D3216AAC08CA047DA60</string>\n\t\t\t\t<string>B4CA9869A1F71DB60F8D8B061D814CC5</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Products</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>928CDEDEA8EC3C437DB27409A17C998B</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>40043CBCDD93A301F8437421D53D02A3</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>9303B618AC39FB9AC08C2C49BF74EB55</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>83489AF05AC1B719AA183B3AFC2BE3AA</string>\n\t\t\t\t<string>D06A2482F5337777E2FD81594035B829</string>\n\t\t\t\t<string>45DA8587F08705657CBBFF27A51A0143</string>\n\t\t\t\t<string>F8803DAD17AC9CE8BCAD6B0594646D64</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFrameworksBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>93E203BDEABA3092CDF443A1AA4202FD</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>05B129043462F91B458D18AFB8F529C2</string>\n\t\t\t\t<string>B388A0A92CD8B2C9CD1F9297453C50BA</string>\n\t\t\t\t<string>86D56E9B7AD7546729AD442A3D02478A</string>\n\t\t\t\t<string>E2FAD92811C5785C55D927D4BBF05C68</string>\n\t\t\t\t<string>75B5B409862E7A82A20C878277D303AF</string>\n\t\t\t\t<string>69B023D17AE27F4AFA2514F22965C5D0</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Support Files</string>\n\t\t\t<key>path</key>\n\t\t\t<string>../Target Support Files/NMSSH</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>942DE51F25BA046A971321558B6BEA5A</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>D5EB8839E96EE9D01C2BF4D48D8EDF36</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>9469DF81ECB494E84675969B5E13374C</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>63A42196CB86BF9D7F26EC16B135E0CF</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>94914325FB30736386431FA57CAE5AE4</key>\n\t\t<dict>\n\t\t\t<key>explicitFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NMSSH.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>BUILT_PRODUCTS_DIR</string>\n\t\t</dict>\n\t\t<key>94FA3A77E6FC614EA18C169BA609056E</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>DGElasticPullToRefreshLoadingViewCircle.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>DGElasticPullToRefresh/DGElasticPullToRefreshLoadingViewCircle.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>9505960D18F60DAA70871C006CA302EF</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>7D67EB40B9B5DAC7A2A758E1C8EEF4BC</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>95A51226875B54D2C24099FABD65F9A4</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NMSSH.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH/NMSSH.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>95BDB0879B32F78AD2E6AC781320E7C2</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>223648D2D9A87589BDD0F2446CC1BF2A</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>95C3D67F3A2378FDCAD498AF576A36D7</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.xcconfig</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Gifu.xcconfig</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>95CC2C7E06DC188A05DAAEE9CAA555A3</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>ADF19C953CE2A7D0B72EC93A81FCCC26</string>\n\t\t\t\t<string>8EB11202167FCDDF1257AAAB1D1FB244</string>\n\t\t\t\t<string>5CB05FBCB32D21E194B5ECF680CB6AE0</string>\n\t\t\t\t<string>095406039B4D371E48D08B38A2975AC8</string>\n\t\t\t\t<string>4081EA628AF0B73AC51FFB9D7AB3B89E</string>\n\t\t\t\t<string>C7B6DD7C0456C50289A2C381DFE9FA3F</string>\n\t\t\t\t<string>34CCDCA848A701466256BC2927DA8856</string>\n\t\t\t\t<string>BE41196F6A3903E59C3306FE3F8B43FE</string>\n\t\t\t\t<string>C0DB70AB368765DC64BFB5FEA75E0696</string>\n\t\t\t\t<string>EFE92E8D3813DD26E78E93EEAF6D7E7E</string>\n\t\t\t\t<string>62E8346F03C03E7F4D631361F325689E</string>\n\t\t\t\t<string>3EA8F215C9C1432D74E5CCA4834AA8C0</string>\n\t\t\t\t<string>AA314156AC500125F4078EE968DB14C6</string>\n\t\t\t\t<string>7B48852C4D848FA2DA416A98F6425869</string>\n\t\t\t\t<string>AE4CF87C02C042DF13ED5B21C4FDC1E0</string>\n\t\t\t\t<string>16102E4E35FAA0FC4161282FECE56469</string>\n\t\t\t\t<string>5BC19E6E0F199276003F0AF96838BCE5</string>\n\t\t\t\t<string>2D3405986FC586FA6C0A5E0B6BA7E64E</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXSourcesBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>95D4FD4EE6EC9C7566AFDCB870E6A978</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>AF04A68FC019D3EAB4159D21638A42F1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>976A24EA83BF3467025D3580ED456D06</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXTargetDependency</string>\n\t\t\t<key>name</key>\n\t\t\t<string>SwiftyJSON</string>\n\t\t\t<key>target</key>\n\t\t\t<string>FB6A25C88BCCDB159C1C71A2C484100D</string>\n\t\t\t<key>targetProxy</key>\n\t\t\t<string>45FA3456C69B0437B37A006EFB69674D</string>\n\t\t</dict>\n\t\t<key>977577C045EDA9D9D1F46E2598D19FC7</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.xcconfig</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Pods.debug.xcconfig</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>97B071F74774C182E2EBD5319D1F565F</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>C832BE8F84718CAD9B5B7A0F2296F628</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>97CA0B8036338914727FF40447D5C34C</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.plist.xml</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Info.plist</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>97E1CBD3DF590CB3415D629A4ECBC776</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>45B1D072665424E0D9FEAA51DE27E6E3</string>\n\t\t\t\t<string>63002BFF3EE441011E71DD87CDA49484</string>\n\t\t\t\t<string>034548B827C03622818B97E6F50C78EC</string>\n\t\t\t\t<string>9B8983A42745CE241C8FE81ADFB76218</string>\n\t\t\t\t<string>E75768524ABD0E737765714AE4677C48</string>\n\t\t\t\t<string>AC2EF1AE40274FFDC401667516F473E2</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Support Files</string>\n\t\t\t<key>path</key>\n\t\t\t<string>../Target Support Files/Swifter</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>9838C7578BE14F947489DA4D1C595898</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>A1E5E540A44850D55021393D3B56D093</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>98760AA9A7D6FB3DA51581FB5D81023D</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>95D4FD4EE6EC9C7566AFDCB870E6A978</string>\n\t\t\t\t<string>556344573F293DFD06C18EC7B51B812B</string>\n\t\t\t\t<string>80109CAB3AB2A64C968C7FE0171B89F1</string>\n\t\t\t\t<string>CEE3227590AFA556D61A75618381AFB4</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXSourcesBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>988F0BEB31938ED3D03BD2F30C2178DF</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NMSFTP.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH/NMSFTP.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>98D75CBF835E0513551169EAFCDB35B3</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>name</key>\n\t\t\t<string>AudioToolbox.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/AudioToolbox.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>DEVELOPER_DIR</string>\n\t\t</dict>\n\t\t<key>997199E72131063A4BBCAE8FBC3CAECC</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>679ABE39538CF97A7B169D851D0D472D</string>\n\t\t\t\t<string>4684964FE77650C6E9F3ED93AC79C87D</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>RongCloudIMKit</string>\n\t\t\t<key>path</key>\n\t\t\t<string>RongCloudIMKit</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>998667BFE20E591A5EF6D4412B709E4B</key>\n\t\t<dict>\n\t\t\t<key>containerPortal</key>\n\t\t\t<string>D41D8CD98F00B204E9800998ECF8427E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXContainerItemProxy</string>\n\t\t\t<key>proxyType</key>\n\t\t\t<string>1</string>\n\t\t\t<key>remoteGlobalIDString</key>\n\t\t\t<string>0E579C8B6EC88FD31F0C2B47C9058B48</string>\n\t\t\t<key>remoteInfo</key>\n\t\t\t<string>AASquaresLoading</string>\n\t\t</dict>\n\t\t<key>99901C3BB68EEFED23AD5D68A6D00DD9</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>path</key>\n\t\t\t<string>CYRTextView.modulemap</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>99DC0137E12C0E6A0CF0626CB80CB1D5</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>E56D64DF36156ED67576CCA614D0618F</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>9A33333E6963F5910C2F9B4A21ED1C16</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array/>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXSourcesBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>9A72A7D51819C4D550B5473E909F71FF</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>LineChartRenderer.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Renderers/LineChartRenderer.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>9A8A6001F3E0387D56C0CB3189D0CF54</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>FD0CC0A859DB9231444E62D7E971B22A</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFrameworksBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>9AB9C30C29CCEEC9315ABE415511676B</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Notifications.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/Notifications.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>9AC1C9FD1210EC02AAB22EE0DE3F2B60</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>E5055FEB2A2A322A90311B7874DC9092</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/DGElasticPullToRefresh/DGElasticPullToRefresh-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/DGElasticPullToRefresh/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/DGElasticPullToRefresh/DGElasticPullToRefresh.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>DGElasticPullToRefresh</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>SWIFT_OPTIMIZATION_LEVEL</key>\n\t\t\t\t<string>-Onone</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Debug</string>\n\t\t</dict>\n\t\t<key>9ACB6C78F78F1EF04CBFD24FBF52D12C</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>E8E725C145C99E05F90D6F5141B56754</string>\n\t\t\t\t<string>B28D9E00358A3BFC146406A9E9D84CCF</string>\n\t\t\t\t<string>CF82ED8D2AAF0100798F74B82004713B</string>\n\t\t\t\t<string>B3F888A903C9E8B6C17D5FD59576A722</string>\n\t\t\t\t<string>4A649E5F7B4737DC7A6645E6EBE61690</string>\n\t\t\t\t<string>57EB7F801E937056D8EA61707A156023</string>\n\t\t\t\t<string>AE7C99A546378A3B72C0A2F4B1F1DE56</string>\n\t\t\t\t<string>942DE51F25BA046A971321558B6BEA5A</string>\n\t\t\t\t<string>AAFB9E75081EEE8503740F8E73FC1563</string>\n\t\t\t\t<string>4888A76CCC22B207C2B0D3B6741688DA</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXSourcesBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>9B0170C2DE85A2CED19A6FB95B59CD25</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>22B30496E9D4C59ABF59F254C49FF122</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Project</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>9B4184FC9E303824C5756A811AB09E31</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>C109982F8C877B91A290E88A1EBC1E1D</string>\n\t\t\t\t<string>62D919A2C9C2C955FA825CB474A9F16B</string>\n\t\t\t\t<string>4567150A2B071C2DA321F4CE18FF8364</string>\n\t\t\t\t<string>7E9DCF48CA71A987E38B65E8EA1BC65E</string>\n\t\t\t\t<string>42787649B04F8FCB3363DE9C7642B645</string>\n\t\t\t\t<string>69E2158C4EE02BF8D175828AD9D93C69</string>\n\t\t\t\t<string>D07DAD252FED8A056A4085E49639E5D7</string>\n\t\t\t\t<string>D5EB8839E96EE9D01C2BF4D48D8EDF36</string>\n\t\t\t\t<string>FF2C748C341F3E0FA03FC7D890D54304</string>\n\t\t\t\t<string>20DCE1442556CA5F41805570F5B5844F</string>\n\t\t\t\t<string>A50FBF61AC12A13CE4B7E629E19DB144</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Gifu</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Gifu</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>9B8983A42745CE241C8FE81ADFB76218</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Swifter-dummy.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>9BBB90314EEDCAA33FB3160A02862010</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>05BA62425D43DD87EC6390A0FAE74D1E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>9BCA03B2F0B3C0EA0D3499F966194E75</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>path</key>\n\t\t\t<string>AASquaresLoading-dummy.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>9C01EAB768BB47EB46A5760C4E164C3A</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>129963BBCBF40DB2189A0EB7993EDF12</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>9C29B71FB70AAEC2242DDF5BD50C55A3</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurationList</key>\n\t\t\t<string>25E5BE8AC9996AEF5235FB7EEB1A801D</string>\n\t\t\t<key>buildPhases</key>\n\t\t\t<array>\n\t\t\t\t<string>AD5E022434C2CCBE447351CEC813EB1E</string>\n\t\t\t\t<string>9A8A6001F3E0387D56C0CB3189D0CF54</string>\n\t\t\t\t<string>FB566F69981E2F14222BE796DC7474B5</string>\n\t\t\t</array>\n\t\t\t<key>buildRules</key>\n\t\t\t<array/>\n\t\t\t<key>dependencies</key>\n\t\t\t<array/>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXNativeTarget</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Swifter</string>\n\t\t\t<key>productName</key>\n\t\t\t<string>Swifter</string>\n\t\t\t<key>productReference</key>\n\t\t\t<string>35220F594E860391A0ED1DF9ECA6EBCA</string>\n\t\t\t<key>productType</key>\n\t\t\t<string>com.apple.product-type.framework</string>\n\t\t</dict>\n\t\t<key>9D4E866B71A9C1336273DDC9164734A2</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>95BDB0879B32F78AD2E6AC781320E7C2</string>\n\t\t\t\t<string>0380D2B912CDE029522351D67E39310E</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXHeadersBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>9D4F76E63FE32EDCFE411B47AADE7C20</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>DA312349A49333542E6F4B36B329960E</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/Pods/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MACH_O_TYPE</key>\n\t\t\t\t<string>staticlib</string>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/Pods/Pods.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>OTHER_LDFLAGS</key>\n\t\t\t\t<string></string>\n\t\t\t\t<key>OTHER_LIBTOOLFLAGS</key>\n\t\t\t\t<string></string>\n\t\t\t\t<key>PODS_ROOT</key>\n\t\t\t\t<string>$(SRCROOT)</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>Pods</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Release</string>\n\t\t</dict>\n\t\t<key>9D7EF092E912A37841FC7F3316B1EE46</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>mztools.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/minizip/mztools.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>9D98F0DEB1F6A637347AA210314D3648</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive-dummy.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>9DD2A8006D79DC4469F9BD2FFB55F071</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>E2F0E619F4A90A088378D7A28F583D02</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>9E03F9A988688B18599B93160471758E</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>0A0B1AD12AF0AAF31F2FE461AEDD6AC9</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>9E138A11AB568FDD962F892987F6F048</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>131D95D3FCDF7799E1D69213A378638E</string>\n\t\t\t\t<string>E8429EE77E177E3DDF7BDF57797AB2EC</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFrameworksBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>9E1EEA656E59AB9E30DC8D0385F289B4</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>63B79EFF01B2EE5390F1C6930E5D9E13</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>9F1272B6E005ED49F1C4BCCDD73D1F58</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>16BED61439C924D34FF25EC21932E8AF</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>COMPILER_FLAGS</key>\n\t\t\t\t<string>-DOS_OBJECT_USE_OBJC=0</string>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>9F45FA658BE59059A916A5F98B6F70A7</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>IBarChartDataSet.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Interfaces/IBarChartDataSet.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>9F67093900083070A89BDF2635A435DB</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>E5055FEB2A2A322A90311B7874DC9092</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/DGElasticPullToRefresh/DGElasticPullToRefresh-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/DGElasticPullToRefresh/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/DGElasticPullToRefresh/DGElasticPullToRefresh.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>DGElasticPullToRefresh</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Release</string>\n\t\t</dict>\n\t\t<key>9F76D67DEC97A5BBB9AD3546ED28FFDE</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>03F0D41F8726403C1B0B5F3D93915906</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>9F898C8AC3124C1B95F382C093800963</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>8EC66117408FE5D27B57F58550E978C0</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/SwiftyJSON/SwiftyJSON-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/SwiftyJSON/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/SwiftyJSON/SwiftyJSON.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>SwiftyJSON</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>SWIFT_OPTIMIZATION_LEVEL</key>\n\t\t\t\t<string>-Onone</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Debug</string>\n\t\t</dict>\n\t\t<key>9FD26D6C00634178B74170103B48A9CF</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>242B71AC1ED8BF10BFB8883D7A043B57</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>A001EF9508D510E336B414095A84EC0F</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>5768DCD828BCB3B8A372407BA137B249</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXHeadersBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>A00CBCB935830FEE99F6E645C95E834D</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>B70483F68DA580907714FF534F1A20DA</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>A020A04A30303EBCC97F078481030B44</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>libssh2_publickey.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH-iOS/Libraries/include/libssh2/libssh2_publickey.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>A0688D041EA5E1060A50787E5D0A8B88</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ZLMusicFlowWaveView.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>ZLMusicFlowWaveView/ZLMusicFlowWaveView.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>A0718C652496BAA16F3007BE63680091</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>D131D943789EC727F15929276BBBD8BD</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>A16184B99AC1C6FBC8F177C124589651</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.xcconfig</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SJCSimplePDFView.xcconfig</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>A1B31917F302790BEE2C7CA37EFBA0DF</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>unzip.c</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/minizip/unzip.c</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>A1E5E540A44850D55021393D3B56D093</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>BubbleChartDataEntry.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/BubbleChartDataEntry.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>A20419267FBC2600623140053A2AA8F7</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>B06192AD341CDBCD0D19BD7B8DCF3B4E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>A28C94FC58D7492A6E64E2C97EBAFE0B</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>name</key>\n\t\t\t<string>AVFoundation.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/AVFoundation.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>DEVELOPER_DIR</string>\n\t\t</dict>\n\t\t<key>A2F9F4EDE9E30138049A5CE2A7BDE3A5</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>AlamofireRSSParser-prefix.pch</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>A3415EFF6AEA35162B52EC0734DE1761</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>name</key>\n\t\t\t<string>GLKit.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/GLKit.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>DEVELOPER_DIR</string>\n\t\t</dict>\n\t\t<key>A46427534DD269E2ED45FE9190F4F819</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>BD97C1D6886F4A540BA21C18DE70A47A</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFrameworksBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>A473EE5B6E7552F583A7E6C0411A63FE</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>161961ABCAFC8D944C13F6B003163607</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>COMPILER_FLAGS</key>\n\t\t\t\t<string>-DOS_OBJECT_USE_OBJC=0</string>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>A481946E2B03D2D461A9D9942194D32C</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>AASquaresLoading-umbrella.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>A48B96C6FBB609A286F182ED83923097</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>BE0A3BFD226BAF44617BFBB3DB345624</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>A50FBF61AC12A13CE4B7E629E19DB144</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>C2F4A628275A3E441F742896335D7FF5</string>\n\t\t\t\t<string>95C3D67F3A2378FDCAD498AF576A36D7</string>\n\t\t\t\t<string>FE28E020C32C8DA2DA56BAB6494D030A</string>\n\t\t\t\t<string>6EC148C19BB64CE3477E95F7CA39F711</string>\n\t\t\t\t<string>D131D943789EC727F15929276BBBD8BD</string>\n\t\t\t\t<string>17F30271B79E8344F95C3FA89632ADC8</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Support Files</string>\n\t\t\t<key>path</key>\n\t\t\t<string>../Target Support Files/Gifu</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>A525E68A31198AD8B3B5CAC519F1A43E</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>6B53E7009C09C0B74CCBE630C56B20C1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>A5F486B6DA397786F31EB6A27CBA10F5</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>A99843CE4BE0995346C06785127AB91C</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>A70CDAD61F90AC503C7D04CC22DA2923</key>\n\t\t<dict>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ALWAYS_SEARCH_USER_PATHS</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>CLANG_CXX_LANGUAGE_STANDARD</key>\n\t\t\t\t<string>gnu++0x</string>\n\t\t\t\t<key>CLANG_CXX_LIBRARY</key>\n\t\t\t\t<string>libc++</string>\n\t\t\t\t<key>CLANG_ENABLE_MODULES</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>CLANG_ENABLE_OBJC_ARC</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>CLANG_WARN_BOOL_CONVERSION</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>CLANG_WARN_CONSTANT_CONVERSION</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>CLANG_WARN_DIRECT_OBJC_ISA_USAGE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>CLANG_WARN_EMPTY_BODY</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>CLANG_WARN_ENUM_CONVERSION</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>CLANG_WARN_INT_CONVERSION</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>CLANG_WARN_OBJC_ROOT_CLASS</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>CLANG_WARN_UNREACHABLE_CODE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>CLANG_WARN__DUPLICATE_METHOD_MATCH</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>COPY_PHASE_STRIP</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>GCC_C_LANGUAGE_STANDARD</key>\n\t\t\t\t<string>gnu99</string>\n\t\t\t\t<key>GCC_DYNAMIC_NO_PIC</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>GCC_OPTIMIZATION_LEVEL</key>\n\t\t\t\t<string>0</string>\n\t\t\t\t<key>GCC_PREPROCESSOR_DEFINITIONS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>DEBUG=1</string>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t</array>\n\t\t\t\t<key>GCC_SYMBOLS_PRIVATE_EXTERN</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>GCC_WARN_64_TO_32_BIT_CONVERSION</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_WARN_ABOUT_RETURN_TYPE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_WARN_UNDECLARED_SELECTOR</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_WARN_UNINITIALIZED_AUTOS</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_WARN_UNUSED_FUNCTION</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_WARN_UNUSED_VARIABLE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>ONLY_ACTIVE_ARCH</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>STRIP_INSTALLED_PRODUCT</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>SYMROOT</key>\n\t\t\t\t<string>${SRCROOT}/../build</string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Debug</string>\n\t\t</dict>\n\t\t<key>A792226DBE4257340C826C75A0DC208F</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Request.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/Request.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>A79BA180FB0AAA9758E33B6FC43DD7F2</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>BFE4C92C7B56F5BE2EDB6693B5B01F06</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>COMPILER_FLAGS</key>\n\t\t\t\t<string>-DOS_OBJECT_USE_OBJC=0</string>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>A808AE4EBFE37F90FE49C2715FB330F2</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>B7931B4F53CD6EDE5CF224FA1404C794</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>A8095458ED6EE84FC61C7A523DD5E84D</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>0294DCA76D64937CF8D8ADF477A4FA11</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>COMPILER_FLAGS</key>\n\t\t\t\t<string>-DOS_OBJECT_USE_OBJC=0</string>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>A868E1FE16614BD1F1336EC1C9D8A8A8</key>\n\t\t<dict>\n\t\t\t<key>explicitFileType</key>\n\t\t\t<string>wrapper.cfbundle</string>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>AlamofireRSS.bundle</string>\n\t\t\t<key>path</key>\n\t\t\t<string>AlamofireRSS.bundle</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>BUILT_PRODUCTS_DIR</string>\n\t\t</dict>\n\t\t<key>A89C4B4FA34F489CCA9D61165EA98AF9</key>\n\t\t<dict>\n\t\t\t<key>explicitFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>BUILT_PRODUCTS_DIR</string>\n\t\t</dict>\n\t\t<key>A962F3A2F35704A852AC7D38910200D9</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>archive.ar</string>\n\t\t\t<key>name</key>\n\t\t\t<string>libopencore-amrnb.a</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/libopencore-amrnb.a</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>A99843CE4BE0995346C06785127AB91C</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartXAxisValueFormatter.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Formatters/ChartXAxisValueFormatter.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>AA314156AC500125F4078EE968DB14C6</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>1891931FD0A3F4CC78749D9E977A8505</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>AAD9F83548ADC849E712A6A4D7A6D789</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>EB42675237B2858B723331F045DB2FB4</string>\n\t\t\t\t<string>5C8F85E0EEBB7F9DDADE1D67E310ACAF</string>\n\t\t\t\t<string>586EA2D58EF199363C2C23823C092089</string>\n\t\t\t\t<string>450044A6490A439394B0F3A67CCFBD00</string>\n\t\t\t\t<string>45DDC4029E0C5A71CC9136854BFC8AB1</string>\n\t\t\t\t<string>66F42930FE68C6E4BD9E882D382F237C</string>\n\t\t\t\t<string>C4B3C15B8ACB8B8ECC0466781B5838BD</string>\n\t\t\t\t<string>E3E49AEE7447C2756D79CBF55AEBDF02</string>\n\t\t\t\t<string>01776C25A5DB30E5FB22DABA2D28B271</string>\n\t\t\t\t<string>16B29AE122AF64257C643FA13FBBA52B</string>\n\t\t\t\t<string>4544CA2498B23C5B3295862D2F20901A</string>\n\t\t\t\t<string>8E8CBDC117A589EB2A32FDEE22A5921C</string>\n\t\t\t\t<string>74A1509B9BC47C1B4C479FB033E06B24</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXHeadersBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>AAFB9E75081EEE8503740F8E73FC1563</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>FF2C748C341F3E0FA03FC7D890D54304</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>ABEF8242948249F9A5BF7C36F57CD8DB</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>877DB484F7698974CCC1D66B51116FE1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>ABFB4E32ADD23D5E47758C89919D0EAD</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXTargetDependency</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Swifter</string>\n\t\t\t<key>target</key>\n\t\t\t<string>9C29B71FB70AAEC2242DDF5BD50C55A3</string>\n\t\t\t<key>targetProxy</key>\n\t\t\t<string>F96AE71D5D1E0E91E4AB3E8EB2B2612A</string>\n\t\t</dict>\n\t\t<key>AC2EF1AE40274FFDC401667516F473E2</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Swifter-umbrella.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>AC8B33D9041AD680F9D5317FAAF423E0</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>95A51226875B54D2C24099FABD65F9A4</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>ACE29C6EE9323028266DA51A3449336F</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>B801611949F9A65BDAD1BA9E75AC4B43</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Project</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>AD5E022434C2CCBE447351CEC813EB1E</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>D22E0FDFD7709E9736B0A7D27CFA1FFC</string>\n\t\t\t\t<string>8B6EF9C34F1E4597938A09B5A8086C08</string>\n\t\t\t\t<string>409737D7933980737EC1592FBD4AAADE</string>\n\t\t\t\t<string>D2C4ADCAC2A7308D24784C168825A6CC</string>\n\t\t\t\t<string>B8FCA3C53C645E5E3C2497744767DA06</string>\n\t\t\t\t<string>FD6B3B6081C8329BA2B82C48DEAA71C8</string>\n\t\t\t\t<string>52349732EBA58888E9A0DBEB887F361B</string>\n\t\t\t\t<string>11F862EDC00E98340C3E6E46BA922E26</string>\n\t\t\t\t<string>52136F9F39CC2759B6CC1922BCB1AB41</string>\n\t\t\t\t<string>BC112F174DA60C5E98C5F62DC222A8CF</string>\n\t\t\t\t<string>9F76D67DEC97A5BBB9AD3546ED28FFDE</string>\n\t\t\t\t<string>75694EB52988796CCDEC1C4A50560B6D</string>\n\t\t\t\t<string>B464B42CACD04405291A2DAB52398E9B</string>\n\t\t\t\t<string>9151874C2B5F097360208EB0315C6297</string>\n\t\t\t\t<string>25502F3A70A00FFB9812245EC0ECD0F6</string>\n\t\t\t\t<string>5D33D52D318CF2F7B66A1D73DDCE436D</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXSourcesBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>ADD0B8D536C47FE797C15119D29AFC71</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurationList</key>\n\t\t\t<string>89CC9FB44A3C41E010E2D4EE388B8D07</string>\n\t\t\t<key>buildPhases</key>\n\t\t\t<array>\n\t\t\t\t<string>124CC709A273ED2691A47C5CEA065111</string>\n\t\t\t\t<string>FC5B42B4BAB1F773C37B0B7916361BB0</string>\n\t\t\t\t<string>BEF74F5A1537A0F36703A7B86CC67092</string>\n\t\t\t</array>\n\t\t\t<key>buildRules</key>\n\t\t\t<array/>\n\t\t\t<key>dependencies</key>\n\t\t\t<array>\n\t\t\t\t<string>7643F494404131680430018F7EC92AE2</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXNativeTarget</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ZLSinusWaveView</string>\n\t\t\t<key>productName</key>\n\t\t\t<string>ZLSinusWaveView</string>\n\t\t\t<key>productReference</key>\n\t\t\t<string>B4CA9869A1F71DB60F8D8B061D814CC5</string>\n\t\t\t<key>productType</key>\n\t\t\t<string>com.apple.product-type.framework</string>\n\t\t</dict>\n\t\t<key>ADD71B1DEF5A923A72F5BD91617A3BFA</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>61441E6010D0E49F26DDACBC74B8FCC2</string>\n\t\t\t\t<string>EB00AA6939C22D418E0231F5C736BC44</string>\n\t\t\t\t<string>00ED322AD74E086D0DBE4FAC8A72856D</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ZLSinusWaveView</string>\n\t\t\t<key>path</key>\n\t\t\t<string>ZLSinusWaveView</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>ADDD22883EB4304A18264D3F48B70486</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.plist.xml</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Info.plist</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>ADF19C953CE2A7D0B72EC93A81FCCC26</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>391D473F1E22B03F1E1DA498562A0F38</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>AE1566BD32F907C4B66DEF43A2CEFC05</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>191F7183D2E17767A8B14716B9453747</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>AE2091E6977D6C16528F5BCCDF7FCDC9</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>74DAF567B850F3FC5893C8CBDB828616</string>\n\t\t\t\t<string>191955118642709970DA6F35F57D57A6</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFrameworksBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>AE2C11E6B5332F82FE14C6CDB59D57FA</key>\n\t\t<dict>\n\t\t\t<key>containerPortal</key>\n\t\t\t<string>D41D8CD98F00B204E9800998ECF8427E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXContainerItemProxy</string>\n\t\t\t<key>proxyType</key>\n\t\t\t<string>1</string>\n\t\t\t<key>remoteGlobalIDString</key>\n\t\t\t<string>AEA56EBE1B518C71721209FB26701898</string>\n\t\t\t<key>remoteInfo</key>\n\t\t\t<string>Gifu</string>\n\t\t</dict>\n\t\t<key>AE4CF87C02C042DF13ED5B21C4FDC1E0</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>39E179F4DAB57EC19626D1DCC4F5F007</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>AE6C6B2C0EB874E9337C85BFF8DC4358</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>AEFloatConverter.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/AEFloatConverter.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>AE7C99A546378A3B72C0A2F4B1F1DE56</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>FE28E020C32C8DA2DA56BAB6494D030A</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>AE9410D9B1C05916CA1D2817FB0F45F1</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ZLMusicFlowDecorativeView.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>ZLMusicFlowWaveView/ZLMusicFlowDecorativeView.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>AEA56EBE1B518C71721209FB26701898</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurationList</key>\n\t\t\t<string>B4096C390FF4F7F3535818EA64A6377C</string>\n\t\t\t<key>buildPhases</key>\n\t\t\t<array>\n\t\t\t\t<string>9ACB6C78F78F1EF04CBFD24FBF52D12C</string>\n\t\t\t\t<string>E6780F645E1E0B045D81802B23CA1195</string>\n\t\t\t\t<string>211BF217FEF65CFAFA0595009B57B795</string>\n\t\t\t</array>\n\t\t\t<key>buildRules</key>\n\t\t\t<array/>\n\t\t\t<key>dependencies</key>\n\t\t\t<array/>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXNativeTarget</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Gifu</string>\n\t\t\t<key>productName</key>\n\t\t\t<string>Gifu</string>\n\t\t\t<key>productReference</key>\n\t\t\t<string>02787AB0F80C11B895A72337338D4CB7</string>\n\t\t\t<key>productType</key>\n\t\t\t<string>com.apple.product-type.framework</string>\n\t\t</dict>\n\t\t<key>AF04A68FC019D3EAB4159D21638A42F1</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>path</key>\n\t\t\t<string>AlamofireRSSParser-dummy.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>AF2CF0BAA5DF6BABFC217F2495AD6FBA</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>name</key>\n\t\t\t<string>RongIMLib.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>B02BF2860C124E9C66C26D2E4913EC5B</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.xcconfig</string>\n\t\t\t<key>path</key>\n\t\t\t<string>ZLSinusWaveView.xcconfig</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>B06192AD341CDBCD0D19BD7B8DCF3B4E</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CombinedChartRenderer.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Renderers/CombinedChartRenderer.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>B0EF69E356D3A304384FA0E56A5CD630</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>17C4E6CB67D0446387655B959DA3A951</string>\n\t\t\t\t<string>B1F334FD78AE10A3AE1DFACE03F36892</string>\n\t\t\t\t<string>A79BA180FB0AAA9758E33B6FC43DD7F2</string>\n\t\t\t\t<string>366B695AE31536E5AB0C83E287A6DBC6</string>\n\t\t\t\t<string>A473EE5B6E7552F583A7E6C0411A63FE</string>\n\t\t\t\t<string>470A19320682236DEF0633151EF7F01C</string>\n\t\t\t\t<string>1D0D77460730EC30F5AFC5241DE8C317</string>\n\t\t\t\t<string>52ADA7A4A97CBF5879F6167136D1E715</string>\n\t\t\t\t<string>241D3259D8743003561A971C917C0C14</string>\n\t\t\t\t<string>A8095458ED6EE84FC61C7A523DD5E84D</string>\n\t\t\t\t<string>3F35D9D6BE5B906A940193BD32AEA736</string>\n\t\t\t\t<string>2EC5A9E72CC8EBAA5DC6255EB89C5879</string>\n\t\t\t\t<string>BF25A6BDAC99AE9978881DAEEC73426C</string>\n\t\t\t\t<string>57D859C2DD2A786A0EC902A7DE9F864C</string>\n\t\t\t\t<string>9F1272B6E005ED49F1C4BCCDD73D1F58</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXSourcesBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>B1729F851F648EC60EE93CDB3C8BAEAD</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>F82198F34DD14753A42F4328CD5E7A6B</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFrameworksBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>B19032CD69D4606E7EEBB7E0BCAA9AD6</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>4313A1E9F9BFAE03053BBCE38418C9AB</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>B1AC36AEB4A84D49B74BB6F8E0AEF018</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>784DED0AA95B4F0087AD1FCA0D438BE0</string>\n\t\t\t\t<string>4276EB8AC31314ED23699BF489AAA02A</string>\n\t\t\t\t<string>8EC66117408FE5D27B57F58550E978C0</string>\n\t\t\t\t<string>37F47C35B2ADE059B4D7AF6334776FC9</string>\n\t\t\t\t<string>CF3C78D8B69FFFBF68081511B212DEC9</string>\n\t\t\t\t<string>5E8334E4B9A3934776155BFEA1ADCCC7</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Support Files</string>\n\t\t\t<key>path</key>\n\t\t\t<string>../Target Support Files/SwiftyJSON</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>B1F334FD78AE10A3AE1DFACE03F36892</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>CEEC903A8A88FC7DAC58821172A38152</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>COMPILER_FLAGS</key>\n\t\t\t\t<string>-DOS_OBJECT_USE_OBJC=0</string>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>B28621795FA91577FCF3525D161A891E</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZAudio.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/EZAudio.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>B28D9E00358A3BFC146406A9E9D84CCF</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>62D919A2C9C2C955FA825CB474A9F16B</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>B2C2A2977AC39FB8A1FC7FAE64E26072</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>DGElasticPullToRefreshConstants.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>DGElasticPullToRefresh/DGElasticPullToRefreshConstants.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>B2F9711D635766F4754D415B41FFC818</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>70525166CB057B3EDE7449F355542038</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>B388A0A92CD8B2C9CD1F9297453C50BA</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH.modulemap</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>B3C1BBCF776752C05DDE5AAFAF11F696</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>0CCE916C80D42C6943D73D1A829DA787</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>B3E49DEC5C3E2B45976F07322793CC64</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>768CC1338D4B027D4517DD3611152862</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>B3F888A903C9E8B6C17D5FD59576A722</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>7E9DCF48CA71A987E38B65E8EA1BC65E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>B4096C390FF4F7F3535818EA64A6377C</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurations</key>\n\t\t\t<array>\n\t\t\t\t<string>5BBC00FA891515A4337DFE7D18C0BD00</string>\n\t\t\t\t<string>BBB4FB5074AF70904472427EAB2C66DF</string>\n\t\t\t</array>\n\t\t\t<key>defaultConfigurationIsVisible</key>\n\t\t\t<string>0</string>\n\t\t\t<key>defaultConfigurationName</key>\n\t\t\t<string>Release</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCConfigurationList</string>\n\t\t</dict>\n\t\t<key>B464B42CACD04405291A2DAB52398E9B</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>4458DADC90FBB23CF881C195DC1D4980</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>B497794704BDE793D7B8264F55B3EC9F</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurations</key>\n\t\t\t<array>\n\t\t\t\t<string>F9AA2C518CD3B5220C9D0F81F8289BCF</string>\n\t\t\t\t<string>C4CF426251F31AE4420AFC8273807D28</string>\n\t\t\t</array>\n\t\t\t<key>defaultConfigurationIsVisible</key>\n\t\t\t<string>0</string>\n\t\t\t<key>defaultConfigurationName</key>\n\t\t\t<string>Release</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCConfigurationList</string>\n\t\t</dict>\n\t\t<key>B4CA9869A1F71DB60F8D8B061D814CC5</key>\n\t\t<dict>\n\t\t\t<key>explicitFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ZLSinusWaveView.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>ZLSinusWaveView.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>BUILT_PRODUCTS_DIR</string>\n\t\t</dict>\n\t\t<key>B4E6B408AA61BA919AA4B1D77012E3F6</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Download.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/Download.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>B50658E33EBBEE7C9364A18D8514154E</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>E7EBFB9C050DC8C1E889D6089F119DBF</string>\n\t\t\t\t<string>D1317396D19297E6736AFF6DACCE392F</string>\n\t\t\t\t<string>7CE0E9D851E9395C41EF6AFA7AE47423</string>\n\t\t\t\t<string>362C15B9D5B743CE94949C267A11A11F</string>\n\t\t\t\t<string>9C01EAB768BB47EB46A5760C4E164C3A</string>\n\t\t\t\t<string>3B1F9EB02DD6CBB544A332E7F8A4A716</string>\n\t\t\t\t<string>CF90390BE8B0052175B720A6F7A4DA7C</string>\n\t\t\t\t<string>3E620824BFA4001189C1AA5EEE595C67</string>\n\t\t\t\t<string>72085F8624E47C76F715EBE276B125EB</string>\n\t\t\t\t<string>02E32AEB8ABF1AF925416098365CE932</string>\n\t\t\t\t<string>FA8EFDE6A60AE635795BEF328FE32AED</string>\n\t\t\t\t<string>07F0E71CC75B65CD371F8F56F53D86F0</string>\n\t\t\t\t<string>897752D9150F684990F930BCC8BD5619</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXSourcesBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>B5916DB8C1387ACAFA0EBB944E15F3E3</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>7E387B67B1AB63AFDB74AEAA00DD821D</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>B5971F611DFCB1DBE9E29202C26D4163</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>9BCA03B2F0B3C0EA0D3499F966194E75</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>B5EEC8A63E90F6F8F85DEF5514D52ED8</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Timeline.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/Timeline.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>B70483F68DA580907714FF534F1A20DA</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartLegend.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Components/ChartLegend.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>B756C6158B1743F24242A4F20F07ECCA</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ServerTrustPolicy.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/ServerTrustPolicy.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>B76F74C8F9438C97CE81DA0817A9D699</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Validation.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/Validation.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>B76F8A1C0154EDBE0747BBB72FE5E62B</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array/>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFrameworksBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>B774655DA50556217BC45010C800332E</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>272BAEFC0F1D27DEF0B82A5B2705399E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>B7931B4F53CD6EDE5CF224FA1404C794</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CandleChartData.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/CandleChartData.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>B7B80995527643776607AFFA75B91E24</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>75D98FF52E597A11900E131B6C4E1ADA</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Targets Support Files</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>B801611949F9A65BDAD1BA9E75AC4B43</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>aesopt.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/aes/aesopt.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>B8024D22C71DD62C706C2DA89005F3EE</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZAudioFile.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/EZAudioFile.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>B80A7F9A2E84C0DE81E907E12076A4A1</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CandleChartDataSet.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/CandleChartDataSet.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>B85E049096D02564EBABAB2D5BF6B6BE</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>LineChartView.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Charts/LineChartView.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>B88349DF809DD951EF76B2B561C15983</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>PieChartDataSet.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/PieChartDataSet.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>B8BBF24C6E5985DBBE1D91820E19E613</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.plist.xml</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Info.plist</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>B8CDE1803E298A956357E75C96E49EE7</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>HttpRequest.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Sources/HttpRequest.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>B8E903F30171A1D853877248B25C11D5</key>\n\t\t<dict>\n\t\t\t<key>containerPortal</key>\n\t\t\t<string>D41D8CD98F00B204E9800998ECF8427E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXContainerItemProxy</string>\n\t\t\t<key>proxyType</key>\n\t\t\t<string>1</string>\n\t\t\t<key>remoteGlobalIDString</key>\n\t\t\t<string>43FD5AF8E2E268BB58C2BEE180302F51</string>\n\t\t\t<key>remoteInfo</key>\n\t\t\t<string>AlamofireRSSParser</string>\n\t\t</dict>\n\t\t<key>B8FCA3C53C645E5E3C2497744767DA06</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>26CA2DF100EC60422EB34B611F67ACD6</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>B90A6C426043472FEECCAD567C74CD38</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>977577C045EDA9D9D1F46E2598D19FC7</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/Pods/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MACH_O_TYPE</key>\n\t\t\t\t<string>staticlib</string>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/Pods/Pods.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>OTHER_LDFLAGS</key>\n\t\t\t\t<string></string>\n\t\t\t\t<key>OTHER_LIBTOOLFLAGS</key>\n\t\t\t\t<string></string>\n\t\t\t\t<key>PODS_ROOT</key>\n\t\t\t\t<string>$(SRCROOT)</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>Pods</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>SWIFT_OPTIMIZATION_LEVEL</key>\n\t\t\t\t<string>-Onone</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Debug</string>\n\t\t</dict>\n\t\t<key>B90D9DCA72327E7BB3D9A76CD30DF985</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>C9A6539E4BB6E9D4FBA65ABF94AC03BB</string>\n\t\t\t\t<string>8BCFC48792C0183444EC97C43A6E3BB4</string>\n\t\t\t\t<string>33CB5E4C130C28C458CD4F7AA1DF99E6</string>\n\t\t\t\t<string>0C2C052032470959CD56614BF9453DC8</string>\n\t\t\t\t<string>F4D16626DE6568E42E73DDF1FED85EE6</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXSourcesBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>B972BD02DECCFEB0CD404ED449764022</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>BarLineScatterCandleBubbleChartDataProvider.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Interfaces/BarLineScatterCandleBubbleChartDataProvider.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>B9764BA1C1B4139220BE15EBBCD6CECE</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>543700860208A4CDC32C58B8636E5827</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>B990718DD6D67073DBCDCF8E6ABED5A5</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>HttpResponse.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Sources/HttpResponse.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>BA48D6CA288389ECA1569120A6333992</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>5E8334E4B9A3934776155BFEA1ADCCC7</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>BA6428E9F66FD5A23C0A2E06ED26CD2F</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Podfile</string>\n\t\t\t<key>path</key>\n\t\t\t<string>../Podfile</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>SOURCE_ROOT</string>\n\t\t\t<key>xcLanguageSpecificationIdentifier</key>\n\t\t\t<string>xcode.lang.ruby</string>\n\t\t</dict>\n\t\t<key>BA7AA59D2E9F556A528840EA05378089</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CandleStickChartRenderer.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Renderers/CandleStickChartRenderer.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>BB2FFAA7E97AA17F0DB5FA6C24617400</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CYRTextView.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>CYRTextView/CYRTextView.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>BB3A8D7FC41ED300CAA4DF3D0527DEAE</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>1B8D79A74968EFE68A03C339F93BE40A</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>BB8BF3A20530EBB622CA33D5AEFB739D</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>sha1.c</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/aes/sha1.c</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>BBB4FB5074AF70904472427EAB2C66DF</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>95C3D67F3A2378FDCAD498AF576A36D7</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/Gifu/Gifu-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/Gifu/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/Gifu/Gifu.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>Gifu</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Release</string>\n\t\t</dict>\n\t\t<key>BC112F174DA60C5E98C5F62DC222A8CF</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>06FD8F213BF2DF4860A3890A3F6C9943</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>BCD5071CB4E5FAEE7FC51746F4B17B62</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>033590E1C2397DA8E570B55810775B8E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>BCD583736D388CAD44C261B79972B86B</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts-umbrella.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>BD11BD25E12B54CC641E519B27C11B66</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZOutput.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/EZOutput.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>BD8D5708635D65BB93AC3037C5DCA03E</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>AnimatedViewPortJob.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Jobs/AnimatedViewPortJob.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>BD97C1D6886F4A540BA21C18DE70A47A</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>40043CBCDD93A301F8437421D53D02A3</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>BDFFD562F6F4A7DA2EB850BC744C7541</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurations</key>\n\t\t\t<array>\n\t\t\t\t<string>04A4F1E8E6A3624871B2EE0C687248B2</string>\n\t\t\t\t<string>8C29735442BC85B0F88470642089405D</string>\n\t\t\t</array>\n\t\t\t<key>defaultConfigurationIsVisible</key>\n\t\t\t<string>0</string>\n\t\t\t<key>defaultConfigurationName</key>\n\t\t\t<string>Release</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCConfigurationList</string>\n\t\t</dict>\n\t\t<key>BE0A3BFD226BAF44617BFBB3DB345624</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>HorizontalBarChartHighlighter.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Highlight/HorizontalBarChartHighlighter.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>BE3F1A095E8DF60F568AC3C16C9CD9CC</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>BarLineScatterCandleBubbleChartData.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/BarLineScatterCandleBubbleChartData.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>BE41196F6A3903E59C3306FE3F8B43FE</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>9AB9C30C29CCEEC9315ABE415511676B</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>BE6178583E3411E5621C8AB2CB79014F</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>IBubbleChartDataSet.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Interfaces/IBubbleChartDataSet.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>BEF74F5A1537A0F36703A7B86CC67092</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>8FC086E0146293F873A3FA450C0C3731</string>\n\t\t\t\t<string>4EBF65047A668987D122EE46E359FF4D</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXHeadersBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>BF20B8C23E028DAAB8B003D153FABE87</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>RadarChartDataSet.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Implementations/Standard/RadarChartDataSet.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>BF25A6BDAC99AE9978881DAEEC73426C</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>CE9719F08048A9825AEAE45D13A0F9DF</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>COMPILER_FLAGS</key>\n\t\t\t\t<string>-DOS_OBJECT_USE_OBJC=0</string>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>BF69C7BFB84A04FFD493D9B9FA9BDD58</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>BE6178583E3411E5621C8AB2CB79014F</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>BFBFE3DE50EEDD42B2CC58CF2F499BCE</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurations</key>\n\t\t\t<array>\n\t\t\t\t<string>1946E9116D8062A9DA249B5276ECE602</string>\n\t\t\t\t<string>69693BA8A71B1AB49790F1AEA9F54D84</string>\n\t\t\t</array>\n\t\t\t<key>defaultConfigurationIsVisible</key>\n\t\t\t<string>0</string>\n\t\t\t<key>defaultConfigurationName</key>\n\t\t\t<string>Release</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCConfigurationList</string>\n\t\t</dict>\n\t\t<key>BFE4C92C7B56F5BE2EDB6693B5B01F06</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>aestab.c</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/aes/aestab.c</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>BFEF228FE25034EB7CF784D634E0B10E</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>A020A04A30303EBCC97F078481030B44</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>C0964599C373EAF8F5D4F77150B2E585</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.xcconfig</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts.xcconfig</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>C0DB70AB368765DC64BFB5FEA75E0696</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>05D9707C1A350638ECD52006A481F077</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>C0FF762D04F76D834E1291819067E12A</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CombinedChartView.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Charts/CombinedChartView.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>C109982F8C877B91A290E88A1EBC1E1D</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>AnimatableImageView.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/AnimatableImageView.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>C12599A3FB6E4A5ACCBAB8DF11AE7381</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>398AF30D80C1481DE30A977A180903ED</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>C17EA91E38478C5DF425AFCDBDFBB3A1</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>69B023D17AE27F4AFA2514F22965C5D0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>C29238134AE5C4B8C2352C6C11C495EB</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.xcconfig</string>\n\t\t\t<key>path</key>\n\t\t\t<string>ZLMusicFlowWaveView.xcconfig</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>C2A17F16FEDD054EA6CCD34CC92A7594</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>D21CB11D4389FD174002BD2E4714DF56</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>C2F12F2C42BADD59AA7540A3C8107D51</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>6C61009912177D3D77B80D65EC5B2AA4</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>C2F4A628275A3E441F742896335D7FF5</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Gifu.modulemap</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>C32F09F394641163865197D9A3C0BEF2</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>631FB7E22898D4FDDBEB4FF4CC88BD80</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>C3746E36F91278C40D0DCBA78D124E88</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>23EB4B1F1FB528E10C5030501D4C3454</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/Alamofire/Alamofire-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/Alamofire/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/Alamofire/Alamofire.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>Alamofire</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>SWIFT_OPTIMIZATION_LEVEL</key>\n\t\t\t\t<string>-Onone</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Debug</string>\n\t\t</dict>\n\t\t<key>C40C801B9D221B9D29844EB7E276D83B</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>CA0C9E24A1D5EE5E5CEC3A7677E450BA</string>\n\t\t\t\t<string>5D48CB591598D53251BDB48146F61D43</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXSourcesBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>C4B3C15B8ACB8B8ECC0466781B5838BD</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>F298F979D3ED9894044C72F2C66925E6</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>C4CF426251F31AE4420AFC8273807D28</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>86D56E9B7AD7546729AD442A3D02478A</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/NMSSH/NMSSH-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/NMSSH/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/NMSSH/NMSSH.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>NMSSH</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Release</string>\n\t\t</dict>\n\t\t<key>C5AA30790616DFD31FB6E41D32920A1A</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZAudio.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/EZAudio.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>C5CF886AF69707824E7BE68FCA944D76</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartViewPortHandler.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Utils/ChartViewPortHandler.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>C617DC78B1A377E48CF0C244D1511F26</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>path</key>\n\t\t\t<string>CYRTextView-dummy.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>C6828C2508515BC0428D6BDAA1292DC9</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurationList</key>\n\t\t\t<string>E03408AFB82FEE195F7C04419FF416EA</string>\n\t\t\t<key>buildPhases</key>\n\t\t\t<array>\n\t\t\t\t<string>DB4D428C23AD783427D44B1957F195F2</string>\n\t\t\t\t<string>8F77C82F0C8760528390313D44756D9B</string>\n\t\t\t\t<string>85F1FA1A04887000AE6D42617A155669</string>\n\t\t\t</array>\n\t\t\t<key>buildRules</key>\n\t\t\t<array/>\n\t\t\t<key>dependencies</key>\n\t\t\t<array/>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXNativeTarget</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Charts</string>\n\t\t\t<key>productName</key>\n\t\t\t<string>Charts</string>\n\t\t\t<key>productReference</key>\n\t\t\t<string>2E70CA0E5B5063FA1695EC714491B22A</string>\n\t\t\t<key>productType</key>\n\t\t\t<string>com.apple.product-type.framework</string>\n\t\t</dict>\n\t\t<key>C68300FA475B7BF7E3419859C05D8AA8</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>0BE89C1211FB9D34E28695028E028BC5</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>C69E27AE1864F2E73BFE3829B41BFE3F</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXTargetDependency</string>\n\t\t\t<key>name</key>\n\t\t\t<string>AlamofireRSSParser-AlamofireRSS</string>\n\t\t\t<key>target</key>\n\t\t\t<string>6DCD8E0D46E3E688EABD466D9ECB53BE</string>\n\t\t\t<key>targetProxy</key>\n\t\t\t<string>33B9BFC9E784B2CD678E24E68652504C</string>\n\t\t</dict>\n\t\t<key>C6C515B057B0700ADA865B63CA1A0C6B</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>3103D8A7D64FE15C94380056D5AB453E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>C6CB3768F4481A3D58397BABD408885A</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>BF20B8C23E028DAAB8B003D153FABE87</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>C6DC7B869C1C73B1B12FFF994EEFAAA3</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>RadarChartView.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Charts/RadarChartView.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>C6F18733027EAC1685B8E3E304C5357A</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>1AC2B93F71120CA50074113DD62725AC</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>C6F5785A49C245BD02BBD3DCA2FD6C53</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>69FE1C8A369E61A2B5F16F781CC4C612</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>C7B6DD7C0456C50289A2C381DFE9FA3F</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>776ECCE5529B00F6D7F372E0F8AB6002</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>C7B98156605B0AC4C70830469ABB06A4</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZMicrophone.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/EZMicrophone.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>C832BE8F84718CAD9B5B7A0F2296F628</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Common.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/Common.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>C85C98983FF1862632F74F4104DB6E68</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>79AF06EC7F78F59EDAC780C88DB961AE</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>C89A56E617144FEA3136394B712452A5</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>087A04860A4A8EC54E6A1A5AF7F73E23</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>C8D8C67006FDDEAC7E7CCB7553FFB573</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>0D30D4EC5DBB217F591F99D492225B04</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Project</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>C989B85CAE2F73F5FFAA2EFB44C56081</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartDataApproximatorFilter.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Filters/ChartDataApproximatorFilter.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>C9A6539E4BB6E9D4FBA65ABF94AC03BB</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>34CEA003BE26A7286C83A2E59C4A7A2F</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>C9B9AD22764D9774AC7E4C72CEE64C60</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartTransformerHorizontalBarChart.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Utils/ChartTransformerHorizontalBarChart.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>C9E6D695EAE6C1062DEA079BB751B87F</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>path</key>\n\t\t\t<string>ZLMusicFlowWaveView.modulemap</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>CA0C9E24A1D5EE5E5CEC3A7677E450BA</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>37F47C35B2ADE059B4D7AF6334776FC9</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>CB4B3C6333DFEB6D8B46D3F9908CBE2A</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>C0964599C373EAF8F5D4F77150B2E585</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/Charts/Charts-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/Charts/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/Charts/Charts.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>Charts</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Release</string>\n\t\t</dict>\n\t\t<key>CB8943577E424C7F4E953DE7A18FA12C</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXTargetDependency</string>\n\t\t\t<key>name</key>\n\t\t\t<string>DGElasticPullToRefresh</string>\n\t\t\t<key>target</key>\n\t\t\t<string>115824B7CB2E76E5ACB836A251E79404</string>\n\t\t\t<key>targetProxy</key>\n\t\t\t<string>1CF9B76B2F64B9518142C0E419278E19</string>\n\t\t</dict>\n\t\t<key>CBC0F7C552B739C909B650A0F42F7F38</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.script.sh</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Pods-resources.sh</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>CBC7A5017D4527A9E94D74915C54ACB8</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Alamofire-prefix.pch</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>CBDFB1F7E57AACF12D6C4BC2E29B8283</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>6FB01F35A58B096070AD063AE6B3459A</string>\n\t\t\t\t<string>7F87651AE9B6CA0E7F4A0114F19A7924</string>\n\t\t\t\t<string>9BCA03B2F0B3C0EA0D3499F966194E75</string>\n\t\t\t\t<string>2F9E24C3EB88806401EAEE690D73F1A1</string>\n\t\t\t\t<string>A481946E2B03D2D461A9D9942194D32C</string>\n\t\t\t\t<string>FC9680DA45C4F4007DF7852E9D4CD965</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Support Files</string>\n\t\t\t<key>path</key>\n\t\t\t<string>../Target Support Files/AASquaresLoading</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>CC1086A80586AA695872978B4DCA7686</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>IScatterChartDataSet.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Interfaces/IScatterChartDataSet.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>CD50BB7E7708FCBA8DAAB65D3B0E3A04</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>40043CBCDD93A301F8437421D53D02A3</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>CDD0E4686262A0C5C4CBF479DA08F122</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>5A7F1D5307EAD796E3AA22EA222AA8FA</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>CDD10EA7FDB7BA6CF457E5EC0E4174A3</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Manager.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/Manager.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>CDE3C54614B1F64A979844A035DA0BA6</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>E3946A371A05F0C0CB253C741C19F897</string>\n\t\t\t\t<string>905C0B7980F791438B4754D9AB323CBE</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFrameworksBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>CE787D2E7219B1CE32FB1F9F3BB56BC6</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>prng.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/aes/prng.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>CE9719F08048A9825AEAE45D13A0F9DF</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>SSZipArchive.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/SSZipArchive.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>CEBB2FD70283D5A17132F1B8566E0D2E</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>50DD5592D089DE7626D6837A4E9EA1AC</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>CEE3227590AFA556D61A75618381AFB4</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>3CB03ADC16519670885B618511A8CFED</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>CEEC903A8A88FC7DAC58821172A38152</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>aeskey.c</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/aes/aeskey.c</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>CF3C78D8B69FFFBF68081511B212DEC9</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SwiftyJSON-prefix.pch</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>CF82ED8D2AAF0100798F74B82004713B</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>4567150A2B071C2DA321F4CE18FF8364</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>CF90390BE8B0052175B720A6F7A4DA7C</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>FD04474CE1E00D47F9010D3A6526EA81</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>CF9D51D988643E797BAE8A9A54D9F2CD</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZAudioFile.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/EZAudioFile.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>CFA3D4558500E9CC96C07F908B66D6B5</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CoreText.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/CoreText.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>DEVELOPER_DIR</string>\n\t\t</dict>\n\t\t<key>D0405803033A2A777B8E4DFA0C1800ED</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Pods-acknowledgements.markdown</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>D06A2482F5337777E2FD81594035B829</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>A28C94FC58D7492A6E64E2C97EBAFE0B</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>D07DAD252FED8A056A4085E49639E5D7</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Gifu.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/Gifu.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>D09B82E039368828B6E7C5FE88975F8F</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>String+SHA1.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Sources/String+SHA1.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>D1317396D19297E6736AFF6DACCE392F</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>1EF3386A084C9BF7F3B05704CD56DBE6</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>D131D943789EC727F15929276BBBD8BD</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Gifu-umbrella.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>D170993D4633F76FF548FD13C3B84EC3</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>LineRadarChartRenderer.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Renderers/LineRadarChartRenderer.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>D1B2C2D29810BC661B81102DBD76A35D</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurations</key>\n\t\t\t<array>\n\t\t\t\t<string>6F96FF4172FE4DDDA8BB660DD50ABA6A</string>\n\t\t\t\t<string>702840BAC90AC4754E17FD68C4B8DEAC</string>\n\t\t\t</array>\n\t\t\t<key>defaultConfigurationIsVisible</key>\n\t\t\t<string>0</string>\n\t\t\t<key>defaultConfigurationName</key>\n\t\t\t<string>Release</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCConfigurationList</string>\n\t\t</dict>\n\t\t<key>D1F1695E20DD0A70DA19C6226F3E6BEF</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>7E299BF9A615998682A1A05F5F0E42EE</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>D20A7E639C045BD6532B3CA94A1DBBE2</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>48F9BF534FE68A179559BAE0103EED67</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>D21CB11D4389FD174002BD2E4714DF56</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartAxisRendererBase.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Renderers/ChartAxisRendererBase.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>D22E0FDFD7709E9736B0A7D27CFA1FFC</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>49459EAB6B6631BA931AAD932786D029</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>D24B9254E2DE0C6C7A2339323E1BF0A4</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurations</key>\n\t\t\t<array>\n\t\t\t\t<string>DFEB11ACE1629F94671A20E833C4DC7E</string>\n\t\t\t\t<string>7D70BAF35B5E41ECAA00CC8B49CAF3FB</string>\n\t\t\t</array>\n\t\t\t<key>defaultConfigurationIsVisible</key>\n\t\t\t<string>0</string>\n\t\t\t<key>defaultConfigurationName</key>\n\t\t\t<string>Release</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCConfigurationList</string>\n\t\t</dict>\n\t\t<key>D2C4ADCAC2A7308D24784C168825A6CC</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>136FA39293487CFA2EA9129427511420</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>D337D7308207F3411F5DD32CB88A5F1B</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>2BCC458FDD5F692BBB2BFC64BB5701FC</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>D3602C188ACB17FC40AC72FB96C5EB35</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartViewBase.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Charts/ChartViewBase.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>D383B7AF516798B5F9C43DB0E5E55AA6</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>F7B3565EFC793DB0CE40900A2C1F3244</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>D40D65B89CE20F485FF2173D31AF3853</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartComponentBase.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Components/ChartComponentBase.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>D41D8CD98F00B204E9800998ECF8427E</key>\n\t\t<dict>\n\t\t\t<key>attributes</key>\n\t\t\t<dict>\n\t\t\t\t<key>LastSwiftUpdateCheck</key>\n\t\t\t\t<string>0700</string>\n\t\t\t\t<key>LastUpgradeCheck</key>\n\t\t\t\t<string>0700</string>\n\t\t\t</dict>\n\t\t\t<key>buildConfigurationList</key>\n\t\t\t<string>2D8E8EC45A3A1A1D94AE762CB5028504</string>\n\t\t\t<key>compatibilityVersion</key>\n\t\t\t<string>Xcode 3.2</string>\n\t\t\t<key>developmentRegion</key>\n\t\t\t<string>English</string>\n\t\t\t<key>hasScannedForEncodings</key>\n\t\t\t<string>0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXProject</string>\n\t\t\t<key>knownRegions</key>\n\t\t\t<array>\n\t\t\t\t<string>en</string>\n\t\t\t</array>\n\t\t\t<key>mainGroup</key>\n\t\t\t<string>7DB346D0F39D3F0E887471402A8071AB</string>\n\t\t\t<key>productRefGroup</key>\n\t\t\t<string>92151B6A7B2524A1BABEEE69E0CA7861</string>\n\t\t\t<key>projectDirPath</key>\n\t\t\t<string></string>\n\t\t\t<key>projectReferences</key>\n\t\t\t<array/>\n\t\t\t<key>projectRoot</key>\n\t\t\t<string></string>\n\t\t\t<key>targets</key>\n\t\t\t<array>\n\t\t\t\t<string>0E579C8B6EC88FD31F0C2B47C9058B48</string>\n\t\t\t\t<string>79C040AFDDCE1BCBF6D8B5EB0B85887F</string>\n\t\t\t\t<string>43FD5AF8E2E268BB58C2BEE180302F51</string>\n\t\t\t\t<string>6DCD8E0D46E3E688EABD466D9ECB53BE</string>\n\t\t\t\t<string>C6828C2508515BC0428D6BDAA1292DC9</string>\n\t\t\t\t<string>339174A0A2DC9E27C74F079867D82284</string>\n\t\t\t\t<string>115824B7CB2E76E5ACB836A251E79404</string>\n\t\t\t\t<string>254EA72DFADAB5F3286B8726A554C9E6</string>\n\t\t\t\t<string>AEA56EBE1B518C71721209FB26701898</string>\n\t\t\t\t<string>3881764D412915AEE2FDC3677F741D9A</string>\n\t\t\t\t<string>137FDB371251B06FCC2593DBA88272D2</string>\n\t\t\t\t<string>F60C777A2655795B8C4DD4476D3522F5</string>\n\t\t\t\t<string>F49E17CE595BF7A7A46139779E891F78</string>\n\t\t\t\t<string>9C29B71FB70AAEC2242DDF5BD50C55A3</string>\n\t\t\t\t<string>FB6A25C88BCCDB159C1C71A2C484100D</string>\n\t\t\t\t<string>F8C233736FECBA33C0E71D949DF017CA</string>\n\t\t\t\t<string>ADD0B8D536C47FE797C15119D29AFC71</string>\n\t\t\t</array>\n\t\t</dict>\n\t\t<key>D5AB4F80FDD82F7FD614CB3F000E615B</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>4ADAD0E91F5DCCDC1EEF2C11C99034AC</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>D5E75CD283EA586FB4A33BD1E70116F8</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>C0964599C373EAF8F5D4F77150B2E585</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/Charts/Charts-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/Charts/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/Charts/Charts.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>Charts</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>SWIFT_OPTIMIZATION_LEVEL</key>\n\t\t\t\t<string>-Onone</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Debug</string>\n\t\t</dict>\n\t\t<key>D5EB8839E96EE9D01C2BF4D48D8EDF36</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ImageSourceHelpers.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Source/ImageSourceHelpers.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>D5EC2A1F955556DA0724C612A78C674B</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>8621EC900E9540E855F2A45193465CE6</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>D5F44E638D27C282B496D1999C8B754A</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>AlamofireRSSParser.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Pod/Classes/AlamofireRSSParser.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>D7292846D89C548856055AEC24A11827</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>1F8B22539695E07FA9762AFF2D92CB5A</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>D73CA5EABA732B046927C93C476FC634</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>534D8D488609E2DA3DBE7CA778E2D5DC</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>D7AC85CBA5CACB37DD2CDA0B13E3DC0D</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>6A2D73BF1B684C56E7FEF0F452537CCF</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>D7C1E15DAA48F123231A498172D38967</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NMSSHHostConfig.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH/NMSSHHostConfig.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>D7D019D2275A7A64B3188D36B0F5F8F4</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartLegendRenderer.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Renderers/ChartLegendRenderer.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>D879768BF616B126D71B6BA5F638D96A</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>667AE18ABE1BD4A574755ED111198F89</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>D8A45F2D53B5C2246CB9D246A16F678F</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>F3E8A533B0FA4678233C985618BEEEA6</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Project</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>D903133FE593BA39A527BFD1887D43BE</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXTargetDependency</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Charts</string>\n\t\t\t<key>target</key>\n\t\t\t<string>C6828C2508515BC0428D6BDAA1292DC9</string>\n\t\t\t<key>targetProxy</key>\n\t\t\t<string>65C7C81B8FCE42F70895210309838E7D</string>\n\t\t</dict>\n\t\t<key>DA312349A49333542E6F4B36B329960E</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.xcconfig</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Pods.release.xcconfig</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>DA3AA58FE349027A794BEA3358EED800</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>IPieChartDataSet.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Interfaces/IPieChartDataSet.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>DA3C0B91AFC44531B8A01A3F0562457C</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ZipArchive.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/ZipArchive.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>DA8F020D6AA506F0106F80186BDA93E4</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZRecorder.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/EZRecorder.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>DB4D428C23AD783427D44B1957F195F2</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>DD580D63E4D76F53372817544FDB8882</string>\n\t\t\t\t<string>4EC9879E9DEB9D169929ADA6EEFB18FD</string>\n\t\t\t\t<string>FC8A29D1F192FF1FDA3BB7D0935A1B3F</string>\n\t\t\t\t<string>4EEF9EF82DBD9FA2F25E1ABDE291AC02</string>\n\t\t\t\t<string>1FFA88C4B3A1DAF8DA3FBD1FB22358B5</string>\n\t\t\t\t<string>3EF3C6E2D5466E70A62B0CE90DA2604C</string>\n\t\t\t\t<string>D20A7E639C045BD6532B3CA94A1DBBE2</string>\n\t\t\t\t<string>465CB044A4902D7BAA80597E096B0E67</string>\n\t\t\t\t<string>B19032CD69D4606E7EEBB7E0BCAA9AD6</string>\n\t\t\t\t<string>9FD26D6C00634178B74170103B48A9CF</string>\n\t\t\t\t<string>352EF1AF94125D67FEAA040F32449B24</string>\n\t\t\t\t<string>02C1BEA6FE84433F6C6A713533B7B9BD</string>\n\t\t\t\t<string>4ABE19F043A4FECE8C2A3F1F72AB3F7F</string>\n\t\t\t\t<string>620860DD966F93A5BB284ECA65E3FF68</string>\n\t\t\t\t<string>B774655DA50556217BC45010C800332E</string>\n\t\t\t\t<string>9838C7578BE14F947489DA4D1C595898</string>\n\t\t\t\t<string>D383B7AF516798B5F9C43DB0E5E55AA6</string>\n\t\t\t\t<string>B3E49DEC5C3E2B45976F07322793CC64</string>\n\t\t\t\t<string>9DD2A8006D79DC4469F9BD2FFB55F071</string>\n\t\t\t\t<string>6F27F0A0E87FC39880EE7BC442E7525C</string>\n\t\t\t\t<string>A808AE4EBFE37F90FE49C2715FB330F2</string>\n\t\t\t\t<string>FC34E76E2F5CB664B627A6F1192888FA</string>\n\t\t\t\t<string>70073C35619976BCC6D659E523A9375E</string>\n\t\t\t\t<string>2E6846DB220C35EF387C119161A37580</string>\n\t\t\t\t<string>86F265DD248E17D2B6A3C5E4AA8B6800</string>\n\t\t\t\t<string>2E176E84663592A2EB1DF3E23B6D3225</string>\n\t\t\t\t<string>9BBB90314EEDCAA33FB3160A02862010</string>\n\t\t\t\t<string>99DC0137E12C0E6A0CF0626CB80CB1D5</string>\n\t\t\t\t<string>54E862294530B7914A37F408C0DFF74C</string>\n\t\t\t\t<string>C2A17F16FEDD054EA6CCD34CC92A7594</string>\n\t\t\t\t<string>C12599A3FB6E4A5ACCBAB8DF11AE7381</string>\n\t\t\t\t<string>15AD01DB1A64F162CCBC2E4D02B1458A</string>\n\t\t\t\t<string>268957DD1BCCEB3ABCE0BA4DED45EA01</string>\n\t\t\t\t<string>38E5AE8278D6C47639BB70049876C110</string>\n\t\t\t\t<string>003EBB47E856DBB92F4A63FC2AD8C892</string>\n\t\t\t\t<string>7C204B9F7D811C860F446BAB1575C344</string>\n\t\t\t\t<string>1268FBA2F4CEE4DC3577E8DD52D25975</string>\n\t\t\t\t<string>ABEF8242948249F9A5BF7C36F57CD8DB</string>\n\t\t\t\t<string>17E8ECFF7879DDE903F47869DEBAA874</string>\n\t\t\t\t<string>124D0BAABE6160B5E0B6ADC527C58418</string>\n\t\t\t\t<string>2B44A572F8A1ACA0F3964493F4D3228D</string>\n\t\t\t\t<string>A525E68A31198AD8B3B5CAC519F1A43E</string>\n\t\t\t\t<string>421EC967AD86F44E9BDB88301D94B33B</string>\n\t\t\t\t<string>224F8C8DCD27EA9658A028C095C4F275</string>\n\t\t\t\t<string>C32F09F394641163865197D9A3C0BEF2</string>\n\t\t\t\t<string>3C50B55F32F9344B641ACF672F0220A4</string>\n\t\t\t\t<string>A00CBCB935830FEE99F6E645C95E834D</string>\n\t\t\t\t<string>778126769FD6E223F9574C2E19DD5453</string>\n\t\t\t\t<string>797C9F2528F449390500C4FECCBAA135</string>\n\t\t\t\t<string>65FB4C3B9C6D3DF8ED9A60732536021D</string>\n\t\t\t\t<string>3B2ED386492166C28D7631B4488EA230</string>\n\t\t\t\t<string>24A9C720DFCC621D045671BF48493E8A</string>\n\t\t\t\t<string>4846448B6998275139FBF24E87C11D42</string>\n\t\t\t\t<string>1ED95865A0F35E6479942C08DC17E359</string>\n\t\t\t\t<string>371FCB701E2FA5156BA218C0C95A1C5E</string>\n\t\t\t\t<string>783C44EF16D4C79ADC985C8C86C458D5</string>\n\t\t\t\t<string>50AE3A2D24BA4DE093FC4BD2657AC1FB</string>\n\t\t\t\t<string>9505960D18F60DAA70871C006CA302EF</string>\n\t\t\t\t<string>317A3E7B043018C7BD7F857B76FE1462</string>\n\t\t\t\t<string>30092F63FB79CD827CB85D797464FB40</string>\n\t\t\t\t<string>E1BAD342EFFB5E062959C14B5E07DC68</string>\n\t\t\t\t<string>D1F1695E20DD0A70DA19C6226F3E6BEF</string>\n\t\t\t\t<string>3EED0E841D10FEAA033A3C645CB219D3</string>\n\t\t\t\t<string>1711226039A0CD668F7DBEEE45D9E238</string>\n\t\t\t\t<string>38482CD39B3757452D67AE22C1DA5F29</string>\n\t\t\t\t<string>DE042C08F7F3A2A3B4546F8EADFCDEC5</string>\n\t\t\t\t<string>A5F486B6DA397786F31EB6A27CBA10F5</string>\n\t\t\t\t<string>1677FAD2A148DA1DDE73736B4848878B</string>\n\t\t\t\t<string>C2F12F2C42BADD59AA7540A3C8107D51</string>\n\t\t\t\t<string>AE1566BD32F907C4B66DEF43A2CEFC05</string>\n\t\t\t\t<string>B5916DB8C1387ACAFA0EBB944E15F3E3</string>\n\t\t\t\t<string>770318C2100C2A9A4D14D224B041B0E5</string>\n\t\t\t\t<string>A20419267FBC2600623140053A2AA8F7</string>\n\t\t\t\t<string>4BD7EE6ED468BE4A70A0739940369D7D</string>\n\t\t\t\t<string>C6F18733027EAC1685B8E3E304C5357A</string>\n\t\t\t\t<string>A48B96C6FBB609A286F182ED83923097</string>\n\t\t\t\t<string>2DFEDFAB407EBB39DF8E289418A7BE63</string>\n\t\t\t\t<string>D73CA5EABA732B046927C93C476FC634</string>\n\t\t\t\t<string>729F9E9B68A861150F91F93D765BD254</string>\n\t\t\t\t<string>BCD5071CB4E5FAEE7FC51746F4B17B62</string>\n\t\t\t\t<string>BF69C7BFB84A04FFD493D9B9FA9BDD58</string>\n\t\t\t\t<string>3519CBA7EE38A591227561F3B974D709</string>\n\t\t\t\t<string>9181C57B0D5E511D518D6ED675AC30A6</string>\n\t\t\t\t<string>E1EC4988F56A7D8818978CF0E11235B6</string>\n\t\t\t\t<string>86712FE294355019927A4B113B072F63</string>\n\t\t\t\t<string>B9764BA1C1B4139220BE15EBBCD6CECE</string>\n\t\t\t\t<string>6C77A1B3D784E94C0A704E5758AF6E14</string>\n\t\t\t\t<string>7B234F4406FD51E392E7B688A295E8FB</string>\n\t\t\t\t<string>FEAAEDF7FAFA3134CA836F1AB6E0FDF5</string>\n\t\t\t\t<string>631BAC0B955DDA472F2092F853D8624D</string>\n\t\t\t\t<string>2EBAA77DF6F106BCE20CADC931D8C84F</string>\n\t\t\t\t<string>1A576993F97A4BD21C20CE9685D55B45</string>\n\t\t\t\t<string>3DB99C22AB1CE344BFE50941C299F2AB</string>\n\t\t\t\t<string>604D5A1EF4ABD6E0ACB3B5C820C9F841</string>\n\t\t\t\t<string>1568D9F321313FECF78F199CE4E7B442</string>\n\t\t\t\t<string>821EB8A5F1FC9B2F4EAB51C67F4DE2C6</string>\n\t\t\t\t<string>1792949332E845FCE9745F455932668C</string>\n\t\t\t\t<string>FF383AB25605A99106208E2F7CBC811E</string>\n\t\t\t\t<string>D5EC2A1F955556DA0724C612A78C674B</string>\n\t\t\t\t<string>C68300FA475B7BF7E3419859C05D8AA8</string>\n\t\t\t\t<string>10DA9C9D58BDE4AEBC101C70A645E315</string>\n\t\t\t\t<string>F9E9A2403A8E8D7D3509ABF2A40A5CD7</string>\n\t\t\t\t<string>CEBB2FD70283D5A17132F1B8566E0D2E</string>\n\t\t\t\t<string>127AB4661AC9A5832C3D5A4077C1A58C</string>\n\t\t\t\t<string>6744F19C73C44705160ECB1E7C7FB733</string>\n\t\t\t\t<string>C6CB3768F4481A3D58397BABD408885A</string>\n\t\t\t\t<string>9E1EEA656E59AB9E30DC8D0385F289B4</string>\n\t\t\t\t<string>3D8DDA0FEB1A3AFF6643F9121E19D044</string>\n\t\t\t\t<string>C6C515B057B0700ADA865B63CA1A0C6B</string>\n\t\t\t\t<string>1AA2BFF6AAA29B3C65D9109C6D89B631</string>\n\t\t\t\t<string>BB3A8D7FC41ED300CAA4DF3D0527DEAE</string>\n\t\t\t\t<string>C89A56E617144FEA3136394B712452A5</string>\n\t\t\t\t<string>C6F5785A49C245BD02BBD3DCA2FD6C53</string>\n\t\t\t\t<string>E90141BF332560ED9C3BA829889E51CD</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXSourcesBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>DC0D405095C90FB4035A2F0243192579</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>fileenc.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/aes/fileenc.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>DC9FDA0AFC976AC147511622F5DB1860</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>en.lproj</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/en.lproj</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>DCC866ED59787599F6878FA3408C9E43</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.xcconfig</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio.xcconfig</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>DCE911485FE993C88C00E6FC8F301448</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>49459EAB6B6631BA931AAD932786D029</string>\n\t\t\t\t<string>E51BBFF2074DA4267B550E1D58ADF58A</string>\n\t\t\t\t<string>26CA2DF100EC60422EB34B611F67ACD6</string>\n\t\t\t\t<string>1D0F56E661286DC8431D8887DD690692</string>\n\t\t\t\t<string>136FA39293487CFA2EA9129427511420</string>\n\t\t\t\t<string>169B552578427611CD64555A461D8A88</string>\n\t\t\t\t<string>B8CDE1803E298A956357E75C96E49EE7</string>\n\t\t\t\t<string>B990718DD6D67073DBCDCF8E6ABED5A5</string>\n\t\t\t\t<string>57723204FBD830B51D546A0059298711</string>\n\t\t\t\t<string>06FD8F213BF2DF4860A3890A3F6C9943</string>\n\t\t\t\t<string>03F0D41F8726403C1B0B5F3D93915906</string>\n\t\t\t\t<string>698765A4EF927BBD85BC37EE2FF01903</string>\n\t\t\t\t<string>4458DADC90FBB23CF881C195DC1D4980</string>\n\t\t\t\t<string>E80999E723F79EDC7D4FD8BF79BCA5F5</string>\n\t\t\t\t<string>D09B82E039368828B6E7C5FE88975F8F</string>\n\t\t\t\t<string>97E1CBD3DF590CB3415D629A4ECBC776</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Swifter</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Swifter</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>DCECD6AAC84A0BDBE43081FFF891F3FF</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>pwd2key.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/aes/pwd2key.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>DD3A008898F33BA6A93E536EF2E82A41</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>D337D7308207F3411F5DD32CB88A5F1B</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXHeadersBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>DD580D63E4D76F53372817544FDB8882</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>2DDDE6A2D911CE26FD721A694DA7D986</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>DD7AF476E0F820613312BA057B209D07</key>\n\t\t<dict>\n\t\t\t<key>containerPortal</key>\n\t\t\t<string>D41D8CD98F00B204E9800998ECF8427E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXContainerItemProxy</string>\n\t\t\t<key>proxyType</key>\n\t\t\t<string>1</string>\n\t\t\t<key>remoteGlobalIDString</key>\n\t\t\t<string>3881764D412915AEE2FDC3677F741D9A</string>\n\t\t\t<key>remoteInfo</key>\n\t\t\t<string>NMSSH</string>\n\t\t</dict>\n\t\t<key>DD7D8BD19010A140BBD01B5E92541182</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>BB2FFAA7E97AA17F0DB5FA6C24617400</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>DE042C08F7F3A2A3B4546F8EADFCDEC5</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>19318C4AE0C9FF87FDC7C34424E9305F</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>DFCF6A958A237C3D561F2830085A3000</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>hmac.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/aes/hmac.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>DFEB11ACE1629F94671A20E833C4DC7E</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>36D90A99286A433572F91AB604418967</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/AlamofireRSSParser/AlamofireRSSParser-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/AlamofireRSSParser/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/AlamofireRSSParser/AlamofireRSSParser.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>AlamofireRSSParser</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>SWIFT_OPTIMIZATION_LEVEL</key>\n\t\t\t\t<string>-Onone</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Debug</string>\n\t\t</dict>\n\t\t<key>E03408AFB82FEE195F7C04419FF416EA</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurations</key>\n\t\t\t<array>\n\t\t\t\t<string>D5E75CD283EA586FB4A33BD1E70116F8</string>\n\t\t\t\t<string>CB4B3C6333DFEB6D8B46D3F9908CBE2A</string>\n\t\t\t</array>\n\t\t\t<key>defaultConfigurationIsVisible</key>\n\t\t\t<string>0</string>\n\t\t\t<key>defaultConfigurationName</key>\n\t\t\t<string>Release</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCConfigurationList</string>\n\t\t</dict>\n\t\t<key>E0CAE9A4EC3948A0E48F0096EAF93132</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SJCSimplePDFView-prefix.pch</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>E14C8107646EC3F8588ED97956DCC65A</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>5F74650537FAFA0C20CFECF3870638C4</string>\n\t\t\t\t<string>5BAE1115B0F38B2B700C84FCE61FDD87</string>\n\t\t\t\t<string>8D901D00C6FF59773C631FE0557B8845</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Frameworks</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>E1802D1110A2554B9624857DFBA4126A</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>395E75AD0A89CABE845F7299D0509640</string>\n\t\t\t\t<string>4CDBCAF32D84C52F6A5CD9D53D1C8686</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Charts</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>E1BAD342EFFB5E062959C14B5E07DC68</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>1A7CD22F5ED03019E906E471DD59388F</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>E1EC4988F56A7D8818978CF0E11235B6</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>E6CC8802D5BE9DF62F444322062597D0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>E2F0E619F4A90A088378D7A28F583D02</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>BubbleChartRenderer.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Renderers/BubbleChartRenderer.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>E2FAD92811C5785C55D927D4BBF05C68</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH-dummy.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>E349CFCDAD29F7182C472495FBBFCF0F</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NMSSH.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH-iOS/NMSSH.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>E3946A371A05F0C0CB253C741C19F897</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>F209FD4822C5866ECCA569B37842FBBA</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>E3E49AEE7447C2756D79CBF55AEBDF02</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>0FDD62CA863BD5DBE7F5C375C207C7EF</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>E4097C8AD80F7FA95C14816874CD3B28</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>034548B827C03622818B97E6F50C78EC</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/Swifter/Swifter-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/Swifter/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/Swifter/Swifter.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>Swifter</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Release</string>\n\t\t</dict>\n\t\t<key>E42B1F498AF0874C6DE8124BB795F15E</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>AnimatedZoomViewJob.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Jobs/AnimatedZoomViewJob.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>E5055FEB2A2A322A90311B7874DC9092</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.xcconfig</string>\n\t\t\t<key>path</key>\n\t\t\t<string>DGElasticPullToRefresh.xcconfig</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>E51BBFF2074DA4267B550E1D58ADF58A</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>File.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Sources/File.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>E56D64DF36156ED67576CCA614D0618F</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartAnimator.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Animation/ChartAnimator.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>E56EA2D2498EDB9C4058F8E9A8989FAE</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>17E57B8F489EA569011B8678EC392493</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>E618C6E4AE74F180898BC4052A0BA056</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>31A8AB41E1FF5C54D0970DF38969E324</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Project</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>E6780F645E1E0B045D81802B23CA1195</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>CD50BB7E7708FCBA8DAAB65D3B0E3A04</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFrameworksBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>E6CC8802D5BE9DF62F444322062597D0</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ILineChartDataSet.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Data/Interfaces/ILineChartDataSet.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>E714E7EE552ED72453DB7F1AB1FE9DC9</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXTargetDependency</string>\n\t\t\t<key>name</key>\n\t\t\t<string>SJCSimplePDFView</string>\n\t\t\t<key>target</key>\n\t\t\t<string>F60C777A2655795B8C4DD4476D3522F5</string>\n\t\t\t<key>targetProxy</key>\n\t\t\t<string>2B478D3A308B7A2B85319239F72DE289</string>\n\t\t</dict>\n\t\t<key>E74514FEF953E9C25CBFE0645FADFC41</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>F5C563FFB56C2F264F8F6B3EF31B074F</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>E75768524ABD0E737765714AE4677C48</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Swifter-prefix.pch</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>E772910ED9BD048407A4D78E5020A45F</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CYRTextStorage.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>CYRTextView/CYRTextStorage.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>E7BD9D0FF2125D7C3A92D70C380B3261</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>6DA6701753BDEEF59EA50F2CB8CDC7EC</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>E7DB65F9F86D73C2E1F34D7832CD69DF</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurations</key>\n\t\t\t<array>\n\t\t\t\t<string>71EB9AFCBF7ABE58DCC9C10DEB02906A</string>\n\t\t\t\t<string>51F55670AE3232AEAA1C0CE9575ACACC</string>\n\t\t\t</array>\n\t\t\t<key>defaultConfigurationIsVisible</key>\n\t\t\t<string>0</string>\n\t\t\t<key>defaultConfigurationName</key>\n\t\t\t<string>Release</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCConfigurationList</string>\n\t\t</dict>\n\t\t<key>E7EBFB9C050DC8C1E889D6089F119DBF</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>46EC9DD508AF1269E9D7DAB50594AB66</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>E7F21354943D9F42A70697D5A5EF72E9</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.script.sh</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Pods-frameworks.sh</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>E80999E723F79EDC7D4FD8BF79BCA5F5</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>String+Misc.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Sources/String+Misc.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>E8429EE77E177E3DDF7BDF57797AB2EC</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>71E013AE8742AF9DE782F24E90B5E1DB</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>E8446514FBAD26C0E18F24A5715AEF67</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.plist.xml</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Info.plist</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>E8E725C145C99E05F90D6F5141B56754</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>C109982F8C877B91A290E88A1EBC1E1D</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>E8F096851EC41151C5B6B0F804F678F0</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>LineChartDataProvider.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Interfaces/LineChartDataProvider.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>E90141BF332560ED9C3BA829889E51CD</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>FD194E12D7F3D8DAA667A3A52EB221CA</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>EA55530B8CFA1390B85AD2EAE503944D</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.xcconfig</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive.xcconfig</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>EA714E8F4EBC70B2C11E2BCA2854D037</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartMarker.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Components/ChartMarker.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>EAF5382389A29BF0B9ECFE46E3F5AC4D</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.plist.xml</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Emoji.plist</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/Emoji.plist</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>EB00AA6939C22D418E0231F5C736BC44</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ZLSinusWaveView.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>ZLSinusWaveView/ZLSinusWaveView.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>EB42675237B2858B723331F045DB2FB4</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>AE6C6B2C0EB874E9337C85BFF8DC4358</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>EC840730B431C4C5CCBC36514D28D17A</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>AE9410D9B1C05916CA1D2817FB0F45F1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>ECA049105DF827404AAEC0CD3E189C64</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NMSSH+Protected.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH/Config/NMSSH+Protected.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>ECB77A2F7E083C88A4C9EAEF40CB8D17</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZAudioPlayer.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/EZAudioPlayer.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>ECDF2C04EED904A4AFC64DED8EA45544</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>94FA3A77E6FC614EA18C169BA609056E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>ED3BCC1E1780692338F70AA5634917DF</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartAxisBase.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Components/ChartAxisBase.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>ED50758E863F122346C9C2E1873E53DE</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>sha1.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/aes/sha1.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>ED564D8B303131454DDC6593B8982939</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>A89C4B4FA34F489CCA9D61165EA98AF9</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>EF2C26926BC90B457BF77F1F5C3864A5</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>46D3F6AF317B0CA613B0F2C91085FBED</string>\n\t\t\t\t<string>CBDFB1F7E57AACF12D6C4BC2E29B8283</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>AASquaresLoading</string>\n\t\t\t<key>path</key>\n\t\t\t<string>AASquaresLoading</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>EFAF93ECA6E252EF29AB51A210E6D8E4</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NMSSHLogger.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH/Config/NMSSHLogger.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>EFC93C11F16B90228BA386D77AA69400</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>B02BF2860C124E9C66C26D2E4913EC5B</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/ZLSinusWaveView/ZLSinusWaveView-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/ZLSinusWaveView/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/ZLSinusWaveView/ZLSinusWaveView.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>ZLSinusWaveView</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Debug</string>\n\t\t</dict>\n\t\t<key>EFDF3B631BBB965A372347705CA14854</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>9469DF81ECB494E84675969B5E13374C</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXHeadersBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>EFE92E8D3813DD26E78E93EEAF6D7E7E</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>A792226DBE4257340C826C75A0DC208F</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>F0230F9740EC7A507AC92A65994E63C9</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NMSFTP.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH/NMSFTP.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>F0C215D509673D9BE13B73AC1B1CCB15</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>F6A855C0E5EE0EC482325EB94815F74A</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>F1022A0213E11D4057BBBF840A3B335C</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>6626187A5C620C82B45EA50B60E531EC</string>\n\t\t\t\t<string>7E3FD9DA3AAA3363CA2108CF49E0D9BE</string>\n\t\t\t\t<string>EA55530B8CFA1390B85AD2EAE503944D</string>\n\t\t\t\t<string>9D98F0DEB1F6A637347AA210314D3648</string>\n\t\t\t\t<string>5334BFFDC74B5BC33AB2F29E413CD99A</string>\n\t\t\t\t<string>5A7F1D5307EAD796E3AA22EA222AA8FA</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Support Files</string>\n\t\t\t<key>path</key>\n\t\t\t<string>../Target Support Files/SSZipArchive</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>F14AEB3CA1EC057579980D73111BA153</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>216C34E27969A0794EC8C460C31FA2CE</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Project</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>F16A3CAE58D32CAAECC25DDD2BEEA158</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>DA3C0B91AFC44531B8A01A3F0562457C</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>F209FD4822C5866ECCA569B37842FBBA</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CFNetwork.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/CFNetwork.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>DEVELOPER_DIR</string>\n\t\t</dict>\n\t\t<key>F27960E09751B596BEBF7019989E8BA3</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>CFA3D4558500E9CC96C07F908B66D6B5</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>F298F979D3ED9894044C72F2C66925E6</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZAudioPlotGL.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/EZAudioPlotGL.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>F2F301CD8741E18EEB9C1AA349323CFC</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>29FE1468A9F2C8D913EAD260E4E8B852</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Public</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>F31DF6C5B30A988A0B2DB360615D985B</key>\n\t\t<dict>\n\t\t\t<key>explicitFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>path</key>\n\t\t\t<string>ZLSinusWaveView.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>BUILT_PRODUCTS_DIR</string>\n\t\t</dict>\n\t\t<key>F36B8EEC5A75332E7C25AF70B7FF19EF</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>16707D24276E0D4BA984EAD7829AFC3B</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>F38A27EE294EDDE1BCEA87D82E418D06</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ScatterChartDataProvider.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Interfaces/ScatterChartDataProvider.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>F3E8A533B0FA4678233C985618BEEEA6</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>crypt.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SSZipArchive/minizip/crypt.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>F49E17CE595BF7A7A46139779E891F78</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurationList</key>\n\t\t\t<string>D1B2C2D29810BC661B81102DBD76A35D</string>\n\t\t\t<key>buildPhases</key>\n\t\t\t<array>\n\t\t\t\t<string>B0EF69E356D3A304384FA0E56A5CD630</string>\n\t\t\t\t<string>0A55876558D0DC9160E5F6D64ADBA9F8</string>\n\t\t\t\t<string>329F9F0BFAE5C4683145EC1BA2C6C00C</string>\n\t\t\t</array>\n\t\t\t<key>buildRules</key>\n\t\t\t<array/>\n\t\t\t<key>dependencies</key>\n\t\t\t<array/>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXNativeTarget</string>\n\t\t\t<key>name</key>\n\t\t\t<string>SSZipArchive</string>\n\t\t\t<key>productName</key>\n\t\t\t<string>SSZipArchive</string>\n\t\t\t<key>productReference</key>\n\t\t\t<string>8EDF3AE7833D667E4C4D8478FD4B5447</string>\n\t\t\t<key>productType</key>\n\t\t\t<string>com.apple.product-type.framework</string>\n\t\t</dict>\n\t\t<key>F4D16626DE6568E42E73DDF1FED85EE6</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>72C2EC0D8143C4CE2FF8091B233306BF</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>F51D8948E1F5D0E0FA3161D641164C0E</key>\n\t\t<dict>\n\t\t\t<key>explicitFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>SwiftyJSON.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SwiftyJSON.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>BUILT_PRODUCTS_DIR</string>\n\t\t</dict>\n\t\t<key>F5A144C28EEF910B35FCD66B9ACB13AE</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartTransformer.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Utils/ChartTransformer.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>F5C563FFB56C2F264F8F6B3EF31B074F</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>path</key>\n\t\t\t<string>SJCSimplePDFView-dummy.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>F60BC667495022BB71DE0C146D3C99EA</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>20C5E87C1DF07DEA65CD74B8D07D6D1C</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXHeadersBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>F60C777A2655795B8C4DD4476D3522F5</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurationList</key>\n\t\t\t<string>E7DB65F9F86D73C2E1F34D7832CD69DF</string>\n\t\t\t<key>buildPhases</key>\n\t\t\t<array>\n\t\t\t\t<string>8364C5015494EEDBFB7AC551266741BB</string>\n\t\t\t\t<string>AE2091E6977D6C16528F5BCCDF7FCDC9</string>\n\t\t\t\t<string>655EC23C173F625425EFCDC75BE0A4D2</string>\n\t\t\t</array>\n\t\t\t<key>buildRules</key>\n\t\t\t<array/>\n\t\t\t<key>dependencies</key>\n\t\t\t<array/>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXNativeTarget</string>\n\t\t\t<key>name</key>\n\t\t\t<string>SJCSimplePDFView</string>\n\t\t\t<key>productName</key>\n\t\t\t<string>SJCSimplePDFView</string>\n\t\t\t<key>productReference</key>\n\t\t\t<string>21B7F68E83AB3158AC18BB512498ECE0</string>\n\t\t\t<key>productType</key>\n\t\t\t<string>com.apple.product-type.framework</string>\n\t\t</dict>\n\t\t<key>F6A855C0E5EE0EC482325EB94815F74A</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.h</string>\n\t\t\t<key>name</key>\n\t\t\t<string>NMSSHSession.h</string>\n\t\t\t<key>path</key>\n\t\t\t<string>NMSSH/NMSSHSession.h</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>F7210A9C5D404BB2ED9A06FE29F3AC73</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio.modulemap</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>F7852FD543BD5C8EEF81095A19EAD332</key>\n\t\t<dict>\n\t\t\t<key>explicitFileType</key>\n\t\t\t<string>wrapper.framework</string>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>0</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>name</key>\n\t\t\t<string>DGElasticPullToRefresh.framework</string>\n\t\t\t<key>path</key>\n\t\t\t<string>DGElasticPullToRefresh.framework</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>BUILT_PRODUCTS_DIR</string>\n\t\t</dict>\n\t\t<key>F7B3565EFC793DB0CE40900A2C1F3244</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>BubbleChartDataProvider.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Interfaces/BubbleChartDataProvider.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>F818CCD384C18AFDD6BDA68C6D1C19A0</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>034548B827C03622818B97E6F50C78EC</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/Swifter/Swifter-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/Swifter/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/Swifter/Swifter.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>Swifter</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>SWIFT_OPTIMIZATION_LEVEL</key>\n\t\t\t\t<string>-Onone</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Debug</string>\n\t\t</dict>\n\t\t<key>F82198F34DD14753A42F4328CD5E7A6B</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>40043CBCDD93A301F8437421D53D02A3</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>F8803DAD17AC9CE8BCAD6B0594646D64</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>A3415EFF6AEA35162B52EC0734DE1761</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>F8C233736FECBA33C0E71D949DF017CA</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurationList</key>\n\t\t\t<string>BDFFD562F6F4A7DA2EB850BC744C7541</string>\n\t\t\t<key>buildPhases</key>\n\t\t\t<array>\n\t\t\t\t<string>5016FC849FB311577714D8BF17D07034</string>\n\t\t\t\t<string>17C841636A1F7BAB561CE0585060E01F</string>\n\t\t\t\t<string>32BAF7044096F3B8947FFBDDEBDF5E04</string>\n\t\t\t</array>\n\t\t\t<key>buildRules</key>\n\t\t\t<array/>\n\t\t\t<key>dependencies</key>\n\t\t\t<array>\n\t\t\t\t<string>1976D47319F44DDEB11B1DB5E28BEC84</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXNativeTarget</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ZLMusicFlowWaveView</string>\n\t\t\t<key>productName</key>\n\t\t\t<string>ZLMusicFlowWaveView</string>\n\t\t\t<key>productReference</key>\n\t\t\t<string>0727A4243F3B7D3216AAC08CA047DA60</string>\n\t\t\t<key>productType</key>\n\t\t\t<string>com.apple.product-type.framework</string>\n\t\t</dict>\n\t\t<key>F90D7168D47857A3578EC1A796A202DB</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>71C68E3AFFC61709566D8EA695CFB5E7</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t\t<key>settings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ATTRIBUTES</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>Project</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t\t<key>F96AE71D5D1E0E91E4AB3E8EB2B2612A</key>\n\t\t<dict>\n\t\t\t<key>containerPortal</key>\n\t\t\t<string>D41D8CD98F00B204E9800998ECF8427E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXContainerItemProxy</string>\n\t\t\t<key>proxyType</key>\n\t\t\t<string>1</string>\n\t\t\t<key>remoteGlobalIDString</key>\n\t\t\t<string>9C29B71FB70AAEC2242DDF5BD50C55A3</string>\n\t\t\t<key>remoteInfo</key>\n\t\t\t<string>Swifter</string>\n\t\t</dict>\n\t\t<key>F9AA2C518CD3B5220C9D0F81F8289BCF</key>\n\t\t<dict>\n\t\t\t<key>baseConfigurationReference</key>\n\t\t\t<string>86D56E9B7AD7546729AD442A3D02478A</string>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>CODE_SIGN_IDENTITY[sdk=iphoneos*]</key>\n\t\t\t\t<string>iPhone Developer</string>\n\t\t\t\t<key>CURRENT_PROJECT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DEFINES_MODULE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>DYLIB_COMPATIBILITY_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_CURRENT_VERSION</key>\n\t\t\t\t<string>1</string>\n\t\t\t\t<key>DYLIB_INSTALL_NAME_BASE</key>\n\t\t\t\t<string>@rpath</string>\n\t\t\t\t<key>ENABLE_STRICT_OBJC_MSGSEND</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_PREFIX_HEADER</key>\n\t\t\t\t<string>Target Support Files/NMSSH/NMSSH-prefix.pch</string>\n\t\t\t\t<key>INFOPLIST_FILE</key>\n\t\t\t\t<string>Target Support Files/NMSSH/Info.plist</string>\n\t\t\t\t<key>INSTALL_PATH</key>\n\t\t\t\t<string>$(LOCAL_LIBRARY_DIR)/Frameworks</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>LD_RUNPATH_SEARCH_PATHS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>$(inherited)</string>\n\t\t\t\t\t<string>@executable_path/Frameworks</string>\n\t\t\t\t\t<string>@loader_path/Frameworks</string>\n\t\t\t\t</array>\n\t\t\t\t<key>MODULEMAP_FILE</key>\n\t\t\t\t<string>Target Support Files/NMSSH/NMSSH.modulemap</string>\n\t\t\t\t<key>MTL_ENABLE_DEBUG_INFO</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>PRODUCT_NAME</key>\n\t\t\t\t<string>NMSSH</string>\n\t\t\t\t<key>SDKROOT</key>\n\t\t\t\t<string>iphoneos</string>\n\t\t\t\t<key>SKIP_INSTALL</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>TARGETED_DEVICE_FAMILY</key>\n\t\t\t\t<string>1,2</string>\n\t\t\t\t<key>VERSIONING_SYSTEM</key>\n\t\t\t\t<string>apple-generic</string>\n\t\t\t\t<key>VERSION_INFO_PREFIX</key>\n\t\t\t\t<string></string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Debug</string>\n\t\t</dict>\n\t\t<key>F9E9A2403A8E8D7D3509ABF2A40A5CD7</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>39225A7983DD89DC9CD0F0A9DE3F508A</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>FA3529BA5DD86B6E59A2A2C589EA5884</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>0CFA654DBD993FD0F891ECD3B7432064</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>FA6606E69ACCD1B09D98F9CC5F9A98C3</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>RSSFeed.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Pod/Classes/RSSFeed.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>FA6B4510586447CB081BC8FA92CE4357</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>894E5DA93A9F359521A89826BE6DA777</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>FA8EFDE6A60AE635795BEF328FE32AED</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>3F37EE1C6EE59F78A3A5E60EF31FFA3A</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>FB45FFD90572718D82AB9092B750F0CA</key>\n\t\t<dict>\n\t\t\t<key>buildSettings</key>\n\t\t\t<dict>\n\t\t\t\t<key>ALWAYS_SEARCH_USER_PATHS</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>CLANG_CXX_LANGUAGE_STANDARD</key>\n\t\t\t\t<string>gnu++0x</string>\n\t\t\t\t<key>CLANG_CXX_LIBRARY</key>\n\t\t\t\t<string>libc++</string>\n\t\t\t\t<key>CLANG_ENABLE_MODULES</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>CLANG_ENABLE_OBJC_ARC</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>CLANG_WARN_BOOL_CONVERSION</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>CLANG_WARN_CONSTANT_CONVERSION</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>CLANG_WARN_DIRECT_OBJC_ISA_USAGE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>CLANG_WARN_EMPTY_BODY</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>CLANG_WARN_ENUM_CONVERSION</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>CLANG_WARN_INT_CONVERSION</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>CLANG_WARN_OBJC_ROOT_CLASS</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>CLANG_WARN_UNREACHABLE_CODE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>CLANG_WARN__DUPLICATE_METHOD_MATCH</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>COPY_PHASE_STRIP</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>ENABLE_NS_ASSERTIONS</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>GCC_C_LANGUAGE_STANDARD</key>\n\t\t\t\t<string>gnu99</string>\n\t\t\t\t<key>GCC_PREPROCESSOR_DEFINITIONS</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>RELEASE=1</string>\n\t\t\t\t</array>\n\t\t\t\t<key>GCC_WARN_64_TO_32_BIT_CONVERSION</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_WARN_ABOUT_RETURN_TYPE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_WARN_UNDECLARED_SELECTOR</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_WARN_UNINITIALIZED_AUTOS</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_WARN_UNUSED_FUNCTION</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>GCC_WARN_UNUSED_VARIABLE</key>\n\t\t\t\t<string>YES</string>\n\t\t\t\t<key>IPHONEOS_DEPLOYMENT_TARGET</key>\n\t\t\t\t<string>8.0</string>\n\t\t\t\t<key>STRIP_INSTALLED_PRODUCT</key>\n\t\t\t\t<string>NO</string>\n\t\t\t\t<key>SYMROOT</key>\n\t\t\t\t<string>${SRCROOT}/../build</string>\n\t\t\t\t<key>VALIDATE_PRODUCT</key>\n\t\t\t\t<string>YES</string>\n\t\t\t</dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>XCBuildConfiguration</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Release</string>\n\t\t</dict>\n\t\t<key>FB566F69981E2F14222BE796DC7474B5</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>1E99A621975C1DDBF7CD0F92C076D716</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXHeadersBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>FB6A25C88BCCDB159C1C71A2C484100D</key>\n\t\t<dict>\n\t\t\t<key>buildConfigurationList</key>\n\t\t\t<string>1E5B2E2366403FF3F48D14E0344AB088</string>\n\t\t\t<key>buildPhases</key>\n\t\t\t<array>\n\t\t\t\t<string>C40C801B9D221B9D29844EB7E276D83B</string>\n\t\t\t\t<string>3E678AB82500885E6B28B0A982617ED8</string>\n\t\t\t\t<string>5E3EC164F92FFE16F448E27839FDFF32</string>\n\t\t\t</array>\n\t\t\t<key>buildRules</key>\n\t\t\t<array/>\n\t\t\t<key>dependencies</key>\n\t\t\t<array/>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXNativeTarget</string>\n\t\t\t<key>name</key>\n\t\t\t<string>SwiftyJSON</string>\n\t\t\t<key>productName</key>\n\t\t\t<string>SwiftyJSON</string>\n\t\t\t<key>productReference</key>\n\t\t\t<string>F51D8948E1F5D0E0FA3161D641164C0E</string>\n\t\t\t<key>productType</key>\n\t\t\t<string>com.apple.product-type.framework</string>\n\t\t</dict>\n\t\t<key>FB8A97E23B00E9EE80BB504728D87825</key>\n\t\t<dict>\n\t\t\t<key>containerPortal</key>\n\t\t\t<string>D41D8CD98F00B204E9800998ECF8427E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXContainerItemProxy</string>\n\t\t\t<key>proxyType</key>\n\t\t\t<string>1</string>\n\t\t\t<key>remoteGlobalIDString</key>\n\t\t\t<string>79C040AFDDCE1BCBF6D8B5EB0B85887F</string>\n\t\t\t<key>remoteInfo</key>\n\t\t\t<string>Alamofire</string>\n\t\t</dict>\n\t\t<key>FC34E76E2F5CB664B627A6F1192888FA</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>80875D1812BC200BAB068CBC75B74E7A</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>FC5B42B4BAB1F773C37B0B7916361BB0</key>\n\t\t<dict>\n\t\t\t<key>buildActionMask</key>\n\t\t\t<string>2147483647</string>\n\t\t\t<key>files</key>\n\t\t\t<array>\n\t\t\t\t<string>ED564D8B303131454DDC6593B8982939</string>\n\t\t\t\t<string>5C4566FE7B7461D8601278AE68C50358</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFrameworksBuildPhase</string>\n\t\t\t<key>runOnlyForDeploymentPostprocessing</key>\n\t\t\t<string>0</string>\n\t\t</dict>\n\t\t<key>FC8A29D1F192FF1FDA3BB7D0935A1B3F</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>E42B1F498AF0874C6DE8124BB795F15E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>FC9680DA45C4F4007DF7852E9D4CD965</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>text.plist.xml</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Info.plist</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>FC9D79D0CC991302B49BFA48C4BE2AB9</key>\n\t\t<dict>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXTargetDependency</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Gifu</string>\n\t\t\t<key>target</key>\n\t\t\t<string>AEA56EBE1B518C71721209FB26701898</string>\n\t\t\t<key>targetProxy</key>\n\t\t\t<string>AE2C11E6B5332F82FE14C6CDB59D57FA</string>\n\t\t</dict>\n\t\t<key>FD04474CE1E00D47F9010D3A6526EA81</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>name</key>\n\t\t\t<string>EZAudioPlotGL.m</string>\n\t\t\t<key>path</key>\n\t\t\t<string>EZAudio/EZAudioPlotGL.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>FD0CC0A859DB9231444E62D7E971B22A</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>40043CBCDD93A301F8437421D53D02A3</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>FD194E12D7F3D8DAA667A3A52EB221CA</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ZoomChartViewJob.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Jobs/ZoomChartViewJob.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>FD6B3B6081C8329BA2B82C48DEAA71C8</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>169B552578427611CD64555A461D8A88</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>FE28E020C32C8DA2DA56BAB6494D030A</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.c.objc</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Gifu-dummy.m</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>FE7F3C43D504E49A918DA967538283F8</key>\n\t\t<dict>\n\t\t\t<key>containerPortal</key>\n\t\t\t<string>D41D8CD98F00B204E9800998ECF8427E</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXContainerItemProxy</string>\n\t\t\t<key>proxyType</key>\n\t\t\t<string>1</string>\n\t\t\t<key>remoteGlobalIDString</key>\n\t\t\t<string>339174A0A2DC9E27C74F079867D82284</string>\n\t\t\t<key>remoteInfo</key>\n\t\t\t<string>CYRTextView</string>\n\t\t</dict>\n\t\t<key>FEAAEDF7FAFA3134CA836F1AB6E0FDF5</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>CC1086A80586AA695872978B4DCA7686</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>FF2C748C341F3E0FA03FC7D890D54304</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>Runes.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Carthage/Checkouts/Runes/Source/Runes.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>FF383AB25605A99106208E2F7CBC811E</key>\n\t\t<dict>\n\t\t\t<key>fileRef</key>\n\t\t\t<string>6CDE7B54911112B22403C6B83659EE77</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXBuildFile</string>\n\t\t</dict>\n\t\t<key>FFAF70D9A0BFA84F517D08E78C3A8EF4</key>\n\t\t<dict>\n\t\t\t<key>includeInIndex</key>\n\t\t\t<string>1</string>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXFileReference</string>\n\t\t\t<key>lastKnownFileType</key>\n\t\t\t<string>sourcecode.swift</string>\n\t\t\t<key>name</key>\n\t\t\t<string>ChartFill.swift</string>\n\t\t\t<key>path</key>\n\t\t\t<string>Charts/Classes/Utils/ChartFill.swift</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t\t<key>FFCB6492484858E07ECCD87017C470A1</key>\n\t\t<dict>\n\t\t\t<key>children</key>\n\t\t\t<array>\n\t\t\t\t<string>38A041658F28816244E23069CB89C403</string>\n\t\t\t\t<string>34CEA003BE26A7286C83A2E59C4A7A2F</string>\n\t\t\t\t<string>E772910ED9BD048407A4D78E5020A45F</string>\n\t\t\t\t<string>717A214D47C4467FB7418FB121F803FD</string>\n\t\t\t\t<string>BB2FFAA7E97AA17F0DB5FA6C24617400</string>\n\t\t\t\t<string>4ED7C61B5475997505191F07F768B0E2</string>\n\t\t\t\t<string>62FD1B17D0F7FFDE4730993A41302A52</string>\n\t\t\t\t<string>72C2EC0D8143C4CE2FF8091B233306BF</string>\n\t\t\t\t<string>70A566A1797B301E45BC4F43633CF81A</string>\n\t\t\t</array>\n\t\t\t<key>isa</key>\n\t\t\t<string>PBXGroup</string>\n\t\t\t<key>name</key>\n\t\t\t<string>CYRTextView</string>\n\t\t\t<key>path</key>\n\t\t\t<string>CYRTextView</string>\n\t\t\t<key>sourceTree</key>\n\t\t\t<string>&lt;group&gt;</string>\n\t\t</dict>\n\t</dict>\n\t<key>rootObject</key>\n\t<string>D41D8CD98F00B204E9800998ECF8427E</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/Emoji.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<array>\n    <!---->\n<string>😊</string>\n<string>😨</string>\n<string>😍</string>\n<string>😳</string>\n<string>😎</string>\n<string>😭</string>\n<string>😌</string>\n<string>😵</string>\n<string>😴</string>\n<string>😢</string>\n<string>😅</string>\n<string>😡</string>\n<string>😜</string>\n<string>😀</string>\n<string>😲</string>\n<string>😟</string>\n<string>😤</string>\n<string>😞</string>\n<string>😫</string>\n<string>😣</string>\n<string>😈</string>\n<string>😉</string>\n<string>😯</string>\n<string>😕</string>\n<string>😰</string>\n<string>😋</string>\n<string>😝</string>\n<string>😓</string>\n<string>😃</string>\n<string>😂</string>\n<string>😘</string>\n<string>😒</string>\n<string>😏</string>\n<string>😶</string>\n<string>😱</string>\n<string>😖</string>\n<string>😩</string>\n<string>😔</string>\n<string>😑</string>\n<string>😚</string>\n<string>😪</string>\n<string>😇</string>\n<string>🙊</string>\n<string>👊</string>\n<string>👎</string>\n<string>☝</string>\n<string>✌</string>\n<string>😬</string>\n<string>😷</string>\n<string>🙈</string>\n<string>👌</string>\n<string>👏</string>\n<string>✊</string>\n<string>💪</string>\n<string>😆</string>\n<string>☺</string>\n<string>🙉</string>\n<string>👍</string>\n<string>🙏</string>\n<string>✋</string>\n<string>☀</string>\n<string>☕</string>\n<string>⛄</string>\n<string>📚</string>\n<string>🎁</string>\n<string>🎉</string>\n<string>🍦</string>\n<string>☁</string>\n<string>❄</string>\n<string>⚡</string>\n<string>💰</string>\n<string>🎂</string>\n<string>🎓</string>\n<string>🍖</string>\n<string>☔</string>\n<string>⛅</string>\n<string>✏</string>\n<string>💩</string>\n<string>🎄</string>\n<string>🍷</string>\n<string>🎤</string>\n<string>🏀</string>\n<string>🀄</string>\n<string>💣</string>\n<string>📢</string>\n<string>🌏</string>\n<string>🍫</string>\n<string>🎲</string>\n<string>🏂</string>\n<string>💡</string>\n<string>💤</string>\n<string>🚫</string>\n<string>🌻</string>\n<string>🍻</string>\n<string>🎵</string>\n<string>🏡</string>\n<string>💢</string>\n<string>📞</string>\n<string>🚿</string>\n<string>🍚</string>\n<string>👪</string>\n<string>👼</string>\n<string>💊</string>\n<string>🔫</string>\n<string>🌹</string>\n<string>🐶</string>\n<string>💄</string>\n<string>👫</string>\n<string>👽</string>\n<string>💋</string>\n<string>🌙</string>\n<string>🍉</string>\n<string>🐷</string>\n<string>💔</string>\n<string>👻</string>\n<string>👿</string>\n<string>💍</string>\n<string>🌲</string>\n<string>🐴</string>\n<string>👑</string>\n<string>🔥</string>\n<string>⭐</string>\n<string>⚽</string>\n<string>🕖</string>\n<string>⏰</string>\n<string>😁</string>\n<string>🚀</string>\n<string>⏳</string>\n\n</array>\n</plist>\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongCloud.bundle/unicode_to_hanyu_pinyin.txt",
    "content": "3007 (ling2)\r\n4E00 (yi1)\r\n4E01 (ding1,zheng1)\r\n4E02 (kao3)\r\n4E03 (qi1)\r\n4E04 (shang4,shang3)\r\n4E05 (xia4)\r\n4E06 (none0)\r\n4E07 (wan4,mo4)\r\n4E08 (zhang4)\r\n4E09 (san1)\r\n4E0A (shang4,shang3)\r\n4E0B (xia4)\r\n4E0C (ji1)\r\n4E0D (bu4,bu2,fou3)\r\n4E0E (yu3,yu4,yu2)\r\n4E0F (mian3)\r\n4E10 (gai4)\r\n4E11 (chou3)\r\n4E12 (chou3)\r\n4E13 (zhuan1)\r\n4E14 (qie3,ju1)\r\n4E15 (pi1)\r\n4E16 (shi4)\r\n4E17 (shi4)\r\n4E18 (qiu1)\r\n4E19 (bing3)\r\n4E1A (ye4)\r\n4E1B (cong2)\r\n4E1C (dong1)\r\n4E1D (si1)\r\n4E1E (cheng2)\r\n4E1F (diu1)\r\n4E20 (qiu1)\r\n4E21 (liang3)\r\n4E22 (diu1)\r\n4E23 (you3)\r\n4E24 (liang3)\r\n4E25 (yan2)\r\n4E26 (bing4)\r\n4E27 (sang1,sang4,sang5)\r\n4E28 (shu4)\r\n4E29 (jiu1)\r\n4E2A (ge4,ge3)\r\n4E2B (ya1)\r\n4E2C (qiang2,pan2)\r\n4E2D (zhong1,zhong4)\r\n4E2E (ji3)\r\n4E2F (jie4)\r\n4E30 (feng1)\r\n4E31 (guan4)\r\n4E32 (chuan4)\r\n4E33 (chan3)\r\n4E34 (lin2)\r\n4E35 (zhuo1)\r\n4E36 (zhu3,dian3)\r\n4E37 (none0)\r\n4E38 (wan2)\r\n4E39 (dan1)\r\n4E3A (wei2,wei4)\r\n4E3B (zhu3)\r\n4E3C (jing3,dan3)\r\n4E3D (li4,li2)\r\n4E3E (ju3)\r\n4E3F (pie3)\r\n4E40 (fu2)\r\n4E41 (yi2)\r\n4E42 (yi4,ai4)\r\n4E43 (nai3)\r\n4E44 (none0)\r\n4E45 (jiu3)\r\n4E46 (jiu3)\r\n4E47 (tuo1)\r\n4E48 (me5,ma5,yao1)\r\n4E49 (yi4)\r\n4E4A (none0)\r\n4E4B (zhi1)\r\n4E4C (wu1,wu4)\r\n4E4D (zha4)\r\n4E4E (hu1)\r\n4E4F (fa2)\r\n4E50 (le4,yue4)\r\n4E51 (zhong4)\r\n4E52 (ping1)\r\n4E53 (pang1)\r\n4E54 (qiao2)\r\n4E55 (hu3,hu4)\r\n4E56 (guai1)\r\n4E57 (cheng2,sheng4)\r\n4E58 (cheng2,sheng4)\r\n4E59 (yi3)\r\n4E5A (yin3)\r\n4E5B (none0)\r\n4E5C (mie1,nie4)\r\n4E5D (jiu3)\r\n4E5E (qi3)\r\n4E5F (ye3)\r\n4E60 (xi2)\r\n4E61 (xiang1)\r\n4E62 (gai4)\r\n4E63 (diu1)\r\n4E64 (none0)\r\n4E65 (none0)\r\n4E66 (shu1)\r\n4E67 (none0)\r\n4E68 (shi3)\r\n4E69 (ji1)\r\n4E6A (nang1)\r\n4E6B (jia1)\r\n4E6C (none0)\r\n4E6D (shi2)\r\n4E6E (none0)\r\n4E6F (none0)\r\n4E70 (mai3)\r\n4E71 (luan4)\r\n4E72 (none0)\r\n4E73 (ru3)\r\n4E74 (xi3)\r\n4E75 (yan3)\r\n4E76 (fu3)\r\n4E77 (sha1)\r\n4E78 (na3)\r\n4E79 (gan1,qian2)\r\n4E7A (none0)\r\n4E7B (none0)\r\n4E7C (none0)\r\n4E7D (none0)\r\n4E7E (qian2,gan1)\r\n4E7F (zhi4)\r\n4E80 (gui1,jun1,qiu1)\r\n4E81 (gan1)\r\n4E82 (luan4)\r\n4E83 (lin3)\r\n4E84 (yi4)\r\n4E85 (jue2)\r\n4E86 (le5,liao3,liao4)\r\n4E87 (none0)\r\n4E88 (yu3,yu2)\r\n4E89 (zheng1)\r\n4E8A (shi4)\r\n4E8B (shi4)\r\n4E8C (er4)\r\n4E8D (chu4)\r\n4E8E (yu2)\r\n4E8F (kui1)\r\n4E90 (yu2)\r\n4E91 (yun2)\r\n4E92 (hu4)\r\n4E93 (qi2)\r\n4E94 (wu3)\r\n4E95 (jing3)\r\n4E96 (si4)\r\n4E97 (sui4)\r\n4E98 (gen4)\r\n4E99 (gen4,geng4)\r\n4E9A (ya4)\r\n4E9B (xie1,xie5)\r\n4E9C (ya4)\r\n4E9D (qi2)\r\n4E9E (ya4,ya3)\r\n4E9F (ji2,qi4)\r\n4EA0 (tou2)\r\n4EA1 (wang2,wu2)\r\n4EA2 (kang4)\r\n4EA3 (ta4)\r\n4EA4 (jiao1)\r\n4EA5 (hai4)\r\n4EA6 (yi4)\r\n4EA7 (chan3)\r\n4EA8 (heng1)\r\n4EA9 (mu3)\r\n4EAA (none0)\r\n4EAB (xiang3)\r\n4EAC (jing1)\r\n4EAD (ting2)\r\n4EAE (liang4)\r\n4EAF (heng1)\r\n4EB0 (jing1)\r\n4EB1 (ye4)\r\n4EB2 (qin1,qin5,qing4)\r\n4EB3 (bo2)\r\n4EB4 (you4)\r\n4EB5 (xie4)\r\n4EB6 (dan3,dan4)\r\n4EB7 (lian2)\r\n4EB8 (duo3)\r\n4EB9 (wei3,wei4)\r\n4EBA (ren2)\r\n4EBB (ren2)\r\n4EBC (ji2)\r\n4EBD (none0)\r\n4EBE (wang2)\r\n4EBF (yi4)\r\n4EC0 (shen2,shi2,she2)\r\n4EC1 (ren2)\r\n4EC2 (le4)\r\n4EC3 (ding1)\r\n4EC4 (ze4)\r\n4EC5 (jin3,jin4)\r\n4EC6 (pu1,pu2)\r\n4EC7 (chou2,qiu2)\r\n4EC8 (ba1)\r\n4EC9 (zhang3)\r\n4ECA (jin1)\r\n4ECB (jie4)\r\n4ECC (bing1)\r\n4ECD (reng2)\r\n4ECE (cong2,cong1)\r\n4ECF (fo2,fu2)\r\n4ED0 (san3)\r\n4ED1 (lun2)\r\n4ED2 (none0)\r\n4ED3 (cang1)\r\n4ED4 (zi3,zai3,zi1)\r\n4ED5 (shi4)\r\n4ED6 (ta1)\r\n4ED7 (zhang4)\r\n4ED8 (fu4)\r\n4ED9 (xian1)\r\n4EDA (xian1)\r\n4EDB (cha4)\r\n4EDC (hong2)\r\n4EDD (tong2)\r\n4EDE (ren4)\r\n4EDF (qian1)\r\n4EE0 (gan3)\r\n4EE1 (ge1,yi4)\r\n4EE2 (di2)\r\n4EE3 (dai4)\r\n4EE4 (ling4,ling2,ling3)\r\n4EE5 (yi3)\r\n4EE6 (chao4)\r\n4EE7 (chang2)\r\n4EE8 (sa1)\r\n4EE9 (shang4)\r\n4EEA (yi2)\r\n4EEB (mu4)\r\n4EEC (men5,men2)\r\n4EED (ren4)\r\n4EEE (jia3,jia4)\r\n4EEF (chao4)\r\n4EF0 (yang3)\r\n4EF1 (qian2)\r\n4EF2 (zhong4)\r\n4EF3 (pi3)\r\n4EF4 (wan4)\r\n4EF5 (wu3)\r\n4EF6 (jian4)\r\n4EF7 (jia4,jie4,jie5)\r\n4EF8 (yao3)\r\n4EF9 (feng1)\r\n4EFA (cang1)\r\n4EFB (ren4,ren2)\r\n4EFC (wang2)\r\n4EFD (fen4)\r\n4EFE (di1)\r\n4EFF (fang3)\r\n4F00 (zhong1)\r\n4F01 (qi3,qi4)\r\n4F02 (pei4)\r\n4F03 (yu2)\r\n4F04 (diao4)\r\n4F05 (dun4)\r\n4F06 (wen4)\r\n4F07 (yi4)\r\n4F08 (xin3)\r\n4F09 (kang4)\r\n4F0A (yi1)\r\n4F0B (ji2)\r\n4F0C (ai4)\r\n4F0D (wu3)\r\n4F0E (ji4)\r\n4F0F (fu2)\r\n4F10 (fa2,fa1)\r\n4F11 (xiu1)\r\n4F12 (jin4)\r\n4F13 (bei1)\r\n4F14 (chen2)\r\n4F15 (fu1)\r\n4F16 (tang3)\r\n4F17 (zhong4)\r\n4F18 (you1)\r\n4F19 (huo3)\r\n4F1A (hui4,kuai4)\r\n4F1B (yu3)\r\n4F1C (cui4,zu2)\r\n4F1D (yun2)\r\n4F1E (san3)\r\n4F1F (wei3)\r\n4F20 (chuan2,zhuan4)\r\n4F21 (che1)\r\n4F22 (ya2)\r\n4F23 (xian4)\r\n4F24 (shang1)\r\n4F25 (chang1,tang3)\r\n4F26 (lun2)\r\n4F27 (cang1,chen5)\r\n4F28 (xun4)\r\n4F29 (xin4)\r\n4F2A (wei3)\r\n4F2B (zhu4)\r\n4F2C (chi3)\r\n4F2D (xuan2)\r\n4F2E (nao2,nu3)\r\n4F2F (bo2,bai3,ba4)\r\n4F30 (gu1,gu4)\r\n4F31 (ni3)\r\n4F32 (ni4)\r\n4F33 (xie4)\r\n4F34 (ban4)\r\n4F35 (xu4)\r\n4F36 (ling2)\r\n4F37 (zhou4)\r\n4F38 (shen1)\r\n4F39 (qu1)\r\n4F3A (si4,ci4)\r\n4F3B (beng1)\r\n4F3C (si4,shi4)\r\n4F3D (jia1,ga1,qie2,qia1)\r\n4F3E (pi1)\r\n4F3F (yi4)\r\n4F40 (si4,shi4)\r\n4F41 (ai3)\r\n4F42 (zheng1,zheng4)\r\n4F43 (dian4,tian2)\r\n4F44 (han2)\r\n4F45 (mai4)\r\n4F46 (dan4)\r\n4F47 (zhu4)\r\n4F48 (bu4)\r\n4F49 (qu1)\r\n4F4A (bi3)\r\n4F4B (shao4)\r\n4F4C (ci3)\r\n4F4D (wei4)\r\n4F4E (di1)\r\n4F4F (zhu4)\r\n4F50 (zuo3)\r\n4F51 (you4)\r\n4F52 (yang1)\r\n4F53 (ti3,ben4,ti1)\r\n4F54 (zhan4)\r\n4F55 (he2,he4)\r\n4F56 (bi4)\r\n4F57 (tuo2)\r\n4F58 (she2)\r\n4F59 (yu2,tu2)\r\n4F5A (yi4,die2)\r\n4F5B (fo2,fu2)\r\n4F5C (zuo4,zuo1,zuo2)\r\n4F5D (gou1)\r\n4F5E (ning4)\r\n4F5F (tong2)\r\n4F60 (ni3)\r\n4F61 (xuan1,san3)\r\n4F62 (ju4)\r\n4F63 (yong1,yong4)\r\n4F64 (wa3)\r\n4F65 (qian1)\r\n4F66 (none0)\r\n4F67 (ka3)\r\n4F68 (none0)\r\n4F69 (pei4)\r\n4F6A (huai2)\r\n4F6B (he4)\r\n4F6C (lao3)\r\n4F6D (xiang2)\r\n4F6E (ge2)\r\n4F6F (yang2)\r\n4F70 (bai3)\r\n4F71 (fa3)\r\n4F72 (ming2)\r\n4F73 (jia1)\r\n4F74 (nai4,er4)\r\n4F75 (bing4)\r\n4F76 (ji2)\r\n4F77 (heng2)\r\n4F78 (huo2)\r\n4F79 (gui3)\r\n4F7A (quan2)\r\n4F7B (tiao1,tiao2)\r\n4F7C (jiao3,jia3)\r\n4F7D (ci4)\r\n4F7E (yi4)\r\n4F7F (shi3,shi4)\r\n4F80 (xing2)\r\n4F81 (shen1)\r\n4F82 (tuo1)\r\n4F83 (kan3)\r\n4F84 (zhi2)\r\n4F85 (gai1,kai1)\r\n4F86 (lai2)\r\n4F87 (yi2)\r\n4F88 (chi3)\r\n4F89 (kua3)\r\n4F8A (guang1)\r\n4F8B (li4)\r\n4F8C (yin1)\r\n4F8D (shi4)\r\n4F8E (mi3)\r\n4F8F (zhu1)\r\n4F90 (xu4)\r\n4F91 (you4)\r\n4F92 (an1)\r\n4F93 (lu4)\r\n4F94 (mou2)\r\n4F95 (er2)\r\n4F96 (lun2)\r\n4F97 (dong4,tong2,tong3)\r\n4F98 (cha4)\r\n4F99 (chi4)\r\n4F9A (xun4)\r\n4F9B (gong1,gong4)\r\n4F9C (zhou1)\r\n4F9D (yi1)\r\n4F9E (ru3)\r\n4F9F (jian4)\r\n4FA0 (xia2)\r\n4FA1 (jia4,jie4)\r\n4FA2 (zai4)\r\n4FA3 (lu:3)\r\n4FA4 (none0)\r\n4FA5 (jiao3,yao2,jia3)\r\n4FA6 (zhen1)\r\n4FA7 (ce4,ze4,zhai1)\r\n4FA8 (qiao2)\r\n4FA9 (kuai4)\r\n4FAA (chai2)\r\n4FAB (ning4)\r\n4FAC (nong2)\r\n4FAD (jin3,jin4)\r\n4FAE (wu3)\r\n4FAF (hou4,hou2)\r\n4FB0 (jiong3)\r\n4FB1 (cheng3)\r\n4FB2 (zhen4)\r\n4FB3 (cuo4)\r\n4FB4 (chou3)\r\n4FB5 (qin1)\r\n4FB6 (lu:3)\r\n4FB7 (ju2)\r\n4FB8 (shu4)\r\n4FB9 (ting3)\r\n4FBA (shen4)\r\n4FBB (tuo1)\r\n4FBC (bo2)\r\n4FBD (nan2)\r\n4FBE (hao1)\r\n4FBF (bian4,pian2)\r\n4FC0 (tui3)\r\n4FC1 (yu3)\r\n4FC2 (xi4)\r\n4FC3 (cu4)\r\n4FC4 (e2,e4)\r\n4FC5 (qiu2)\r\n4FC6 (xu2)\r\n4FC7 (kuang3)\r\n4FC8 (ku4)\r\n4FC9 (wu2)\r\n4FCA (jun4,zun4,juan4)\r\n4FCB (yi4)\r\n4FCC (fu3)\r\n4FCD (lang2)\r\n4FCE (zu3)\r\n4FCF (qiao4)\r\n4FD0 (li4)\r\n4FD1 (yong3)\r\n4FD2 (hun4)\r\n4FD3 (jing4)\r\n4FD4 (xian4)\r\n4FD5 (san4)\r\n4FD6 (pai3)\r\n4FD7 (su2)\r\n4FD8 (fu2)\r\n4FD9 (xi1)\r\n4FDA (li3)\r\n4FDB (mian3)\r\n4FDC (ping1)\r\n4FDD (bao3)\r\n4FDE (yu2,shu4)\r\n4FDF (si4,qi2)\r\n4FE0 (xia2)\r\n4FE1 (xin4,shen1)\r\n4FE2 (xiu1)\r\n4FE3 (yu3)\r\n4FE4 (ti4)\r\n4FE5 (che1)\r\n4FE6 (chou2)\r\n4FE7 (none0)\r\n4FE8 (yan3)\r\n4FE9 (liang3,lia3)\r\n4FEA (li4)\r\n4FEB (lai2)\r\n4FEC (si1)\r\n4FED (jian3)\r\n4FEE (xiu1)\r\n4FEF (fu3)\r\n4FF0 (he2)\r\n4FF1 (ju4,ju1)\r\n4FF2 (xiao4)\r\n4FF3 (pai2)\r\n4FF4 (jian4)\r\n4FF5 (biao4,biao3)\r\n4FF6 (ti4,chu4)\r\n4FF7 (fei4)\r\n4FF8 (feng4)\r\n4FF9 (ya4)\r\n4FFA (an3)\r\n4FFB (bei4)\r\n4FFC (yu4,zhou1)\r\n4FFD (xin1)\r\n4FFE (bi3,bei1,bi4)\r\n4FFF (chi2)\r\n5000 (chang1)\r\n5001 (zhi1)\r\n5002 (bing4)\r\n5003 (zan2)\r\n5004 (yao2)\r\n5005 (cui4)\r\n5006 (lia3,liang3)\r\n5007 (wan3)\r\n5008 (lai2)\r\n5009 (cang1)\r\n500A (zong3)\r\n500B (ge4,ge5)\r\n500C (guan1)\r\n500D (bei4)\r\n500E (tian1)\r\n500F (shu1,shu4)\r\n5010 (shu1)\r\n5011 (men5,men2)\r\n5012 (dao3,dao4)\r\n5013 (tan2)\r\n5014 (jue2,jue4)\r\n5015 (chui2)\r\n5016 (xing4)\r\n5017 (peng2)\r\n5018 (tang3,chang2)\r\n5019 (hou4)\r\n501A (yi3)\r\n501B (qi1)\r\n501C (ti4)\r\n501D (gan4)\r\n501E (jing4,liang4)\r\n501F (jie4)\r\n5020 (xu1)\r\n5021 (chang4,chang1)\r\n5022 (jie2)\r\n5023 (fang3)\r\n5024 (zhi2)\r\n5025 (kong1,kong3)\r\n5026 (juan4)\r\n5027 (zong1)\r\n5028 (ju4)\r\n5029 (qian4)\r\n502A (ni2)\r\n502B (lun2)\r\n502C (zhuo1,zhuo2)\r\n502D (wo1)\r\n502E (luo3)\r\n502F (song1)\r\n5030 (leng2)\r\n5031 (hun4)\r\n5032 (dong1)\r\n5033 (zi4)\r\n5034 (ben4)\r\n5035 (wu3)\r\n5036 (ju4,ju1)\r\n5037 (nai4)\r\n5038 (cai3)\r\n5039 (jian3)\r\n503A (zhai4)\r\n503B (ye1)\r\n503C (zhi2)\r\n503D (sha4)\r\n503E (qing1)\r\n503F (none0)\r\n5040 (ying1)\r\n5041 (cheng1,cheng4)\r\n5042 (qian2)\r\n5043 (yan3)\r\n5044 (nuan4)\r\n5045 (zhong4)\r\n5046 (chun3)\r\n5047 (jia3,jia4)\r\n5048 (jie2,ji4)\r\n5049 (wei3)\r\n504A (yu3)\r\n504B (bing4)\r\n504C (ruo4)\r\n504D (ti2)\r\n504E (wei1)\r\n504F (pian1)\r\n5050 (yan4)\r\n5051 (feng1)\r\n5052 (tang3)\r\n5053 (wo4)\r\n5054 (e4)\r\n5055 (xie2,jie1)\r\n5056 (che3)\r\n5057 (sheng3)\r\n5058 (kan3)\r\n5059 (di4)\r\n505A (zuo4)\r\n505B (cha1)\r\n505C (ting2)\r\n505D (bei1)\r\n505E (ye4)\r\n505F (huang2)\r\n5060 (yao3)\r\n5061 (zhan4)\r\n5062 (qiu1)\r\n5063 (yan1)\r\n5064 (you2)\r\n5065 (jian4)\r\n5066 (xu3)\r\n5067 (zha1)\r\n5068 (chai1)\r\n5069 (fu4)\r\n506A (bi1)\r\n506B (zhi4)\r\n506C (zong3)\r\n506D (mian3)\r\n506E (ji2)\r\n506F (yi3)\r\n5070 (xie4)\r\n5071 (xun2)\r\n5072 (si1,cai1)\r\n5073 (duan1)\r\n5074 (ce4,ze4)\r\n5075 (zhen1)\r\n5076 (ou3)\r\n5077 (tou1)\r\n5078 (tou1)\r\n5079 (bei4)\r\n507A (za2,zan2)\r\n507B (lou2,lu:3)\r\n507C (jie2)\r\n507D (wei4)\r\n507E (fen4)\r\n507F (chang2)\r\n5080 (kui3,gui1)\r\n5081 (sou3)\r\n5082 (chi3)\r\n5083 (su4)\r\n5084 (xia1)\r\n5085 (fu4)\r\n5086 (yuan4)\r\n5087 (rong3)\r\n5088 (li4)\r\n5089 (ru4)\r\n508A (yun3)\r\n508B (gou4)\r\n508C (ma4)\r\n508D (bang4,bang1)\r\n508E (dian1)\r\n508F (tang2)\r\n5090 (hao1)\r\n5091 (jie2)\r\n5092 (xi1)\r\n5093 (shan1)\r\n5094 (qian4)\r\n5095 (jue2)\r\n5096 (cang1)\r\n5097 (chu4)\r\n5098 (san3)\r\n5099 (bei4)\r\n509A (xiao4)\r\n509B (yong2)\r\n509C (yao2)\r\n509D (ta4)\r\n509E (suo1)\r\n509F (wang1)\r\n50A0 (fa2)\r\n50A1 (bing4,bing1)\r\n50A2 (jia1)\r\n50A3 (dai3)\r\n50A4 (zai4)\r\n50A5 (tang3)\r\n50A6 (none0)\r\n50A7 (bin1)\r\n50A8 (chu3)\r\n50A9 (nuo2)\r\n50AA (zan1)\r\n50AB (lei3)\r\n50AC (cui1)\r\n50AD (yong1,yong4,yong2)\r\n50AE (zao1)\r\n50AF (zong3)\r\n50B0 (peng2)\r\n50B1 (song3)\r\n50B2 (ao4)\r\n50B3 (chuan2,zhuan4)\r\n50B4 (yu3)\r\n50B5 (zhai4)\r\n50B6 (zu2)\r\n50B7 (shang1)\r\n50B8 (qiang3)\r\n50B9 (qiang1)\r\n50BA (chi4)\r\n50BB (sha3)\r\n50BC (han4)\r\n50BD (zhang1)\r\n50BE (qing1,qing2)\r\n50BF (yan4)\r\n50C0 (di4)\r\n50C1 (xi1)\r\n50C2 (lou2,lu:3)\r\n50C3 (bei4)\r\n50C4 (piao1)\r\n50C5 (jin3,jin4)\r\n50C6 (lian3)\r\n50C7 (lu4)\r\n50C8 (man4)\r\n50C9 (qian1)\r\n50CA (xian1)\r\n50CB (qiu2)\r\n50CC (ying2)\r\n50CD (dong4)\r\n50CE (zhuan4)\r\n50CF (xiang4)\r\n50D0 (shan3)\r\n50D1 (qiao2)\r\n50D2 (jiong3)\r\n50D3 (tui2)\r\n50D4 (zun3)\r\n50D5 (pu2,pu1)\r\n50D6 (xi1)\r\n50D7 (lao4)\r\n50D8 (chang3)\r\n50D9 (guang1)\r\n50DA (liao2)\r\n50DB (qi1)\r\n50DC (deng4)\r\n50DD (chan2)\r\n50DE (wei3)\r\n50DF (zhang3)\r\n50E0 (fan1)\r\n50E1 (hui4)\r\n50E2 (chuan3)\r\n50E3 (tie3)\r\n50E4 (dan4)\r\n50E5 (jiao3,yao2)\r\n50E6 (jiu4)\r\n50E7 (seng1)\r\n50E8 (fen4)\r\n50E9 (xian4)\r\n50EA (jue2)\r\n50EB (e4)\r\n50EC (jiao1)\r\n50ED (jian4)\r\n50EE (tong2,zhuang4)\r\n50EF (lin2)\r\n50F0 (bo2)\r\n50F1 (gu4)\r\n50F2 (xian1)\r\n50F3 (su4)\r\n50F4 (xian4)\r\n50F5 (jiang1)\r\n50F6 (min3)\r\n50F7 (ye4)\r\n50F8 (jin4)\r\n50F9 (jia4)\r\n50FA (qiao4)\r\n50FB (pi4)\r\n50FC (feng1)\r\n50FD (zhou4)\r\n50FE (ai4)\r\n50FF (sai4)\r\n5100 (yi2)\r\n5101 (jun4,juan4)\r\n5102 (nong2)\r\n5103 (shan4)\r\n5104 (yi4)\r\n5105 (dang1)\r\n5106 (jing3)\r\n5107 (xuan1)\r\n5108 (kuai4)\r\n5109 (jian3)\r\n510A (chu4)\r\n510B (dan1)\r\n510C (jiao3)\r\n510D (sha3)\r\n510E (zai4,zai3)\r\n510F (none0)\r\n5110 (bin4,bin1)\r\n5111 (an4)\r\n5112 (ru2)\r\n5113 (tai2)\r\n5114 (chou2)\r\n5115 (chai2)\r\n5116 (lan2)\r\n5117 (ni3)\r\n5118 (jin3,jin4)\r\n5119 (qian1)\r\n511A (meng2)\r\n511B (wu3)\r\n511C (neng2)\r\n511D (qiong2)\r\n511E (ni3)\r\n511F (chang2)\r\n5120 (lie4)\r\n5121 (lei3)\r\n5122 (lu:3)\r\n5123 (kuang3)\r\n5124 (bao4)\r\n5125 (du2)\r\n5126 (biao1)\r\n5127 (zan3)\r\n5128 (zhi2)\r\n5129 (si4)\r\n512A (you1)\r\n512B (hao2)\r\n512C (qin1)\r\n512D (chen4)\r\n512E (li4)\r\n512F (teng2)\r\n5130 (wei3)\r\n5131 (long2)\r\n5132 (chu3,chu2)\r\n5133 (chan4)\r\n5134 (rang2)\r\n5135 (shu4)\r\n5136 (hui4)\r\n5137 (li4)\r\n5138 (luo2)\r\n5139 (zan3,zuan3)\r\n513A (nuo2)\r\n513B (tang3)\r\n513C (yan3)\r\n513D (lei4)\r\n513E (nang4)\r\n513F (er2,r2)\r\n5140 (wu4,wu1)\r\n5141 (yun3)\r\n5142 (zan1)\r\n5143 (yuan2)\r\n5144 (xiong1)\r\n5145 (chong1)\r\n5146 (zhao4)\r\n5147 (xiong1)\r\n5148 (xian1)\r\n5149 (guang1)\r\n514A (dui4)\r\n514B (ke4)\r\n514C (dui4)\r\n514D (mian3,wen4)\r\n514E (tu4)\r\n514F (chang2,zhang3)\r\n5150 (er2)\r\n5151 (dui4)\r\n5152 (er2,er1)\r\n5153 (jin1)\r\n5154 (tu4)\r\n5155 (si4)\r\n5156 (yan3)\r\n5157 (yan3)\r\n5158 (shi3)\r\n5159 (shi2,ke4)\r\n515A (dang3)\r\n515B (qian1)\r\n515C (dou1)\r\n515D (fen1)\r\n515E (mao2)\r\n515F (xin1)\r\n5160 (dou1)\r\n5161 (bai3,ke4)\r\n5162 (jing1)\r\n5163 (li3)\r\n5164 (kuang4)\r\n5165 (ru4)\r\n5166 (wang2,wu2)\r\n5167 (nei4)\r\n5168 (quan2)\r\n5169 (liang3)\r\n516A (yu2,shu4)\r\n516B (ba1,ba2)\r\n516C (gong1)\r\n516D (liu4,lu4)\r\n516E (xi1)\r\n516F (none0)\r\n5170 (lan2)\r\n5171 (gong4,gong1,gong3)\r\n5172 (tian1)\r\n5173 (guan1)\r\n5174 (xing1,xing4)\r\n5175 (bing1)\r\n5176 (qi2,ji1)\r\n5177 (ju4)\r\n5178 (dian3)\r\n5179 (zi1,ci2)\r\n517A (none0)\r\n517B (yang3)\r\n517C (jian1)\r\n517D (shou4)\r\n517E (ji4)\r\n517F (yi4)\r\n5180 (ji4)\r\n5181 (chan3)\r\n5182 (jiong1)\r\n5183 (mao4)\r\n5184 (ran3)\r\n5185 (nei4)\r\n5186 (yuan2)\r\n5187 (mao3,mou3)\r\n5188 (gang1)\r\n5189 (ran3)\r\n518A (ce4)\r\n518B (jiong1)\r\n518C (ce4)\r\n518D (zai4)\r\n518E (gua3)\r\n518F (jiong3)\r\n5190 (mao4,mo4)\r\n5191 (zhou4)\r\n5192 (mao4,mo4)\r\n5193 (gou4)\r\n5194 (xu3)\r\n5195 (mian3)\r\n5196 (mi4)\r\n5197 (rong3)\r\n5198 (yin2)\r\n5199 (xie3,xie4)\r\n519A (kan3)\r\n519B (jun1)\r\n519C (nong2)\r\n519D (yi2)\r\n519E (mi2)\r\n519F (shi4)\r\n51A0 (guan1,guan4)\r\n51A1 (meng2)\r\n51A2 (zhong3)\r\n51A3 (zui4)\r\n51A4 (yuan1)\r\n51A5 (ming2)\r\n51A6 (kou4)\r\n51A7 (none0)\r\n51A8 (fu4)\r\n51A9 (xie3)\r\n51AA (mi4)\r\n51AB (bing1)\r\n51AC (dong1)\r\n51AD (tai4)\r\n51AE (gang1)\r\n51AF (feng2,ping2)\r\n51B0 (bing1)\r\n51B1 (hu4)\r\n51B2 (chong1,chong4)\r\n51B3 (jue2)\r\n51B4 (hu4)\r\n51B5 (kuang4)\r\n51B6 (ye3)\r\n51B7 (leng3)\r\n51B8 (pan4)\r\n51B9 (fu3)\r\n51BA (min3)\r\n51BB (dong4)\r\n51BC (xian3)\r\n51BD (lie4)\r\n51BE (xia2)\r\n51BF (jian1)\r\n51C0 (jing4)\r\n51C1 (shu4)\r\n51C2 (mei3)\r\n51C3 (shang4)\r\n51C4 (qi1)\r\n51C5 (gu4)\r\n51C6 (zhun3)\r\n51C7 (song1)\r\n51C8 (jing4)\r\n51C9 (liang2,liang4)\r\n51CA (qing4,jing4)\r\n51CB (diao1)\r\n51CC (ling2)\r\n51CD (dong4)\r\n51CE (gan4)\r\n51CF (jian3)\r\n51D0 (yin1,yin2)\r\n51D1 (cou4)\r\n51D2 (ai2)\r\n51D3 (li4)\r\n51D4 (cang1)\r\n51D5 (ming3)\r\n51D6 (zhun3)\r\n51D7 (cui2)\r\n51D8 (si1)\r\n51D9 (duo2)\r\n51DA (jin4)\r\n51DB (lin3)\r\n51DC (lin3)\r\n51DD (ning2)\r\n51DE (xi1)\r\n51DF (du2)\r\n51E0 (ji3,ji1)\r\n51E1 (fan2)\r\n51E2 (fan2)\r\n51E3 (fan2)\r\n51E4 (feng4)\r\n51E5 (ju1)\r\n51E6 (chu3,chu4)\r\n51E7 (none0)\r\n51E8 (feng1)\r\n51E9 (none0)\r\n51EA (none0)\r\n51EB (fu2)\r\n51EC (feng1)\r\n51ED (ping2)\r\n51EE (feng1)\r\n51EF (kai3)\r\n51F0 (huang2)\r\n51F1 (kai3)\r\n51F2 (gan1)\r\n51F3 (deng4)\r\n51F4 (ping2)\r\n51F5 (qu1,kan3)\r\n51F6 (xiong1)\r\n51F7 (kuai4)\r\n51F8 (tu1,tu2,gu3)\r\n51F9 (ao1,wa1)\r\n51FA (chu1)\r\n51FB (ji1)\r\n51FC (dang4)\r\n51FD (han2)\r\n51FE (han2)\r\n51FF (zao2,zuo4)\r\n5200 (dao1)\r\n5201 (diao1)\r\n5202 (dao1)\r\n5203 (ren4)\r\n5204 (ren4)\r\n5205 (chuang1)\r\n5206 (fen1,fen4)\r\n5207 (qie4,qie1)\r\n5208 (yi4)\r\n5209 (ji4)\r\n520A (kan1)\r\n520B (qian4)\r\n520C (cun3)\r\n520D (chu2)\r\n520E (wen3)\r\n520F (ji1)\r\n5210 (dan3)\r\n5211 (xing2)\r\n5212 (hua4,hua2,huai5)\r\n5213 (wan2)\r\n5214 (jue2)\r\n5215 (li2)\r\n5216 (yue4)\r\n5217 (lie4)\r\n5218 (liu2)\r\n5219 (ze2)\r\n521A (gang1)\r\n521B (chuang4,chuang1)\r\n521C (fu2)\r\n521D (chu1)\r\n521E (qu4)\r\n521F (ju1)\r\n5220 (shan1)\r\n5221 (min3)\r\n5222 (ling2)\r\n5223 (zhong1)\r\n5224 (pan4)\r\n5225 (bie2)\r\n5226 (jie2)\r\n5227 (jie2)\r\n5228 (bao4,pao2)\r\n5229 (li4)\r\n522A (shan1)\r\n522B (bie2,bie4)\r\n522C (chan3)\r\n522D (jing3)\r\n522E (gua1)\r\n522F (gen1)\r\n5230 (dao4)\r\n5231 (chuang4)\r\n5232 (kui1)\r\n5233 (ku1)\r\n5234 (duo4)\r\n5235 (er4)\r\n5236 (zhi4)\r\n5237 (shua1,shua4)\r\n5238 (quan4,xuan4)\r\n5239 (cha4,sha1)\r\n523A (ci4,ci1)\r\n523B (ke4,ke1)\r\n523C (jie2)\r\n523D (gui4)\r\n523E (ci4)\r\n523F (gui4)\r\n5240 (kai3)\r\n5241 (duo4)\r\n5242 (ji4)\r\n5243 (ti4)\r\n5244 (jing3)\r\n5245 (lou2)\r\n5246 (luo2)\r\n5247 (ze2)\r\n5248 (yuan1)\r\n5249 (cuo4)\r\n524A (xue1,xiao1,xue4)\r\n524B (ke4)\r\n524C (la4,la2)\r\n524D (qian2)\r\n524E (cha4)\r\n524F (chuan4)\r\n5250 (gua3)\r\n5251 (jian4)\r\n5252 (cuo4)\r\n5253 (li2)\r\n5254 (ti1)\r\n5255 (fei4)\r\n5256 (pou1,pou3,po3)\r\n5257 (chan3)\r\n5258 (qi2)\r\n5259 (chuang4)\r\n525A (zi4)\r\n525B (gang1)\r\n525C (wan1)\r\n525D (bo1)\r\n525E (ji1,ji3)\r\n525F (duo1)\r\n5260 (qing2)\r\n5261 (yan3,shan4)\r\n5262 (zhuo2)\r\n5263 (jian4)\r\n5264 (ji4)\r\n5265 (bo1,bao1)\r\n5266 (yan1)\r\n5267 (ju4)\r\n5268 (huo4)\r\n5269 (sheng4)\r\n526A (jian3)\r\n526B (duo2)\r\n526C (duan1)\r\n526D (wu1)\r\n526E (gua3)\r\n526F (fu4)\r\n5270 (sheng4)\r\n5271 (jian4)\r\n5272 (ge1)\r\n5273 (zha2)\r\n5274 (kai3)\r\n5275 (chuang4,chuang1)\r\n5276 (juan1)\r\n5277 (chan3)\r\n5278 (tuan2,zhuan1)\r\n5279 (lu4)\r\n527A (li2)\r\n527B (fou2)\r\n527C (shan1)\r\n527D (piao1,piao4)\r\n527E (kou1)\r\n527F (jiao3,chao1,jia3)\r\n5280 (gua1)\r\n5281 (qiao1)\r\n5282 (jue2)\r\n5283 (hua4,hua2)\r\n5284 (zha2)\r\n5285 (zhuo2)\r\n5286 (lian2)\r\n5287 (ju4)\r\n5288 (pi1,pi3)\r\n5289 (liu2)\r\n528A (gui4)\r\n528B (jiao3)\r\n528C (gui4)\r\n528D (jian4)\r\n528E (jian4)\r\n528F (tang1)\r\n5290 (huo1)\r\n5291 (ji4)\r\n5292 (jian4)\r\n5293 (yi4)\r\n5294 (jian4)\r\n5295 (zhi4)\r\n5296 (chan2)\r\n5297 (cuan2)\r\n5298 (mo2)\r\n5299 (li2)\r\n529A (zhu2)\r\n529B (li4)\r\n529C (ya4)\r\n529D (quan4)\r\n529E (ban4)\r\n529F (gong1)\r\n52A0 (jia1)\r\n52A1 (wu4)\r\n52A2 (mai4)\r\n52A3 (lie4)\r\n52A4 (jing4)\r\n52A5 (keng1)\r\n52A6 (xie2)\r\n52A7 (zhi3)\r\n52A8 (dong4)\r\n52A9 (zhu4)\r\n52AA (nu3,nao2)\r\n52AB (jie2)\r\n52AC (qu2)\r\n52AD (shao4)\r\n52AE (yi4)\r\n52AF (zhu1)\r\n52B0 (mo4)\r\n52B1 (li4)\r\n52B2 (jing4,jin4)\r\n52B3 (lao2)\r\n52B4 (lao2)\r\n52B5 (juan4)\r\n52B6 (kou3)\r\n52B7 (yang2)\r\n52B8 (wa1)\r\n52B9 (xiao4)\r\n52BA (mou2)\r\n52BB (kuang1)\r\n52BC (jie2)\r\n52BD (lie4)\r\n52BE (he2)\r\n52BF (shi4)\r\n52C0 (ke4)\r\n52C1 (jing4,jin4)\r\n52C2 (hao2)\r\n52C3 (bo2)\r\n52C4 (min3)\r\n52C5 (chi4)\r\n52C6 (lang2)\r\n52C7 (yong3)\r\n52C8 (yong3)\r\n52C9 (mian3)\r\n52CA (ke4)\r\n52CB (xun1)\r\n52CC (juan4)\r\n52CD (qing2)\r\n52CE (lu4)\r\n52CF (bu4)\r\n52D0 (meng3)\r\n52D1 (lai4)\r\n52D2 (le4,lei1)\r\n52D3 (kai4)\r\n52D4 (mian3)\r\n52D5 (dong4)\r\n52D6 (xu4)\r\n52D7 (xu4)\r\n52D8 (kan1,kan4)\r\n52D9 (wu4)\r\n52DA (yi4)\r\n52DB (xun1)\r\n52DC (weng3)\r\n52DD (sheng4,sheng1)\r\n52DE (lao2,lao4)\r\n52DF (mu4)\r\n52E0 (lu4)\r\n52E1 (piao1)\r\n52E2 (shi4)\r\n52E3 (ji1)\r\n52E4 (qin2)\r\n52E5 (qiang3)\r\n52E6 (jiao3,chao1)\r\n52E7 (quan4)\r\n52E8 (xiang4)\r\n52E9 (yi4)\r\n52EA (qiao1)\r\n52EB (fan2)\r\n52EC (juan1)\r\n52ED (tong2)\r\n52EE (ju4)\r\n52EF (dan1)\r\n52F0 (xie2)\r\n52F1 (mai4)\r\n52F2 (xun1)\r\n52F3 (xun1)\r\n52F4 (lu:4)\r\n52F5 (li4)\r\n52F6 (che4)\r\n52F7 (rang2)\r\n52F8 (quan4)\r\n52F9 (bao1)\r\n52FA (shao2,shuo4,biao1)\r\n52FB (yun2)\r\n52FC (jiu1)\r\n52FD (bao4)\r\n52FE (gou1,gou4)\r\n52FF (wu4)\r\n5300 (yun2)\r\n5301 (none0)\r\n5302 (none0)\r\n5303 (gai4)\r\n5304 (gai4)\r\n5305 (bao1)\r\n5306 (cong1)\r\n5307 (none0)\r\n5308 (xiong1)\r\n5309 (peng1)\r\n530A (ju2)\r\n530B (tao2)\r\n530C (ge2)\r\n530D (pu2)\r\n530E (an4)\r\n530F (pao2)\r\n5310 (fu2)\r\n5311 (gong1)\r\n5312 (da2)\r\n5313 (jiu4)\r\n5314 (qiong1)\r\n5315 (bi3)\r\n5316 (hua4,hua1)\r\n5317 (bei3)\r\n5318 (nao3)\r\n5319 (chi2,shi5)\r\n531A (fang1,xi3)\r\n531B (jiu4)\r\n531C (yi2)\r\n531D (za1)\r\n531E (jiang4)\r\n531F (kang4)\r\n5320 (jiang4)\r\n5321 (kuang1)\r\n5322 (hu1)\r\n5323 (xia2)\r\n5324 (qu1)\r\n5325 (fan2)\r\n5326 (gui3)\r\n5327 (qie4)\r\n5328 (cang2,zang4)\r\n5329 (kuang1)\r\n532A (fei3)\r\n532B (hu1)\r\n532C (yu3)\r\n532D (gui3)\r\n532E (kui4)\r\n532F (hui4)\r\n5330 (dan1)\r\n5331 (kui4)\r\n5332 (lian2)\r\n5333 (lian2)\r\n5334 (suan3)\r\n5335 (du2)\r\n5336 (jiu4)\r\n5337 (qu2)\r\n5338 (xi4)\r\n5339 (pi3,pi1,ya3)\r\n533A (qu1,ou1)\r\n533B (yi1)\r\n533C (an4)\r\n533D (yan3)\r\n533E (bian3)\r\n533F (ni4)\r\n5340 (qu1,ou1)\r\n5341 (shi2)\r\n5342 (xin4)\r\n5343 (qian1)\r\n5344 (nian4)\r\n5345 (sa4)\r\n5346 (zu2)\r\n5347 (sheng1)\r\n5348 (wu3)\r\n5349 (hui4)\r\n534A (ban4)\r\n534B (shi4)\r\n534C (xi4)\r\n534D (wan4)\r\n534E (hua2,hua4,hua1)\r\n534F (xie2)\r\n5350 (wan4)\r\n5351 (bei1)\r\n5352 (zu2,cu4)\r\n5353 (zhuo2,zhuo1)\r\n5354 (xie2)\r\n5355 (dan1,chan2,shan4)\r\n5356 (mai4)\r\n5357 (nan2,na1)\r\n5358 (dan1,chan2)\r\n5359 (ji2)\r\n535A (bo2)\r\n535B (shuai4,lu:4)\r\n535C (bu3,bo5)\r\n535D (kuang4)\r\n535E (bian4)\r\n535F (bu3)\r\n5360 (zhan4,zhan1)\r\n5361 (ka3,qia3)\r\n5362 (lu2)\r\n5363 (you3)\r\n5364 (lu3)\r\n5365 (xi1)\r\n5366 (gua4)\r\n5367 (wo4)\r\n5368 (xie4)\r\n5369 (jie2)\r\n536A (jie2)\r\n536B (wei4)\r\n536C (ang2,yang3)\r\n536D (qiong2)\r\n536E (zhi1)\r\n536F (mao3)\r\n5370 (yin4)\r\n5371 (wei1,wei2)\r\n5372 (shao4)\r\n5373 (ji2)\r\n5374 (que4)\r\n5375 (luan3)\r\n5376 (shi4)\r\n5377 (juan3,juan4,quan2)\r\n5378 (xie4)\r\n5379 (xu4)\r\n537A (jin3)\r\n537B (que4)\r\n537C (wu4)\r\n537D (ji2)\r\n537E (e4)\r\n537F (qing1)\r\n5380 (xi1)\r\n5381 (none0)\r\n5382 (chang3,han3,an1)\r\n5383 (han3)\r\n5384 (e4)\r\n5385 (ting1)\r\n5386 (li4)\r\n5387 (zhe2)\r\n5388 (an1,chang3)\r\n5389 (li4)\r\n538A (ya3)\r\n538B (ya1,ya4)\r\n538C (yan4)\r\n538D (she4)\r\n538E (zhi3)\r\n538F (zha3)\r\n5390 (pang2)\r\n5391 (none0)\r\n5392 (ke4)\r\n5393 (ya2)\r\n5394 (zhi4)\r\n5395 (ce4,si5)\r\n5396 (pang2)\r\n5397 (ti2)\r\n5398 (li2)\r\n5399 (she4)\r\n539A (hou4)\r\n539B (ting1)\r\n539C (zui1)\r\n539D (cuo4)\r\n539E (fei4)\r\n539F (yuan2)\r\n53A0 (ce4,si5)\r\n53A1 (yuan2)\r\n53A2 (xiang1)\r\n53A3 (yan3)\r\n53A4 (li4)\r\n53A5 (jue2)\r\n53A6 (sha4,xia4)\r\n53A7 (dian1)\r\n53A8 (chu2)\r\n53A9 (jiu4)\r\n53AA (qin2,jin3)\r\n53AB (ao2)\r\n53AC (gui3)\r\n53AD (yan4,yan1)\r\n53AE (si1)\r\n53AF (li4)\r\n53B0 (chang3,an1)\r\n53B1 (lan2)\r\n53B2 (li4)\r\n53B3 (yan2)\r\n53B4 (yan3)\r\n53B5 (yuan2)\r\n53B6 (si1)\r\n53B7 (si1)\r\n53B8 (lin2)\r\n53B9 (qiu2)\r\n53BA (qu4)\r\n53BB (qu4)\r\n53BC (none0)\r\n53BD (lei3)\r\n53BE (du1)\r\n53BF (xian4)\r\n53C0 (zhuan1)\r\n53C1 (san1)\r\n53C2 (can1,cen1,shen1)\r\n53C3 (can1,cen1,shen1,san1)\r\n53C4 (san1)\r\n53C5 (can1,cen1,shen1)\r\n53C6 (ai4)\r\n53C7 (dai4)\r\n53C8 (you4)\r\n53C9 (cha1,cha2,cha3,cha4)\r\n53CA (ji2)\r\n53CB (you3)\r\n53CC (shuang1)\r\n53CD (fan3)\r\n53CE (shou1)\r\n53CF (guai4)\r\n53D0 (ba2)\r\n53D1 (fa1,fa4)\r\n53D2 (ruo4)\r\n53D3 (shi4)\r\n53D4 (shu1,shu2)\r\n53D5 (zhui4)\r\n53D6 (qu3)\r\n53D7 (shou4)\r\n53D8 (bian4)\r\n53D9 (xu4)\r\n53DA (jia3)\r\n53DB (pan4)\r\n53DC (sou3)\r\n53DD (ji2)\r\n53DE (yu4)\r\n53DF (sou3)\r\n53E0 (die2)\r\n53E1 (rui4)\r\n53E2 (cong2)\r\n53E3 (kou3)\r\n53E4 (gu3)\r\n53E5 (ju4,gou1)\r\n53E6 (ling4)\r\n53E7 (gua3)\r\n53E8 (tao1,dao1,dao2)\r\n53E9 (kou4)\r\n53EA (zhi3,zhi1)\r\n53EB (jiao4)\r\n53EC (zhao4,shao4,zhao1)\r\n53ED (ba1)\r\n53EE (ding1)\r\n53EF (ke3,ke4)\r\n53F0 (tai2,tai1)\r\n53F1 (chi4)\r\n53F2 (shi3)\r\n53F3 (you4)\r\n53F4 (qiu2)\r\n53F5 (po3)\r\n53F6 (ye4,xie2)\r\n53F7 (hao4,hao2)\r\n53F8 (si1)\r\n53F9 (tan4)\r\n53FA (chi3)\r\n53FB (le4)\r\n53FC (diao1)\r\n53FD (ji1)\r\n53FE (none0)\r\n53FF (hong1)\r\n5400 (mie1)\r\n5401 (yu4,xu1,yu1)\r\n5402 (mang2)\r\n5403 (chi1,ji2)\r\n5404 (ge4,ge3)\r\n5405 (xuan1)\r\n5406 (yao1)\r\n5407 (zi3)\r\n5408 (he2,ge3)\r\n5409 (ji2)\r\n540A (diao4)\r\n540B (cun4)\r\n540C (tong2,tong4)\r\n540D (ming2)\r\n540E (hou4)\r\n540F (li4)\r\n5410 (tu3,tu4)\r\n5411 (xiang4)\r\n5412 (zha4,zha1)\r\n5413 (he4,xia4)\r\n5414 (ye3)\r\n5415 (lu:3)\r\n5416 (a1)\r\n5417 (ma5,ma3,ma2)\r\n5418 (ou3)\r\n5419 (xue1)\r\n541A (yi1)\r\n541B (jun1)\r\n541C (chou3)\r\n541D (lin4)\r\n541E (tun1)\r\n541F (yin2)\r\n5420 (fei4)\r\n5421 (bi3,pi3)\r\n5422 (qin4)\r\n5423 (qin4)\r\n5424 (jie4)\r\n5425 (pou1)\r\n5426 (fou3,pi3)\r\n5427 (ba5,ba1)\r\n5428 (dun1)\r\n5429 (fen1)\r\n542A (e2)\r\n542B (han2)\r\n542C (ting1,yin3)\r\n542D (hang2,keng1)\r\n542E (shun3)\r\n542F (qi3)\r\n5430 (hu1)\r\n5431 (zhi1,zi1)\r\n5432 (yin3)\r\n5433 (wu2)\r\n5434 (wu2)\r\n5435 (chao3,chao1)\r\n5436 (na4)\r\n5437 (chuo4)\r\n5438 (xi1)\r\n5439 (chui1,chui4)\r\n543A (dou1)\r\n543B (wen3)\r\n543C (hou3)\r\n543D (ou2,hong1)\r\n543E (wu2)\r\n543F (gao4,gu4)\r\n5440 (ya1,ya5)\r\n5441 (jun4)\r\n5442 (lu:3)\r\n5443 (e4,e5)\r\n5444 (ge2)\r\n5445 (mei2)\r\n5446 (dai1,ai2)\r\n5447 (qi3)\r\n5448 (cheng2)\r\n5449 (wu2)\r\n544A (gao4,gu4)\r\n544B (fu1)\r\n544C (jiao4)\r\n544D (hong1)\r\n544E (chi3)\r\n544F (sheng1)\r\n5450 (na4,na5,ne4,ne5)\r\n5451 (tun1)\r\n5452 (m2)\r\n5453 (yi4)\r\n5454 (dai1,tai3)\r\n5455 (ou3,ou4)\r\n5456 (li4)\r\n5457 (bei5,bai4)\r\n5458 (yuan2,yun2,yun4)\r\n5459 (guo1)\r\n545A (none0)\r\n545B (qiang1,qiang4)\r\n545C (wu1)\r\n545D (e4)\r\n545E (shi1)\r\n545F (quan3)\r\n5460 (pen3)\r\n5461 (wen3)\r\n5462 (ni2,ne5,na4,ne4)\r\n5463 (mou2)\r\n5464 (ling4)\r\n5465 (ran3)\r\n5466 (you1)\r\n5467 (di3)\r\n5468 (zhou1)\r\n5469 (shi4)\r\n546A (zhou4)\r\n546B (zhan1)\r\n546C (ling2)\r\n546D (yi4)\r\n546E (qi4)\r\n546F (ping2)\r\n5470 (zi3)\r\n5471 (gua1,gu1,wa1,gua3)\r\n5472 (ci1,zi1)\r\n5473 (wei4)\r\n5474 (xu1)\r\n5475 (he1,ke1,a1,a2,a3,a4,a5)\r\n5476 (nao2)\r\n5477 (xia1,xia2)\r\n5478 (pei1)\r\n5479 (yi4)\r\n547A (xiao1)\r\n547B (shen1)\r\n547C (hu1)\r\n547D (ming4)\r\n547E (da2)\r\n547F (qu1)\r\n5480 (ju3,zui3)\r\n5481 (gan1)\r\n5482 (za1)\r\n5483 (tuo1)\r\n5484 (duo1,duo4)\r\n5485 (pou3)\r\n5486 (pao2)\r\n5487 (bie2)\r\n5488 (fu2)\r\n5489 (bi4,fu2)\r\n548A (he2,he4,huo2,huo4,huo5)\r\n548B (za3,ze2,zha1,zha4)\r\n548C (he2,he4,huo2,huo4,huo5,hai1,he5,hu2)\r\n548D (hai1)\r\n548E (jiu4)\r\n548F (yong3)\r\n5490 (fu4,fu5)\r\n5491 (da1)\r\n5492 (zhou4)\r\n5493 (wa3)\r\n5494 (ka3,ka1)\r\n5495 (gu1)\r\n5496 (ka1,ga1)\r\n5497 (zuo3)\r\n5498 (bu4)\r\n5499 (long2)\r\n549A (dong1)\r\n549B (ning2)\r\n549C (zha4)\r\n549D (si1)\r\n549E (xian4)\r\n549F (huo4)\r\n54A0 (qi1)\r\n54A1 (er4)\r\n54A2 (e4)\r\n54A3 (guang1)\r\n54A4 (zha4)\r\n54A5 (xi4,die2)\r\n54A6 (yi2)\r\n54A7 (lie3,lie1,lie5)\r\n54A8 (zi1)\r\n54A9 (mie1)\r\n54AA (mi1)\r\n54AB (zhi3)\r\n54AC (yao3)\r\n54AD (ji1)\r\n54AE (zhou4)\r\n54AF (ge1,ka3,lo5,luo4,ge2)\r\n54B0 (shuai4)\r\n54B1 (zan2,za2,zan5)\r\n54B2 (xiao4)\r\n54B3 (ke2,hai1,ka3,kai4)\r\n54B4 (hui1)\r\n54B5 (kua1)\r\n54B6 (huai4)\r\n54B7 (tao2)\r\n54B8 (xian2)\r\n54B9 (e4)\r\n54BA (xuan3)\r\n54BB (xiu1)\r\n54BC (guo1,kuai1)\r\n54BD (yan1,yan4,ye4)\r\n54BE (lao3)\r\n54BF (yi1)\r\n54C0 (ai1)\r\n54C1 (pin3)\r\n54C2 (shen3)\r\n54C3 (tong2)\r\n54C4 (hong1,hong3,hong4)\r\n54C5 (xiong1,hong1)\r\n54C6 (duo1)\r\n54C7 (wa1,wa5)\r\n54C8 (ha1,ha3,ha4,ka1)\r\n54C9 (zai1)\r\n54CA (you4)\r\n54CB (di4)\r\n54CC (pai4)\r\n54CD (xiang3)\r\n54CE (ai1,ai3,ai4)\r\n54CF (gen2)\r\n54D0 (kuang1)\r\n54D1 (ya1,ya3)\r\n54D2 (da1)\r\n54D3 (xiao1)\r\n54D4 (bi4)\r\n54D5 (hui4,yue3)\r\n54D6 (none0)\r\n54D7 (hua1,hua2,ye4)\r\n54D8 (none0)\r\n54D9 (kuai4)\r\n54DA (duo3)\r\n54DB (none0)\r\n54DC (ji4)\r\n54DD (nong2)\r\n54DE (mou1)\r\n54DF (yo5,yo1)\r\n54E0 (hao4)\r\n54E1 (yuan2,yun2,yun4)\r\n54E2 (long4)\r\n54E3 (pou3)\r\n54E4 (mang2)\r\n54E5 (ge1)\r\n54E6 (e2,o2,o4,wo2,wo4)\r\n54E7 (chi1)\r\n54E8 (shao4)\r\n54E9 (li1,li3,li5)\r\n54EA (na3,nei3,na5,ne2,nai3)\r\n54EB (zu2)\r\n54EC (he1)\r\n54ED (ku1)\r\n54EE (xiao4,xiao1)\r\n54EF (xian4)\r\n54F0 (lao2)\r\n54F1 (bei4)\r\n54F2 (zhe2)\r\n54F3 (zha1)\r\n54F4 (liang4)\r\n54F5 (ba1)\r\n54F6 (mi3)\r\n54F7 (le4)\r\n54F8 (sui1)\r\n54F9 (fou2)\r\n54FA (bu3)\r\n54FB (han4)\r\n54FC (heng1,hng5)\r\n54FD (geng3)\r\n54FE (shuo1)\r\n54FF (ge3)\r\n5500 (you4)\r\n5501 (yan4)\r\n5502 (gu3)\r\n5503 (gu3)\r\n5504 (bai4,bei5)\r\n5505 (han1)\r\n5506 (suo1)\r\n5507 (chun2)\r\n5508 (yi4)\r\n5509 (ai1,ai4)\r\n550A (jia2)\r\n550B (tu3)\r\n550C (xian2)\r\n550D (guan1,guan3)\r\n550E (li4)\r\n550F (xi1)\r\n5510 (tang2)\r\n5511 (zuo4)\r\n5512 (miu1)\r\n5513 (che1)\r\n5514 (wu2,n2,n3,ng2,ng3)\r\n5515 (zao4)\r\n5516 (ya1)\r\n5517 (dou3)\r\n5518 (qi3)\r\n5519 (di2)\r\n551A (qin4)\r\n551B (ma4)\r\n551C (none0)\r\n551D (gong4)\r\n551E (dou3)\r\n551F (none0)\r\n5520 (lao2,lao4)\r\n5521 (liang3)\r\n5522 (suo3)\r\n5523 (zao4)\r\n5524 (huan4)\r\n5525 (none0)\r\n5526 (gou4)\r\n5527 (ji1)\r\n5528 (zuo3)\r\n5529 (wo1)\r\n552A (feng3)\r\n552B (yin2)\r\n552C (hu3,xia4)\r\n552D (qi1)\r\n552E (shou4)\r\n552F (wei2,wei3)\r\n5530 (shua1)\r\n5531 (chang4)\r\n5532 (er2)\r\n5533 (li4)\r\n5534 (qiang4)\r\n5535 (an3)\r\n5536 (jie4)\r\n5537 (yo1)\r\n5538 (nian4)\r\n5539 (yu2)\r\n553A (tian3)\r\n553B (lai2)\r\n553C (sha4)\r\n553D (xi1)\r\n553E (tuo4)\r\n553F (hu1)\r\n5540 (ai2)\r\n5541 (zhou1,zhao1)\r\n5542 (nou4)\r\n5543 (ken3)\r\n5544 (zhuo2)\r\n5545 (zhuo2)\r\n5546 (shang1)\r\n5547 (di1)\r\n5548 (heng4)\r\n5549 (lin2)\r\n554A (a5,a1,a2,a3,a4)\r\n554B (xiao1)\r\n554C (xiang1)\r\n554D (tun1)\r\n554E (wu3)\r\n554F (wen4)\r\n5550 (cui4)\r\n5551 (jie1)\r\n5552 (hu1)\r\n5553 (qi3)\r\n5554 (qi3)\r\n5555 (tao2)\r\n5556 (dan4)\r\n5557 (dan4)\r\n5558 (wan3)\r\n5559 (zi3)\r\n555A (bi3)\r\n555B (cui4)\r\n555C (chuo4,chuai4)\r\n555D (he2)\r\n555E (ya3,ya1)\r\n555F (qi3)\r\n5560 (zhe2)\r\n5561 (fei1)\r\n5562 (liang3)\r\n5563 (xian2)\r\n5564 (pi2)\r\n5565 (sha2)\r\n5566 (la5,la1)\r\n5567 (ze2)\r\n5568 (qing1)\r\n5569 (gua4)\r\n556A (pa1)\r\n556B (zhe3)\r\n556C (se4)\r\n556D (zhuan4)\r\n556E (nie4)\r\n556F (guo1)\r\n5570 (luo1)\r\n5571 (yan1)\r\n5572 (di4)\r\n5573 (quan2)\r\n5574 (tan1,chan3)\r\n5575 (bo5)\r\n5576 (ding4)\r\n5577 (lang1)\r\n5578 (xiao4)\r\n5579 (none0)\r\n557A (tang2)\r\n557B (chi4)\r\n557C (ti2)\r\n557D (an2)\r\n557E (jiu1)\r\n557F (dan4)\r\n5580 (ka1,ke4,ka4)\r\n5581 (yong2)\r\n5582 (wei4)\r\n5583 (nan2)\r\n5584 (shan4)\r\n5585 (yu4)\r\n5586 (zhe2)\r\n5587 (la3,la1,la2)\r\n5588 (jie1)\r\n5589 (hou2)\r\n558A (han3)\r\n558B (die2,zha2)\r\n558C (zhou1)\r\n558D (chai2)\r\n558E (kuai1)\r\n558F (re3,nuo4)\r\n5590 (yu4)\r\n5591 (yin1)\r\n5592 (zan3)\r\n5593 (yao1)\r\n5594 (wo1,o1)\r\n5595 (mian3)\r\n5596 (hu2)\r\n5597 (yun3)\r\n5598 (chuan3)\r\n5599 (hui4)\r\n559A (huan4)\r\n559B (huan4)\r\n559C (xi3)\r\n559D (he1,he4)\r\n559E (ji1)\r\n559F (kui4)\r\n55A0 (zhong3)\r\n55A1 (wei3)\r\n55A2 (sha4)\r\n55A3 (xu3)\r\n55A4 (huang2)\r\n55A5 (du4)\r\n55A6 (nie4)\r\n55A7 (xuan1)\r\n55A8 (liang4)\r\n55A9 (yu4)\r\n55AA (sang1,sang4)\r\n55AB (chi1)\r\n55AC (qiao2)\r\n55AD (yan4)\r\n55AE (dan1,chan2,shan4)\r\n55AF (pen1)\r\n55B0 (shi2,si4)\r\n55B1 (li2)\r\n55B2 (yo5,yo1)\r\n55B3 (zha1,cha1)\r\n55B4 (wei1)\r\n55B5 (miao1)\r\n55B6 (ying2)\r\n55B7 (pen1,pen4,pen5)\r\n55B8 (none0)\r\n55B9 (kui2)\r\n55BA (xi4)\r\n55BB (yu4)\r\n55BC (jie2)\r\n55BD (lou5,lou2)\r\n55BE (ku4)\r\n55BF (cao1)\r\n55C0 (huo4)\r\n55C1 (ti2)\r\n55C2 (yao2)\r\n55C3 (he4)\r\n55C4 (a2,sha4)\r\n55C5 (xiu4)\r\n55C6 (qiang1,qiang4)\r\n55C7 (se4)\r\n55C8 (yong1)\r\n55C9 (su4)\r\n55CA (hong3)\r\n55CB (xie1)\r\n55CC (ai4,yi4)\r\n55CD (suo1)\r\n55CE (ma5,ma3)\r\n55CF (cha1)\r\n55D0 (hai4)\r\n55D1 (ke4,ke1)\r\n55D2 (da1,ta4)\r\n55D3 (sang3)\r\n55D4 (chen1)\r\n55D5 (ru4,nou4)\r\n55D6 (sou1)\r\n55D7 (gong1)\r\n55D8 (ji1)\r\n55D9 (pang3)\r\n55DA (wu1)\r\n55DB (qian4)\r\n55DC (shi4)\r\n55DD (ge2)\r\n55DE (zi1)\r\n55DF (jie1,jue1)\r\n55E0 (luo4)\r\n55E1 (weng1)\r\n55E2 (wa4)\r\n55E3 (si4)\r\n55E4 (chi1)\r\n55E5 (hao2)\r\n55E6 (suo1)\r\n55E7 (jia1,lun2)\r\n55E8 (hai1,hei1)\r\n55E9 (suo3)\r\n55EA (qin2)\r\n55EB (nie4)\r\n55EC (he1)\r\n55ED (none0)\r\n55EE (sai4)\r\n55EF (ng4,ng2,ng3,n2,n3,n4)\r\n55F0 (ge4)\r\n55F1 (na2)\r\n55F2 (dia3)\r\n55F3 (ai4,ai3)\r\n55F4 (none0)\r\n55F5 (tong1)\r\n55F6 (bi4)\r\n55F7 (ao2)\r\n55F8 (ao2)\r\n55F9 (lian2)\r\n55FA (cui1)\r\n55FB (zhe1)\r\n55FC (mo4)\r\n55FD (sou4)\r\n55FE (sou3,zu2)\r\n55FF (tan3)\r\n5600 (di2,di1)\r\n5601 (qi1)\r\n5602 (jiao4)\r\n5603 (chong1)\r\n5604 (jiao1)\r\n5605 (kai3)\r\n5606 (tan4)\r\n5607 (san1)\r\n5608 (cao2)\r\n5609 (jia1)\r\n560A (none0)\r\n560B (xiao1)\r\n560C (piao4)\r\n560D (lou5,lou2)\r\n560E (ga1,ga3,ga2)\r\n560F (gu3,jia3)\r\n5610 (xiao1)\r\n5611 (hu1)\r\n5612 (hui4)\r\n5613 (guo1)\r\n5614 (ou1,ou3,ou4)\r\n5615 (xian1)\r\n5616 (ze2)\r\n5617 (chang2)\r\n5618 (xu1,shi1)\r\n5619 (po2)\r\n561A (de1,dei1)\r\n561B (ma5,ma2)\r\n561C (ma4,ma3,mo4)\r\n561D (hu2)\r\n561E (lei5)\r\n561F (du1)\r\n5620 (ga1)\r\n5621 (tang1)\r\n5622 (ye3)\r\n5623 (beng1)\r\n5624 (ying1)\r\n5625 (none0)\r\n5626 (jiao4)\r\n5627 (mi4)\r\n5628 (xiao4)\r\n5629 (hua1,hua2,ye4)\r\n562A (mai3)\r\n562B (ran2)\r\n562C (zuo1,chuai4,zhuai4)\r\n562D (peng1)\r\n562E (lao2,lao4)\r\n562F (xiao4)\r\n5630 (ji1)\r\n5631 (zhu3)\r\n5632 (chao2,zhao1)\r\n5633 (kui4)\r\n5634 (zui3)\r\n5635 (xiao1)\r\n5636 (si1)\r\n5637 (hao2)\r\n5638 (fu3,m2)\r\n5639 (liao2)\r\n563A (qiao2)\r\n563B (xi1)\r\n563C (xu4)\r\n563D (chan3)\r\n563E (dan4)\r\n563F (hei1,mo4,hai1)\r\n5640 (xun4)\r\n5641 (wu4)\r\n5642 (zun3)\r\n5643 (pan2)\r\n5644 (chi1)\r\n5645 (kui1)\r\n5646 (can3)\r\n5647 (zan3)\r\n5648 (cu4)\r\n5649 (dan4)\r\n564A (yu4)\r\n564B (tun1)\r\n564C (cheng1,ceng1)\r\n564D (jiao4)\r\n564E (ye1)\r\n564F (xi1)\r\n5650 (qi4)\r\n5651 (hao2)\r\n5652 (lian2)\r\n5653 (xu1,shi1)\r\n5654 (deng1)\r\n5655 (hui1)\r\n5656 (yin2)\r\n5657 (pu1)\r\n5658 (jue1)\r\n5659 (qin2)\r\n565A (xun2)\r\n565B (nie4)\r\n565C (lu1)\r\n565D (si1)\r\n565E (yan4)\r\n565F (ying4)\r\n5660 (da1)\r\n5661 (zhan1)\r\n5662 (o1)\r\n5663 (zhou4)\r\n5664 (jin4)\r\n5665 (nong2)\r\n5666 (hui4,yue1)\r\n5667 (hui4)\r\n5668 (qi4)\r\n5669 (e4)\r\n566A (zao4)\r\n566B (yi1,yi4)\r\n566C (shi4)\r\n566D (jiao4)\r\n566E (yuan4)\r\n566F (ai4,ai3)\r\n5670 (yong1)\r\n5671 (xue2,jue2)\r\n5672 (kuai4)\r\n5673 (yu3)\r\n5674 (pen1,pen4)\r\n5675 (dao4)\r\n5676 (ga2)\r\n5677 (xin1)\r\n5678 (dun1,dun4)\r\n5679 (dang1)\r\n567A (none0)\r\n567B (sai1)\r\n567C (pi1)\r\n567D (pi3)\r\n567E (yin1)\r\n567F (zui3)\r\n5680 (ning2)\r\n5681 (di2)\r\n5682 (han3)\r\n5683 (ta4)\r\n5684 (huo4,huo1,o3)\r\n5685 (ru2)\r\n5686 (hao1)\r\n5687 (xia4,he4)\r\n5688 (yan4)\r\n5689 (duo1)\r\n568A (pi4)\r\n568B (chou2)\r\n568C (ji4)\r\n568D (jin4)\r\n568E (hao2)\r\n568F (ti4)\r\n5690 (chang2)\r\n5691 (none0)\r\n5692 (none0)\r\n5693 (ca1,cha1)\r\n5694 (ti4)\r\n5695 (lu1)\r\n5696 (hui4)\r\n5697 (bao4)\r\n5698 (you1)\r\n5699 (nie4)\r\n569A (yin2)\r\n569B (hu4)\r\n569C (mo4)\r\n569D (huang1)\r\n569E (zhe2)\r\n569F (li2)\r\n56A0 (liu2)\r\n56A1 (none0)\r\n56A2 (nang2,nang1)\r\n56A3 (xiao1,ao2)\r\n56A4 (mo2)\r\n56A5 (yan4)\r\n56A6 (li4)\r\n56A7 (lu2)\r\n56A8 (long2)\r\n56A9 (mo2)\r\n56AA (dan1)\r\n56AB (chen4)\r\n56AC (pin2)\r\n56AD (pi3)\r\n56AE (xiang4)\r\n56AF (huo4)\r\n56B0 (mo2)\r\n56B1 (xi1)\r\n56B2 (duo3)\r\n56B3 (ku4)\r\n56B4 (yan2)\r\n56B5 (chan2)\r\n56B6 (ying1)\r\n56B7 (rang3,rang1)\r\n56B8 (dian3)\r\n56B9 (la1)\r\n56BA (ta4)\r\n56BB (xiao1)\r\n56BC (jiao2,jiao4,jue2)\r\n56BD (chuo4)\r\n56BE (huan4)\r\n56BF (huo4)\r\n56C0 (zhuan4,zhuan3)\r\n56C1 (nie4)\r\n56C2 (xiao1,ao2)\r\n56C3 (ca4)\r\n56C4 (li2)\r\n56C5 (chan3)\r\n56C6 (chai4)\r\n56C7 (li4)\r\n56C8 (yi4)\r\n56C9 (luo1,luo2)\r\n56CA (nang2,nang1)\r\n56CB (zan4)\r\n56CC (su1)\r\n56CD (xi3)\r\n56CE (none0)\r\n56CF (jian1)\r\n56D0 (za2)\r\n56D1 (zhu3)\r\n56D2 (lan2)\r\n56D3 (nie4)\r\n56D4 (nang1)\r\n56D5 (none0)\r\n56D6 (none0)\r\n56D7 (wei2)\r\n56D8 (hui2)\r\n56D9 (yin1)\r\n56DA (qiu2)\r\n56DB (si4)\r\n56DC (nin2)\r\n56DD (jian3,nan1)\r\n56DE (hui2)\r\n56DF (xin4)\r\n56E0 (yin1)\r\n56E1 (nan1)\r\n56E2 (tuan2)\r\n56E3 (tuan2)\r\n56E4 (dun4,tun2)\r\n56E5 (kang4)\r\n56E6 (yuan1)\r\n56E7 (jiong3)\r\n56E8 (pian1)\r\n56E9 (yun4)\r\n56EA (cong1,chuang1)\r\n56EB (hu2)\r\n56EC (hui2)\r\n56ED (yuan2)\r\n56EE (e2)\r\n56EF (guo2)\r\n56F0 (kun4)\r\n56F1 (cong1)\r\n56F2 (wei2)\r\n56F3 (tu2)\r\n56F4 (wei2)\r\n56F5 (lun2)\r\n56F6 (guo2)\r\n56F7 (jun1)\r\n56F8 (ri4)\r\n56F9 (ling2)\r\n56FA (gu4)\r\n56FB (guo2)\r\n56FC (tai1)\r\n56FD (guo2)\r\n56FE (tu2)\r\n56FF (you4)\r\n5700 (guo2)\r\n5701 (yin2)\r\n5702 (hun4)\r\n5703 (pu3)\r\n5704 (yu3)\r\n5705 (han2)\r\n5706 (yuan2)\r\n5707 (lun2)\r\n5708 (quan1,juan1,juan4,quan3)\r\n5709 (yu3)\r\n570A (qing1)\r\n570B (guo2)\r\n570C (chui2)\r\n570D (wei2)\r\n570E (yuan2)\r\n570F (quan1,juan1,juan4)\r\n5710 (ku1)\r\n5711 (pu3)\r\n5712 (yuan2)\r\n5713 (yuan2)\r\n5714 (e4)\r\n5715 (tu2,shu1,guan3)\r\n5716 (tu2)\r\n5717 (tu2)\r\n5718 (tuan2)\r\n5719 (lu:e4)\r\n571A (hui4)\r\n571B (yi4)\r\n571C (yuan2,huan2)\r\n571D (luan2)\r\n571E (luan2)\r\n571F (tu3)\r\n5720 (ya4)\r\n5721 (tu3)\r\n5722 (ting3)\r\n5723 (sheng4)\r\n5724 (yan2)\r\n5725 (lu2)\r\n5726 (none0)\r\n5727 (ya1,ya4)\r\n5728 (zai4)\r\n5729 (wei2,xu1)\r\n572A (ge1)\r\n572B (yu4)\r\n572C (wu1)\r\n572D (gui1)\r\n572E (pi3)\r\n572F (yi2)\r\n5730 (di4,de5)\r\n5731 (qian1)\r\n5732 (qian1)\r\n5733 (zhen4)\r\n5734 (zhuo2,shao2)\r\n5735 (dang4)\r\n5736 (qia4)\r\n5737 (none0)\r\n5738 (none0)\r\n5739 (kuang4)\r\n573A (chang3,chang2,chang5)\r\n573B (qi2,yin2)\r\n573C (nie4)\r\n573D (mo4)\r\n573E (ji1)\r\n573F (jia2)\r\n5740 (zhi3)\r\n5741 (zhi3)\r\n5742 (ban3)\r\n5743 (xun1)\r\n5744 (tou2)\r\n5745 (qin3)\r\n5746 (fen2)\r\n5747 (jun1,yun4)\r\n5748 (keng1)\r\n5749 (dun4)\r\n574A (fang1,fang2)\r\n574B (fen4)\r\n574C (ben4)\r\n574D (tan1)\r\n574E (kan3)\r\n574F (huai4,pi1,pei1)\r\n5750 (zuo4)\r\n5751 (keng1)\r\n5752 (bi4)\r\n5753 (xing2)\r\n5754 (di4)\r\n5755 (jing1)\r\n5756 (ji4)\r\n5757 (kuai4)\r\n5758 (di3)\r\n5759 (jing1)\r\n575A (jian1)\r\n575B (tan2)\r\n575C (li4)\r\n575D (ba4)\r\n575E (wu4)\r\n575F (fen2)\r\n5760 (zhui4)\r\n5761 (po1)\r\n5762 (pan3)\r\n5763 (tang1)\r\n5764 (kun1)\r\n5765 (qu1)\r\n5766 (tan3)\r\n5767 (zhi2)\r\n5768 (tuo2)\r\n5769 (gan1)\r\n576A (ping2)\r\n576B (dian4)\r\n576C (wa1)\r\n576D (ni2)\r\n576E (tai2,tai1)\r\n576F (pi1)\r\n5770 (jiong1)\r\n5771 (yang1)\r\n5772 (fo2)\r\n5773 (ao4)\r\n5774 (liu4)\r\n5775 (qiu1)\r\n5776 (mu4)\r\n5777 (ke3,ke1)\r\n5778 (gou4)\r\n5779 (xue4)\r\n577A (ba2)\r\n577B (chi2,di3)\r\n577C (che4)\r\n577D (ling2)\r\n577E (zhu4)\r\n577F (fu4)\r\n5780 (hu1)\r\n5781 (zhi4)\r\n5782 (chui2)\r\n5783 (la1)\r\n5784 (long3)\r\n5785 (long3)\r\n5786 (lu2)\r\n5787 (ao4)\r\n5788 (none0)\r\n5789 (pao2)\r\n578A (none0)\r\n578B (xing2)\r\n578C (tong2,dong4)\r\n578D (ji4)\r\n578E (ke4)\r\n578F (lu4)\r\n5790 (ci2)\r\n5791 (chi3)\r\n5792 (lei3)\r\n5793 (gai1)\r\n5794 (yin1)\r\n5795 (hou4)\r\n5796 (dui1)\r\n5797 (zhao4)\r\n5798 (fu2)\r\n5799 (guang1)\r\n579A (yao2)\r\n579B (duo3,duo4)\r\n579C (duo3,duo4)\r\n579D (gui3)\r\n579E (cha2)\r\n579F (yang2)\r\n57A0 (yin2)\r\n57A1 (fa2)\r\n57A2 (gou4)\r\n57A3 (yuan2)\r\n57A4 (die2)\r\n57A5 (xie2)\r\n57A6 (ken3)\r\n57A7 (shang3)\r\n57A8 (shou3)\r\n57A9 (e4)\r\n57AA (none0)\r\n57AB (dian4)\r\n57AC (hong2)\r\n57AD (ya1,ya4)\r\n57AE (kua3)\r\n57AF (da5)\r\n57B0 (none0)\r\n57B1 (dang4)\r\n57B2 (kai3)\r\n57B3 (none0)\r\n57B4 (nao3)\r\n57B5 (an1)\r\n57B6 (xing1)\r\n57B7 (xian4)\r\n57B8 (huan4,huan2,yuan4)\r\n57B9 (bang1)\r\n57BA (pei1)\r\n57BB (ba4)\r\n57BC (yi4)\r\n57BD (yin4)\r\n57BE (han4)\r\n57BF (xu4)\r\n57C0 (chui2)\r\n57C1 (cen2)\r\n57C2 (geng3)\r\n57C3 (ai1)\r\n57C4 (peng2)\r\n57C5 (fang2)\r\n57C6 (que4)\r\n57C7 (yong3)\r\n57C8 (jun4)\r\n57C9 (jia2)\r\n57CA (di4)\r\n57CB (mai2,man2)\r\n57CC (lang4)\r\n57CD (xuan4)\r\n57CE (cheng2)\r\n57CF (shan1)\r\n57D0 (jin1)\r\n57D1 (zhe2)\r\n57D2 (lie4,le4)\r\n57D3 (lie4)\r\n57D4 (pu3,bu4,bu3)\r\n57D5 (cheng2)\r\n57D6 (none0)\r\n57D7 (bu4)\r\n57D8 (shi2)\r\n57D9 (xun1)\r\n57DA (guo1)\r\n57DB (jiong1)\r\n57DC (ye3)\r\n57DD (nian4)\r\n57DE (di1)\r\n57DF (yu4)\r\n57E0 (bu4)\r\n57E1 (wu4,ya1)\r\n57E2 (juan3)\r\n57E3 (sui4)\r\n57E4 (pi2,bei1,bi4)\r\n57E5 (cheng1)\r\n57E6 (wan3)\r\n57E7 (ju4)\r\n57E8 (lun3)\r\n57E9 (zheng1)\r\n57EA (kong1)\r\n57EB (zhong3)\r\n57EC (dong1)\r\n57ED (dai4)\r\n57EE (tan4)\r\n57EF (an3)\r\n57F0 (cai4)\r\n57F1 (shu2)\r\n57F2 (beng3)\r\n57F3 (kan3)\r\n57F4 (zhi2)\r\n57F5 (duo3)\r\n57F6 (yi4)\r\n57F7 (zhi2)\r\n57F8 (yi4)\r\n57F9 (pei2)\r\n57FA (ji1)\r\n57FB (zhun3)\r\n57FC (qi2)\r\n57FD (sao4)\r\n57FE (ju4)\r\n57FF (ni2,ni4)\r\n5800 (ku1,jue2)\r\n5801 (ke3)\r\n5802 (tang2)\r\n5803 (kun1)\r\n5804 (ni4)\r\n5805 (jian1)\r\n5806 (dui1,zui1)\r\n5807 (jin3)\r\n5808 (gang1)\r\n5809 (yu4)\r\n580A (e4,wu4)\r\n580B (peng2,beng4,peng4)\r\n580C (gu4)\r\n580D (tu4)\r\n580E (leng4,ling2)\r\n580F (none0)\r\n5810 (ya2)\r\n5811 (qian4)\r\n5812 (none0)\r\n5813 (an4)\r\n5814 (chen1)\r\n5815 (duo4,hui1)\r\n5816 (nao3)\r\n5817 (tu1)\r\n5818 (cheng2)\r\n5819 (yin1)\r\n581A (hun2)\r\n581B (bi4)\r\n581C (lian4)\r\n581D (guo1)\r\n581E (die2)\r\n581F (zhuan4)\r\n5820 (hou4)\r\n5821 (bao3,bu3,pu4,pu3)\r\n5822 (bao3)\r\n5823 (yu2)\r\n5824 (di1,ti2)\r\n5825 (mao2)\r\n5826 (jie1)\r\n5827 (ruan2)\r\n5828 (e4,ai4)\r\n5829 (geng4)\r\n582A (kan1)\r\n582B (zong1)\r\n582C (yu2)\r\n582D (huang2)\r\n582E (e4)\r\n582F (yao2)\r\n5830 (yan4)\r\n5831 (bao4)\r\n5832 (ji2)\r\n5833 (mei2)\r\n5834 (chang2,chang3)\r\n5835 (du3)\r\n5836 (tuo1)\r\n5837 (an3)\r\n5838 (feng2)\r\n5839 (zhong4)\r\n583A (jie4)\r\n583B (zhen1)\r\n583C (heng4)\r\n583D (gang1)\r\n583E (chuan3)\r\n583F (jian3)\r\n5840 (none0)\r\n5841 (lei3)\r\n5842 (gang3)\r\n5843 (huang1)\r\n5844 (leng2)\r\n5845 (duan4)\r\n5846 (wan1)\r\n5847 (xuan1)\r\n5848 (ji4)\r\n5849 (ji2)\r\n584A (kuai4)\r\n584B (ying2)\r\n584C (ta1)\r\n584D (cheng2)\r\n584E (yong3)\r\n584F (kai3)\r\n5850 (su4)\r\n5851 (su4)\r\n5852 (shi2)\r\n5853 (mi4)\r\n5854 (ta3,da5)\r\n5855 (weng3)\r\n5856 (cheng2)\r\n5857 (tu2)\r\n5858 (tang2)\r\n5859 (qiao1)\r\n585A (zhong3)\r\n585B (li4)\r\n585C (peng2)\r\n585D (bang4)\r\n585E (sai4,se4,sai1)\r\n585F (zang4)\r\n5860 (dui1)\r\n5861 (tian2)\r\n5862 (wu4)\r\n5863 (cheng3)\r\n5864 (xun1,xuan1)\r\n5865 (ge2)\r\n5866 (zhen4)\r\n5867 (ai4)\r\n5868 (gong1)\r\n5869 (yan2)\r\n586A (kan3)\r\n586B (tian2)\r\n586C (yuan2)\r\n586D (wen1)\r\n586E (xie4)\r\n586F (liu4)\r\n5870 (none0)\r\n5871 (lang3)\r\n5872 (chang2,chang3)\r\n5873 (peng2)\r\n5874 (beng1)\r\n5875 (chen2)\r\n5876 (lu4)\r\n5877 (lu3)\r\n5878 (ou1)\r\n5879 (qian4)\r\n587A (mei2)\r\n587B (mo4)\r\n587C (zhuan1)\r\n587D (shuang3)\r\n587E (shu2)\r\n587F (lou3)\r\n5880 (chi2)\r\n5881 (man4)\r\n5882 (biao1)\r\n5883 (jing4)\r\n5884 (ce4)\r\n5885 (shu4)\r\n5886 (di4)\r\n5887 (zhang4)\r\n5888 (kan4)\r\n5889 (yong1)\r\n588A (dian4)\r\n588B (chen3)\r\n588C (zhi2)\r\n588D (ji4)\r\n588E (guo1)\r\n588F (qiang3)\r\n5890 (jin3)\r\n5891 (di1)\r\n5892 (shang1)\r\n5893 (mu4)\r\n5894 (cui1)\r\n5895 (yan4)\r\n5896 (ta3,da5)\r\n5897 (zeng1)\r\n5898 (qi2)\r\n5899 (qiang2)\r\n589A (liang2)\r\n589B (none0)\r\n589C (zhui4)\r\n589D (qiao1)\r\n589E (zeng1)\r\n589F (xu1)\r\n58A0 (shan4)\r\n58A1 (shan4)\r\n58A2 (ba2)\r\n58A3 (pu2)\r\n58A4 (kuai4)\r\n58A5 (dong3)\r\n58A6 (fan2)\r\n58A7 (que4)\r\n58A8 (mo4)\r\n58A9 (dun1)\r\n58AA (dun1)\r\n58AB (zun1,zun3)\r\n58AC (zui4)\r\n58AD (sheng4)\r\n58AE (duo4,hui1)\r\n58AF (duo4)\r\n58B0 (tan2)\r\n58B1 (deng4,yan4)\r\n58B2 (mu2)\r\n58B3 (fen2)\r\n58B4 (huang2)\r\n58B5 (tan2)\r\n58B6 (da5)\r\n58B7 (ye4)\r\n58B8 (chu2)\r\n58B9 (none0)\r\n58BA (ao4)\r\n58BB (qiang2)\r\n58BC (ji1)\r\n58BD (qiao1)\r\n58BE (ken3)\r\n58BF (yi4)\r\n58C0 (pi2)\r\n58C1 (bi4)\r\n58C2 (dian4)\r\n58C3 (jiang1)\r\n58C4 (ye3)\r\n58C5 (yong1,yong3)\r\n58C6 (xue2)\r\n58C7 (tan2)\r\n58C8 (lan3)\r\n58C9 (ju4)\r\n58CA (huai4,pi1)\r\n58CB (dang4)\r\n58CC (rang3)\r\n58CD (qian4)\r\n58CE (xuan1)\r\n58CF (lan4)\r\n58D0 (mi2)\r\n58D1 (he4,huo4)\r\n58D2 (kai4)\r\n58D3 (ya1,ya4)\r\n58D4 (dao3)\r\n58D5 (hao2)\r\n58D6 (ruan2)\r\n58D7 (none0)\r\n58D8 (lei3)\r\n58D9 (kuang4)\r\n58DA (lu2)\r\n58DB (yan2)\r\n58DC (tan2)\r\n58DD (wei3)\r\n58DE (huai4,pi1)\r\n58DF (long3)\r\n58E0 (long3)\r\n58E1 (rui4)\r\n58E2 (li4)\r\n58E3 (lin2)\r\n58E4 (rang3)\r\n58E5 (chan2)\r\n58E6 (xun1)\r\n58E7 (yan2)\r\n58E8 (lei2)\r\n58E9 (ba4)\r\n58EA (none0)\r\n58EB (shi4)\r\n58EC (ren2)\r\n58ED (none0)\r\n58EE (zhuang4)\r\n58EF (zhuang4)\r\n58F0 (sheng1)\r\n58F1 (yi1)\r\n58F2 (mai4)\r\n58F3 (qiao4,ke2)\r\n58F4 (zhu3)\r\n58F5 (zhuang4)\r\n58F6 (hu2)\r\n58F7 (hu2)\r\n58F8 (kun3)\r\n58F9 (yi1)\r\n58FA (hu2)\r\n58FB (xu4)\r\n58FC (kun3)\r\n58FD (shou4)\r\n58FE (mang3)\r\n58FF (zun1)\r\n5900 (shou4)\r\n5901 (yi1)\r\n5902 (zhi3)\r\n5903 (gu1)\r\n5904 (chu3,chu4)\r\n5905 (xiang2)\r\n5906 (feng2)\r\n5907 (bei4)\r\n5908 (none0)\r\n5909 (bian4)\r\n590A (sui1)\r\n590B (qun1)\r\n590C (ling2)\r\n590D (fu4)\r\n590E (zuo4)\r\n590F (xia4,jia3)\r\n5910 (xiong4)\r\n5911 (none0)\r\n5912 (nao2)\r\n5913 (xia4)\r\n5914 (kui2)\r\n5915 (xi1,xi4)\r\n5916 (wai4)\r\n5917 (yuan4)\r\n5918 (mao3)\r\n5919 (su4)\r\n591A (duo1)\r\n591B (duo1)\r\n591C (ye4)\r\n591D (qing2)\r\n591E (none0)\r\n591F (gou4)\r\n5920 (gou4)\r\n5921 (qi4)\r\n5922 (meng4)\r\n5923 (meng4)\r\n5924 (yin2)\r\n5925 (huo3)\r\n5926 (chen4)\r\n5927 (da4,dai4)\r\n5928 (ze4)\r\n5929 (tian1)\r\n592A (tai4)\r\n592B (fu1,fu2)\r\n592C (guai4)\r\n592D (yao1,yao3)\r\n592E (yang1)\r\n592F (hang1,ben4)\r\n5930 (gao3)\r\n5931 (shi1)\r\n5932 (ben3,tao1)\r\n5933 (tai4)\r\n5934 (tou2)\r\n5935 (yan3)\r\n5936 (bi3)\r\n5937 (yi2)\r\n5938 (kua1)\r\n5939 (jia1,jia2,ga1)\r\n593A (duo2)\r\n593B (none0)\r\n593C (kuang3)\r\n593D (yun4)\r\n593E (jia1,jia2)\r\n593F (ba1)\r\n5940 (en1,mang2)\r\n5941 (lian2)\r\n5942 (huan4)\r\n5943 (di1)\r\n5944 (yan3,yan1)\r\n5945 (pao4)\r\n5946 (juan4)\r\n5947 (qi2,ji1)\r\n5948 (nai4,nai3)\r\n5949 (feng4)\r\n594A (xie2)\r\n594B (fen4)\r\n594C (dian3)\r\n594D (none0)\r\n594E (kui2)\r\n594F (zou4)\r\n5950 (huan4)\r\n5951 (qi4,xie4,qie4)\r\n5952 (kai1)\r\n5953 (she1)\r\n5954 (ben1,ben4)\r\n5955 (yi4)\r\n5956 (jiang3)\r\n5957 (tao4)\r\n5958 (zhuang3,zang4)\r\n5959 (ben3)\r\n595A (xi1)\r\n595B (huang3)\r\n595C (fei3)\r\n595D (diao1)\r\n595E (sui1)\r\n595F (beng1)\r\n5960 (dian4)\r\n5961 (ao4)\r\n5962 (she1)\r\n5963 (weng1)\r\n5964 (pan3)\r\n5965 (ao4)\r\n5966 (wu4)\r\n5967 (ao4)\r\n5968 (jiang3)\r\n5969 (lian2)\r\n596A (duo2)\r\n596B (yun1)\r\n596C (jiang3)\r\n596D (shi4)\r\n596E (fen4)\r\n596F (huo4)\r\n5970 (bei4)\r\n5971 (lian2)\r\n5972 (che3)\r\n5973 (nu:3,ru3)\r\n5974 (nu2)\r\n5975 (ding3)\r\n5976 (nai3)\r\n5977 (qian1)\r\n5978 (jian1)\r\n5979 (ta1)\r\n597A (jiu3)\r\n597B (nan2)\r\n597C (cha4)\r\n597D (hao3,hao4)\r\n597E (xian1)\r\n597F (fan4)\r\n5980 (ji3)\r\n5981 (shuo4)\r\n5982 (ru2)\r\n5983 (fei1)\r\n5984 (wang4)\r\n5985 (hong2)\r\n5986 (zhuang1)\r\n5987 (fu4)\r\n5988 (ma1)\r\n5989 (dan1)\r\n598A (ren4)\r\n598B (fu1)\r\n598C (jing4)\r\n598D (yan2)\r\n598E (xie4)\r\n598F (wen4)\r\n5990 (zhong1)\r\n5991 (pa1)\r\n5992 (du4)\r\n5993 (ji4)\r\n5994 (keng1)\r\n5995 (zhong4)\r\n5996 (yao1)\r\n5997 (jin4)\r\n5998 (yun2)\r\n5999 (miao4)\r\n599A (pei1)\r\n599B (chi1)\r\n599C (yue4)\r\n599D (zhuang1)\r\n599E (niu1)\r\n599F (yan4)\r\n59A0 (na4)\r\n59A1 (xin1,xin4)\r\n59A2 (fen2)\r\n59A3 (bi3)\r\n59A4 (yu2)\r\n59A5 (tuo3)\r\n59A6 (feng1)\r\n59A7 (yuan2)\r\n59A8 (fang2,fang1)\r\n59A9 (wu3)\r\n59AA (yu4)\r\n59AB (gui1)\r\n59AC (du4)\r\n59AD (ba2)\r\n59AE (ni1)\r\n59AF (zhou2)\r\n59B0 (zhou2)\r\n59B1 (zhao1)\r\n59B2 (da2)\r\n59B3 (nai3,ni3)\r\n59B4 (yuan3)\r\n59B5 (tou3)\r\n59B6 (xuan2)\r\n59B7 (zhi2)\r\n59B8 (e1)\r\n59B9 (mei4)\r\n59BA (mo4)\r\n59BB (qi1,qi4)\r\n59BC (bi4)\r\n59BD (shen1)\r\n59BE (qie4)\r\n59BF (e1)\r\n59C0 (he2)\r\n59C1 (xu3)\r\n59C2 (fa2)\r\n59C3 (zheng1)\r\n59C4 (ni1)\r\n59C5 (ban4)\r\n59C6 (mu3)\r\n59C7 (fu1,fu4)\r\n59C8 (ling2)\r\n59C9 (zi3)\r\n59CA (zi3)\r\n59CB (shi3)\r\n59CC (ran3)\r\n59CD (shan1)\r\n59CE (yang1)\r\n59CF (qian2)\r\n59D0 (jie3)\r\n59D1 (gu1)\r\n59D2 (si4)\r\n59D3 (xing4)\r\n59D4 (wei3,wei1)\r\n59D5 (zi1)\r\n59D6 (ju4)\r\n59D7 (shan1)\r\n59D8 (pin1)\r\n59D9 (ren4)\r\n59DA (yao2)\r\n59DB (tong3)\r\n59DC (jiang1)\r\n59DD (shu1)\r\n59DE (ji2)\r\n59DF (gai1)\r\n59E0 (shang4)\r\n59E1 (kuo4)\r\n59E2 (juan1)\r\n59E3 (jiao1)\r\n59E4 (gou4)\r\n59E5 (lao3,mu3)\r\n59E6 (jian1)\r\n59E7 (jian1)\r\n59E8 (yi2)\r\n59E9 (nian2)\r\n59EA (zhi2)\r\n59EB (ji1)\r\n59EC (ji1)\r\n59ED (xian4)\r\n59EE (heng2)\r\n59EF (guang1)\r\n59F0 (jun1)\r\n59F1 (kua1)\r\n59F2 (yan4)\r\n59F3 (ming3)\r\n59F4 (lie4)\r\n59F5 (pei4)\r\n59F6 (yan3)\r\n59F7 (you4)\r\n59F8 (yan2)\r\n59F9 (cha4)\r\n59FA (xian3)\r\n59FB (yin1)\r\n59FC (chi3)\r\n59FD (gui3)\r\n59FE (quan2)\r\n59FF (zi1)\r\n5A00 (song1)\r\n5A01 (wei1)\r\n5A02 (hong2)\r\n5A03 (wa2)\r\n5A04 (lou2)\r\n5A05 (ya4)\r\n5A06 (rao3,rao2)\r\n5A07 (jiao1)\r\n5A08 (luan2)\r\n5A09 (ping1)\r\n5A0A (xian4)\r\n5A0B (shao4)\r\n5A0C (li3)\r\n5A0D (cheng2)\r\n5A0E (xie4)\r\n5A0F (mang2)\r\n5A10 (none0)\r\n5A11 (suo1)\r\n5A12 (mu3)\r\n5A13 (wei3)\r\n5A14 (ke4)\r\n5A15 (lai4)\r\n5A16 (chuo4)\r\n5A17 (ding4)\r\n5A18 (niang2)\r\n5A19 (keng1)\r\n5A1A (nan2)\r\n5A1B (yu2)\r\n5A1C (na4,nuo2)\r\n5A1D (pei1)\r\n5A1E (sui1)\r\n5A1F (juan1)\r\n5A20 (shen1,chen2,zhen4)\r\n5A21 (zhi4)\r\n5A22 (han2)\r\n5A23 (di4)\r\n5A24 (zhuang1)\r\n5A25 (e2)\r\n5A26 (pin2)\r\n5A27 (tui4)\r\n5A28 (xian4)\r\n5A29 (mian3,wan3)\r\n5A2A (wu2)\r\n5A2B (yan2)\r\n5A2C (wu3)\r\n5A2D (xi1)\r\n5A2E (yan2)\r\n5A2F (yu2)\r\n5A30 (si4)\r\n5A31 (yu2)\r\n5A32 (wa1)\r\n5A33 (li4)\r\n5A34 (xian2)\r\n5A35 (ju1)\r\n5A36 (qu3,qu4)\r\n5A37 (chui2)\r\n5A38 (qi1)\r\n5A39 (xian2)\r\n5A3A (zhui1)\r\n5A3B (dong1)\r\n5A3C (chang1)\r\n5A3D (lu4)\r\n5A3E (ai2)\r\n5A3F (e1)\r\n5A40 (e1)\r\n5A41 (lou2,lu:3)\r\n5A42 (mian2)\r\n5A43 (cong2)\r\n5A44 (pou3)\r\n5A45 (ju2)\r\n5A46 (po2)\r\n5A47 (cai3)\r\n5A48 (ling2)\r\n5A49 (wan3)\r\n5A4A (biao3)\r\n5A4B (xiao1)\r\n5A4C (shu3)\r\n5A4D (qi3)\r\n5A4E (hui1)\r\n5A4F (fu4)\r\n5A50 (wo3)\r\n5A51 (rui2)\r\n5A52 (tan2)\r\n5A53 (fei1)\r\n5A54 (none0)\r\n5A55 (jie2)\r\n5A56 (tian1)\r\n5A57 (ni2)\r\n5A58 (quan2)\r\n5A59 (jing4)\r\n5A5A (hun1)\r\n5A5B (jing1)\r\n5A5C (qian1)\r\n5A5D (dian4)\r\n5A5E (xing4)\r\n5A5F (hu4)\r\n5A60 (wan2)\r\n5A61 (lai2)\r\n5A62 (bi4)\r\n5A63 (yin1)\r\n5A64 (chou1,zhou1)\r\n5A65 (chuo4)\r\n5A66 (fu4)\r\n5A67 (jing4)\r\n5A68 (lun2)\r\n5A69 (yan4,an4)\r\n5A6A (lan2)\r\n5A6B (kun1)\r\n5A6C (yin2)\r\n5A6D (ya4)\r\n5A6E (none0)\r\n5A6F (li4)\r\n5A70 (dian3)\r\n5A71 (xian2)\r\n5A72 (none0)\r\n5A73 (hua4)\r\n5A74 (ying1)\r\n5A75 (chan2)\r\n5A76 (shen3)\r\n5A77 (ting2)\r\n5A78 (yang2)\r\n5A79 (yao3)\r\n5A7A (wu4)\r\n5A7B (nan4)\r\n5A7C (chuo4)\r\n5A7D (jia3)\r\n5A7E (tou1)\r\n5A7F (xu4)\r\n5A80 (yu2)\r\n5A81 (wei1)\r\n5A82 (ti2)\r\n5A83 (rou2)\r\n5A84 (mei3)\r\n5A85 (dan1)\r\n5A86 (ruan3)\r\n5A87 (qin1)\r\n5A88 (none0)\r\n5A89 (wu1)\r\n5A8A (qian2)\r\n5A8B (chun1)\r\n5A8C (mao2)\r\n5A8D (fu4)\r\n5A8E (jie3)\r\n5A8F (duan1)\r\n5A90 (xi1)\r\n5A91 (zhong4)\r\n5A92 (mei2)\r\n5A93 (huang2)\r\n5A94 (mian2)\r\n5A95 (an1)\r\n5A96 (ying2)\r\n5A97 (xuan1)\r\n5A98 (none0)\r\n5A99 (wei1)\r\n5A9A (mei4)\r\n5A9B (yuan2,yuan4)\r\n5A9C (zhen1)\r\n5A9D (qiu1)\r\n5A9E (ti2,shi4)\r\n5A9F (xie4)\r\n5AA0 (tuo3)\r\n5AA1 (lian4)\r\n5AA2 (mao4)\r\n5AA3 (ran3)\r\n5AA4 (si1)\r\n5AA5 (pian1)\r\n5AA6 (wei4)\r\n5AA7 (wa1)\r\n5AA8 (jiu4)\r\n5AA9 (hu2)\r\n5AAA (ao3)\r\n5AAB (none0)\r\n5AAC (bao3)\r\n5AAD (xu1)\r\n5AAE (tou1,tou3)\r\n5AAF (gui1)\r\n5AB0 (zou1)\r\n5AB1 (yao2)\r\n5AB2 (pi4)\r\n5AB3 (xi2)\r\n5AB4 (yuan2)\r\n5AB5 (ying4)\r\n5AB6 (rong2)\r\n5AB7 (ru4)\r\n5AB8 (chi1)\r\n5AB9 (liu2)\r\n5ABA (mei3)\r\n5ABB (pan2)\r\n5ABC (ao3)\r\n5ABD (ma1)\r\n5ABE (gou4)\r\n5ABF (kui4)\r\n5AC0 (qin2)\r\n5AC1 (jia4)\r\n5AC2 (sao3)\r\n5AC3 (zhen1)\r\n5AC4 (yuan2)\r\n5AC5 (cha1)\r\n5AC6 (yong2)\r\n5AC7 (ming2)\r\n5AC8 (ying1)\r\n5AC9 (ji2)\r\n5ACA (su4)\r\n5ACB (niao3)\r\n5ACC (xian2)\r\n5ACD (tao1,yao3)\r\n5ACE (pang2)\r\n5ACF (lang2)\r\n5AD0 (niao3)\r\n5AD1 (bao2)\r\n5AD2 (ai4)\r\n5AD3 (pi4)\r\n5AD4 (pin2)\r\n5AD5 (yi4)\r\n5AD6 (piao2)\r\n5AD7 (yu4)\r\n5AD8 (lei2)\r\n5AD9 (xuan2)\r\n5ADA (man4,man1)\r\n5ADB (yi1)\r\n5ADC (zhang1)\r\n5ADD (kang1)\r\n5ADE (yong2)\r\n5ADF (ni4)\r\n5AE0 (li2)\r\n5AE1 (di2)\r\n5AE2 (gui1)\r\n5AE3 (yan1)\r\n5AE4 (jin4)\r\n5AE5 (zhuan1)\r\n5AE6 (chang2)\r\n5AE7 (ce4)\r\n5AE8 (han1,ran3)\r\n5AE9 (nen4)\r\n5AEA (lao4)\r\n5AEB (mo2)\r\n5AEC (zhe1)\r\n5AED (hu4)\r\n5AEE (hu4)\r\n5AEF (ao4)\r\n5AF0 (nen4)\r\n5AF1 (qiang2)\r\n5AF2 (none0)\r\n5AF3 (bi4)\r\n5AF4 (gu1)\r\n5AF5 (wu3)\r\n5AF6 (qiao2)\r\n5AF7 (tuo3)\r\n5AF8 (zhan3)\r\n5AF9 (mao2)\r\n5AFA (xian2)\r\n5AFB (xian2)\r\n5AFC (mo4)\r\n5AFD (liao2)\r\n5AFE (lian2)\r\n5AFF (hua4)\r\n5B00 (gui1)\r\n5B01 (deng1)\r\n5B02 (zhi2)\r\n5B03 (xu1)\r\n5B04 (none0)\r\n5B05 (hua4)\r\n5B06 (xi1)\r\n5B07 (hui4)\r\n5B08 (rao3,rao2)\r\n5B09 (xi1)\r\n5B0A (yan4)\r\n5B0B (chan2)\r\n5B0C (jiao1)\r\n5B0D (mei3)\r\n5B0E (fan4)\r\n5B0F (fan1)\r\n5B10 (xian1)\r\n5B11 (yi4)\r\n5B12 (wei4)\r\n5B13 (chan1)\r\n5B14 (fan4)\r\n5B15 (shi4)\r\n5B16 (bi4)\r\n5B17 (shan4)\r\n5B18 (sui4)\r\n5B19 (qiang2)\r\n5B1A (lian2)\r\n5B1B (huan2,qiong2,xuan1)\r\n5B1C (none0)\r\n5B1D (niao3)\r\n5B1E (dong3)\r\n5B1F (yi4)\r\n5B20 (can2)\r\n5B21 (ai4)\r\n5B22 (niang2)\r\n5B23 (ning2)\r\n5B24 (ma1)\r\n5B25 (tiao3)\r\n5B26 (chou2)\r\n5B27 (jin4)\r\n5B28 (ci2)\r\n5B29 (yu2)\r\n5B2A (pin2)\r\n5B2B (none0)\r\n5B2C (xu1)\r\n5B2D (nai3)\r\n5B2E (yan1)\r\n5B2F (tai2)\r\n5B30 (ying1)\r\n5B31 (can2)\r\n5B32 (niao3)\r\n5B33 (none0)\r\n5B34 (ying2)\r\n5B35 (mian2)\r\n5B36 (none0)\r\n5B37 (ma1)\r\n5B38 (shen3)\r\n5B39 (xing4)\r\n5B3A (ni4)\r\n5B3B (du2)\r\n5B3C (liu2)\r\n5B3D (yuan1)\r\n5B3E (lan3)\r\n5B3F (yan4)\r\n5B40 (shuang1)\r\n5B41 (ling2)\r\n5B42 (jiao3)\r\n5B43 (niang2)\r\n5B44 (lan3)\r\n5B45 (xian1)\r\n5B46 (ying1)\r\n5B47 (shuang1)\r\n5B48 (shuai1)\r\n5B49 (quan2)\r\n5B4A (mi3)\r\n5B4B (li2)\r\n5B4C (luan2)\r\n5B4D (yan2)\r\n5B4E (zhu3)\r\n5B4F (lan3)\r\n5B50 (zi5,zi3,zi2)\r\n5B51 (jie2)\r\n5B52 (jue2)\r\n5B53 (jue2)\r\n5B54 (kong3)\r\n5B55 (yun4)\r\n5B56 (zi1)\r\n5B57 (zi4)\r\n5B58 (cun2)\r\n5B59 (sun1)\r\n5B5A (fu2)\r\n5B5B (bei4,bo2)\r\n5B5C (zi1)\r\n5B5D (xiao4)\r\n5B5E (xin4)\r\n5B5F (meng4)\r\n5B60 (si4)\r\n5B61 (tai1)\r\n5B62 (bao1)\r\n5B63 (ji4)\r\n5B64 (gu1)\r\n5B65 (nu2)\r\n5B66 (xue2)\r\n5B67 (none0)\r\n5B68 (chan2)\r\n5B69 (hai2)\r\n5B6A (luan2)\r\n5B6B (sun1)\r\n5B6C (nao1)\r\n5B6D (mie1)\r\n5B6E (cong2)\r\n5B6F (jian1)\r\n5B70 (shu2)\r\n5B71 (chan2,can4)\r\n5B72 (ya1)\r\n5B73 (zi1,zi4)\r\n5B74 (ni3)\r\n5B75 (fu1)\r\n5B76 (zi1)\r\n5B77 (li2)\r\n5B78 (xue2,xiao2)\r\n5B79 (bo4)\r\n5B7A (ru2,ru4)\r\n5B7B (nai2)\r\n5B7C (nie4)\r\n5B7D (nie4)\r\n5B7E (ying1)\r\n5B7F (luan2)\r\n5B80 (mian2)\r\n5B81 (ning2,ning4)\r\n5B82 (rong3)\r\n5B83 (ta1)\r\n5B84 (gui3)\r\n5B85 (zhai2,zhe4)\r\n5B86 (qiong2)\r\n5B87 (yu3)\r\n5B88 (shou3)\r\n5B89 (an1)\r\n5B8A (tu1)\r\n5B8B (song4)\r\n5B8C (wan2)\r\n5B8D (rou4)\r\n5B8E (yao3)\r\n5B8F (hong2)\r\n5B90 (yi2)\r\n5B91 (jing3)\r\n5B92 (zhun1)\r\n5B93 (mi4)\r\n5B94 (guai1)\r\n5B95 (dang4)\r\n5B96 (hong2)\r\n5B97 (zong1)\r\n5B98 (guan1)\r\n5B99 (zhou4)\r\n5B9A (ding4)\r\n5B9B (wan3,yuan1)\r\n5B9C (yi2)\r\n5B9D (bao3)\r\n5B9E (shi2)\r\n5B9F (shi2)\r\n5BA0 (chong3)\r\n5BA1 (shen3)\r\n5BA2 (ke4)\r\n5BA3 (xuan1)\r\n5BA4 (shi4)\r\n5BA5 (you4)\r\n5BA6 (huan4)\r\n5BA7 (yi2)\r\n5BA8 (tiao3)\r\n5BA9 (shi3)\r\n5BAA (xian4)\r\n5BAB (gong1)\r\n5BAC (cheng2)\r\n5BAD (qun2)\r\n5BAE (gong1)\r\n5BAF (xiao1)\r\n5BB0 (zai3)\r\n5BB1 (zha1)\r\n5BB2 (bao3)\r\n5BB3 (hai4)\r\n5BB4 (yan4)\r\n5BB5 (xiao1)\r\n5BB6 (jia1,gu1,jie5,jia5)\r\n5BB7 (shen3)\r\n5BB8 (chen2)\r\n5BB9 (rong2)\r\n5BBA (huang3)\r\n5BBB (mi4)\r\n5BBC (kou4)\r\n5BBD (kuan1)\r\n5BBE (bin1)\r\n5BBF (su4,xiu3,xiu4)\r\n5BC0 (cai3,shen3)\r\n5BC1 (zan3)\r\n5BC2 (ji4,ji2)\r\n5BC3 (yuan1)\r\n5BC4 (ji4)\r\n5BC5 (yin2)\r\n5BC6 (mi4)\r\n5BC7 (kou4)\r\n5BC8 (qing1)\r\n5BC9 (he4)\r\n5BCA (zhen1)\r\n5BCB (jian3)\r\n5BCC (fu4)\r\n5BCD (ning2)\r\n5BCE (bing4)\r\n5BCF (huan2)\r\n5BD0 (mei4)\r\n5BD1 (qin3)\r\n5BD2 (han2)\r\n5BD3 (yu4)\r\n5BD4 (shi2)\r\n5BD5 (ning2)\r\n5BD6 (jin4)\r\n5BD7 (ning2)\r\n5BD8 (zhi4)\r\n5BD9 (yu3)\r\n5BDA (bao3)\r\n5BDB (kuan1)\r\n5BDC (ning2)\r\n5BDD (qin3)\r\n5BDE (mo4)\r\n5BDF (cha2)\r\n5BE0 (ju4)\r\n5BE1 (gua3)\r\n5BE2 (qin3)\r\n5BE3 (hu1)\r\n5BE4 (wu4)\r\n5BE5 (liao2)\r\n5BE6 (shi2)\r\n5BE7 (ning2,ning4)\r\n5BE8 (zhai4)\r\n5BE9 (shen3)\r\n5BEA (wei3)\r\n5BEB (xie3)\r\n5BEC (kuan1)\r\n5BED (hui4)\r\n5BEE (liao2)\r\n5BEF (jun4)\r\n5BF0 (huan2)\r\n5BF1 (yi4)\r\n5BF2 (yi2)\r\n5BF3 (bao3)\r\n5BF4 (qin1)\r\n5BF5 (chong3)\r\n5BF6 (bao3)\r\n5BF7 (feng1)\r\n5BF8 (cun4)\r\n5BF9 (dui4)\r\n5BFA (si4)\r\n5BFB (xun2,xin2)\r\n5BFC (dao3)\r\n5BFD (lu:3,luo1)\r\n5BFE (dui4)\r\n5BFF (shou4)\r\n5C00 (po3)\r\n5C01 (feng1)\r\n5C02 (zhuan1)\r\n5C03 (fu1)\r\n5C04 (she4,shi2,ye4)\r\n5C05 (ke4)\r\n5C06 (jiang1,jiang4,qiang1)\r\n5C07 (jiang1,jiang4,qiang1)\r\n5C08 (zhuan1)\r\n5C09 (wei4,yu4)\r\n5C0A (zun1)\r\n5C0B (xun2,xin2)\r\n5C0C (shu4)\r\n5C0D (dui4)\r\n5C0E (dao3,dao4)\r\n5C0F (xiao3)\r\n5C10 (ji1)\r\n5C11 (shao3,shao4)\r\n5C12 (er3)\r\n5C13 (er3)\r\n5C14 (er3)\r\n5C15 (ga3)\r\n5C16 (jian1)\r\n5C17 (shu1)\r\n5C18 (chen2)\r\n5C19 (shang4)\r\n5C1A (shang4)\r\n5C1B (yuan2)\r\n5C1C (ga2)\r\n5C1D (chang2)\r\n5C1E (liao2,liao3)\r\n5C1F (xian3)\r\n5C20 (xian1)\r\n5C21 (none0)\r\n5C22 (wang1,you2)\r\n5C23 (wang1,you2)\r\n5C24 (you2)\r\n5C25 (liao4)\r\n5C26 (liao4)\r\n5C27 (yao2)\r\n5C28 (mang2,pang2)\r\n5C29 (wang1)\r\n5C2A (wang1)\r\n5C2B (wang1)\r\n5C2C (ga4)\r\n5C2D (yao2)\r\n5C2E (duo4)\r\n5C2F (kui4)\r\n5C30 (zhong3,zhong4)\r\n5C31 (jiu4)\r\n5C32 (gan1)\r\n5C33 (gu3)\r\n5C34 (gan1)\r\n5C35 (gan1)\r\n5C36 (gan1)\r\n5C37 (gan1)\r\n5C38 (shi1)\r\n5C39 (yin3)\r\n5C3A (chi3,che3)\r\n5C3B (kao1)\r\n5C3C (ni2)\r\n5C3D (jin3,jin4)\r\n5C3E (wei3,yi3)\r\n5C3F (niao4,sui1,ni4)\r\n5C40 (ju2)\r\n5C41 (pi4)\r\n5C42 (ceng2)\r\n5C43 (xi4)\r\n5C44 (bi1,bi3)\r\n5C45 (ju1,ji1)\r\n5C46 (jie4)\r\n5C47 (tian1)\r\n5C48 (qu1)\r\n5C49 (ti4)\r\n5C4A (jie4)\r\n5C4B (wu1)\r\n5C4C (diao3)\r\n5C4D (shi1)\r\n5C4E (shi3)\r\n5C4F (ping2,bing3)\r\n5C50 (ji1)\r\n5C51 (xie4)\r\n5C52 (chen2)\r\n5C53 (xi4)\r\n5C54 (ni2)\r\n5C55 (zhan3)\r\n5C56 (xi1)\r\n5C57 (none0)\r\n5C58 (man3)\r\n5C59 (e1)\r\n5C5A (lou4)\r\n5C5B (ping2)\r\n5C5C (ti4)\r\n5C5D (fei4)\r\n5C5E (shu3,zhu3)\r\n5C5F (xie4)\r\n5C60 (tu2)\r\n5C61 (lu:3)\r\n5C62 (lu:3)\r\n5C63 (xi3)\r\n5C64 (ceng2)\r\n5C65 (lu:3)\r\n5C66 (ju4)\r\n5C67 (xie4)\r\n5C68 (ju4)\r\n5C69 (jue2)\r\n5C6A (liao2)\r\n5C6B (jue2)\r\n5C6C (shu3,zhu3)\r\n5C6D (xi4)\r\n5C6E (che4)\r\n5C6F (tun2,zhun1)\r\n5C70 (ni4)\r\n5C71 (shan1)\r\n5C72 (wa1)\r\n5C73 (xian1)\r\n5C74 (li4)\r\n5C75 (e4)\r\n5C76 (none0)\r\n5C77 (none0)\r\n5C78 (long2)\r\n5C79 (yi4,ge1)\r\n5C7A (qi3)\r\n5C7B (ren4)\r\n5C7C (wu4)\r\n5C7D (han4)\r\n5C7E (shen1)\r\n5C7F (yu3)\r\n5C80 (chu1)\r\n5C81 (sui4)\r\n5C82 (qi3)\r\n5C83 (none0)\r\n5C84 (yue4)\r\n5C85 (ban3)\r\n5C86 (yao3)\r\n5C87 (ang2)\r\n5C88 (ya2)\r\n5C89 (wu4)\r\n5C8A (jie2)\r\n5C8B (e4)\r\n5C8C (ji2)\r\n5C8D (qian1)\r\n5C8E (fen1)\r\n5C8F (wan2)\r\n5C90 (qi2)\r\n5C91 (cen2)\r\n5C92 (qian2)\r\n5C93 (qi2)\r\n5C94 (cha4)\r\n5C95 (jie4)\r\n5C96 (qu1)\r\n5C97 (gang3,gang1)\r\n5C98 (xian4)\r\n5C99 (ao4)\r\n5C9A (lan2)\r\n5C9B (dao3)\r\n5C9C (ba1)\r\n5C9D (zhai3)\r\n5C9E (zuo4)\r\n5C9F (yang3)\r\n5CA0 (ju4)\r\n5CA1 (gang1)\r\n5CA2 (ke3)\r\n5CA3 (gou3)\r\n5CA4 (xue4)\r\n5CA5 (bo1)\r\n5CA6 (li4)\r\n5CA7 (tiao2)\r\n5CA8 (qu1)\r\n5CA9 (yan2)\r\n5CAA (fu2)\r\n5CAB (xiu4)\r\n5CAC (jia3)\r\n5CAD (ling3)\r\n5CAE (tuo2)\r\n5CAF (pei1)\r\n5CB0 (you3)\r\n5CB1 (dai4)\r\n5CB2 (kuang4)\r\n5CB3 (yue4)\r\n5CB4 (qu1)\r\n5CB5 (hu4)\r\n5CB6 (po4)\r\n5CB7 (min2)\r\n5CB8 (an4)\r\n5CB9 (tiao2)\r\n5CBA (ling3)\r\n5CBB (chi2)\r\n5CBC (none0)\r\n5CBD (dong1)\r\n5CBE (none0)\r\n5CBF (kui1)\r\n5CC0 (xiu4)\r\n5CC1 (mao3)\r\n5CC2 (tong2)\r\n5CC3 (xue2)\r\n5CC4 (yi4)\r\n5CC5 (none0)\r\n5CC6 (he1)\r\n5CC7 (ke1)\r\n5CC8 (luo4)\r\n5CC9 (e1)\r\n5CCA (fu4)\r\n5CCB (xun2)\r\n5CCC (die2)\r\n5CCD (lu4)\r\n5CCE (lang3)\r\n5CCF (er3)\r\n5CD0 (gai1)\r\n5CD1 (quan2)\r\n5CD2 (tong2,dong4)\r\n5CD3 (yi2)\r\n5CD4 (mu3)\r\n5CD5 (shi2)\r\n5CD6 (an1)\r\n5CD7 (wei3)\r\n5CD8 (hu1)\r\n5CD9 (zhi4,shi4)\r\n5CDA (mi4)\r\n5CDB (li3)\r\n5CDC (ji1)\r\n5CDD (tong2)\r\n5CDE (kui3)\r\n5CDF (you4)\r\n5CE0 (none0)\r\n5CE1 (xia2)\r\n5CE2 (li3)\r\n5CE3 (yao2)\r\n5CE4 (jiao4,qiao2,jiao2)\r\n5CE5 (zheng1)\r\n5CE6 (luan2)\r\n5CE7 (jiao1)\r\n5CE8 (e2)\r\n5CE9 (e2)\r\n5CEA (yu4)\r\n5CEB (ye2)\r\n5CEC (bu1)\r\n5CED (qiao4)\r\n5CEE (qun1)\r\n5CEF (feng1)\r\n5CF0 (feng1)\r\n5CF1 (nao2,nao1)\r\n5CF2 (li4)\r\n5CF3 (you2)\r\n5CF4 (xian4)\r\n5CF5 (hong2)\r\n5CF6 (dao3)\r\n5CF7 (shen1)\r\n5CF8 (cheng2)\r\n5CF9 (tu2)\r\n5CFA (geng3)\r\n5CFB (jun4)\r\n5CFC (hao4)\r\n5CFD (xia2)\r\n5CFE (yin1)\r\n5CFF (wu2,yu1)\r\n5D00 (lang4)\r\n5D01 (kan3)\r\n5D02 (lao2)\r\n5D03 (lai2)\r\n5D04 (xian3)\r\n5D05 (que4)\r\n5D06 (kong1)\r\n5D07 (chong2)\r\n5D08 (chong2)\r\n5D09 (ta4)\r\n5D0A (none0)\r\n5D0B (hua2,hua4)\r\n5D0C (ju1)\r\n5D0D (lai2)\r\n5D0E (qi2)\r\n5D0F (min2)\r\n5D10 (kun1)\r\n5D11 (kun1)\r\n5D12 (zu2)\r\n5D13 (gu4)\r\n5D14 (cui1)\r\n5D15 (ya2)\r\n5D16 (ya2,ai2)\r\n5D17 (gang3,gang1)\r\n5D18 (lun2)\r\n5D19 (lun2)\r\n5D1A (leng2)\r\n5D1B (jue2)\r\n5D1C (duo1)\r\n5D1D (cheng1)\r\n5D1E (guo1)\r\n5D1F (yin2)\r\n5D20 (dong1)\r\n5D21 (han2)\r\n5D22 (zheng1)\r\n5D23 (wei3)\r\n5D24 (yao2,xiao2)\r\n5D25 (pi3)\r\n5D26 (yan1)\r\n5D27 (song1)\r\n5D28 (jie2)\r\n5D29 (beng1)\r\n5D2A (zu2)\r\n5D2B (jue2)\r\n5D2C (dong1)\r\n5D2D (zhan3)\r\n5D2E (gu4)\r\n5D2F (yin2)\r\n5D30 (zi1)\r\n5D31 (ze2)\r\n5D32 (huang2)\r\n5D33 (yu2)\r\n5D34 (wei1,wai3)\r\n5D35 (yang2)\r\n5D36 (feng1)\r\n5D37 (qiu2)\r\n5D38 (dun4)\r\n5D39 (ti2)\r\n5D3A (yi3)\r\n5D3B (zhi4)\r\n5D3C (shi4)\r\n5D3D (zai3)\r\n5D3E (yao3)\r\n5D3F (e4)\r\n5D40 (zhu4)\r\n5D41 (kan1)\r\n5D42 (lu:4)\r\n5D43 (yan3)\r\n5D44 (mei3)\r\n5D45 (gan1,gan4)\r\n5D46 (ji1)\r\n5D47 (ji1)\r\n5D48 (huan4)\r\n5D49 (ting2)\r\n5D4A (sheng4)\r\n5D4B (mei2)\r\n5D4C (qian4,qian1,kan4)\r\n5D4D (wu4)\r\n5D4E (yu2)\r\n5D4F (zong1)\r\n5D50 (lan2)\r\n5D51 (jie2,he2)\r\n5D52 (yan2)\r\n5D53 (yan2)\r\n5D54 (wei3)\r\n5D55 (zong1)\r\n5D56 (cha2)\r\n5D57 (sui4)\r\n5D58 (rong2)\r\n5D59 (ke1)\r\n5D5A (qin1)\r\n5D5B (yu2)\r\n5D5C (qi2)\r\n5D5D (lou3)\r\n5D5E (tu2)\r\n5D5F (dui1)\r\n5D60 (xi1)\r\n5D61 (weng1)\r\n5D62 (cang1)\r\n5D63 (dang1)\r\n5D64 (rong2)\r\n5D65 (jie2)\r\n5D66 (ai2)\r\n5D67 (liu2)\r\n5D68 (wu3)\r\n5D69 (song1)\r\n5D6A (qiao1)\r\n5D6B (zi1)\r\n5D6C (wei2)\r\n5D6D (beng1)\r\n5D6E (dian1)\r\n5D6F (cuo2)\r\n5D70 (qian3)\r\n5D71 (yong2)\r\n5D72 (nie4)\r\n5D73 (cuo2)\r\n5D74 (ji2)\r\n5D75 (none0)\r\n5D76 (none0)\r\n5D77 (song3)\r\n5D78 (zong1)\r\n5D79 (jiang4)\r\n5D7A (liao2)\r\n5D7B (none0)\r\n5D7C (chan3)\r\n5D7D (di4)\r\n5D7E (cen1)\r\n5D7F (ding3)\r\n5D80 (tu1,die2)\r\n5D81 (lou3)\r\n5D82 (zhang4)\r\n5D83 (zhan3)\r\n5D84 (zhan3)\r\n5D85 (ao2)\r\n5D86 (cao2)\r\n5D87 (qu1)\r\n5D88 (qiang1)\r\n5D89 (zui1)\r\n5D8A (zui3)\r\n5D8B (dao3)\r\n5D8C (dao3)\r\n5D8D (xi2)\r\n5D8E (yu4)\r\n5D8F (bo2)\r\n5D90 (long2)\r\n5D91 (xiang3)\r\n5D92 (ceng2)\r\n5D93 (bo1)\r\n5D94 (qin1)\r\n5D95 (jiao1)\r\n5D96 (yan3)\r\n5D97 (lao2)\r\n5D98 (zhan4)\r\n5D99 (lin2)\r\n5D9A (liao2)\r\n5D9B (liao2)\r\n5D9C (jin1)\r\n5D9D (deng4)\r\n5D9E (duo4)\r\n5D9F (zun1)\r\n5DA0 (jiao4,qiao2)\r\n5DA1 (gui4)\r\n5DA2 (yao2)\r\n5DA3 (qiao2)\r\n5DA4 (yao2)\r\n5DA5 (jue2)\r\n5DA6 (zhan1)\r\n5DA7 (yi4)\r\n5DA8 (xue1)\r\n5DA9 (nao2)\r\n5DAA (ye4)\r\n5DAB (ye4)\r\n5DAC (yi1)\r\n5DAD (e4)\r\n5DAE (xian3)\r\n5DAF (ji2)\r\n5DB0 (xie4)\r\n5DB1 (ke3)\r\n5DB2 (sui3)\r\n5DB3 (di4)\r\n5DB4 (ao4)\r\n5DB5 (zui4)\r\n5DB6 (none0)\r\n5DB7 (yi2)\r\n5DB8 (rong2)\r\n5DB9 (dao3)\r\n5DBA (ling3)\r\n5DBB (za2)\r\n5DBC (yu3)\r\n5DBD (yue4)\r\n5DBE (yin3)\r\n5DBF (none0)\r\n5DC0 (jie2)\r\n5DC1 (li4)\r\n5DC2 (sui3,xi1)\r\n5DC3 (long2)\r\n5DC4 (long2)\r\n5DC5 (dian1)\r\n5DC6 (ying2)\r\n5DC7 (xi1)\r\n5DC8 (ju2)\r\n5DC9 (chan2)\r\n5DCA (ying3)\r\n5DCB (kui1)\r\n5DCC (yan2)\r\n5DCD (wei1,wei2)\r\n5DCE (nao2)\r\n5DCF (quan2)\r\n5DD0 (chao1)\r\n5DD1 (cuan2)\r\n5DD2 (luan2)\r\n5DD3 (dian1)\r\n5DD4 (dian1)\r\n5DD5 (nie4)\r\n5DD6 (yan2)\r\n5DD7 (yan2)\r\n5DD8 (yan3)\r\n5DD9 (nao2)\r\n5DDA (yan3)\r\n5DDB (chuan1)\r\n5DDC (gui4)\r\n5DDD (chuan1)\r\n5DDE (zhou1)\r\n5DDF (huang1)\r\n5DE0 (jing1)\r\n5DE1 (xun2)\r\n5DE2 (chao2)\r\n5DE3 (chao2)\r\n5DE4 (lie4)\r\n5DE5 (gong1)\r\n5DE6 (zuo3)\r\n5DE7 (qiao3)\r\n5DE8 (ju4)\r\n5DE9 (gong3)\r\n5DEA (none0)\r\n5DEB (wu1,wu2)\r\n5DEC (none0)\r\n5DED (none0)\r\n5DEE (cha1,cha4,chai1,ci1)\r\n5DEF (qiu2)\r\n5DF0 (qiu2)\r\n5DF1 (ji3)\r\n5DF2 (yi3)\r\n5DF3 (si4)\r\n5DF4 (ba1)\r\n5DF5 (zhi1)\r\n5DF6 (zhao1)\r\n5DF7 (xiang4,hang4)\r\n5DF8 (yi2)\r\n5DF9 (jin3)\r\n5DFA (xun4)\r\n5DFB (juan4,juan3)\r\n5DFC (none0)\r\n5DFD (xun4)\r\n5DFE (jin1)\r\n5DFF (fu2)\r\n5E00 (za1)\r\n5E01 (bi4)\r\n5E02 (shi4)\r\n5E03 (bu4)\r\n5E04 (ding1)\r\n5E05 (shuai4)\r\n5E06 (fan1,fan2)\r\n5E07 (nie4)\r\n5E08 (shi1)\r\n5E09 (fen1)\r\n5E0A (pa4)\r\n5E0B (zhi3)\r\n5E0C (xi1)\r\n5E0D (hu4)\r\n5E0E (dan4)\r\n5E0F (wei2)\r\n5E10 (zhang4)\r\n5E11 (tang3)\r\n5E12 (dai4)\r\n5E13 (ma4)\r\n5E14 (pei4)\r\n5E15 (pa4)\r\n5E16 (tie1,tie3,tie4)\r\n5E17 (fu2)\r\n5E18 (lian2)\r\n5E19 (zhi4)\r\n5E1A (zhou3)\r\n5E1B (bo2)\r\n5E1C (zhi4)\r\n5E1D (di4)\r\n5E1E (mo4)\r\n5E1F (yi4)\r\n5E20 (yi4)\r\n5E21 (ping2)\r\n5E22 (qia4)\r\n5E23 (juan4)\r\n5E24 (ru2)\r\n5E25 (shuai4,shuo4)\r\n5E26 (dai4)\r\n5E27 (zhen1)\r\n5E28 (shui4)\r\n5E29 (qiao4)\r\n5E2A (zhen1)\r\n5E2B (shi1)\r\n5E2C (qun2)\r\n5E2D (xi2)\r\n5E2E (bang1)\r\n5E2F (dai4)\r\n5E30 (gui1)\r\n5E31 (chou2,dao4)\r\n5E32 (ping2)\r\n5E33 (zhang4)\r\n5E34 (sha1)\r\n5E35 (wan1)\r\n5E36 (dai4)\r\n5E37 (wei2)\r\n5E38 (chang2)\r\n5E39 (sha4)\r\n5E3A (qi2)\r\n5E3B (ze2)\r\n5E3C (guo2)\r\n5E3D (mao4)\r\n5E3E (du3)\r\n5E3F (hou2)\r\n5E40 (zhen1,zheng4)\r\n5E41 (xu1)\r\n5E42 (mi4)\r\n5E43 (wei2)\r\n5E44 (wo4)\r\n5E45 (fu2)\r\n5E46 (yi4)\r\n5E47 (bang1)\r\n5E48 (ping2)\r\n5E49 (none0)\r\n5E4A (gong1)\r\n5E4B (pan2)\r\n5E4C (huang3)\r\n5E4D (dao1,tao1)\r\n5E4E (mi4)\r\n5E4F (jia1)\r\n5E50 (teng2)\r\n5E51 (hui1)\r\n5E52 (zhong1)\r\n5E53 (sen1)\r\n5E54 (man4)\r\n5E55 (mu4)\r\n5E56 (biao1)\r\n5E57 (guo2)\r\n5E58 (ze2)\r\n5E59 (mu4)\r\n5E5A (bang1)\r\n5E5B (zhang4)\r\n5E5C (jiong3)\r\n5E5D (chan3)\r\n5E5E (fu2)\r\n5E5F (zhi4)\r\n5E60 (hu1)\r\n5E61 (fan1)\r\n5E62 (chuang2,zhuang4)\r\n5E63 (bi4)\r\n5E64 (bi4)\r\n5E65 (none0)\r\n5E66 (mi4)\r\n5E67 (qiao1)\r\n5E68 (dan4)\r\n5E69 (fen2)\r\n5E6A (meng2)\r\n5E6B (bang1)\r\n5E6C (chou2,dao4)\r\n5E6D (mie4)\r\n5E6E (chu2)\r\n5E6F (jie1)\r\n5E70 (xian3)\r\n5E71 (lan2)\r\n5E72 (gan1,gan4)\r\n5E73 (ping2)\r\n5E74 (nian2)\r\n5E75 (jian1)\r\n5E76 (bing4,bing1)\r\n5E77 (bing4)\r\n5E78 (xing4)\r\n5E79 (gan4,gan1)\r\n5E7A (yao1)\r\n5E7B (huan4)\r\n5E7C (you4)\r\n5E7D (you1)\r\n5E7E (ji3,ji1)\r\n5E7F (guang3,an1)\r\n5E80 (pi3)\r\n5E81 (ting1)\r\n5E82 (ze4)\r\n5E83 (guang3,an1)\r\n5E84 (zhuang1)\r\n5E85 (mo5)\r\n5E86 (qing4)\r\n5E87 (bi4)\r\n5E88 (qin2)\r\n5E89 (dun4)\r\n5E8A (chuang2)\r\n5E8B (gui3)\r\n5E8C (ya3)\r\n5E8D (bai4)\r\n5E8E (jie4)\r\n5E8F (xu4)\r\n5E90 (lu2)\r\n5E91 (wu3)\r\n5E92 (none0)\r\n5E93 (ku4)\r\n5E94 (ying1,ying4)\r\n5E95 (di3,de5)\r\n5E96 (pao2)\r\n5E97 (dian4)\r\n5E98 (ya1)\r\n5E99 (miao4)\r\n5E9A (geng1)\r\n5E9B (ci1)\r\n5E9C (fu3)\r\n5E9D (tong2)\r\n5E9E (pang2)\r\n5E9F (fei4)\r\n5EA0 (xiang2)\r\n5EA1 (yi3)\r\n5EA2 (zhi4)\r\n5EA3 (tiao1)\r\n5EA4 (zhi4)\r\n5EA5 (xiu1)\r\n5EA6 (du4,duo2,duo4)\r\n5EA7 (zuo4)\r\n5EA8 (xiao1)\r\n5EA9 (tu2)\r\n5EAA (gui3)\r\n5EAB (ku4)\r\n5EAC (pang2,mang3)\r\n5EAD (ting2)\r\n5EAE (you3)\r\n5EAF (bu1)\r\n5EB0 (bing3)\r\n5EB1 (cheng3)\r\n5EB2 (lai2)\r\n5EB3 (bi4,bei1)\r\n5EB4 (ji2)\r\n5EB5 (an1)\r\n5EB6 (shu4)\r\n5EB7 (kang1)\r\n5EB8 (yong1)\r\n5EB9 (tuo3)\r\n5EBA (song1)\r\n5EBB (shu4)\r\n5EBC (qing3)\r\n5EBD (yu4)\r\n5EBE (yu3)\r\n5EBF (miao4)\r\n5EC0 (sou1)\r\n5EC1 (ce4,ci4)\r\n5EC2 (xiang1)\r\n5EC3 (fei4)\r\n5EC4 (jiu4)\r\n5EC5 (he2)\r\n5EC6 (hui4)\r\n5EC7 (liu4)\r\n5EC8 (sha4,xia4)\r\n5EC9 (lian2)\r\n5ECA (lang2)\r\n5ECB (sou1)\r\n5ECC (jian1)\r\n5ECD (pou3)\r\n5ECE (qing3)\r\n5ECF (jiu4)\r\n5ED0 (jiu4)\r\n5ED1 (qin2,jin3)\r\n5ED2 (ao2)\r\n5ED3 (kuo4)\r\n5ED4 (lou2)\r\n5ED5 (yin4)\r\n5ED6 (liao4)\r\n5ED7 (dai4)\r\n5ED8 (lu4)\r\n5ED9 (yi4)\r\n5EDA (chu2)\r\n5EDB (chan2)\r\n5EDC (tu2)\r\n5EDD (si1)\r\n5EDE (xin1)\r\n5EDF (miao4)\r\n5EE0 (chang3,an1)\r\n5EE1 (wu3)\r\n5EE2 (fei4)\r\n5EE3 (guang3,an1)\r\n5EE4 (none0)\r\n5EE5 (guai4)\r\n5EE6 (bi4)\r\n5EE7 (qiang2)\r\n5EE8 (xie4)\r\n5EE9 (lin3)\r\n5EEA (lin3)\r\n5EEB (liao2)\r\n5EEC (lu2)\r\n5EED (none0)\r\n5EEE (ying2)\r\n5EEF (xian1)\r\n5EF0 (ting1)\r\n5EF1 (yong1)\r\n5EF2 (li2)\r\n5EF3 (ting1)\r\n5EF4 (yin3)\r\n5EF5 (xun2)\r\n5EF6 (yan2)\r\n5EF7 (ting2)\r\n5EF8 (di2)\r\n5EF9 (po4)\r\n5EFA (jian4)\r\n5EFB (hui2)\r\n5EFC (nai3)\r\n5EFD (hui2)\r\n5EFE (gong3)\r\n5EFF (nian4)\r\n5F00 (kai1)\r\n5F01 (bian4)\r\n5F02 (yi4)\r\n5F03 (qi4)\r\n5F04 (nong4,long4)\r\n5F05 (fen2)\r\n5F06 (ju3)\r\n5F07 (yan3)\r\n5F08 (yi4)\r\n5F09 (zang4,zhuang3)\r\n5F0A (bi4)\r\n5F0B (yi4)\r\n5F0C (yi1)\r\n5F0D (er4)\r\n5F0E (san1)\r\n5F0F (shi4)\r\n5F10 (er4)\r\n5F11 (shi4)\r\n5F12 (shi4)\r\n5F13 (gong1)\r\n5F14 (diao4)\r\n5F15 (yin3)\r\n5F16 (hu4)\r\n5F17 (fu2)\r\n5F18 (hong2)\r\n5F19 (wu1)\r\n5F1A (tui2)\r\n5F1B (chi2)\r\n5F1C (qiang2,qiang3)\r\n5F1D (ba4)\r\n5F1E (shen3)\r\n5F1F (di4)\r\n5F20 (zhang1)\r\n5F21 (jue2)\r\n5F22 (tao1)\r\n5F23 (fu3)\r\n5F24 (di3)\r\n5F25 (mi2)\r\n5F26 (xian2)\r\n5F27 (hu2)\r\n5F28 (chao1)\r\n5F29 (nu3)\r\n5F2A (jing4)\r\n5F2B (zhen3)\r\n5F2C (yi2)\r\n5F2D (mi3)\r\n5F2E (quan1)\r\n5F2F (wan1)\r\n5F30 (shao1)\r\n5F31 (ruo4)\r\n5F32 (xuan1)\r\n5F33 (jing4)\r\n5F34 (diao1)\r\n5F35 (zhang1)\r\n5F36 (jiang4)\r\n5F37 (qiang2,jiang4,qiang3)\r\n5F38 (beng1)\r\n5F39 (dan4,tan2)\r\n5F3A (qiang2,qiang3,jiang4)\r\n5F3B (bi4)\r\n5F3C (bi4)\r\n5F3D (she4)\r\n5F3E (dan4,tan2)\r\n5F3F (jian3)\r\n5F40 (gou4)\r\n5F41 (none0)\r\n5F42 (fa1)\r\n5F43 (bi4)\r\n5F44 (kou1)\r\n5F45 (none0)\r\n5F46 (bie4)\r\n5F47 (xiao1)\r\n5F48 (dan4,tan2)\r\n5F49 (kuang4)\r\n5F4A (qiang2,jiang4)\r\n5F4B (hong2)\r\n5F4C (mi2)\r\n5F4D (kuo4)\r\n5F4E (wan1)\r\n5F4F (jue2)\r\n5F50 (ji4)\r\n5F51 (ji4)\r\n5F52 (gui1)\r\n5F53 (dang1,dang4)\r\n5F54 (lu4)\r\n5F55 (lu4)\r\n5F56 (tuan4)\r\n5F57 (hui4)\r\n5F58 (zhi4)\r\n5F59 (hui4)\r\n5F5A (hui4)\r\n5F5B (yi2)\r\n5F5C (yi2)\r\n5F5D (yi2)\r\n5F5E (yi2)\r\n5F5F (huo4)\r\n5F60 (huo4)\r\n5F61 (shan1)\r\n5F62 (xing2)\r\n5F63 (zhang1)\r\n5F64 (tong2)\r\n5F65 (yan4)\r\n5F66 (yan4)\r\n5F67 (yu4)\r\n5F68 (chi1)\r\n5F69 (cai3)\r\n5F6A (biao1)\r\n5F6B (diao1)\r\n5F6C (bin1)\r\n5F6D (peng2)\r\n5F6E (yong3)\r\n5F6F (piao4)\r\n5F70 (zhang1)\r\n5F71 (ying3)\r\n5F72 (chi1)\r\n5F73 (chi4)\r\n5F74 (zhuo2)\r\n5F75 (tuo3)\r\n5F76 (ji2)\r\n5F77 (pang2,fang3)\r\n5F78 (zhong1)\r\n5F79 (yi4)\r\n5F7A (wang2)\r\n5F7B (che4)\r\n5F7C (bi3)\r\n5F7D (di1)\r\n5F7E (ling3)\r\n5F7F (fu2)\r\n5F80 (wang3,wang4)\r\n5F81 (zheng1)\r\n5F82 (cu2)\r\n5F83 (wang3,wang4)\r\n5F84 (jing4)\r\n5F85 (dai4,dai1)\r\n5F86 (xi1)\r\n5F87 (xun4,xun2)\r\n5F88 (hen3)\r\n5F89 (yang2)\r\n5F8A (huai2,hui2)\r\n5F8B (lu:4)\r\n5F8C (hou4)\r\n5F8D (wang3)\r\n5F8E (cheng3)\r\n5F8F (zhi4)\r\n5F90 (xu2)\r\n5F91 (jing4)\r\n5F92 (tu2)\r\n5F93 (cong2)\r\n5F94 (none0)\r\n5F95 (lai2)\r\n5F96 (cong2)\r\n5F97 (de2,de5,dei3)\r\n5F98 (pai2)\r\n5F99 (xi3)\r\n5F9A (none0)\r\n5F9B (qi1)\r\n5F9C (chang2)\r\n5F9D (zhi4)\r\n5F9E (cong2,cong1,zong4)\r\n5F9F (zhou1)\r\n5FA0 (lai2)\r\n5FA1 (yu4)\r\n5FA2 (xie4)\r\n5FA3 (jie4)\r\n5FA4 (jian4)\r\n5FA5 (chi2,shi4)\r\n5FA6 (jia3)\r\n5FA7 (bian4)\r\n5FA8 (huang2)\r\n5FA9 (fu4)\r\n5FAA (xun2)\r\n5FAB (wei3)\r\n5FAC (pang2)\r\n5FAD (yao2)\r\n5FAE (wei1,wei2)\r\n5FAF (xi1)\r\n5FB0 (zheng1)\r\n5FB1 (piao4)\r\n5FB2 (chi2)\r\n5FB3 (de2)\r\n5FB4 (zheng1)\r\n5FB5 (zhi3,zheng1)\r\n5FB6 (bie2)\r\n5FB7 (de2)\r\n5FB8 (chong1)\r\n5FB9 (che4)\r\n5FBA (jiao3)\r\n5FBB (wei4)\r\n5FBC (jiao4,jiao3,jia3)\r\n5FBD (hui1)\r\n5FBE (mei2)\r\n5FBF (long4)\r\n5FC0 (xiang1)\r\n5FC1 (bao4)\r\n5FC2 (qu2)\r\n5FC3 (xin1)\r\n5FC4 (xin1)\r\n5FC5 (bi4)\r\n5FC6 (yi4)\r\n5FC7 (le4)\r\n5FC8 (ren2)\r\n5FC9 (dao1)\r\n5FCA (ding4)\r\n5FCB (gai3)\r\n5FCC (ji4)\r\n5FCD (ren3)\r\n5FCE (ren2)\r\n5FCF (chan4)\r\n5FD0 (tan3)\r\n5FD1 (te4)\r\n5FD2 (te4,tui1,tei1)\r\n5FD3 (gan1)\r\n5FD4 (qi4)\r\n5FD5 (dai4)\r\n5FD6 (cun3)\r\n5FD7 (zhi4)\r\n5FD8 (wang4,wang2)\r\n5FD9 (mang2)\r\n5FDA (xi1)\r\n5FDB (fan2)\r\n5FDC (ying1,ying4)\r\n5FDD (tian3)\r\n5FDE (min2)\r\n5FDF (min2)\r\n5FE0 (zhong1)\r\n5FE1 (chong1)\r\n5FE2 (wu4)\r\n5FE3 (ji2)\r\n5FE4 (wu3)\r\n5FE5 (xi4)\r\n5FE6 (ye4)\r\n5FE7 (you1)\r\n5FE8 (wan4)\r\n5FE9 (zong3)\r\n5FEA (zhong1,song1)\r\n5FEB (kuai4)\r\n5FEC (yu4)\r\n5FED (bian4)\r\n5FEE (zhi4)\r\n5FEF (chi2)\r\n5FF0 (cui4)\r\n5FF1 (chen2)\r\n5FF2 (tai4)\r\n5FF3 (tun2)\r\n5FF4 (qian2)\r\n5FF5 (nian4)\r\n5FF6 (hun2)\r\n5FF7 (xiong1)\r\n5FF8 (niu3,nu:4)\r\n5FF9 (wang3)\r\n5FFA (xian1)\r\n5FFB (xin1)\r\n5FFC (kang1)\r\n5FFD (hu1)\r\n5FFE (kai4)\r\n5FFF (fen4)\r\n6000 (huai2)\r\n6001 (tai4)\r\n6002 (song3)\r\n6003 (wu3)\r\n6004 (ou4)\r\n6005 (chang4)\r\n6006 (chuang4)\r\n6007 (ju4)\r\n6008 (yi4)\r\n6009 (bao3)\r\n600A (chao1)\r\n600B (min2)\r\n600C (pi1)\r\n600D (zuo4)\r\n600E (zen3,ze3)\r\n600F (yang4)\r\n6010 (kou4)\r\n6011 (ban4)\r\n6012 (nu4)\r\n6013 (nao2)\r\n6014 (zheng1,zheng4)\r\n6015 (pa4)\r\n6016 (bu4)\r\n6017 (tie1)\r\n6018 (hu4)\r\n6019 (hu4)\r\n601A (ju4)\r\n601B (da2)\r\n601C (lian2,ling2)\r\n601D (si1,sai1)\r\n601E (zhou4)\r\n601F (di4)\r\n6020 (dai4)\r\n6021 (yi2)\r\n6022 (tu2)\r\n6023 (you2)\r\n6024 (fu1)\r\n6025 (ji2)\r\n6026 (peng1)\r\n6027 (xing4)\r\n6028 (yuan4)\r\n6029 (ni2)\r\n602A (guai4)\r\n602B (fu2,fei4)\r\n602C (xi4)\r\n602D (bi4)\r\n602E (you1)\r\n602F (qie4,que4)\r\n6030 (xuan4)\r\n6031 (zong1)\r\n6032 (bing3)\r\n6033 (huang3)\r\n6034 (xu4)\r\n6035 (chu4)\r\n6036 (pi1)\r\n6037 (xi1)\r\n6038 (xi1)\r\n6039 (tan1)\r\n603A (none0)\r\n603B (zong3)\r\n603C (dui4)\r\n603D (none0)\r\n603E (none0)\r\n603F (yi4)\r\n6040 (chi3)\r\n6041 (nen4,ren4,nin2)\r\n6042 (xun2)\r\n6043 (shi4)\r\n6044 (xi4)\r\n6045 (lao3)\r\n6046 (heng2)\r\n6047 (kuang1)\r\n6048 (mou2,mu4)\r\n6049 (zhi3)\r\n604A (xie2)\r\n604B (lian4)\r\n604C (tiao1)\r\n604D (huang3)\r\n604E (die2)\r\n604F (hao3)\r\n6050 (kong3)\r\n6051 (gui3)\r\n6052 (heng2)\r\n6053 (xi1)\r\n6054 (xiao4)\r\n6055 (shu4)\r\n6056 (sai1,si1)\r\n6057 (hu1)\r\n6058 (qiu1)\r\n6059 (yang4)\r\n605A (hui4)\r\n605B (hui2)\r\n605C (chi4)\r\n605D (jia2)\r\n605E (yi2)\r\n605F (xiong1)\r\n6060 (guai4)\r\n6061 (lin4)\r\n6062 (hui1)\r\n6063 (zi4)\r\n6064 (xu4)\r\n6065 (chi3)\r\n6066 (xiang4)\r\n6067 (nu:4)\r\n6068 (hen4)\r\n6069 (en1)\r\n606A (ke4,que4)\r\n606B (dong4,tong1)\r\n606C (tian2)\r\n606D (gong1)\r\n606E (quan2)\r\n606F (xi1,xi2)\r\n6070 (qia4)\r\n6071 (yue4)\r\n6072 (peng1)\r\n6073 (ken3)\r\n6074 (de2)\r\n6075 (hui4)\r\n6076 (e4,e3,wu4,wu1)\r\n6077 (none0)\r\n6078 (tong4)\r\n6079 (yan1)\r\n607A (kai3)\r\n607B (ce4)\r\n607C (nao3)\r\n607D (yun4)\r\n607E (mang2)\r\n607F (yong3)\r\n6080 (yong3)\r\n6081 (juan4)\r\n6082 (mang2)\r\n6083 (kun3)\r\n6084 (qiao3,qiao1)\r\n6085 (yue4)\r\n6086 (yu4)\r\n6087 (yu4)\r\n6088 (jie4)\r\n6089 (xi1)\r\n608A (zhe2,qi1)\r\n608B (lin4)\r\n608C (ti4)\r\n608D (han4)\r\n608E (hao4)\r\n608F (qie4)\r\n6090 (ti4)\r\n6091 (bu4)\r\n6092 (yi4)\r\n6093 (qian4)\r\n6094 (hui3)\r\n6095 (xi1)\r\n6096 (bei4)\r\n6097 (man2)\r\n6098 (yi2)\r\n6099 (heng1)\r\n609A (song3)\r\n609B (quan1)\r\n609C (cheng3)\r\n609D (kui1,li3)\r\n609E (wu4)\r\n609F (wu4)\r\n60A0 (you1)\r\n60A1 (li2)\r\n60A2 (liang4)\r\n60A3 (huan4)\r\n60A4 (cong1)\r\n60A5 (yi4)\r\n60A6 (yue4)\r\n60A7 (li4)\r\n60A8 (nin2)\r\n60A9 (nao3)\r\n60AA (e4,e3,wu4)\r\n60AB (que4)\r\n60AC (xuan2)\r\n60AD (qian1)\r\n60AE (wu4)\r\n60AF (min3)\r\n60B0 (cong2)\r\n60B1 (fei3)\r\n60B2 (bei1)\r\n60B3 (de2)\r\n60B4 (cui4)\r\n60B5 (chang4)\r\n60B6 (men4,men1)\r\n60B7 (li4)\r\n60B8 (ji4)\r\n60B9 (guan4)\r\n60BA (guan4)\r\n60BB (xing4)\r\n60BC (dao4)\r\n60BD (qi1)\r\n60BE (kong1)\r\n60BF (tian3)\r\n60C0 (lun2)\r\n60C1 (xi1)\r\n60C2 (kan3)\r\n60C3 (kun1)\r\n60C4 (ni4)\r\n60C5 (qing2,qing5)\r\n60C6 (chou2)\r\n60C7 (dun1)\r\n60C8 (guo3)\r\n60C9 (chan1)\r\n60CA (jing1)\r\n60CB (wan3)\r\n60CC (yuan1)\r\n60CD (jin1)\r\n60CE (ji4)\r\n60CF (lin2)\r\n60D0 (yu4)\r\n60D1 (huo4)\r\n60D2 (he2)\r\n60D3 (quan1)\r\n60D4 (yan3)\r\n60D5 (ti4)\r\n60D6 (ti4)\r\n60D7 (nie1)\r\n60D8 (wang3)\r\n60D9 (chuo4)\r\n60DA (hu1)\r\n60DB (hun1)\r\n60DC (xi1,xi2)\r\n60DD (chang3)\r\n60DE (xin1)\r\n60DF (wei2)\r\n60E0 (hui4)\r\n60E1 (e4,e3,wu4,wu1)\r\n60E2 (rui3)\r\n60E3 (zong3)\r\n60E4 (jian1)\r\n60E5 (yong3)\r\n60E6 (dian4)\r\n60E7 (ju4)\r\n60E8 (can3,can4)\r\n60E9 (cheng2)\r\n60EA (de2)\r\n60EB (bei4)\r\n60EC (qie4)\r\n60ED (can2)\r\n60EE (dan4)\r\n60EF (guan4)\r\n60F0 (duo4)\r\n60F1 (nao3)\r\n60F2 (yun4)\r\n60F3 (xiang3)\r\n60F4 (zhui4)\r\n60F5 (die2)\r\n60F6 (huang2)\r\n60F7 (chun3)\r\n60F8 (qiong2)\r\n60F9 (re3)\r\n60FA (xing1)\r\n60FB (ce4)\r\n60FC (bian3)\r\n60FD (hun1)\r\n60FE (zong1)\r\n60FF (ti2)\r\n6100 (qiao3)\r\n6101 (chou2)\r\n6102 (bei4)\r\n6103 (xuan1)\r\n6104 (wei1)\r\n6105 (ge2)\r\n6106 (qian1)\r\n6107 (wei3)\r\n6108 (yu4)\r\n6109 (yu2)\r\n610A (bi4)\r\n610B (xuan1)\r\n610C (huan4)\r\n610D (min3)\r\n610E (bi4)\r\n610F (yi4)\r\n6110 (mian3)\r\n6111 (yong3)\r\n6112 (kai4,qi4)\r\n6113 (dang4)\r\n6114 (yin1)\r\n6115 (e4)\r\n6116 (chen2)\r\n6117 (mou4)\r\n6118 (qia4)\r\n6119 (ke4)\r\n611A (yu2)\r\n611B (ai4)\r\n611C (qie4)\r\n611D (yan3)\r\n611E (nuo4)\r\n611F (gan3)\r\n6120 (yun4)\r\n6121 (zong3)\r\n6122 (sai1)\r\n6123 (leng4)\r\n6124 (fen4)\r\n6125 (none0)\r\n6126 (kui4)\r\n6127 (kui4)\r\n6128 (que4)\r\n6129 (gong1)\r\n612A (yun2)\r\n612B (su4)\r\n612C (su4)\r\n612D (qi2)\r\n612E (yao2)\r\n612F (song3)\r\n6130 (huang4)\r\n6131 (none0)\r\n6132 (gu3)\r\n6133 (ju4)\r\n6134 (chuang4)\r\n6135 (ta1)\r\n6136 (xie2)\r\n6137 (kai3)\r\n6138 (zheng3)\r\n6139 (yong3)\r\n613A (cao3)\r\n613B (sun4)\r\n613C (shen4)\r\n613D (bo2)\r\n613E (kai4)\r\n613F (yuan4)\r\n6140 (xie2)\r\n6141 (hun4)\r\n6142 (yong3)\r\n6143 (yang3)\r\n6144 (li4)\r\n6145 (sao1)\r\n6146 (tao1)\r\n6147 (yin1)\r\n6148 (ci2)\r\n6149 (xu4)\r\n614A (qian4,qie4)\r\n614B (tai4)\r\n614C (huang1,huang5)\r\n614D (yun4)\r\n614E (shen4)\r\n614F (ming3)\r\n6150 (none0)\r\n6151 (she4)\r\n6152 (cong2)\r\n6153 (piao1)\r\n6154 (mo4)\r\n6155 (mu4)\r\n6156 (guo2)\r\n6157 (chi4)\r\n6158 (can3,can4)\r\n6159 (can2)\r\n615A (can2)\r\n615B (cui2)\r\n615C (min3)\r\n615D (ni4,te4)\r\n615E (zhang1)\r\n615F (tong4)\r\n6160 (ao4)\r\n6161 (shuang3)\r\n6162 (man4)\r\n6163 (guan4)\r\n6164 (que4)\r\n6165 (zao4)\r\n6166 (jiu4)\r\n6167 (hui4)\r\n6168 (kai3,kai4)\r\n6169 (lian2)\r\n616A (ou4,ou1)\r\n616B (song3)\r\n616C (jin3)\r\n616D (yin4)\r\n616E (lu:4)\r\n616F (shang1)\r\n6170 (wei4)\r\n6171 (tuan2)\r\n6172 (man2)\r\n6173 (qian1)\r\n6174 (zhe2)\r\n6175 (yong1)\r\n6176 (qing4)\r\n6177 (kang1,kang3)\r\n6178 (di4)\r\n6179 (zhi2)\r\n617A (lu:2)\r\n617B (juan4)\r\n617C (qi1)\r\n617D (qi1)\r\n617E (yu4)\r\n617F (ping2)\r\n6180 (liao2)\r\n6181 (zong3)\r\n6182 (you1)\r\n6183 (chuang1)\r\n6184 (zhi4)\r\n6185 (tong4)\r\n6186 (cheng1)\r\n6187 (qi4)\r\n6188 (qu1)\r\n6189 (peng2)\r\n618A (bei4)\r\n618B (bie1)\r\n618C (chun2)\r\n618D (jiao1)\r\n618E (zeng1)\r\n618F (chi4)\r\n6190 (lian2)\r\n6191 (ping2)\r\n6192 (kui4)\r\n6193 (hui4)\r\n6194 (qiao2)\r\n6195 (cheng2)\r\n6196 (yin4)\r\n6197 (yin4)\r\n6198 (xi3)\r\n6199 (xi3)\r\n619A (dan4)\r\n619B (tan2)\r\n619C (duo4)\r\n619D (dui4)\r\n619E (dui4)\r\n619F (su4)\r\n61A0 (jue4)\r\n61A1 (ce4)\r\n61A2 (xiao1)\r\n61A3 (fan2)\r\n61A4 (fen4)\r\n61A5 (lao2)\r\n61A6 (lao4)\r\n61A7 (chong1)\r\n61A8 (han1)\r\n61A9 (qi4)\r\n61AA (xian2)\r\n61AB (min3)\r\n61AC (jing3)\r\n61AD (liao3)\r\n61AE (wu3)\r\n61AF (can3)\r\n61B0 (jue2)\r\n61B1 (chou4)\r\n61B2 (xian4)\r\n61B3 (tan3)\r\n61B4 (sheng2)\r\n61B5 (pi1)\r\n61B6 (yi4)\r\n61B7 (chu4)\r\n61B8 (xian1)\r\n61B9 (nao2)\r\n61BA (dan4)\r\n61BB (tan3)\r\n61BC (jing3)\r\n61BD (song1)\r\n61BE (han4)\r\n61BF (jiao1)\r\n61C0 (wei4)\r\n61C1 (huan2)\r\n61C2 (dong3)\r\n61C3 (qin2)\r\n61C4 (qin2)\r\n61C5 (qu2)\r\n61C6 (cao3)\r\n61C7 (ken3)\r\n61C8 (xie4)\r\n61C9 (ying4,ying1)\r\n61CA (ao4)\r\n61CB (mao4)\r\n61CC (yi4)\r\n61CD (lin3)\r\n61CE (se4)\r\n61CF (jun4)\r\n61D0 (huai2)\r\n61D1 (men4)\r\n61D2 (lan3)\r\n61D3 (ai4)\r\n61D4 (lin3)\r\n61D5 (yan1)\r\n61D6 (gua1)\r\n61D7 (xia4)\r\n61D8 (chi4)\r\n61D9 (yu3)\r\n61DA (yin4)\r\n61DB (dai1)\r\n61DC (meng3)\r\n61DD (ai4)\r\n61DE (meng3)\r\n61DF (dui4)\r\n61E0 (qi2)\r\n61E1 (mo3)\r\n61E2 (lan2)\r\n61E3 (men4)\r\n61E4 (chou2)\r\n61E5 (zhi4)\r\n61E6 (nuo4)\r\n61E7 (nuo4)\r\n61E8 (yan1,yan4)\r\n61E9 (yang3)\r\n61EA (bo2)\r\n61EB (zhi2)\r\n61EC (xing4)\r\n61ED (kuang4)\r\n61EE (you1)\r\n61EF (fu2)\r\n61F0 (liu2)\r\n61F1 (mie4)\r\n61F2 (cheng2)\r\n61F3 (none0)\r\n61F4 (chan4)\r\n61F5 (meng3)\r\n61F6 (lan3)\r\n61F7 (huai2)\r\n61F8 (xuan2)\r\n61F9 (rang4)\r\n61FA (chan4)\r\n61FB (ji4)\r\n61FC (ju4)\r\n61FD (huan1)\r\n61FE (she4,zhe2)\r\n61FF (yi4)\r\n6200 (lian4)\r\n6201 (nan3)\r\n6202 (mi2)\r\n6203 (tang3)\r\n6204 (jue2)\r\n6205 (gang4)\r\n6206 (gang4,zhuang4)\r\n6207 (zhuang4)\r\n6208 (ge1)\r\n6209 (yue4)\r\n620A (wu4)\r\n620B (jian1)\r\n620C (xu1,qu5)\r\n620D (shu4)\r\n620E (rong2)\r\n620F (xi4,hu1)\r\n6210 (cheng2)\r\n6211 (wo3)\r\n6212 (jie4)\r\n6213 (ge1)\r\n6214 (jian1)\r\n6215 (qiang1)\r\n6216 (huo4)\r\n6217 (qiang1,qiang4)\r\n6218 (zhan4)\r\n6219 (dong4)\r\n621A (qi1)\r\n621B (jia2)\r\n621C (die2)\r\n621D (cai2)\r\n621E (jia2)\r\n621F (ji3)\r\n6220 (shi4,chi4)\r\n6221 (kan1)\r\n6222 (ji2)\r\n6223 (kui2)\r\n6224 (gai4)\r\n6225 (deng3)\r\n6226 (zhan4)\r\n6227 (chuang1,qiang1,qiang4)\r\n6228 (ge1)\r\n6229 (jian3)\r\n622A (jie2)\r\n622B (yu4)\r\n622C (jian3)\r\n622D (yan3)\r\n622E (lu4)\r\n622F (xi4,hu1)\r\n6230 (zhan4)\r\n6231 (xi4)\r\n6232 (xi4,hu1)\r\n6233 (chuo1)\r\n6234 (dai4)\r\n6235 (qu2)\r\n6236 (hu4)\r\n6237 (hu4)\r\n6238 (hu4)\r\n6239 (e4)\r\n623A (shi4)\r\n623B (li4)\r\n623C (mao3)\r\n623D (hu4)\r\n623E (li4)\r\n623F (fang2)\r\n6240 (suo3)\r\n6241 (bian3,pian1)\r\n6242 (dian4)\r\n6243 (jiong1)\r\n6244 (shang3)\r\n6245 (yi2)\r\n6246 (yi3)\r\n6247 (shan4,shan1)\r\n6248 (hu4)\r\n6249 (fei1)\r\n624A (yan3)\r\n624B (shou3)\r\n624C (shou3)\r\n624D (cai2)\r\n624E (zha1,za1,zha2)\r\n624F (qiu2)\r\n6250 (le4)\r\n6251 (pu1)\r\n6252 (ba1,pa2,pa1)\r\n6253 (da3,da2)\r\n6254 (reng1)\r\n6255 (fu2,bi4)\r\n6256 (none0)\r\n6257 (zai4)\r\n6258 (tuo1)\r\n6259 (zhang4)\r\n625A (diao1)\r\n625B (kang2,gang1)\r\n625C (yu1)\r\n625D (ku1)\r\n625E (han4)\r\n625F (shen1)\r\n6260 (cha1)\r\n6261 (chi3)\r\n6262 (gu3)\r\n6263 (kou4)\r\n6264 (wu4)\r\n6265 (tuo1)\r\n6266 (qian1)\r\n6267 (zhi2)\r\n6268 (cha1)\r\n6269 (kuo4)\r\n626A (men2)\r\n626B (sao3,sao4)\r\n626C (yang2)\r\n626D (niu3)\r\n626E (ban4)\r\n626F (che3)\r\n6270 (rao3)\r\n6271 (xi1)\r\n6272 (qian2)\r\n6273 (ban1,pan1)\r\n6274 (jia2)\r\n6275 (yu2)\r\n6276 (fu2)\r\n6277 (ao4)\r\n6278 (xi1)\r\n6279 (pi1)\r\n627A (zhi3)\r\n627B (zi4)\r\n627C (e4)\r\n627D (dun4)\r\n627E (zhao3)\r\n627F (cheng2)\r\n6280 (ji4)\r\n6281 (yan3)\r\n6282 (kuang2)\r\n6283 (bian4)\r\n6284 (chao1)\r\n6285 (ju1)\r\n6286 (wen4)\r\n6287 (hu2)\r\n6288 (yue4)\r\n6289 (jue2)\r\n628A (ba3,ba4)\r\n628B (qin4)\r\n628C (zhen3)\r\n628D (zheng3)\r\n628E (yun3)\r\n628F (wan2)\r\n6290 (na4)\r\n6291 (yi4)\r\n6292 (shu1)\r\n6293 (zhua1)\r\n6294 (pou2)\r\n6295 (tou2)\r\n6296 (dou3)\r\n6297 (kang4)\r\n6298 (zhe2,she2,zhe1)\r\n6299 (pou2)\r\n629A (fu3)\r\n629B (pao1)\r\n629C (ba2)\r\n629D (ao3)\r\n629E (ze2,zhai2)\r\n629F (tuan2)\r\n62A0 (kou1)\r\n62A1 (lun2,lun1)\r\n62A2 (qiang3,qiang1)\r\n62A3 (none0)\r\n62A4 (hu4)\r\n62A5 (bao4)\r\n62A6 (bing3)\r\n62A7 (zhi3)\r\n62A8 (peng1)\r\n62A9 (tan1)\r\n62AA (pu1)\r\n62AB (pi1)\r\n62AC (tai2)\r\n62AD (yao3)\r\n62AE (zhen3)\r\n62AF (zha1)\r\n62B0 (yang3)\r\n62B1 (bao4)\r\n62B2 (he1)\r\n62B3 (ni3)\r\n62B4 (yi4)\r\n62B5 (di3)\r\n62B6 (chi4)\r\n62B7 (pi1)\r\n62B8 (za1)\r\n62B9 (mo3,ma1,mo4)\r\n62BA (mo3)\r\n62BB (chen1,shen4)\r\n62BC (ya1,ya2)\r\n62BD (chou1)\r\n62BE (qu1)\r\n62BF (min3)\r\n62C0 (chu4)\r\n62C1 (jia1)\r\n62C2 (fu2,bi4)\r\n62C3 (zha3)\r\n62C4 (zhu3)\r\n62C5 (dan1,dan4,dan3)\r\n62C6 (chai1,ca1)\r\n62C7 (mu3)\r\n62C8 (nian1,nian3)\r\n62C9 (la1,la2,la3,la4)\r\n62CA (fu3)\r\n62CB (pao1)\r\n62CC (ban4)\r\n62CD (pai1)\r\n62CE (lin1)\r\n62CF (na2)\r\n62D0 (guai3)\r\n62D1 (qian2)\r\n62D2 (ju4)\r\n62D3 (tuo4,ta4)\r\n62D4 (ba2)\r\n62D5 (tuo1)\r\n62D6 (tuo1)\r\n62D7 (ao4,niu4,yao4,ao3)\r\n62D8 (ju1)\r\n62D9 (zhuo1,zhuo2)\r\n62DA (pan4,pin1)\r\n62DB (zhao1)\r\n62DC (bai4)\r\n62DD (bai4)\r\n62DE (di3)\r\n62DF (ni3)\r\n62E0 (ju4,ju1)\r\n62E1 (kuo4)\r\n62E2 (long3)\r\n62E3 (jian3)\r\n62E4 (qia2)\r\n62E5 (yong1)\r\n62E6 (lan2)\r\n62E7 (ning3,ning2,ning4)\r\n62E8 (bo1)\r\n62E9 (ze2,zhai2)\r\n62EA (qian1)\r\n62EB (hen2)\r\n62EC (kuo4,gua1)\r\n62ED (shi4)\r\n62EE (jie2)\r\n62EF (zheng3)\r\n62F0 (nin3)\r\n62F1 (gong3)\r\n62F2 (gong3)\r\n62F3 (quan2)\r\n62F4 (shuan1)\r\n62F5 (tun2)\r\n62F6 (zan3,za1)\r\n62F7 (kao3)\r\n62F8 (chi3)\r\n62F9 (xie2)\r\n62FA (ce4)\r\n62FB (hui1)\r\n62FC (pin1)\r\n62FD (zhuai4,ye4,zhuai1)\r\n62FE (shi2,she4)\r\n62FF (na2)\r\n6300 (bo4)\r\n6301 (chi2)\r\n6302 (gua4)\r\n6303 (zhi4)\r\n6304 (kuo4)\r\n6305 (duo3)\r\n6306 (duo3)\r\n6307 (zhi3,zhi1,zhi2)\r\n6308 (qie4)\r\n6309 (an4)\r\n630A (nong4,long4)\r\n630B (zhen4)\r\n630C (ge2)\r\n630D (jiao4)\r\n630E (kua4)\r\n630F (dong4)\r\n6310 (ru2,na2)\r\n6311 (tiao3,tiao1)\r\n6312 (lie4)\r\n6313 (zha1)\r\n6314 (lu:3)\r\n6315 (die2)\r\n6316 (wa1)\r\n6317 (jue2)\r\n6318 (none0)\r\n6319 (ju3)\r\n631A (zhi4)\r\n631B (luan2)\r\n631C (ya4)\r\n631D (wo1,zhua1)\r\n631E (ta4)\r\n631F (xie2,jia1)\r\n6320 (nao2)\r\n6321 (dang3,dang4)\r\n6322 (jiao3,jia3)\r\n6323 (zheng1,zheng4)\r\n6324 (ji3)\r\n6325 (hui1)\r\n6326 (xian2)\r\n6327 (none0)\r\n6328 (ai1,ai2)\r\n6329 (tuo1)\r\n632A (nuo2)\r\n632B (cuo4)\r\n632C (bo2)\r\n632D (geng3)\r\n632E (ti3)\r\n632F (zhen4)\r\n6330 (cheng2)\r\n6331 (suo1)\r\n6332 (suo1,sa1,sha1)\r\n6333 (keng1,keng3)\r\n6334 (mei3)\r\n6335 (long4,nong4)\r\n6336 (ju2)\r\n6337 (peng2)\r\n6338 (jian3)\r\n6339 (yi4)\r\n633A (ting3)\r\n633B (shan1)\r\n633C (nuo4)\r\n633D (wan3)\r\n633E (xie2,jia2,xia2)\r\n633F (cha1)\r\n6340 (feng1)\r\n6341 (jiao3,jia3)\r\n6342 (wu3,wu2)\r\n6343 (jun4)\r\n6344 (jiu4)\r\n6345 (tong3)\r\n6346 (kun3)\r\n6347 (huo4)\r\n6348 (tu2)\r\n6349 (zhuo1)\r\n634A (pou2)\r\n634B (lu:3,luo1)\r\n634C (ba1)\r\n634D (han4)\r\n634E (shao1,shao4)\r\n634F (nie1)\r\n6350 (juan1)\r\n6351 (she4)\r\n6352 (shu4)\r\n6353 (ye2)\r\n6354 (jue2)\r\n6355 (bu3)\r\n6356 (huan2)\r\n6357 (bu4)\r\n6358 (jun4)\r\n6359 (yi4)\r\n635A (zhai1)\r\n635B (lu:3)\r\n635C (sou1)\r\n635D (tuo1)\r\n635E (lao1)\r\n635F (sun3)\r\n6360 (bang1)\r\n6361 (jian3)\r\n6362 (huan4)\r\n6363 (dao3)\r\n6364 (none0)\r\n6365 (wan4)\r\n6366 (qin2)\r\n6367 (peng3)\r\n6368 (she3,she4)\r\n6369 (lie4)\r\n636A (min2)\r\n636B (men2)\r\n636C (fu3)\r\n636D (bai3)\r\n636E (ju4,ju1)\r\n636F (dao2)\r\n6370 (wo3)\r\n6371 (ai2,ai1)\r\n6372 (juan3)\r\n6373 (yue4)\r\n6374 (zong3)\r\n6375 (chen3)\r\n6376 (chui2)\r\n6377 (jie2)\r\n6378 (tu1)\r\n6379 (ben4)\r\n637A (na4)\r\n637B (nian3)\r\n637C (nuo2)\r\n637D (zu2)\r\n637E (wo4)\r\n637F (xi1,qi1)\r\n6380 (xian1)\r\n6381 (cheng2)\r\n6382 (dian1)\r\n6383 (sao3,sao4)\r\n6384 (lun2,lun1)\r\n6385 (qing4)\r\n6386 (gang1)\r\n6387 (duo1,duo5)\r\n6388 (shou4)\r\n6389 (diao4)\r\n638A (pou2,pou3)\r\n638B (di3)\r\n638C (zhang3)\r\n638D (gun3)\r\n638E (ji3)\r\n638F (tao1)\r\n6390 (qia1)\r\n6391 (qi2)\r\n6392 (pai2,pai3)\r\n6393 (shu2)\r\n6394 (qian1)\r\n6395 (ling2)\r\n6396 (ye4,ye1,yi4)\r\n6397 (ya3)\r\n6398 (jue2)\r\n6399 (zheng1,zheng4)\r\n639A (liang3)\r\n639B (gua4)\r\n639C (yi3)\r\n639D (huo4)\r\n639E (shan4)\r\n639F (ding4)\r\n63A0 (lu:e4,lu:e3)\r\n63A1 (cai3)\r\n63A2 (tan4,tan1)\r\n63A3 (che4)\r\n63A4 (bing1)\r\n63A5 (jie1)\r\n63A6 (ti1)\r\n63A7 (kong4)\r\n63A8 (tui1)\r\n63A9 (yan3)\r\n63AA (cuo4)\r\n63AB (zou1)\r\n63AC (ju1,ju2)\r\n63AD (tian4)\r\n63AE (qian2)\r\n63AF (ken4)\r\n63B0 (bai1,bo4)\r\n63B1 (shou3,pa2)\r\n63B2 (jie1)\r\n63B3 (lu3)\r\n63B4 (guai1,guo2)\r\n63B5 (none0)\r\n63B6 (none0)\r\n63B7 (zhi4,zhi1)\r\n63B8 (dan3,shan4,shan3)\r\n63B9 (none0)\r\n63BA (chan1,shan3,can4)\r\n63BB (sao1)\r\n63BC (guan4)\r\n63BD (peng4)\r\n63BE (yuan4)\r\n63BF (nuo4)\r\n63C0 (jian3)\r\n63C1 (zheng1)\r\n63C2 (jiu1)\r\n63C3 (jian1)\r\n63C4 (yu2)\r\n63C5 (yan2)\r\n63C6 (kui2)\r\n63C7 (nan3)\r\n63C8 (hong1)\r\n63C9 (rou2)\r\n63CA (pi4)\r\n63CB (wei1)\r\n63CC (sai1)\r\n63CD (zou4)\r\n63CE (xuan1)\r\n63CF (miao2)\r\n63D0 (ti2,di1,shi2)\r\n63D1 (nie1)\r\n63D2 (cha1)\r\n63D3 (shi4)\r\n63D4 (zong3)\r\n63D5 (zhen4)\r\n63D6 (yi1)\r\n63D7 (shun3)\r\n63D8 (heng2)\r\n63D9 (bian4)\r\n63DA (yang2)\r\n63DB (huan4)\r\n63DC (yan3)\r\n63DD (zan3)\r\n63DE (an3)\r\n63DF (xu1,ju1)\r\n63E0 (ya4)\r\n63E1 (wo4)\r\n63E2 (ke4)\r\n63E3 (chuai3,chuai1,chuai4)\r\n63E4 (ji2,jie2)\r\n63E5 (ti4)\r\n63E6 (la2)\r\n63E7 (la4)\r\n63E8 (cheng2)\r\n63E9 (kai1)\r\n63EA (jiu1)\r\n63EB (jiu1)\r\n63EC (tu2)\r\n63ED (jie1)\r\n63EE (hui1)\r\n63EF (geng1)\r\n63F0 (chong4)\r\n63F1 (shuo4)\r\n63F2 (she2,die2)\r\n63F3 (xie1)\r\n63F4 (yuan2)\r\n63F5 (qian2)\r\n63F6 (ye2)\r\n63F7 (cha1)\r\n63F8 (zha1)\r\n63F9 (bei1)\r\n63FA (yao2)\r\n63FB (none0)\r\n63FC (none0)\r\n63FD (lan3)\r\n63FE (wen4)\r\n63FF (qin4)\r\n6400 (chan1)\r\n6401 (ge1,ge2)\r\n6402 (lou3,lou1)\r\n6403 (zong3)\r\n6404 (geng1)\r\n6405 (jiao3,jia3)\r\n6406 (gou4)\r\n6407 (qin4)\r\n6408 (yong3)\r\n6409 (que4)\r\n640A (chou1)\r\n640B (chuai1)\r\n640C (zhan3)\r\n640D (sun3)\r\n640E (sun1)\r\n640F (bo2)\r\n6410 (chu4)\r\n6411 (rong3)\r\n6412 (bang4,peng2)\r\n6413 (cuo1)\r\n6414 (sao1)\r\n6415 (ke4)\r\n6416 (yao2)\r\n6417 (dao3)\r\n6418 (zhi1)\r\n6419 (nu4)\r\n641A (xie2)\r\n641B (jian1)\r\n641C (sou1)\r\n641D (qiu3)\r\n641E (gao3)\r\n641F (xian3)\r\n6420 (shuo4)\r\n6421 (sang3)\r\n6422 (jin4)\r\n6423 (mie4)\r\n6424 (e4)\r\n6425 (chui2)\r\n6426 (nuo4)\r\n6427 (shan1)\r\n6428 (ta4)\r\n6429 (jie2)\r\n642A (tang2)\r\n642B (pan2)\r\n642C (ban1)\r\n642D (da1)\r\n642E (li4)\r\n642F (tao1)\r\n6430 (hu2)\r\n6431 (zhi4)\r\n6432 (wa1)\r\n6433 (xia2)\r\n6434 (qian1)\r\n6435 (wen4)\r\n6436 (qiang3,chuang3,qiang1)\r\n6437 (chen1)\r\n6438 (zhen1)\r\n6439 (e4)\r\n643A (xie2)\r\n643B (nuo4)\r\n643C (quan2)\r\n643D (cha2)\r\n643E (zha4)\r\n643F (ge2)\r\n6440 (wu3)\r\n6441 (en4)\r\n6442 (she4)\r\n6443 (gong4)\r\n6444 (she4)\r\n6445 (shu1)\r\n6446 (bai3)\r\n6447 (yao2)\r\n6448 (bin4)\r\n6449 (sou1)\r\n644A (tan1)\r\n644B (sha1)\r\n644C (chan3)\r\n644D (suo1)\r\n644E (liao2)\r\n644F (chong1)\r\n6450 (chuang1)\r\n6451 (guo2,guai1)\r\n6452 (bing4)\r\n6453 (feng2)\r\n6454 (shuai1)\r\n6455 (di4)\r\n6456 (qi4)\r\n6457 (none0)\r\n6458 (zhai1,zhe2)\r\n6459 (lian3)\r\n645A (cheng1)\r\n645B (chi1)\r\n645C (guan4)\r\n645D (lu4)\r\n645E (luo4)\r\n645F (lou3,lou1)\r\n6460 (zong3)\r\n6461 (gai4,xi4)\r\n6462 (hu4)\r\n6463 (zha1)\r\n6464 (chuang3)\r\n6465 (tang4)\r\n6466 (hua4)\r\n6467 (cui1)\r\n6468 (nai2)\r\n6469 (mo2,ma1)\r\n646A (jiang1)\r\n646B (gui1)\r\n646C (ying4)\r\n646D (zhi2)\r\n646E (ao2)\r\n646F (zhi4)\r\n6470 (chi4)\r\n6471 (man2)\r\n6472 (shan4)\r\n6473 (kou1)\r\n6474 (shu1)\r\n6475 (suo3)\r\n6476 (tuan2)\r\n6477 (zhao1)\r\n6478 (mo1,mo2)\r\n6479 (mo2)\r\n647A (zhe2)\r\n647B (chan1,shan3)\r\n647C (keng1)\r\n647D (biao1,biao4)\r\n647E (jiang4)\r\n647F (yin1)\r\n6480 (gou4)\r\n6481 (qian1)\r\n6482 (liao4,liao1,liao2)\r\n6483 (ji1)\r\n6484 (ying1)\r\n6485 (jue1)\r\n6486 (pie1)\r\n6487 (pie3,pie1)\r\n6488 (lao1)\r\n6489 (dun1)\r\n648A (xian4)\r\n648B (ruan2)\r\n648C (kui4)\r\n648D (zan3)\r\n648E (yi4)\r\n648F (xian2)\r\n6490 (cheng1)\r\n6491 (cheng1)\r\n6492 (sa1,sa3)\r\n6493 (nao2)\r\n6494 (heng4)\r\n6495 (si1)\r\n6496 (han4)\r\n6497 (huang2)\r\n6498 (da1)\r\n6499 (zun3)\r\n649A (nian3)\r\n649B (lin3)\r\n649C (zheng3)\r\n649D (hui1)\r\n649E (zhuang4,chuang2)\r\n649F (jiao3,jia3)\r\n64A0 (ji3)\r\n64A1 (cao1)\r\n64A2 (dan3)\r\n64A3 (dan3,shan3,shan4)\r\n64A4 (che4)\r\n64A5 (bo1)\r\n64A6 (che3)\r\n64A7 (jue2)\r\n64A8 (xiao1)\r\n64A9 (liao2,liao1,liao4)\r\n64AA (ben4)\r\n64AB (fu3)\r\n64AC (qiao4)\r\n64AD (bo1,bo4)\r\n64AE (cuo1,zuo3,cuo4,cuo3)\r\n64AF (zhuo2)\r\n64B0 (zhuan4)\r\n64B1 (tuo3)\r\n64B2 (pu1)\r\n64B3 (qin4)\r\n64B4 (dun1)\r\n64B5 (nian3)\r\n64B6 (none0)\r\n64B7 (xie2)\r\n64B8 (lu1)\r\n64B9 (jiao3,jia3)\r\n64BA (cuan1)\r\n64BB (ta4)\r\n64BC (han4)\r\n64BD (qiao4)\r\n64BE (zhua1,wo1)\r\n64BF (jian3)\r\n64C0 (gan3)\r\n64C1 (yong3,yong1)\r\n64C2 (lei2,lei4,lei1)\r\n64C3 (kuo3)\r\n64C4 (lu3)\r\n64C5 (shan4)\r\n64C6 (zhuo2)\r\n64C7 (ze2,zhai2)\r\n64C8 (pu1)\r\n64C9 (chuo4)\r\n64CA (ji2,ji1)\r\n64CB (dang3,dang4)\r\n64CC (se4)\r\n64CD (cao1,cao4)\r\n64CE (qing2)\r\n64CF (jing4)\r\n64D0 (huan4)\r\n64D1 (jie1)\r\n64D2 (qin2)\r\n64D3 (kuai3)\r\n64D4 (dan1,dan3,dan4)\r\n64D5 (xie2)\r\n64D6 (ge3)\r\n64D7 (pi3)\r\n64D8 (bo4,bai1)\r\n64D9 (ao4)\r\n64DA (ju4,ju1)\r\n64DB (ye4)\r\n64DC (none0)\r\n64DD (none0)\r\n64DE (sou3,sou4)\r\n64DF (mi2)\r\n64E0 (ji3)\r\n64E1 (tai2)\r\n64E2 (zhuo2)\r\n64E3 (dao3)\r\n64E4 (xing3)\r\n64E5 (lan3)\r\n64E6 (ca1)\r\n64E7 (ju3)\r\n64E8 (ye2)\r\n64E9 (ru3)\r\n64EA (ye4)\r\n64EB (ye4)\r\n64EC (ni3)\r\n64ED (huo4)\r\n64EE (ji2)\r\n64EF (bin4)\r\n64F0 (ning3,ning2)\r\n64F1 (ge1,ge2)\r\n64F2 (zhi4,zhi2)\r\n64F3 (jie2)\r\n64F4 (kuo4)\r\n64F5 (mo2,ma1)\r\n64F6 (jian4)\r\n64F7 (xie2)\r\n64F8 (lie4)\r\n64F9 (tan1)\r\n64FA (bai3)\r\n64FB (sou3,sou4)\r\n64FC (lu1)\r\n64FD (lu:e4)\r\n64FE (rao3)\r\n64FF (zhi2)\r\n6500 (pan1)\r\n6501 (yang3)\r\n6502 (lei4)\r\n6503 (sa4)\r\n6504 (shu1)\r\n6505 (zan3,cuan2)\r\n6506 (nian3)\r\n6507 (xian3)\r\n6508 (jun4)\r\n6509 (huo1)\r\n650A (lu:e4)\r\n650B (la4)\r\n650C (han4)\r\n650D (ying2)\r\n650E (lu2)\r\n650F (long3)\r\n6510 (qian1)\r\n6511 (qian1)\r\n6512 (zan3,cuan2)\r\n6513 (qian1)\r\n6514 (lan2)\r\n6515 (san1)\r\n6516 (ying1)\r\n6517 (mei2)\r\n6518 (rang3,rang2)\r\n6519 (chan1)\r\n651A (none0)\r\n651B (cuan1)\r\n651C (xie2,xi1)\r\n651D (she4)\r\n651E (luo1)\r\n651F (jun4)\r\n6520 (mi2)\r\n6521 (li2)\r\n6522 (zan3,cuan2)\r\n6523 (luan2)\r\n6524 (tan1)\r\n6525 (zuan4)\r\n6526 (li4)\r\n6527 (dian1)\r\n6528 (wa1)\r\n6529 (dang3)\r\n652A (jiao3,gao3,jia3)\r\n652B (jue2)\r\n652C (lan3)\r\n652D (li4)\r\n652E (nang3)\r\n652F (zhi1)\r\n6530 (gui4)\r\n6531 (gui3)\r\n6532 (qi1)\r\n6533 (xin2)\r\n6534 (po1)\r\n6535 (po1)\r\n6536 (shou1)\r\n6537 (kao3)\r\n6538 (you1)\r\n6539 (gai3)\r\n653A (gai3)\r\n653B (gong1)\r\n653C (gan1)\r\n653D (ban1)\r\n653E (fang4)\r\n653F (zheng4)\r\n6540 (bo2)\r\n6541 (dian1)\r\n6542 (kou4)\r\n6543 (min3)\r\n6544 (wu4)\r\n6545 (gu4)\r\n6546 (ge2)\r\n6547 (ce4)\r\n6548 (xiao4)\r\n6549 (mi3)\r\n654A (chu4)\r\n654B (ge2)\r\n654C (di2)\r\n654D (xu4)\r\n654E (jiao4)\r\n654F (min3)\r\n6550 (chen2)\r\n6551 (jiu4)\r\n6552 (shen1)\r\n6553 (duo2)\r\n6554 (yu3)\r\n6555 (chi4)\r\n6556 (ao2)\r\n6557 (bai4)\r\n6558 (xu4)\r\n6559 (jiao4,jiao1)\r\n655A (duo2)\r\n655B (lian3)\r\n655C (nie4)\r\n655D (bi4)\r\n655E (chang3,tang3)\r\n655F (dian4)\r\n6560 (duo2)\r\n6561 (yi4)\r\n6562 (gan3)\r\n6563 (san4,san3,san5)\r\n6564 (ke3)\r\n6565 (yan4)\r\n6566 (dun1,dui4)\r\n6567 (qi3)\r\n6568 (dou3)\r\n6569 (xiao4)\r\n656A (duo2)\r\n656B (jiao3,jia3)\r\n656C (jing4)\r\n656D (yang2)\r\n656E (xia2)\r\n656F (hun1,min3)\r\n6570 (shu4,shu3,shuo4)\r\n6571 (ai2)\r\n6572 (qiao1)\r\n6573 (ai2)\r\n6574 (zheng3)\r\n6575 (di2)\r\n6576 (zhen4)\r\n6577 (fu1)\r\n6578 (shu4,shu3,shuo4)\r\n6579 (liao2)\r\n657A (qu1)\r\n657B (xiong4)\r\n657C (xi3)\r\n657D (jiao3)\r\n657E (none0)\r\n657F (qiao2)\r\n6580 (zhuo2)\r\n6581 (yi4,du4)\r\n6582 (lian4,lian3)\r\n6583 (bi4)\r\n6584 (li4)\r\n6585 (xue2)\r\n6586 (xiao4)\r\n6587 (wen2,wen4)\r\n6588 (xue2)\r\n6589 (qi2,ji4,qi4)\r\n658A (qi2,ji4,qi4)\r\n658B (zhai1)\r\n658C (bin1)\r\n658D (jue2)\r\n658E (zhai1)\r\n658F (lang3)\r\n6590 (fei3)\r\n6591 (ban1)\r\n6592 (ban1)\r\n6593 (lan2)\r\n6594 (yu3)\r\n6595 (lan2)\r\n6596 (wei3)\r\n6597 (dou4,dou3)\r\n6598 (sheng1)\r\n6599 (liao4)\r\n659A (jia3)\r\n659B (hu2)\r\n659C (xie2,xia2)\r\n659D (jia3)\r\n659E (yu3)\r\n659F (zhen1)\r\n65A0 (jiao4)\r\n65A1 (wo4)\r\n65A2 (tiao3,tou4)\r\n65A3 (dou4)\r\n65A4 (jin1,jin5)\r\n65A5 (chi4)\r\n65A6 (yin2)\r\n65A7 (fu3)\r\n65A8 (qiang1)\r\n65A9 (zhan3)\r\n65AA (qu2,ju1)\r\n65AB (zhuo2)\r\n65AC (zhan3)\r\n65AD (duan4)\r\n65AE (zhuo2)\r\n65AF (si1)\r\n65B0 (xin1)\r\n65B1 (zhuo2)\r\n65B2 (zhuo2)\r\n65B3 (qin2)\r\n65B4 (lin2)\r\n65B5 (zhuo2)\r\n65B6 (chu4)\r\n65B7 (duan4)\r\n65B8 (zhu3)\r\n65B9 (fang1)\r\n65BA (xie4)\r\n65BB (hang2)\r\n65BC (wu1,yu1,yu2)\r\n65BD (shi1)\r\n65BE (pei4)\r\n65BF (you2)\r\n65C0 (none0)\r\n65C1 (pang2,bang4)\r\n65C2 (qi2)\r\n65C3 (zhan1)\r\n65C4 (mao2,mao4)\r\n65C5 (lu:3)\r\n65C6 (pei4)\r\n65C7 (pi1)\r\n65C8 (liu2)\r\n65C9 (fu1)\r\n65CA (fang3)\r\n65CB (xuan2,xuan4)\r\n65CC (jing1)\r\n65CD (jing1)\r\n65CE (ni3)\r\n65CF (zu2)\r\n65D0 (zhao4)\r\n65D1 (yi3)\r\n65D2 (liu2)\r\n65D3 (shao1)\r\n65D4 (jian4)\r\n65D5 (none0)\r\n65D6 (yi3)\r\n65D7 (qi2)\r\n65D8 (zhi4)\r\n65D9 (fan1)\r\n65DA (piao1)\r\n65DB (fan1)\r\n65DC (zhan1)\r\n65DD (guai4)\r\n65DE (sui4)\r\n65DF (yu2)\r\n65E0 (wu2,mo2)\r\n65E1 (ji4)\r\n65E2 (ji4)\r\n65E3 (ji4)\r\n65E4 (huo4)\r\n65E5 (ri4)\r\n65E6 (dan4)\r\n65E7 (jiu4)\r\n65E8 (zhi3)\r\n65E9 (zao3)\r\n65EA (xie2)\r\n65EB (tiao1)\r\n65EC (xun2)\r\n65ED (xu4)\r\n65EE (ga1)\r\n65EF (la2)\r\n65F0 (gan4)\r\n65F1 (han4)\r\n65F2 (tai2)\r\n65F3 (di4)\r\n65F4 (xu1)\r\n65F5 (chan3)\r\n65F6 (shi2)\r\n65F7 (kuang4)\r\n65F8 (yang2)\r\n65F9 (shi2)\r\n65FA (wang4)\r\n65FB (min2)\r\n65FC (min2)\r\n65FD (tun1)\r\n65FE (chun1)\r\n65FF (wu4)\r\n6600 (yun2)\r\n6601 (bei4)\r\n6602 (ang2)\r\n6603 (ze4)\r\n6604 (ban3)\r\n6605 (jie2)\r\n6606 (kun1)\r\n6607 (sheng1)\r\n6608 (hu4)\r\n6609 (fang3)\r\n660A (hao4)\r\n660B (gui4)\r\n660C (chang1)\r\n660D (xuan1)\r\n660E (ming2)\r\n660F (hun1)\r\n6610 (fen1)\r\n6611 (qin3)\r\n6612 (hu1)\r\n6613 (yi4)\r\n6614 (xi1,xi2)\r\n6615 (xin1)\r\n6616 (yan2)\r\n6617 (ze4)\r\n6618 (fang3)\r\n6619 (tan2)\r\n661A (shen4)\r\n661B (ju4)\r\n661C (yang2)\r\n661D (zan3)\r\n661E (bing3)\r\n661F (xing1)\r\n6620 (ying4)\r\n6621 (xuan4)\r\n6622 (pei3)\r\n6623 (zhen3)\r\n6624 (ling2)\r\n6625 (chun1)\r\n6626 (hao4)\r\n6627 (mei4)\r\n6628 (zuo2)\r\n6629 (mo4)\r\n662A (bian4)\r\n662B (xu4)\r\n662C (hun1)\r\n662D (zhao1)\r\n662E (zong4)\r\n662F (shi4)\r\n6630 (shi4)\r\n6631 (yu4)\r\n6632 (fei4,fu2)\r\n6633 (die2)\r\n6634 (mao3)\r\n6635 (ni4,ni3)\r\n6636 (chang3)\r\n6637 (wen1)\r\n6638 (dong1)\r\n6639 (ai3)\r\n663A (bing3)\r\n663B (ang2)\r\n663C (zhou4)\r\n663D (long2)\r\n663E (xian3)\r\n663F (kuang4)\r\n6640 (tiao3)\r\n6641 (chao2,zhao1,zhao4)\r\n6642 (shi2)\r\n6643 (huang3,huang4)\r\n6644 (huang3,huang4)\r\n6645 (xuan1)\r\n6646 (kui2)\r\n6647 (xu1,kua1)\r\n6648 (jiao3)\r\n6649 (jin4)\r\n664A (zhi3)\r\n664B (jin4)\r\n664C (shang3)\r\n664D (tong2)\r\n664E (hong3)\r\n664F (yan4)\r\n6650 (gai1)\r\n6651 (xiang3)\r\n6652 (shai4)\r\n6653 (xiao3)\r\n6654 (ye4)\r\n6655 (yun1,yun4)\r\n6656 (hui1)\r\n6657 (han2)\r\n6658 (han4)\r\n6659 (jun4)\r\n665A (wan3)\r\n665B (xian4)\r\n665C (kun1)\r\n665D (zhou4)\r\n665E (xi1)\r\n665F (sheng4,cheng2)\r\n6660 (sheng4)\r\n6661 (bu1)\r\n6662 (zhe2,zhe1,zhe5)\r\n6663 (zhe1)\r\n6664 (wu4)\r\n6665 (han4)\r\n6666 (hui4)\r\n6667 (hao4)\r\n6668 (chen2)\r\n6669 (wan3)\r\n666A (tian3)\r\n666B (zhuo1)\r\n666C (zui4)\r\n666D (zhou3)\r\n666E (pu3)\r\n666F (jing3,ying3)\r\n6670 (xi1)\r\n6671 (shan3)\r\n6672 (yi3)\r\n6673 (xi1)\r\n6674 (qing2)\r\n6675 (qi3)\r\n6676 (jing1)\r\n6677 (gui3)\r\n6678 (zhen3)\r\n6679 (yi4)\r\n667A (zhi4)\r\n667B (an3)\r\n667C (wan3)\r\n667D (lin2)\r\n667E (liang4)\r\n667F (chang1)\r\n6680 (wang3)\r\n6681 (xiao3)\r\n6682 (zan4)\r\n6683 (none0)\r\n6684 (xuan1)\r\n6685 (geng4)\r\n6686 (yi2)\r\n6687 (xia2,xia4)\r\n6688 (yun1,yun4)\r\n6689 (hui1)\r\n668A (fu3)\r\n668B (min3,min2)\r\n668C (kui2)\r\n668D (he4)\r\n668E (ying4)\r\n668F (du3)\r\n6690 (wei3)\r\n6691 (shu3)\r\n6692 (qing2)\r\n6693 (mao4)\r\n6694 (nan2)\r\n6695 (jian3)\r\n6696 (nuan3)\r\n6697 (an4)\r\n6698 (yang2)\r\n6699 (chun1)\r\n669A (yao2)\r\n669B (suo3)\r\n669C (pu3)\r\n669D (ming2,ming4)\r\n669E (jiao3)\r\n669F (kai3)\r\n66A0 (gao3)\r\n66A1 (weng3)\r\n66A2 (chang4)\r\n66A3 (qi4)\r\n66A4 (hao4)\r\n66A5 (yan4)\r\n66A6 (li4)\r\n66A7 (ai4)\r\n66A8 (ji4)\r\n66A9 (gui4)\r\n66AA (men3)\r\n66AB (zan4,zhan4)\r\n66AC (xie4)\r\n66AD (hao4)\r\n66AE (mu4)\r\n66AF (mo4)\r\n66B0 (cong1)\r\n66B1 (ni4)\r\n66B2 (zhang1)\r\n66B3 (hui4)\r\n66B4 (bao4,pu4)\r\n66B5 (han4)\r\n66B6 (xuan2)\r\n66B7 (chuan2)\r\n66B8 (liao3)\r\n66B9 (xian1)\r\n66BA (dan4)\r\n66BB (jing3)\r\n66BC (pie1)\r\n66BD (lin2)\r\n66BE (tun1)\r\n66BF (xi3)\r\n66C0 (yi4)\r\n66C1 (ji4)\r\n66C2 (kuang4)\r\n66C3 (dai4)\r\n66C4 (ye4)\r\n66C5 (ye4)\r\n66C6 (li4)\r\n66C7 (tan2)\r\n66C8 (tong2)\r\n66C9 (xiao3)\r\n66CA (fei4)\r\n66CB (qin3)\r\n66CC (zhao4)\r\n66CD (hao4)\r\n66CE (yi4)\r\n66CF (xiang4)\r\n66D0 (xing1)\r\n66D1 (sen1)\r\n66D2 (jiao3)\r\n66D3 (bao4)\r\n66D4 (jing4)\r\n66D5 (none0)\r\n66D6 (ai4)\r\n66D7 (ye4)\r\n66D8 (ru2)\r\n66D9 (shu3,shu4)\r\n66DA (meng2)\r\n66DB (xun1)\r\n66DC (yao4,yue4)\r\n66DD (pu4,bao4)\r\n66DE (li4)\r\n66DF (chen2)\r\n66E0 (kuang4)\r\n66E1 (die2)\r\n66E2 (none0)\r\n66E3 (yan4)\r\n66E4 (huo4)\r\n66E5 (lu2)\r\n66E6 (xi1)\r\n66E7 (rong2)\r\n66E8 (long2)\r\n66E9 (nang3)\r\n66EA (luo3)\r\n66EB (luan2)\r\n66EC (shai4)\r\n66ED (tang3)\r\n66EE (yan3)\r\n66EF (chu2)\r\n66F0 (yue1)\r\n66F1 (yue1)\r\n66F2 (qu3,qu1)\r\n66F3 (ye4,zhuai4,yi4)\r\n66F4 (geng4,geng1)\r\n66F5 (zhuai4)\r\n66F6 (hu1)\r\n66F7 (he2)\r\n66F8 (shu1)\r\n66F9 (cao2)\r\n66FA (cao2)\r\n66FB (sheng1)\r\n66FC (man4)\r\n66FD (ceng2,zeng1)\r\n66FE (ceng2,zeng1)\r\n66FF (ti4)\r\n6700 (zui4)\r\n6701 (can3)\r\n6702 (xu4)\r\n6703 (hui4,hui3,kuai4)\r\n6704 (yin4)\r\n6705 (qie4)\r\n6706 (fen1)\r\n6707 (pi2,bi4)\r\n6708 (yue4)\r\n6709 (you3,you4)\r\n670A (ruan3)\r\n670B (peng2)\r\n670C (ban1)\r\n670D (fu2,fu4)\r\n670E (ling2)\r\n670F (fei3)\r\n6710 (qu2)\r\n6711 (none0)\r\n6712 (nu:4)\r\n6713 (tiao4,tiao3)\r\n6714 (shuo4)\r\n6715 (zhen4)\r\n6716 (lang3)\r\n6717 (lang3)\r\n6718 (juan1,zui1)\r\n6719 (ming2)\r\n671A (huang1)\r\n671B (wang4)\r\n671C (tun1)\r\n671D (chao2,zhao1)\r\n671E (ji1,qi1)\r\n671F (qi1,ji1,qi2)\r\n6720 (ying1)\r\n6721 (zong3)\r\n6722 (wang4)\r\n6723 (tong2)\r\n6724 (lang3)\r\n6725 (none0)\r\n6726 (meng2)\r\n6727 (long2)\r\n6728 (mu4)\r\n6729 (deng3)\r\n672A (wei4)\r\n672B (mo4)\r\n672C (ben3)\r\n672D (zha2)\r\n672E (zhu2)\r\n672F (shu4,zhu2)\r\n6730 (none0)\r\n6731 (zhu1)\r\n6732 (ren2)\r\n6733 (ba1)\r\n6734 (po4,piao2,pu3,po1,pu2)\r\n6735 (duo3)\r\n6736 (duo3)\r\n6737 (dao1)\r\n6738 (li4)\r\n6739 (qiu2)\r\n673A (ji1)\r\n673B (jiu1)\r\n673C (bi3)\r\n673D (xiu3)\r\n673E (ting2)\r\n673F (ci4)\r\n6740 (sha1)\r\n6741 (none0)\r\n6742 (za2)\r\n6743 (quan2)\r\n6744 (qian1)\r\n6745 (yu2)\r\n6746 (gan1,gan3)\r\n6747 (wu1)\r\n6748 (cha1,cha4)\r\n6749 (shan1,sha1)\r\n674A (xun2)\r\n674B (fan2)\r\n674C (wu4)\r\n674D (zi3)\r\n674E (li3)\r\n674F (xing4)\r\n6750 (cai2)\r\n6751 (cun1)\r\n6752 (ren4)\r\n6753 (shao2,biao1)\r\n6754 (zhe2)\r\n6755 (di4)\r\n6756 (zhang4)\r\n6757 (mang2)\r\n6758 (chi4)\r\n6759 (yi4)\r\n675A (gu3)\r\n675B (gong1)\r\n675C (du4)\r\n675D (yi2)\r\n675E (qi3)\r\n675F (shu4)\r\n6760 (gang1,gang4)\r\n6761 (tiao2)\r\n6762 (none0)\r\n6763 (none0)\r\n6764 (none0)\r\n6765 (lai2)\r\n6766 (shan1)\r\n6767 (mang2)\r\n6768 (yang2)\r\n6769 (ma4)\r\n676A (miao3)\r\n676B (si4)\r\n676C (yuan2)\r\n676D (hang2)\r\n676E (fei4)\r\n676F (bei1)\r\n6770 (jie2)\r\n6771 (dong1)\r\n6772 (gao3)\r\n6773 (yao3,miao3)\r\n6774 (xian1)\r\n6775 (chu3)\r\n6776 (chun1)\r\n6777 (pa2,ba5)\r\n6778 (shu1)\r\n6779 (hua4)\r\n677A (xin2)\r\n677B (chou3,niu3)\r\n677C (zhu4)\r\n677D (chou3)\r\n677E (song1)\r\n677F (ban3)\r\n6780 (song1)\r\n6781 (ji2)\r\n6782 (yue4)\r\n6783 (yun2)\r\n6784 (gou4)\r\n6785 (ji1)\r\n6786 (mao2)\r\n6787 (pi2)\r\n6788 (bi4)\r\n6789 (wang3)\r\n678A (ang4)\r\n678B (fang1)\r\n678C (fen2)\r\n678D (yi4)\r\n678E (fu2)\r\n678F (nan2)\r\n6790 (xi1)\r\n6791 (hu4)\r\n6792 (ya2)\r\n6793 (dou3)\r\n6794 (xun2)\r\n6795 (zhen3,zhen4)\r\n6796 (yao3)\r\n6797 (lin2)\r\n6798 (rui4)\r\n6799 (e4)\r\n679A (mei2)\r\n679B (zhao4)\r\n679C (guo3)\r\n679D (zhi1,qi2)\r\n679E (zong1,cong1)\r\n679F (yun4)\r\n67A0 (none0)\r\n67A1 (dou3)\r\n67A2 (shu1)\r\n67A3 (zao3)\r\n67A4 (none0)\r\n67A5 (li4)\r\n67A6 (lu2)\r\n67A7 (jian3)\r\n67A8 (cheng2)\r\n67A9 (song1)\r\n67AA (qiang1)\r\n67AB (feng1)\r\n67AC (nan2)\r\n67AD (xiao1)\r\n67AE (xian1)\r\n67AF (ku1)\r\n67B0 (ping2)\r\n67B1 (tai2)\r\n67B2 (xi3)\r\n67B3 (zhi3,zhi1)\r\n67B4 (guai3)\r\n67B5 (xiao1)\r\n67B6 (jia4)\r\n67B7 (jia1)\r\n67B8 (gou3,gou1,ju3)\r\n67B9 (bao1,fu2)\r\n67BA (mo4)\r\n67BB (yi4)\r\n67BC (ye4)\r\n67BD (sang1)\r\n67BE (shi4)\r\n67BF (nie4)\r\n67C0 (bi3)\r\n67C1 (tuo2,duo4,duo1)\r\n67C2 (yi2)\r\n67C3 (ling2)\r\n67C4 (bing3,bing4)\r\n67C5 (ni3)\r\n67C6 (la1)\r\n67C7 (he2)\r\n67C8 (ban4)\r\n67C9 (fan2,bian1)\r\n67CA (zhong1)\r\n67CB (dai4)\r\n67CC (ci2)\r\n67CD (yang1)\r\n67CE (fu1)\r\n67CF (bo2,bai3,bo4)\r\n67D0 (mou3)\r\n67D1 (gan1)\r\n67D2 (qi1)\r\n67D3 (ran3)\r\n67D4 (rou2)\r\n67D5 (mao4)\r\n67D6 (zhao1)\r\n67D7 (song1)\r\n67D8 (zhe4)\r\n67D9 (xia2)\r\n67DA (you4,you2)\r\n67DB (shen1)\r\n67DC (ju3,gui4)\r\n67DD (tuo4)\r\n67DE (zuo4,zha4)\r\n67DF (nan2)\r\n67E0 (ning2)\r\n67E1 (yong3)\r\n67E2 (di3)\r\n67E3 (zhi2)\r\n67E4 (zha1)\r\n67E5 (cha2,zha1)\r\n67E6 (dan4)\r\n67E7 (gu1)\r\n67E8 (none0)\r\n67E9 (jiu4)\r\n67EA (ao1)\r\n67EB (fu2,bi4)\r\n67EC (jian3)\r\n67ED (bo1)\r\n67EE (duo4)\r\n67EF (ke1)\r\n67F0 (nai4)\r\n67F1 (zhu4)\r\n67F2 (bi4)\r\n67F3 (liu3)\r\n67F4 (chai2)\r\n67F5 (zha4)\r\n67F6 (si4)\r\n67F7 (zhu4)\r\n67F8 (pei1)\r\n67F9 (shi4)\r\n67FA (guai3)\r\n67FB (cha2,zha1)\r\n67FC (yao2)\r\n67FD (cheng1)\r\n67FE (jiu4)\r\n67FF (shi4)\r\n6800 (zhi1)\r\n6801 (liu3)\r\n6802 (mei2)\r\n6803 (none0)\r\n6804 (rong2)\r\n6805 (zha4,shan1)\r\n6806 (none0)\r\n6807 (biao1)\r\n6808 (zhan4)\r\n6809 (zhi4)\r\n680A (long2)\r\n680B (dong4)\r\n680C (lu2)\r\n680D (none0)\r\n680E (li4,yue4)\r\n680F (lan2)\r\n6810 (yong3)\r\n6811 (shu4)\r\n6812 (xun2)\r\n6813 (shuan1)\r\n6814 (qi4)\r\n6815 (zhen1)\r\n6816 (qi1,xi1)\r\n6817 (li4)\r\n6818 (chi2,yi2)\r\n6819 (xiang2)\r\n681A (zhen4)\r\n681B (li4)\r\n681C (su4)\r\n681D (gua1,kuo4)\r\n681E (kan1)\r\n681F (bing1,ben1)\r\n6820 (ren3)\r\n6821 (xiao4,jiao4)\r\n6822 (bo2,bai3)\r\n6823 (ren3)\r\n6824 (bing4)\r\n6825 (zi1)\r\n6826 (chou2)\r\n6827 (yi4)\r\n6828 (ci4)\r\n6829 (xu3)\r\n682A (zhu1)\r\n682B (jian4)\r\n682C (zui4)\r\n682D (er2)\r\n682E (er3)\r\n682F (yu4)\r\n6830 (fa2)\r\n6831 (gong3)\r\n6832 (kao3)\r\n6833 (lao3)\r\n6834 (zhan1)\r\n6835 (li4)\r\n6836 (none0)\r\n6837 (yang4)\r\n6838 (he2,hu2)\r\n6839 (gen1)\r\n683A (zhi3)\r\n683B (chi4)\r\n683C (ge2)\r\n683D (zai1)\r\n683E (luan2)\r\n683F (fa2)\r\n6840 (jie2)\r\n6841 (heng2,hang2)\r\n6842 (gui4)\r\n6843 (tao2)\r\n6844 (guang4,guang1)\r\n6845 (wei2)\r\n6846 (kuang4,kuang1)\r\n6847 (ru2)\r\n6848 (an4)\r\n6849 (an1)\r\n684A (juan4)\r\n684B (yi2)\r\n684C (zhuo1)\r\n684D (ku1)\r\n684E (zhi4,zhi2)\r\n684F (qiong2)\r\n6850 (tong2)\r\n6851 (sang1)\r\n6852 (sang1)\r\n6853 (huan2)\r\n6854 (jie2,ju2)\r\n6855 (jiu4)\r\n6856 (xue4)\r\n6857 (duo4)\r\n6858 (zhui1)\r\n6859 (yu2)\r\n685A (zan3)\r\n685B (none0)\r\n685C (ying1)\r\n685D (none0)\r\n685E (none0)\r\n685F (zhan4)\r\n6860 (ya1)\r\n6861 (rao2)\r\n6862 (zhen1)\r\n6863 (dang4)\r\n6864 (qi1)\r\n6865 (qiao2)\r\n6866 (hua4)\r\n6867 (gui4,hui4)\r\n6868 (jiang3)\r\n6869 (zhuang1)\r\n686A (xun2)\r\n686B (suo1)\r\n686C (suo1)\r\n686D (zhen4)\r\n686E (bei1)\r\n686F (ting1)\r\n6870 (kuo4)\r\n6871 (jing4)\r\n6872 (bo2)\r\n6873 (ben4)\r\n6874 (fu2)\r\n6875 (rui3)\r\n6876 (tong3)\r\n6877 (jue2)\r\n6878 (xi1)\r\n6879 (lang2)\r\n687A (liu3)\r\n687B (feng1)\r\n687C (qi1)\r\n687D (wen3)\r\n687E (jun1)\r\n687F (gan3)\r\n6880 (cu4)\r\n6881 (liang2)\r\n6882 (qiu2)\r\n6883 (ting3,ting4)\r\n6884 (you3)\r\n6885 (mei2)\r\n6886 (bang1)\r\n6887 (long4)\r\n6888 (peng1)\r\n6889 (zhuang1)\r\n688A (di4)\r\n688B (xuan1)\r\n688C (tu2)\r\n688D (zao4)\r\n688E (ao1)\r\n688F (gu4)\r\n6890 (bi4)\r\n6891 (di2)\r\n6892 (han2)\r\n6893 (zi3)\r\n6894 (zhi1)\r\n6895 (ren4)\r\n6896 (bei4)\r\n6897 (geng3)\r\n6898 (jian3)\r\n6899 (huan4)\r\n689A (wan3)\r\n689B (nuo2)\r\n689C (jia2)\r\n689D (tiao2)\r\n689E (ji4)\r\n689F (xiao1)\r\n68A0 (lu:3)\r\n68A1 (kuan3)\r\n68A2 (shao1,sao4)\r\n68A3 (cen2)\r\n68A4 (fen1)\r\n68A5 (song1)\r\n68A6 (meng4)\r\n68A7 (wu2)\r\n68A8 (li2)\r\n68A9 (li2)\r\n68AA (dou4)\r\n68AB (cen1)\r\n68AC (ying3)\r\n68AD (suo1)\r\n68AE (ju2)\r\n68AF (ti1)\r\n68B0 (xie4)\r\n68B1 (kun3)\r\n68B2 (zhuo2)\r\n68B3 (shu1)\r\n68B4 (chan1)\r\n68B5 (fan4)\r\n68B6 (wei3)\r\n68B7 (jing4)\r\n68B8 (li2)\r\n68B9 (bing1,bin1)\r\n68BA (none0)\r\n68BB (none0)\r\n68BC (tao2)\r\n68BD (zhi4)\r\n68BE (lai2)\r\n68BF (lian2)\r\n68C0 (jian3)\r\n68C1 (zhuo1)\r\n68C2 (ling2)\r\n68C3 (li2)\r\n68C4 (qi4)\r\n68C5 (bing3)\r\n68C6 (lun2)\r\n68C7 (cong1)\r\n68C8 (qian4)\r\n68C9 (mian2)\r\n68CA (qi2)\r\n68CB (qi2)\r\n68CC (cai3)\r\n68CD (gun4)\r\n68CE (chan2)\r\n68CF (de2)\r\n68D0 (fei3)\r\n68D1 (pai2)\r\n68D2 (bang4)\r\n68D3 (pou3,bang4)\r\n68D4 (hun1)\r\n68D5 (zong1)\r\n68D6 (cheng2)\r\n68D7 (zao3)\r\n68D8 (ji2)\r\n68D9 (li4)\r\n68DA (peng2)\r\n68DB (yu4)\r\n68DC (yu4)\r\n68DD (gu4)\r\n68DE (hun2)\r\n68DF (dong4)\r\n68E0 (tang2)\r\n68E1 (gang1)\r\n68E2 (wang3)\r\n68E3 (di4)\r\n68E4 (xi2)\r\n68E5 (fan2)\r\n68E6 (cheng1)\r\n68E7 (zhan4)\r\n68E8 (qi3)\r\n68E9 (yuan1)\r\n68EA (yan3)\r\n68EB (yu4)\r\n68EC (quan1)\r\n68ED (yi4)\r\n68EE (sen1)\r\n68EF (ren3)\r\n68F0 (chui2)\r\n68F1 (leng2,ling2,leng1)\r\n68F2 (qi1,xi1)\r\n68F3 (zhuo2)\r\n68F4 (fu2)\r\n68F5 (ke1)\r\n68F6 (lai2)\r\n68F7 (zou1)\r\n68F8 (zou1)\r\n68F9 (zhao4,zhuo1)\r\n68FA (guan1)\r\n68FB (fen1)\r\n68FC (fen2)\r\n68FD (chen1)\r\n68FE (qiong2)\r\n68FF (nie4)\r\n6900 (wan3)\r\n6901 (guo3)\r\n6902 (lu4)\r\n6903 (hao2)\r\n6904 (jie1)\r\n6905 (yi3,yi1)\r\n6906 (chou2)\r\n6907 (ju3)\r\n6908 (ju2)\r\n6909 (cheng2,sheng4)\r\n690A (zuo2)\r\n690B (liang2)\r\n690C (qiang1)\r\n690D (zhi2)\r\n690E (zhui1,chui2)\r\n690F (ya1)\r\n6910 (ju1)\r\n6911 (bei1,pi2)\r\n6912 (jiao1)\r\n6913 (zhuo2)\r\n6914 (zi1)\r\n6915 (bin1)\r\n6916 (peng2)\r\n6917 (ding4)\r\n6918 (chu3)\r\n6919 (shan1)\r\n691A (none0)\r\n691B (none0)\r\n691C (jian3)\r\n691D (gui1)\r\n691E (xi4)\r\n691F (du2)\r\n6920 (qian4)\r\n6921 (none0)\r\n6922 (kui4)\r\n6923 (none0)\r\n6924 (luo2)\r\n6925 (zhi1)\r\n6926 (none0)\r\n6927 (none0)\r\n6928 (none0)\r\n6929 (none0)\r\n692A (peng4)\r\n692B (shan4)\r\n692C (none0)\r\n692D (tuo3)\r\n692E (sen1)\r\n692F (duo2)\r\n6930 (ye1,ye2)\r\n6931 (fu4)\r\n6932 (wei3)\r\n6933 (wei1)\r\n6934 (duan4)\r\n6935 (jia3)\r\n6936 (zong1)\r\n6937 (jian1)\r\n6938 (yi2)\r\n6939 (shen4,zhen1,zhen4)\r\n693A (xi2)\r\n693B (yan4)\r\n693C (yan3)\r\n693D (chuan2)\r\n693E (zhan4)\r\n693F (chun1)\r\n6940 (yu3,ju3)\r\n6941 (he2)\r\n6942 (zha1,cha2)\r\n6943 (wo4)\r\n6944 (bian1)\r\n6945 (bi4)\r\n6946 (yao1)\r\n6947 (huo4)\r\n6948 (xu1)\r\n6949 (ruo4)\r\n694A (yang2)\r\n694B (la4)\r\n694C (yan2)\r\n694D (ben3)\r\n694E (hun2)\r\n694F (kui2)\r\n6950 (jie4)\r\n6951 (kui2)\r\n6952 (si1)\r\n6953 (feng1)\r\n6954 (xie1,xie4)\r\n6955 (tuo3)\r\n6956 (ji2)\r\n6957 (jian4)\r\n6958 (mu4)\r\n6959 (mao4)\r\n695A (chu3)\r\n695B (hu4,ku3)\r\n695C (hu2)\r\n695D (lian4)\r\n695E (leng2,leng4)\r\n695F (ting2)\r\n6960 (nan2)\r\n6961 (yu2)\r\n6962 (you2)\r\n6963 (mei2)\r\n6964 (song3)\r\n6965 (xuan4)\r\n6966 (xuan4)\r\n6967 (ying1)\r\n6968 (zhen1)\r\n6969 (pian2)\r\n696A (die2)\r\n696B (ji2)\r\n696C (jie2)\r\n696D (ye4)\r\n696E (chu3)\r\n696F (shun3,dun4)\r\n6970 (yu2)\r\n6971 (cou4)\r\n6972 (wei1)\r\n6973 (mei2)\r\n6974 (di4)\r\n6975 (ji2)\r\n6976 (jie2)\r\n6977 (kai3,jie1)\r\n6978 (qiu1)\r\n6979 (ying2)\r\n697A (rou2)\r\n697B (heng2)\r\n697C (lou2)\r\n697D (le4,yue4)\r\n697E (none0)\r\n697F (gui4)\r\n6980 (pin3)\r\n6981 (none0)\r\n6982 (gai4)\r\n6983 (tan2)\r\n6984 (lan3)\r\n6985 (yun2)\r\n6986 (yu2)\r\n6987 (chen4)\r\n6988 (lu:2)\r\n6989 (ju3)\r\n698A (none0)\r\n698B (none0)\r\n698C (none0)\r\n698D (xie4)\r\n698E (jia3)\r\n698F (yi4)\r\n6990 (zhan3)\r\n6991 (fu4)\r\n6992 (nuo4)\r\n6993 (mi4)\r\n6994 (lang2)\r\n6995 (rong2)\r\n6996 (gu3)\r\n6997 (jian4)\r\n6998 (ju4)\r\n6999 (ta3)\r\n699A (yao3)\r\n699B (zhen1)\r\n699C (bang3)\r\n699D (sha1)\r\n699E (yuan2)\r\n699F (zi3)\r\n69A0 (ming2)\r\n69A1 (su4)\r\n69A2 (jia4)\r\n69A3 (yao2)\r\n69A4 (jie2)\r\n69A5 (huang3)\r\n69A6 (gan4,han2)\r\n69A7 (fei3)\r\n69A8 (zha4)\r\n69A9 (qian2)\r\n69AA (ma4)\r\n69AB (sun3)\r\n69AC (yuan2)\r\n69AD (xie4)\r\n69AE (rong2)\r\n69AF (shi2)\r\n69B0 (zhi1)\r\n69B1 (cui1)\r\n69B2 (yun2)\r\n69B3 (ting2)\r\n69B4 (liu2)\r\n69B5 (rong2)\r\n69B6 (tang2)\r\n69B7 (que4)\r\n69B8 (zhai1)\r\n69B9 (si1)\r\n69BA (sheng4)\r\n69BB (ta4)\r\n69BC (ke4,ke2)\r\n69BD (xi1)\r\n69BE (gu4)\r\n69BF (qi1)\r\n69C0 (kao3)\r\n69C1 (gao3)\r\n69C2 (sun1)\r\n69C3 (pan2)\r\n69C4 (tao1)\r\n69C5 (ge2)\r\n69C6 (xun2)\r\n69C7 (dian1,zhen3)\r\n69C8 (nou4)\r\n69C9 (ji2)\r\n69CA (shuo4)\r\n69CB (gou4)\r\n69CC (chui2)\r\n69CD (qiang1)\r\n69CE (cha2)\r\n69CF (qian3)\r\n69D0 (huai2)\r\n69D1 (mei2)\r\n69D2 (xu4)\r\n69D3 (gang4)\r\n69D4 (gao1)\r\n69D5 (zhuo2)\r\n69D6 (tuo2)\r\n69D7 (qiao2)\r\n69D8 (yang4)\r\n69D9 (dian1)\r\n69DA (jia3)\r\n69DB (jian4,kan3)\r\n69DC (zui4)\r\n69DD (none0)\r\n69DE (long2)\r\n69DF (bin1,bing1)\r\n69E0 (zhu1)\r\n69E1 (none0)\r\n69E2 (xi2)\r\n69E3 (qi3)\r\n69E4 (lian2)\r\n69E5 (hui4)\r\n69E6 (yong2)\r\n69E7 (qian4)\r\n69E8 (guo3)\r\n69E9 (gai4)\r\n69EA (gai4)\r\n69EB (tuan2)\r\n69EC (hua4)\r\n69ED (qi1,cu4,qi4)\r\n69EE (sen1)\r\n69EF (cui1)\r\n69F0 (beng4)\r\n69F1 (you3)\r\n69F2 (hu2)\r\n69F3 (jiang3)\r\n69F4 (hu4)\r\n69F5 (huan4)\r\n69F6 (kui4)\r\n69F7 (yi4)\r\n69F8 (yi4)\r\n69F9 (gao1)\r\n69FA (kang1)\r\n69FB (gui1)\r\n69FC (gui1)\r\n69FD (cao2)\r\n69FE (man2,man4)\r\n69FF (jin3)\r\n6A00 (di4)\r\n6A01 (zhuang1)\r\n6A02 (le4,yue4)\r\n6A03 (lang3)\r\n6A04 (chen2)\r\n6A05 (cong1,zong1)\r\n6A06 (li2)\r\n6A07 (xiu1)\r\n6A08 (qing2)\r\n6A09 (shuang3)\r\n6A0A (fan2)\r\n6A0B (tong1)\r\n6A0C (guan4)\r\n6A0D (ji1)\r\n6A0E (suo1)\r\n6A0F (lei3)\r\n6A10 (lu3)\r\n6A11 (liang2)\r\n6A12 (mi4)\r\n6A13 (lou2)\r\n6A14 (chao2)\r\n6A15 (su4)\r\n6A16 (ke1)\r\n6A17 (chu1,shu1)\r\n6A18 (tang2)\r\n6A19 (biao1)\r\n6A1A (lu4)\r\n6A1B (jiu1)\r\n6A1C (shu4)\r\n6A1D (zha1)\r\n6A1E (shu1)\r\n6A1F (zhang1)\r\n6A20 (men2)\r\n6A21 (mo2,mu2)\r\n6A22 (niao3)\r\n6A23 (yang4)\r\n6A24 (tiao2)\r\n6A25 (peng2)\r\n6A26 (zhu4)\r\n6A27 (sha1)\r\n6A28 (xi1)\r\n6A29 (quan2)\r\n6A2A (heng2,heng4)\r\n6A2B (jian1)\r\n6A2C (cong1)\r\n6A2D (none0)\r\n6A2E (none0)\r\n6A2F (qiang2)\r\n6A30 (none0)\r\n6A31 (ying1)\r\n6A32 (er4)\r\n6A33 (xin2)\r\n6A34 (zhi2)\r\n6A35 (qiao2)\r\n6A36 (zui1)\r\n6A37 (cong2)\r\n6A38 (pu2,po4,pu3)\r\n6A39 (shu4)\r\n6A3A (hua4,hua2)\r\n6A3B (kui4)\r\n6A3C (zhen1)\r\n6A3D (zun1)\r\n6A3E (yue4)\r\n6A3F (zhan3)\r\n6A40 (xi1)\r\n6A41 (xun2)\r\n6A42 (dian4)\r\n6A43 (fa1)\r\n6A44 (gan3)\r\n6A45 (mo2,mu2)\r\n6A46 (wu3)\r\n6A47 (qiao1,cui4)\r\n6A48 (rao2,nao2)\r\n6A49 (lin4)\r\n6A4A (liu2)\r\n6A4B (qiao2)\r\n6A4C (xian4)\r\n6A4D (run4)\r\n6A4E (fan2)\r\n6A4F (zhan3)\r\n6A50 (tuo2)\r\n6A51 (lao3)\r\n6A52 (yun2)\r\n6A53 (shun4)\r\n6A54 (tui2)\r\n6A55 (cheng1)\r\n6A56 (tang2)\r\n6A57 (meng2)\r\n6A58 (ju2)\r\n6A59 (cheng2,chen2)\r\n6A5A (su4)\r\n6A5B (jue2)\r\n6A5C (jue2)\r\n6A5D (tan2)\r\n6A5E (hui4)\r\n6A5F (ji1)\r\n6A60 (nuo3)\r\n6A61 (xiang4)\r\n6A62 (tuo3)\r\n6A63 (ning3)\r\n6A64 (rui3)\r\n6A65 (zhu1)\r\n6A66 (tong2,chuang2)\r\n6A67 (zeng1)\r\n6A68 (fen4)\r\n6A69 (qiong2)\r\n6A6A (ran3)\r\n6A6B (heng2,heng4)\r\n6A6C (cen2)\r\n6A6D (gu1,ku1)\r\n6A6E (liu3)\r\n6A6F (lao4)\r\n6A70 (gao1)\r\n6A71 (chu2)\r\n6A72 (none0)\r\n6A73 (none0)\r\n6A74 (none0)\r\n6A75 (none0)\r\n6A76 (ji2)\r\n6A77 (dou1)\r\n6A78 (none0)\r\n6A79 (lu3)\r\n6A7A (none0)\r\n6A7B (none0)\r\n6A7C (yuan2)\r\n6A7D (ta4)\r\n6A7E (shu1)\r\n6A7F (jiang1)\r\n6A80 (tan2)\r\n6A81 (lin3)\r\n6A82 (nong2)\r\n6A83 (yin3)\r\n6A84 (xi2)\r\n6A85 (sui4)\r\n6A86 (shan1)\r\n6A87 (zui4)\r\n6A88 (xuan2)\r\n6A89 (cheng1)\r\n6A8A (gan4)\r\n6A8B (ju4)\r\n6A8C (zui4)\r\n6A8D (yi4)\r\n6A8E (qin2)\r\n6A8F (pu3)\r\n6A90 (yan2,yin2)\r\n6A91 (lei2)\r\n6A92 (feng1)\r\n6A93 (hui3)\r\n6A94 (dang3)\r\n6A95 (ji4)\r\n6A96 (sui4)\r\n6A97 (bo4,bo2)\r\n6A98 (bi4)\r\n6A99 (ding3)\r\n6A9A (chu3)\r\n6A9B (zhua1)\r\n6A9C (gui4,hui4,kuai4)\r\n6A9D (ji4)\r\n6A9E (jia3)\r\n6A9F (jia3)\r\n6AA0 (qing2)\r\n6AA1 (zhe4)\r\n6AA2 (jian3)\r\n6AA3 (qiang2)\r\n6AA4 (dao4)\r\n6AA5 (yi3)\r\n6AA6 (biao3)\r\n6AA7 (song1)\r\n6AA8 (she1)\r\n6AA9 (lin3)\r\n6AAA (li4,yue4)\r\n6AAB (cha2)\r\n6AAC (meng2)\r\n6AAD (yin2)\r\n6AAE (tao2)\r\n6AAF (tai2)\r\n6AB0 (mian2)\r\n6AB1 (qi2)\r\n6AB2 (none0)\r\n6AB3 (bin1,bing1)\r\n6AB4 (huo4)\r\n6AB5 (ji4)\r\n6AB6 (qian1)\r\n6AB7 (mi2,ni3)\r\n6AB8 (ning2)\r\n6AB9 (yi1)\r\n6ABA (gao3)\r\n6ABB (jian4,kan3)\r\n6ABC (yin4)\r\n6ABD (er2)\r\n6ABE (qing3)\r\n6ABF (yan3)\r\n6AC0 (qi2)\r\n6AC1 (mi4)\r\n6AC2 (zhao4)\r\n6AC3 (gui4,ju3)\r\n6AC4 (chun1)\r\n6AC5 (ji1)\r\n6AC6 (kui2)\r\n6AC7 (po2)\r\n6AC8 (deng4)\r\n6AC9 (chu2)\r\n6ACA (none0)\r\n6ACB (mian2)\r\n6ACC (you1)\r\n6ACD (zhi4)\r\n6ACE (guang4)\r\n6ACF (qian1)\r\n6AD0 (lei3)\r\n6AD1 (lei2,lei3)\r\n6AD2 (sa4)\r\n6AD3 (lu3)\r\n6AD4 (none0)\r\n6AD5 (cuan2)\r\n6AD6 (lu:2)\r\n6AD7 (mie4)\r\n6AD8 (hui4)\r\n6AD9 (ou1)\r\n6ADA (lu:2)\r\n6ADB (zhi4,jie2)\r\n6ADC (gao1)\r\n6ADD (du2)\r\n6ADE (yuan2)\r\n6ADF (li4,yue4)\r\n6AE0 (fei4)\r\n6AE1 (zhu4)\r\n6AE2 (sou3)\r\n6AE3 (lian2)\r\n6AE4 (none0)\r\n6AE5 (chu2)\r\n6AE6 (none0)\r\n6AE7 (zhu1)\r\n6AE8 (lu2)\r\n6AE9 (yan2)\r\n6AEA (li4)\r\n6AEB (zhu1)\r\n6AEC (chen4)\r\n6AED (jie2)\r\n6AEE (e4)\r\n6AEF (su1)\r\n6AF0 (huai2)\r\n6AF1 (nie4)\r\n6AF2 (yu4)\r\n6AF3 (long2)\r\n6AF4 (lai4)\r\n6AF5 (none0)\r\n6AF6 (xian3)\r\n6AF7 (none0)\r\n6AF8 (ju3)\r\n6AF9 (xiao1)\r\n6AFA (ling2)\r\n6AFB (ying1)\r\n6AFC (jian1)\r\n6AFD (yin3)\r\n6AFE (you2)\r\n6AFF (ying2)\r\n6B00 (xiang1)\r\n6B01 (nong2)\r\n6B02 (bo2)\r\n6B03 (chan1)\r\n6B04 (lan2)\r\n6B05 (ju3)\r\n6B06 (shuang1)\r\n6B07 (she4)\r\n6B08 (wei2)\r\n6B09 (cong4)\r\n6B0A (quan2)\r\n6B0B (qu2)\r\n6B0C (none0)\r\n6B0D (none0)\r\n6B0E (yu4)\r\n6B0F (luo2)\r\n6B10 (li4)\r\n6B11 (zan4)\r\n6B12 (luan2)\r\n6B13 (dang3)\r\n6B14 (jue2)\r\n6B15 (none0)\r\n6B16 (lan3)\r\n6B17 (lan2)\r\n6B18 (zhu3)\r\n6B19 (lei2)\r\n6B1A (li3,ji1)\r\n6B1B (ba4,ba3)\r\n6B1C (nang2)\r\n6B1D (yu4)\r\n6B1E (ling2)\r\n6B1F (none0)\r\n6B20 (qian4,qian5)\r\n6B21 (ci4)\r\n6B22 (huan1)\r\n6B23 (xin1)\r\n6B24 (yu2)\r\n6B25 (yu4)\r\n6B26 (qian1)\r\n6B27 (ou1)\r\n6B28 (xu1)\r\n6B29 (chao1)\r\n6B2A (chu4)\r\n6B2B (qi4)\r\n6B2C (kai4)\r\n6B2D (yi4)\r\n6B2E (jue2)\r\n6B2F (xi2)\r\n6B30 (xu1)\r\n6B31 (xia4)\r\n6B32 (yu4)\r\n6B33 (kuai4)\r\n6B34 (lang2)\r\n6B35 (kuan3)\r\n6B36 (shuo4)\r\n6B37 (xi1)\r\n6B38 (e^1,e^2,e^3,e^4,ai3,ai4)\r\n6B39 (yi1,qi1)\r\n6B3A (qi1)\r\n6B3B (hu1)\r\n6B3C (chi3)\r\n6B3D (qin1)\r\n6B3E (kuan3)\r\n6B3F (kan3)\r\n6B40 (kuan3)\r\n6B41 (kan3)\r\n6B42 (chuan2)\r\n6B43 (sha4)\r\n6B44 (none0)\r\n6B45 (yin1)\r\n6B46 (xin1)\r\n6B47 (xie1)\r\n6B48 (yu2)\r\n6B49 (qian4)\r\n6B4A (xiao1)\r\n6B4B (yi2)\r\n6B4C (ge1)\r\n6B4D (wu1)\r\n6B4E (tan4)\r\n6B4F (jin4)\r\n6B50 (ou1)\r\n6B51 (hu1)\r\n6B52 (ti4)\r\n6B53 (huan1)\r\n6B54 (xu1)\r\n6B55 (pen1)\r\n6B56 (xi1)\r\n6B57 (xiao4)\r\n6B58 (hu1)\r\n6B59 (she4,xi1,xi4)\r\n6B5A (none0)\r\n6B5B (lian4)\r\n6B5C (chu4)\r\n6B5D (yi4)\r\n6B5E (kan3)\r\n6B5F (yu2)\r\n6B60 (chuo4)\r\n6B61 (huan1)\r\n6B62 (zhi3)\r\n6B63 (zheng4,zheng1)\r\n6B64 (ci3)\r\n6B65 (bu4)\r\n6B66 (wu3)\r\n6B67 (qi2)\r\n6B68 (bu4)\r\n6B69 (bu4)\r\n6B6A (wai1)\r\n6B6B (ju4)\r\n6B6C (qian2)\r\n6B6D (chi2)\r\n6B6E (se4)\r\n6B6F (chi3)\r\n6B70 (se4)\r\n6B71 (zhong3)\r\n6B72 (sui4)\r\n6B73 (sui4)\r\n6B74 (li4)\r\n6B75 (cuo4)\r\n6B76 (yu2)\r\n6B77 (li4)\r\n6B78 (gui1)\r\n6B79 (dai3)\r\n6B7A (dai3)\r\n6B7B (si3)\r\n6B7C (jian1)\r\n6B7D (zhe2)\r\n6B7E (mo4)\r\n6B7F (mo4)\r\n6B80 (yao3)\r\n6B81 (mo4)\r\n6B82 (cu2)\r\n6B83 (yang1)\r\n6B84 (tian3)\r\n6B85 (sheng1)\r\n6B86 (dai4)\r\n6B87 (shang1)\r\n6B88 (xu1)\r\n6B89 (xun4)\r\n6B8A (shu1)\r\n6B8B (can2)\r\n6B8C (jue2)\r\n6B8D (piao3)\r\n6B8E (qia4)\r\n6B8F (qiu2)\r\n6B90 (su4)\r\n6B91 (qing2)\r\n6B92 (yun3)\r\n6B93 (lian4)\r\n6B94 (yi4)\r\n6B95 (fou3)\r\n6B96 (zhi2,shi5)\r\n6B97 (ye4)\r\n6B98 (can2)\r\n6B99 (hun1)\r\n6B9A (dan1)\r\n6B9B (ji2)\r\n6B9C (ye4)\r\n6B9D (none0)\r\n6B9E (yun3)\r\n6B9F (wen1)\r\n6BA0 (chou4,xiu4)\r\n6BA1 (bin4)\r\n6BA2 (ti4)\r\n6BA3 (jin4)\r\n6BA4 (shang1)\r\n6BA5 (yin2)\r\n6BA6 (diao1)\r\n6BA7 (cu4)\r\n6BA8 (hui4)\r\n6BA9 (cuan4)\r\n6BAA (yi4)\r\n6BAB (dan1,dan4)\r\n6BAC (du4)\r\n6BAD (jiang1)\r\n6BAE (lian4)\r\n6BAF (bin4)\r\n6BB0 (du2)\r\n6BB1 (jian1)\r\n6BB2 (jian1)\r\n6BB3 (shu1)\r\n6BB4 (ou1)\r\n6BB5 (duan4)\r\n6BB6 (zhu4)\r\n6BB7 (yin1,yan1,yin3)\r\n6BB8 (qing4)\r\n6BB9 (yi1)\r\n6BBA (sha1,shai4)\r\n6BBB (ke2,qiao4)\r\n6BBC (ke2,qiao4,que4)\r\n6BBD (yao2)\r\n6BBE (xun4)\r\n6BBF (dian4)\r\n6BC0 (hui3)\r\n6BC1 (hui3)\r\n6BC2 (gu3,gu1)\r\n6BC3 (que4)\r\n6BC4 (ji1)\r\n6BC5 (yi4)\r\n6BC6 (ou1)\r\n6BC7 (hui3)\r\n6BC8 (duan4)\r\n6BC9 (yi1)\r\n6BCA (xiao1)\r\n6BCB (wu2)\r\n6BCC (guan4)\r\n6BCD (mu3)\r\n6BCE (mei3)\r\n6BCF (mei3)\r\n6BD0 (ai3)\r\n6BD1 (zuo3)\r\n6BD2 (du2)\r\n6BD3 (yu4)\r\n6BD4 (bi3,bi4)\r\n6BD5 (bi4)\r\n6BD6 (bi4)\r\n6BD7 (pi2)\r\n6BD8 (pi2)\r\n6BD9 (bi4)\r\n6BDA (chan2)\r\n6BDB (mao2)\r\n6BDC (none0)\r\n6BDD (none0)\r\n6BDE (pi2)\r\n6BDF (none0)\r\n6BE0 (jia1)\r\n6BE1 (zhan1)\r\n6BE2 (sai1)\r\n6BE3 (mu4)\r\n6BE4 (tuo4)\r\n6BE5 (xun2)\r\n6BE6 (er4)\r\n6BE7 (rong2)\r\n6BE8 (xian3)\r\n6BE9 (ju2)\r\n6BEA (mu2)\r\n6BEB (hao2)\r\n6BEC (qiu2)\r\n6BED (dou4)\r\n6BEE (none0)\r\n6BEF (tan3)\r\n6BF0 (pei2)\r\n6BF1 (ju1)\r\n6BF2 (duo2)\r\n6BF3 (cui4)\r\n6BF4 (bi1)\r\n6BF5 (san1)\r\n6BF6 (none0)\r\n6BF7 (mao4)\r\n6BF8 (sui1)\r\n6BF9 (shu1)\r\n6BFA (yu1)\r\n6BFB (tuo4)\r\n6BFC (he2)\r\n6BFD (jian4)\r\n6BFE (ta4)\r\n6BFF (san1)\r\n6C00 (lu:2)\r\n6C01 (mu2)\r\n6C02 (li2)\r\n6C03 (tong2)\r\n6C04 (rong3)\r\n6C05 (chang3)\r\n6C06 (pu3)\r\n6C07 (lu3,lu5)\r\n6C08 (zhan1)\r\n6C09 (sao4)\r\n6C0A (zhan1)\r\n6C0B (meng2)\r\n6C0C (lu3)\r\n6C0D (qu2)\r\n6C0E (die2)\r\n6C0F (shi4,zhi1)\r\n6C10 (di3,di1)\r\n6C11 (min2)\r\n6C12 (jue2)\r\n6C13 (mang2,meng2)\r\n6C14 (qi4)\r\n6C15 (pie1)\r\n6C16 (nai3)\r\n6C17 (qi4)\r\n6C18 (dao1)\r\n6C19 (xian1)\r\n6C1A (chuan1)\r\n6C1B (fen1)\r\n6C1C (ri4)\r\n6C1D (nei4,nai3)\r\n6C1E (none0)\r\n6C1F (fu2)\r\n6C20 (shen1)\r\n6C21 (dong1)\r\n6C22 (qing1)\r\n6C23 (qi4)\r\n6C24 (yin1)\r\n6C25 (xi1)\r\n6C26 (hai4)\r\n6C27 (yang3)\r\n6C28 (an1)\r\n6C29 (ya4)\r\n6C2A (ke4)\r\n6C2B (qing1)\r\n6C2C (ya4)\r\n6C2D (dong1)\r\n6C2E (dan4)\r\n6C2F (lu:4)\r\n6C30 (qing2)\r\n6C31 (yang3)\r\n6C32 (yun1)\r\n6C33 (yun1)\r\n6C34 (shui3)\r\n6C35 (shui3)\r\n6C36 (zheng3)\r\n6C37 (bing1)\r\n6C38 (yong3)\r\n6C39 (dang4)\r\n6C3A (shui3)\r\n6C3B (le4)\r\n6C3C (ni4)\r\n6C3D (tun3)\r\n6C3E (fan4)\r\n6C3F (gui3)\r\n6C40 (ting1)\r\n6C41 (zhi1)\r\n6C42 (qiu2)\r\n6C43 (bin1)\r\n6C44 (ze4)\r\n6C45 (mian3)\r\n6C46 (cuan1)\r\n6C47 (hui4)\r\n6C48 (diao1)\r\n6C49 (han4)\r\n6C4A (cha4)\r\n6C4B (zhuo2)\r\n6C4C (chuan4)\r\n6C4D (wan2)\r\n6C4E (fan4)\r\n6C4F (dai4)\r\n6C50 (xi1,xi4)\r\n6C51 (tuo1)\r\n6C52 (mang3)\r\n6C53 (qiu2)\r\n6C54 (qi4)\r\n6C55 (shan4)\r\n6C56 (pai4)\r\n6C57 (han4,han2)\r\n6C58 (qian1)\r\n6C59 (wu1)\r\n6C5A (wu1)\r\n6C5B (xun4)\r\n6C5C (si4)\r\n6C5D (ru3)\r\n6C5E (gong3,hong4)\r\n6C5F (jiang1)\r\n6C60 (chi2)\r\n6C61 (wu1)\r\n6C62 (none0)\r\n6C63 (none0)\r\n6C64 (tang1,shang1)\r\n6C65 (zhi1)\r\n6C66 (chi2)\r\n6C67 (qian1)\r\n6C68 (mi4)\r\n6C69 (gu3)\r\n6C6A (wang1)\r\n6C6B (qing4)\r\n6C6C (jing3)\r\n6C6D (rui4)\r\n6C6E (jun1)\r\n6C6F (hong2)\r\n6C70 (tai4)\r\n6C71 (quan3)\r\n6C72 (ji2)\r\n6C73 (bian4)\r\n6C74 (bian4)\r\n6C75 (gan4)\r\n6C76 (wen4)\r\n6C77 (zhong1)\r\n6C78 (fang1)\r\n6C79 (xiong1)\r\n6C7A (jue2)\r\n6C7B (hu3)\r\n6C7C (none0)\r\n6C7D (qi4)\r\n6C7E (fen2)\r\n6C7F (xu4)\r\n6C80 (xu4)\r\n6C81 (qin4,shen4)\r\n6C82 (yi2)\r\n6C83 (wo4)\r\n6C84 (yun2)\r\n6C85 (yuan2)\r\n6C86 (hang4)\r\n6C87 (yan3)\r\n6C88 (shen3,chen2)\r\n6C89 (chen2)\r\n6C8A (dan4)\r\n6C8B (you2)\r\n6C8C (dun4,zhuan4)\r\n6C8D (hu4)\r\n6C8E (huo4)\r\n6C8F (qi1)\r\n6C90 (mu4)\r\n6C91 (rou2)\r\n6C92 (mei2,mo4)\r\n6C93 (ta4,da2,ta5)\r\n6C94 (mian3)\r\n6C95 (wu4)\r\n6C96 (chong1)\r\n6C97 (tian1)\r\n6C98 (bi3)\r\n6C99 (sha1,sha4)\r\n6C9A (zhi3)\r\n6C9B (pei4)\r\n6C9C (pan4)\r\n6C9D (zhui3)\r\n6C9E (za1)\r\n6C9F (gou1)\r\n6CA0 (liu2)\r\n6CA1 (mei2,mo4)\r\n6CA2 (ze2)\r\n6CA3 (feng1)\r\n6CA4 (ou4,ou1)\r\n6CA5 (li4)\r\n6CA6 (lun2)\r\n6CA7 (cang1)\r\n6CA8 (feng1)\r\n6CA9 (wei2)\r\n6CAA (hu4)\r\n6CAB (mo4)\r\n6CAC (mei4)\r\n6CAD (shu4)\r\n6CAE (ju3,ju4,ju1)\r\n6CAF (zan3)\r\n6CB0 (tuo1)\r\n6CB1 (tuo2)\r\n6CB2 (duo4)\r\n6CB3 (he2)\r\n6CB4 (li4)\r\n6CB5 (mi3)\r\n6CB6 (yi2)\r\n6CB7 (fu2)\r\n6CB8 (fei4)\r\n6CB9 (you2)\r\n6CBA (tian2)\r\n6CBB (zhi4)\r\n6CBC (zhao3)\r\n6CBD (gu1)\r\n6CBE (zhan1)\r\n6CBF (yan2,yan4)\r\n6CC0 (si1)\r\n6CC1 (kuang4)\r\n6CC2 (jiong3)\r\n6CC3 (ju1)\r\n6CC4 (xie4)\r\n6CC5 (qiu2)\r\n6CC6 (yi4)\r\n6CC7 (jia1)\r\n6CC8 (zhong1)\r\n6CC9 (quan2)\r\n6CCA (bo2,po1,po4)\r\n6CCB (hui4)\r\n6CCC (mi4,bi4)\r\n6CCD (ben1)\r\n6CCE (zhuo2)\r\n6CCF (chu4)\r\n6CD0 (le4)\r\n6CD1 (you3)\r\n6CD2 (gu1)\r\n6CD3 (hong2)\r\n6CD4 (gan1)\r\n6CD5 (fa3)\r\n6CD6 (mao3)\r\n6CD7 (si4)\r\n6CD8 (hu1)\r\n6CD9 (ping2)\r\n6CDA (ci3)\r\n6CDB (fan4,fan2)\r\n6CDC (zhi1)\r\n6CDD (su4)\r\n6CDE (ning4)\r\n6CDF (cheng1)\r\n6CE0 (ling2)\r\n6CE1 (pao4,pao1)\r\n6CE2 (bo1,po1)\r\n6CE3 (qi4,xie4)\r\n6CE4 (si4)\r\n6CE5 (ni2,ni4)\r\n6CE6 (ju2)\r\n6CE7 (yue4)\r\n6CE8 (zhu4)\r\n6CE9 (sheng1)\r\n6CEA (lei4)\r\n6CEB (xuan4)\r\n6CEC (xue4)\r\n6CED (fu1)\r\n6CEE (pan4)\r\n6CEF (min3)\r\n6CF0 (tai4)\r\n6CF1 (yang1)\r\n6CF2 (ji3)\r\n6CF3 (yong3)\r\n6CF4 (guan4)\r\n6CF5 (beng4)\r\n6CF6 (xue2)\r\n6CF7 (long2,shuang1)\r\n6CF8 (lu2)\r\n6CF9 (dan4)\r\n6CFA (luo4,po1)\r\n6CFB (xie4)\r\n6CFC (po1)\r\n6CFD (ze2)\r\n6CFE (jing1)\r\n6CFF (yin2)\r\n6D00 (zhou1)\r\n6D01 (jie2)\r\n6D02 (yi4)\r\n6D03 (hui1)\r\n6D04 (hui2)\r\n6D05 (zui3)\r\n6D06 (cheng2)\r\n6D07 (yin1)\r\n6D08 (wei2)\r\n6D09 (hou4)\r\n6D0A (jian4)\r\n6D0B (yang2)\r\n6D0C (lie4)\r\n6D0D (si4)\r\n6D0E (ji4)\r\n6D0F (er2)\r\n6D10 (xing2)\r\n6D11 (fu2,fu4)\r\n6D12 (sa3)\r\n6D13 (zi4)\r\n6D14 (zhi3)\r\n6D15 (yin1)\r\n6D16 (wu2)\r\n6D17 (xi3,xian3)\r\n6D18 (kao3)\r\n6D19 (zhu1)\r\n6D1A (jiang4)\r\n6D1B (luo4)\r\n6D1C (none0)\r\n6D1D (an4)\r\n6D1E (dong4)\r\n6D1F (yi2)\r\n6D20 (mou2)\r\n6D21 (lei3)\r\n6D22 (yi1)\r\n6D23 (mi3)\r\n6D24 (quan2)\r\n6D25 (jin1)\r\n6D26 (po4)\r\n6D27 (wei3)\r\n6D28 (xiao2)\r\n6D29 (xie4)\r\n6D2A (hong2)\r\n6D2B (xu4)\r\n6D2C (su4)\r\n6D2D (kuang1)\r\n6D2E (tao2)\r\n6D2F (qie4,jie2)\r\n6D30 (ju4)\r\n6D31 (er3)\r\n6D32 (zhou1)\r\n6D33 (ru4)\r\n6D34 (ping2)\r\n6D35 (xun2)\r\n6D36 (xiong1)\r\n6D37 (zhi4)\r\n6D38 (guang1,huang3)\r\n6D39 (huan2)\r\n6D3A (ming2)\r\n6D3B (huo2)\r\n6D3C (wa1)\r\n6D3D (qia4,xia2)\r\n6D3E (pai4,pa1)\r\n6D3F (wu1)\r\n6D40 (qu3)\r\n6D41 (liu2)\r\n6D42 (yi4)\r\n6D43 (jia1)\r\n6D44 (jing4)\r\n6D45 (qian3,jian1)\r\n6D46 (jiang1,jiang4)\r\n6D47 (jiao1)\r\n6D48 (zhen1)\r\n6D49 (shi1)\r\n6D4A (zhuo2)\r\n6D4B (ce4)\r\n6D4C (none0)\r\n6D4D (hui4,kuai4)\r\n6D4E (ji4,ji3)\r\n6D4F (liu2)\r\n6D50 (chan3)\r\n6D51 (hun2)\r\n6D52 (hu3,xu3)\r\n6D53 (nong2)\r\n6D54 (xun2)\r\n6D55 (jin4)\r\n6D56 (lie4)\r\n6D57 (qiu2)\r\n6D58 (wei3)\r\n6D59 (zhe4)\r\n6D5A (jun4,xun4)\r\n6D5B (han2)\r\n6D5C (bang1)\r\n6D5D (mang2)\r\n6D5E (zhuo2)\r\n6D5F (you2)\r\n6D60 (xi1)\r\n6D61 (bo2)\r\n6D62 (dou4)\r\n6D63 (huan4,wan3)\r\n6D64 (hong2)\r\n6D65 (yi4)\r\n6D66 (pu3)\r\n6D67 (ying3)\r\n6D68 (lan3)\r\n6D69 (hao4)\r\n6D6A (lang4)\r\n6D6B (han3)\r\n6D6C (li3)\r\n6D6D (geng1)\r\n6D6E (fu2)\r\n6D6F (wu2)\r\n6D70 (li4)\r\n6D71 (chun2)\r\n6D72 (feng2)\r\n6D73 (yi4)\r\n6D74 (yu4)\r\n6D75 (tong2)\r\n6D76 (lao2)\r\n6D77 (hai3)\r\n6D78 (jin4,jin1)\r\n6D79 (jia2,jia1)\r\n6D7A (chong1)\r\n6D7B (weng3)\r\n6D7C (mei3)\r\n6D7D (sui1)\r\n6D7E (cheng1)\r\n6D7F (pei4)\r\n6D80 (xian4)\r\n6D81 (shen4)\r\n6D82 (tu2)\r\n6D83 (kun4)\r\n6D84 (pin1)\r\n6D85 (nie4)\r\n6D86 (han4)\r\n6D87 (jing1)\r\n6D88 (xiao1)\r\n6D89 (she4)\r\n6D8A (nian3)\r\n6D8B (tu1)\r\n6D8C (yong3,chong1)\r\n6D8D (xiao1)\r\n6D8E (xian2)\r\n6D8F (ting3)\r\n6D90 (e2)\r\n6D91 (su4)\r\n6D92 (tun1)\r\n6D93 (juan1)\r\n6D94 (cen2)\r\n6D95 (ti4)\r\n6D96 (li4)\r\n6D97 (shui4)\r\n6D98 (si4)\r\n6D99 (lei4)\r\n6D9A (shui4)\r\n6D9B (tao1)\r\n6D9C (du2)\r\n6D9D (lao4)\r\n6D9E (lai2)\r\n6D9F (lian2)\r\n6DA0 (wei2)\r\n6DA1 (wo1,guo1)\r\n6DA2 (yun2)\r\n6DA3 (huan4)\r\n6DA4 (di2)\r\n6DA5 (none0)\r\n6DA6 (run4)\r\n6DA7 (jian4)\r\n6DA8 (zhang3,zhang4)\r\n6DA9 (se4)\r\n6DAA (fu2)\r\n6DAB (guan4)\r\n6DAC (xing4)\r\n6DAD (shou4)\r\n6DAE (shuan4)\r\n6DAF (ya2)\r\n6DB0 (chuo4)\r\n6DB1 (zhang4)\r\n6DB2 (ye4,yi4)\r\n6DB3 (kong1)\r\n6DB4 (wan3)\r\n6DB5 (han2)\r\n6DB6 (tuo1)\r\n6DB7 (dong1)\r\n6DB8 (he2,hao4)\r\n6DB9 (wo1)\r\n6DBA (ju1)\r\n6DBB (gan4)\r\n6DBC (liang2,liang4)\r\n6DBD (hun1)\r\n6DBE (ta4)\r\n6DBF (zhuo1)\r\n6DC0 (dian4)\r\n6DC1 (qie4)\r\n6DC2 (de2)\r\n6DC3 (juan4)\r\n6DC4 (zi1)\r\n6DC5 (xi1)\r\n6DC6 (xiao2,yao2)\r\n6DC7 (qi2)\r\n6DC8 (gu3)\r\n6DC9 (guo3)\r\n6DCA (han4)\r\n6DCB (lin2,lin4)\r\n6DCC (tang3)\r\n6DCD (zhou1)\r\n6DCE (peng3)\r\n6DCF (hao4)\r\n6DD0 (chang1)\r\n6DD1 (shu1,shu2)\r\n6DD2 (qi1)\r\n6DD3 (fang1)\r\n6DD4 (chi4)\r\n6DD5 (lu4)\r\n6DD6 (nao4)\r\n6DD7 (ju2)\r\n6DD8 (tao2)\r\n6DD9 (cong2)\r\n6DDA (lei4)\r\n6DDB (zhi4)\r\n6DDC (peng2)\r\n6DDD (fei2)\r\n6DDE (song1)\r\n6DDF (tian3)\r\n6DE0 (pi4)\r\n6DE1 (dan4)\r\n6DE2 (yu4)\r\n6DE3 (ni2)\r\n6DE4 (yu1)\r\n6DE5 (lu4)\r\n6DE6 (gan4)\r\n6DE7 (mi4)\r\n6DE8 (jing4)\r\n6DE9 (ling2)\r\n6DEA (lun2)\r\n6DEB (yin2)\r\n6DEC (cui4)\r\n6DED (qu2)\r\n6DEE (huai2)\r\n6DEF (yu4)\r\n6DF0 (nian4)\r\n6DF1 (shen1)\r\n6DF2 (piao2,hu1)\r\n6DF3 (chun2)\r\n6DF4 (hu1)\r\n6DF5 (yuan1)\r\n6DF6 (lai2)\r\n6DF7 (hun4,hun2,hun3)\r\n6DF8 (qing1)\r\n6DF9 (yan1,yan4)\r\n6DFA (qian3,jian1)\r\n6DFB (tian1)\r\n6DFC (miao3)\r\n6DFD (zhi3)\r\n6DFE (yin3)\r\n6DFF (mi4)\r\n6E00 (ben1)\r\n6E01 (yuan1)\r\n6E02 (wen4)\r\n6E03 (re4)\r\n6E04 (fei1)\r\n6E05 (qing1)\r\n6E06 (yuan1)\r\n6E07 (ke3)\r\n6E08 (ji4)\r\n6E09 (she4)\r\n6E0A (yuan1)\r\n6E0B (se4)\r\n6E0C (lu4)\r\n6E0D (zi4)\r\n6E0E (du2)\r\n6E0F (none0)\r\n6E10 (jian4,jian1)\r\n6E11 (mian3,sheng2)\r\n6E12 (pi4)\r\n6E13 (xi1)\r\n6E14 (yu2)\r\n6E15 (yuan1)\r\n6E16 (shen3)\r\n6E17 (shen4)\r\n6E18 (rou2)\r\n6E19 (huan4)\r\n6E1A (zhu3)\r\n6E1B (jian3)\r\n6E1C (nuan3)\r\n6E1D (yu2)\r\n6E1E (qiu2)\r\n6E1F (ting2)\r\n6E20 (qu2)\r\n6E21 (du4)\r\n6E22 (feng2)\r\n6E23 (zha1,zha3)\r\n6E24 (bo2)\r\n6E25 (wo4)\r\n6E26 (wo1,guo1)\r\n6E27 (di4)\r\n6E28 (wei1)\r\n6E29 (wen1)\r\n6E2A (ru2)\r\n6E2B (xie4)\r\n6E2C (ce4)\r\n6E2D (wei4)\r\n6E2E (ge1)\r\n6E2F (gang3)\r\n6E30 (yan3)\r\n6E31 (hong2)\r\n6E32 (xuan4)\r\n6E33 (mi3)\r\n6E34 (ke3)\r\n6E35 (mao2)\r\n6E36 (ying1)\r\n6E37 (yan3)\r\n6E38 (you2)\r\n6E39 (hong1)\r\n6E3A (miao3)\r\n6E3B (xing3)\r\n6E3C (mei3)\r\n6E3D (zai1)\r\n6E3E (hun2,hun4)\r\n6E3F (nai4)\r\n6E40 (kui2)\r\n6E41 (shi2)\r\n6E42 (e4)\r\n6E43 (pai4)\r\n6E44 (mei2)\r\n6E45 (lian4)\r\n6E46 (qi4)\r\n6E47 (qi4)\r\n6E48 (mei2)\r\n6E49 (tian2)\r\n6E4A (cou4)\r\n6E4B (wei2)\r\n6E4C (can1)\r\n6E4D (tuan1)\r\n6E4E (mian3)\r\n6E4F (xu1)\r\n6E50 (mo4)\r\n6E51 (xu3)\r\n6E52 (ji2)\r\n6E53 (pen2)\r\n6E54 (jian1)\r\n6E55 (jian3)\r\n6E56 (hu2)\r\n6E57 (feng4)\r\n6E58 (xiang1)\r\n6E59 (yi4)\r\n6E5A (yin4)\r\n6E5B (zhan4)\r\n6E5C (shi2)\r\n6E5D (jie1)\r\n6E5E (zhen1)\r\n6E5F (huang2)\r\n6E60 (tan4)\r\n6E61 (yu2)\r\n6E62 (bi4)\r\n6E63 (min3)\r\n6E64 (shi1)\r\n6E65 (tu2)\r\n6E66 (sheng1)\r\n6E67 (yong3,chong1)\r\n6E68 (ju2)\r\n6E69 (zhong4)\r\n6E6A (none0)\r\n6E6B (qiu1,jia3,jiao3,jiu1)\r\n6E6C (jiao3)\r\n6E6D (none0)\r\n6E6E (yin1,yan1)\r\n6E6F (tang1,shang1)\r\n6E70 (long2)\r\n6E71 (huo4)\r\n6E72 (yuan2)\r\n6E73 (nan3)\r\n6E74 (ban4)\r\n6E75 (you3)\r\n6E76 (quan2)\r\n6E77 (chui2)\r\n6E78 (liang4)\r\n6E79 (chan2)\r\n6E7A (yan2)\r\n6E7B (chun2)\r\n6E7C (nie4)\r\n6E7D (zi1)\r\n6E7E (wan1)\r\n6E7F (shi1)\r\n6E80 (man3)\r\n6E81 (ying2)\r\n6E82 (la4)\r\n6E83 (kui4,hui4)\r\n6E84 (none0)\r\n6E85 (jian4,jian1)\r\n6E86 (xu4)\r\n6E87 (lou2)\r\n6E88 (gui1)\r\n6E89 (gai4)\r\n6E8A (none0)\r\n6E8B (none0)\r\n6E8C (po1)\r\n6E8D (jin4)\r\n6E8E (gui4)\r\n6E8F (tang2)\r\n6E90 (yuan2)\r\n6E91 (suo3)\r\n6E92 (yuan2)\r\n6E93 (lian2)\r\n6E94 (yao3)\r\n6E95 (meng4)\r\n6E96 (zhun3)\r\n6E97 (sheng2)\r\n6E98 (ke4)\r\n6E99 (tai4)\r\n6E9A (ta3)\r\n6E9B (wa1)\r\n6E9C (liu1,liu4)\r\n6E9D (gou1)\r\n6E9E (sao1)\r\n6E9F (ming2)\r\n6EA0 (zha4)\r\n6EA1 (shi2)\r\n6EA2 (yi4)\r\n6EA3 (lun4)\r\n6EA4 (ma3)\r\n6EA5 (pu3)\r\n6EA6 (wei1)\r\n6EA7 (li4)\r\n6EA8 (cai2)\r\n6EA9 (wu4)\r\n6EAA (xi1,qi1)\r\n6EAB (wen1)\r\n6EAC (qiang1)\r\n6EAD (ce4)\r\n6EAE (shi1)\r\n6EAF (su4)\r\n6EB0 (yi1)\r\n6EB1 (zhen1,qin2)\r\n6EB2 (sou1)\r\n6EB3 (yun2)\r\n6EB4 (xiu4)\r\n6EB5 (yin1)\r\n6EB6 (rong2)\r\n6EB7 (hun4)\r\n6EB8 (su4)\r\n6EB9 (su4)\r\n6EBA (ni4,niao4)\r\n6EBB (ta4,ta1)\r\n6EBC (shi1)\r\n6EBD (ru4)\r\n6EBE (wei1)\r\n6EBF (pan4)\r\n6EC0 (chu4)\r\n6EC1 (chu2)\r\n6EC2 (pang1)\r\n6EC3 (weng1)\r\n6EC4 (cang1)\r\n6EC5 (mie4)\r\n6EC6 (he2)\r\n6EC7 (dian1)\r\n6EC8 (hao4)\r\n6EC9 (huang3)\r\n6ECA (xi4)\r\n6ECB (zi1)\r\n6ECC (di2)\r\n6ECD (zhi4)\r\n6ECE (ying2,xing2)\r\n6ECF (fu3)\r\n6ED0 (jie2)\r\n6ED1 (hua2,gu3)\r\n6ED2 (ge1)\r\n6ED3 (zi3)\r\n6ED4 (tao1)\r\n6ED5 (teng2)\r\n6ED6 (sui1)\r\n6ED7 (bi4)\r\n6ED8 (jiao4)\r\n6ED9 (hui4)\r\n6EDA (gun3)\r\n6EDB (yin2)\r\n6EDC (gao1)\r\n6EDD (long2,shuang1)\r\n6EDE (zhi4)\r\n6EDF (yan4)\r\n6EE0 (she4)\r\n6EE1 (man3)\r\n6EE2 (ying2)\r\n6EE3 (chun2)\r\n6EE4 (lu:4)\r\n6EE5 (lan4)\r\n6EE6 (luan2)\r\n6EE7 (xiao4)\r\n6EE8 (bin1)\r\n6EE9 (tan1)\r\n6EEA (yu4)\r\n6EEB (xiu3)\r\n6EEC (hu4)\r\n6EED (bi4)\r\n6EEE (biao1)\r\n6EEF (zhi4)\r\n6EF0 (jiang3)\r\n6EF1 (kou4)\r\n6EF2 (shen4)\r\n6EF3 (shang1)\r\n6EF4 (di1)\r\n6EF5 (mi4)\r\n6EF6 (ao2)\r\n6EF7 (lu3)\r\n6EF8 (hu3,xu3)\r\n6EF9 (hu1)\r\n6EFA (you2)\r\n6EFB (chan3)\r\n6EFC (fan4)\r\n6EFD (yong1)\r\n6EFE (gun3)\r\n6EFF (man3)\r\n6F00 (qing4)\r\n6F01 (yu2)\r\n6F02 (piao1,piao3,piao4)\r\n6F03 (ji2)\r\n6F04 (ya2)\r\n6F05 (jiao3)\r\n6F06 (qi1,qu4,xi1)\r\n6F07 (xi3)\r\n6F08 (ji4)\r\n6F09 (lu4)\r\n6F0A (lu:3,lou2)\r\n6F0B (long2)\r\n6F0C (jin3)\r\n6F0D (guo2)\r\n6F0E (cong2)\r\n6F0F (lou4)\r\n6F10 (zhi2)\r\n6F11 (gai4)\r\n6F12 (qiang2)\r\n6F13 (li2)\r\n6F14 (yan3)\r\n6F15 (cao2)\r\n6F16 (jiao4)\r\n6F17 (cong1)\r\n6F18 (chun2)\r\n6F19 (tuan2)\r\n6F1A (ou4,ou1)\r\n6F1B (teng2)\r\n6F1C (ye3)\r\n6F1D (xi2)\r\n6F1E (mi4)\r\n6F1F (tang2)\r\n6F20 (mo4)\r\n6F21 (shang1)\r\n6F22 (han4)\r\n6F23 (lian2)\r\n6F24 (lan3)\r\n6F25 (wa1)\r\n6F26 (li2)\r\n6F27 (qian2)\r\n6F28 (feng2)\r\n6F29 (xuan2)\r\n6F2A (yi1)\r\n6F2B (man4,man2)\r\n6F2C (zi4)\r\n6F2D (mang3)\r\n6F2E (kang1)\r\n6F2F (luo4,ta4)\r\n6F30 (peng1)\r\n6F31 (shu4)\r\n6F32 (zhang3,zhang4)\r\n6F33 (zhang1)\r\n6F34 (chong2)\r\n6F35 (xu4)\r\n6F36 (huan4)\r\n6F37 (kuo4,huo3)\r\n6F38 (jian4,jian1)\r\n6F39 (yan1)\r\n6F3A (chuang3,shuang3)\r\n6F3B (liao2)\r\n6F3C (cui3)\r\n6F3D (ti2)\r\n6F3E (yang4)\r\n6F3F (jiang1,jiang4)\r\n6F40 (cong2)\r\n6F41 (ying3)\r\n6F42 (hong2)\r\n6F43 (xiu1)\r\n6F44 (shu4)\r\n6F45 (guan4)\r\n6F46 (ying2)\r\n6F47 (xiao1)\r\n6F48 (none0)\r\n6F49 (none0)\r\n6F4A (xu4)\r\n6F4B (lian4)\r\n6F4C (zhi4)\r\n6F4D (wei2)\r\n6F4E (pi4)\r\n6F4F (yu4)\r\n6F50 (jiao4)\r\n6F51 (po1)\r\n6F52 (xiang4)\r\n6F53 (hui4)\r\n6F54 (jie2)\r\n6F55 (wu3)\r\n6F56 (pa2)\r\n6F57 (ji2)\r\n6F58 (pan1)\r\n6F59 (wei2)\r\n6F5A (xiao1,su4)\r\n6F5B (qian2)\r\n6F5C (qian2)\r\n6F5D (xi1)\r\n6F5E (lu4)\r\n6F5F (xi4)\r\n6F60 (sun4)\r\n6F61 (dun4)\r\n6F62 (huang2)\r\n6F63 (min3)\r\n6F64 (run4)\r\n6F65 (su4)\r\n6F66 (liao3,liao2,lao3)\r\n6F67 (zhen1)\r\n6F68 (zhong1)\r\n6F69 (yi4)\r\n6F6A (di2)\r\n6F6B (wan1)\r\n6F6C (dan4)\r\n6F6D (tan2)\r\n6F6E (chao2)\r\n6F6F (xun2)\r\n6F70 (kui4,hui4)\r\n6F71 (none0)\r\n6F72 (shao4)\r\n6F73 (tu2)\r\n6F74 (zhu1)\r\n6F75 (sa3)\r\n6F76 (hei1)\r\n6F77 (bi3,bi4)\r\n6F78 (shan1)\r\n6F79 (chan2)\r\n6F7A (chan2)\r\n6F7B (shu3)\r\n6F7C (tong2)\r\n6F7D (pu1)\r\n6F7E (lin2)\r\n6F7F (wei2)\r\n6F80 (se4)\r\n6F81 (se4)\r\n6F82 (cheng2,deng4)\r\n6F83 (jiong3)\r\n6F84 (cheng2,deng4)\r\n6F85 (hua4)\r\n6F86 (jiao1)\r\n6F87 (lao4,lao2)\r\n6F88 (che4)\r\n6F89 (gan3)\r\n6F8A (cun1)\r\n6F8B (heng4)\r\n6F8C (si1)\r\n6F8D (shu4)\r\n6F8E (peng2,peng1)\r\n6F8F (han4)\r\n6F90 (yun2)\r\n6F91 (liu4,liu1)\r\n6F92 (hong4)\r\n6F93 (fu2)\r\n6F94 (hao4)\r\n6F95 (he2)\r\n6F96 (xian1)\r\n6F97 (jian4)\r\n6F98 (shan1)\r\n6F99 (xi4)\r\n6F9A (ao4)\r\n6F9B (lu3)\r\n6F9C (lan2)\r\n6F9D (none0)\r\n6F9E (yu2)\r\n6F9F (lin3)\r\n6FA0 (min3,mian3,sheng2)\r\n6FA1 (zao3)\r\n6FA2 (dang1)\r\n6FA3 (huan3)\r\n6FA4 (ze2)\r\n6FA5 (xie4)\r\n6FA6 (yu4)\r\n6FA7 (li3)\r\n6FA8 (shi4)\r\n6FA9 (xue2)\r\n6FAA (ling2)\r\n6FAB (man4)\r\n6FAC (zi1)\r\n6FAD (yong1)\r\n6FAE (kuai4,hui4)\r\n6FAF (can4)\r\n6FB0 (lian4)\r\n6FB1 (dian4)\r\n6FB2 (ye4)\r\n6FB3 (ao4)\r\n6FB4 (huan2)\r\n6FB5 (lian4)\r\n6FB6 (chan2)\r\n6FB7 (man4)\r\n6FB8 (dan3)\r\n6FB9 (dan4,tan2)\r\n6FBA (yi4)\r\n6FBB (sui4)\r\n6FBC (pi4)\r\n6FBD (ju4)\r\n6FBE (ta4)\r\n6FBF (qin2)\r\n6FC0 (ji1)\r\n6FC1 (zhuo2)\r\n6FC2 (lian2)\r\n6FC3 (nong2)\r\n6FC4 (guo1)\r\n6FC5 (jin4)\r\n6FC6 (fen2)\r\n6FC7 (se4)\r\n6FC8 (ji2)\r\n6FC9 (sui1)\r\n6FCA (hui4)\r\n6FCB (chu3)\r\n6FCC (ta4)\r\n6FCD (song1)\r\n6FCE (ding3)\r\n6FCF (se4)\r\n6FD0 (zhu3)\r\n6FD1 (lai4)\r\n6FD2 (bin1)\r\n6FD3 (lian2)\r\n6FD4 (mi3)\r\n6FD5 (shi1)\r\n6FD6 (shu4)\r\n6FD7 (mi4)\r\n6FD8 (ning4,neng4)\r\n6FD9 (ying2)\r\n6FDA (ying2,xing2)\r\n6FDB (meng2)\r\n6FDC (jin4)\r\n6FDD (qi2)\r\n6FDE (bi4)\r\n6FDF (ji4,ji3)\r\n6FE0 (hao2)\r\n6FE1 (ru2)\r\n6FE2 (zui3,cui4)\r\n6FE3 (wo4)\r\n6FE4 (tao1,tao2)\r\n6FE5 (yin4)\r\n6FE6 (yin3)\r\n6FE7 (dui4)\r\n6FE8 (ci2)\r\n6FE9 (huo4)\r\n6FEA (jing4)\r\n6FEB (lan4)\r\n6FEC (jun4)\r\n6FED (ai4)\r\n6FEE (pu2)\r\n6FEF (zhuo2)\r\n6FF0 (wei2)\r\n6FF1 (bin1)\r\n6FF2 (gu3)\r\n6FF3 (qian2)\r\n6FF4 (xing2)\r\n6FF5 (bin1)\r\n6FF6 (kuo4)\r\n6FF7 (fei4)\r\n6FF8 (none0)\r\n6FF9 (bin1)\r\n6FFA (jian4,jian1)\r\n6FFB (dui4,wei2)\r\n6FFC (luo4)\r\n6FFD (luo4)\r\n6FFE (lu:4)\r\n6FFF (li4)\r\n7000 (you1)\r\n7001 (yang4)\r\n7002 (lu3)\r\n7003 (si4)\r\n7004 (jie2)\r\n7005 (ying4,ying2)\r\n7006 (du2)\r\n7007 (wang3)\r\n7008 (hui1)\r\n7009 (xie4)\r\n700A (pan2)\r\n700B (shen3)\r\n700C (biao1)\r\n700D (chan2)\r\n700E (mie4)\r\n700F (liu2)\r\n7010 (jian1)\r\n7011 (pu4,bao4)\r\n7012 (se4)\r\n7013 (cheng2)\r\n7014 (gu3)\r\n7015 (bin1,pin2)\r\n7016 (huo4)\r\n7017 (xian4)\r\n7018 (lu2)\r\n7019 (qin1)\r\n701A (han4)\r\n701B (ying2)\r\n701C (rong2)\r\n701D (li4)\r\n701E (jing4)\r\n701F (xiao1)\r\n7020 (ying2)\r\n7021 (sui3)\r\n7022 (wei2)\r\n7023 (xie4)\r\n7024 (huai2)\r\n7025 (hao4)\r\n7026 (zhu1)\r\n7027 (long2,shuang1)\r\n7028 (lai4)\r\n7029 (dui4)\r\n702A (fan2)\r\n702B (hu2)\r\n702C (lai4)\r\n702D (none0)\r\n702E (none0)\r\n702F (ying2)\r\n7030 (mi2)\r\n7031 (ji4)\r\n7032 (lian4)\r\n7033 (jian4)\r\n7034 (ying3)\r\n7035 (fen4)\r\n7036 (lin2)\r\n7037 (yi4)\r\n7038 (jian1)\r\n7039 (yue4)\r\n703A (chan2)\r\n703B (dai4)\r\n703C (rang2,rang4)\r\n703D (jian3)\r\n703E (lan2)\r\n703F (fan2)\r\n7040 (shuang4)\r\n7041 (yuan1)\r\n7042 (zhuo2)\r\n7043 (feng1)\r\n7044 (she4)\r\n7045 (lei3)\r\n7046 (lan2)\r\n7047 (cong2)\r\n7048 (qu2)\r\n7049 (yong1)\r\n704A (qian2)\r\n704B (fa3)\r\n704C (guan4)\r\n704D (que4)\r\n704E (yan4)\r\n704F (hao4)\r\n7050 (none0)\r\n7051 (sa3)\r\n7052 (zan4)\r\n7053 (luan2)\r\n7054 (yan4)\r\n7055 (li2)\r\n7056 (mi3)\r\n7057 (dan4)\r\n7058 (tan1)\r\n7059 (dang3)\r\n705A (jiao3)\r\n705B (chan3)\r\n705C (none0)\r\n705D (hao4)\r\n705E (ba4)\r\n705F (zhu2)\r\n7060 (lan3)\r\n7061 (lan2)\r\n7062 (nang3)\r\n7063 (wan1)\r\n7064 (luan2)\r\n7065 (quan2)\r\n7066 (xian1)\r\n7067 (yan4)\r\n7068 (gan4)\r\n7069 (yan4)\r\n706A (yu4)\r\n706B (huo3)\r\n706C (biao1)\r\n706D (mie4)\r\n706E (guang1)\r\n706F (deng1)\r\n7070 (hui1)\r\n7071 (xiao1)\r\n7072 (xiao1)\r\n7073 (none0)\r\n7074 (hong2)\r\n7075 (ling2)\r\n7076 (zao4)\r\n7077 (zhuan4)\r\n7078 (jiu3)\r\n7079 (zha4)\r\n707A (xie4)\r\n707B (chi4)\r\n707C (zhuo2)\r\n707D (zai1)\r\n707E (zai1)\r\n707F (can4)\r\n7080 (yang2)\r\n7081 (qi4)\r\n7082 (zhong1)\r\n7083 (fen2)\r\n7084 (niu3)\r\n7085 (gui4,jiong3)\r\n7086 (wen2)\r\n7087 (po4)\r\n7088 (yi4)\r\n7089 (lu2)\r\n708A (chui1,chui4)\r\n708B (pi1)\r\n708C (kai4)\r\n708D (pan4)\r\n708E (yan2)\r\n708F (kai4)\r\n7090 (pang4)\r\n7091 (mu4)\r\n7092 (chao3)\r\n7093 (liao4)\r\n7094 (gui4,que1)\r\n7095 (kang4)\r\n7096 (dun4)\r\n7097 (guang1)\r\n7098 (xin1)\r\n7099 (zhi4)\r\n709A (guang1)\r\n709B (xin1)\r\n709C (wei3)\r\n709D (qiang4)\r\n709E (bian4)\r\n709F (da2)\r\n70A0 (xia2)\r\n70A1 (zheng1)\r\n70A2 (zhu2)\r\n70A3 (ke3)\r\n70A4 (zhao4)\r\n70A5 (fu2)\r\n70A6 (ba2)\r\n70A7 (duo4)\r\n70A8 (duo4)\r\n70A9 (ling4)\r\n70AA (zhuo2)\r\n70AB (xuan4)\r\n70AC (ju4)\r\n70AD (tan4)\r\n70AE (pao4,bao1,pao2,pao1)\r\n70AF (jiong3)\r\n70B0 (pao2)\r\n70B1 (tai2)\r\n70B2 (tai2)\r\n70B3 (bing3)\r\n70B4 (yang3)\r\n70B5 (tong1,dong1)\r\n70B6 (han1)\r\n70B7 (zhu4)\r\n70B8 (zha4,zha2)\r\n70B9 (dian3,dian5)\r\n70BA (wei4,wei2)\r\n70BB (shi2)\r\n70BC (lian4)\r\n70BD (chi4)\r\n70BE (ping2)\r\n70BF (none0)\r\n70C0 (hu1)\r\n70C1 (shuo4)\r\n70C2 (lan4)\r\n70C3 (ting1)\r\n70C4 (jiao3)\r\n70C5 (xu4)\r\n70C6 (xing2)\r\n70C7 (quan4)\r\n70C8 (lie4)\r\n70C9 (huan4)\r\n70CA (yang2,yang4)\r\n70CB (xiao1)\r\n70CC (xiu1)\r\n70CD (xian3)\r\n70CE (yin2)\r\n70CF (wu1,wu4)\r\n70D0 (zhou1)\r\n70D1 (yao2)\r\n70D2 (shi4)\r\n70D3 (wei1)\r\n70D4 (tong2)\r\n70D5 (tong2)\r\n70D6 (zai1)\r\n70D7 (kai4)\r\n70D8 (hong1)\r\n70D9 (luo4,lao4)\r\n70DA (xia2)\r\n70DB (zhu2)\r\n70DC (xuan3)\r\n70DD (zheng1)\r\n70DE (po4)\r\n70DF (yan1,yin1)\r\n70E0 (hui3)\r\n70E1 (guang1)\r\n70E2 (zhe4)\r\n70E3 (hui1)\r\n70E4 (kao3)\r\n70E5 (none0)\r\n70E6 (fan2)\r\n70E7 (shao1)\r\n70E8 (ye4)\r\n70E9 (hui4)\r\n70EA (none0)\r\n70EB (tang4)\r\n70EC (jin4)\r\n70ED (re4)\r\n70EE (none0)\r\n70EF (xi1)\r\n70F0 (fu2)\r\n70F1 (jiong3)\r\n70F2 (che4)\r\n70F3 (pu3)\r\n70F4 (jing3,ting1)\r\n70F5 (zhuo2)\r\n70F6 (ting3)\r\n70F7 (wan2)\r\n70F8 (hai3)\r\n70F9 (peng1)\r\n70FA (lang3)\r\n70FB (shan1)\r\n70FC (hu1)\r\n70FD (feng1)\r\n70FE (chi4)\r\n70FF (rong2)\r\n7100 (hu2)\r\n7101 (none0)\r\n7102 (shu2)\r\n7103 (lang3)\r\n7104 (xun1)\r\n7105 (xun1)\r\n7106 (jue2)\r\n7107 (xiao1)\r\n7108 (xi1)\r\n7109 (yan1)\r\n710A (han4)\r\n710B (zhuang4)\r\n710C (qu1,jun4)\r\n710D (di4,ti1)\r\n710E (xie4)\r\n710F (qi4)\r\n7110 (wu4)\r\n7111 (none0)\r\n7112 (none0)\r\n7113 (han2)\r\n7114 (yan4)\r\n7115 (huan4)\r\n7116 (men4)\r\n7117 (ju2)\r\n7118 (dao4,tao1)\r\n7119 (bei4)\r\n711A (fen2)\r\n711B (lin4)\r\n711C (kun1)\r\n711D (hun4)\r\n711E (chun1)\r\n711F (xi2)\r\n7120 (cui4)\r\n7121 (wu2,mo2)\r\n7122 (hong1)\r\n7123 (ju4)\r\n7124 (fu3)\r\n7125 (yue1)\r\n7126 (jiao1)\r\n7127 (cong1)\r\n7128 (feng4)\r\n7129 (ping1)\r\n712A (qiong1)\r\n712B (cui4)\r\n712C (xi2)\r\n712D (qiong2)\r\n712E (xin4)\r\n712F (zhuo2,chao1,zhuo1)\r\n7130 (yan4)\r\n7131 (yan4)\r\n7132 (yi4)\r\n7133 (jue2)\r\n7134 (yu4)\r\n7135 (gang4)\r\n7136 (ran2)\r\n7137 (pi2)\r\n7138 (yan4)\r\n7139 (none0)\r\n713A (sheng1)\r\n713B (chang4)\r\n713C (shao1)\r\n713D (none0)\r\n713E (none0)\r\n713F (none0)\r\n7140 (none0)\r\n7141 (chen2)\r\n7142 (he4)\r\n7143 (kui3)\r\n7144 (zhong1)\r\n7145 (duan4)\r\n7146 (ya1)\r\n7147 (hui1)\r\n7148 (feng4)\r\n7149 (lian4)\r\n714A (xuan1)\r\n714B (xing1)\r\n714C (huang2)\r\n714D (jiao3)\r\n714E (jian1)\r\n714F (bi4)\r\n7150 (ying1)\r\n7151 (zhu3)\r\n7152 (wei3)\r\n7153 (tuan1)\r\n7154 (tian4)\r\n7155 (xi1)\r\n7156 (nuan3,xuan1)\r\n7157 (nuan3)\r\n7158 (chan2)\r\n7159 (yan1)\r\n715A (jiong3)\r\n715B (jiong3)\r\n715C (yu4)\r\n715D (mei4)\r\n715E (sha4,sha1)\r\n715F (wu4)\r\n7160 (ye4)\r\n7161 (xin4)\r\n7162 (qiong2)\r\n7163 (rou3)\r\n7164 (mei2)\r\n7165 (huan4)\r\n7166 (xu4,xu3)\r\n7167 (zhao4)\r\n7168 (wei1)\r\n7169 (fan2)\r\n716A (qiu2)\r\n716B (sui4)\r\n716C (yang2,yang4)\r\n716D (lie4)\r\n716E (zhu3)\r\n716F (none0)\r\n7170 (gao4)\r\n7171 (gua1)\r\n7172 (bao1)\r\n7173 (hu2)\r\n7174 (yun1)\r\n7175 (xia1)\r\n7176 (none0)\r\n7177 (none0)\r\n7178 (bian1)\r\n7179 (wei1)\r\n717A (tui4)\r\n717B (tang2)\r\n717C (chao3)\r\n717D (shan1,shan4)\r\n717E (yun1)\r\n717F (bo2)\r\n7180 (huang3)\r\n7181 (xie2)\r\n7182 (xi4)\r\n7183 (wu4)\r\n7184 (xi1,xi2)\r\n7185 (yun2)\r\n7186 (he2)\r\n7187 (he4)\r\n7188 (xi1)\r\n7189 (yun1)\r\n718A (xiong2)\r\n718B (nai2)\r\n718C (kao3)\r\n718D (none0)\r\n718E (yao4)\r\n718F (xun1,xun4)\r\n7190 (ming2)\r\n7191 (lian2)\r\n7192 (ying2)\r\n7193 (wen4)\r\n7194 (rong2)\r\n7195 (none0)\r\n7196 (none0)\r\n7197 (qiang4)\r\n7198 (liu4,liu1)\r\n7199 (xi1)\r\n719A (bi4)\r\n719B (biao1)\r\n719C (cong1)\r\n719D (lu4)\r\n719E (jian1)\r\n719F (shu2,shou2)\r\n71A0 (yi4)\r\n71A1 (lou2)\r\n71A2 (feng1)\r\n71A3 (sui1)\r\n71A4 (yi4)\r\n71A5 (teng1)\r\n71A6 (jue2)\r\n71A7 (zong1)\r\n71A8 (yun4,yu4)\r\n71A9 (hu4)\r\n71AA (yi2)\r\n71AB (zhi4)\r\n71AC (ao2,ao1)\r\n71AD (wei4)\r\n71AE (liao2)\r\n71AF (han4)\r\n71B0 (ou1)\r\n71B1 (re4)\r\n71B2 (jiong3)\r\n71B3 (man4)\r\n71B4 (none0)\r\n71B5 (shang1)\r\n71B6 (cuan4)\r\n71B7 (zeng1)\r\n71B8 (jian1)\r\n71B9 (xi1)\r\n71BA (xi1)\r\n71BB (xi1)\r\n71BC (yi4)\r\n71BD (xiao4)\r\n71BE (chi4)\r\n71BF (huang2)\r\n71C0 (chan3)\r\n71C1 (ye4)\r\n71C2 (qian2)\r\n71C3 (ran2)\r\n71C4 (yan4)\r\n71C5 (xian2)\r\n71C6 (qiao2)\r\n71C7 (zun1)\r\n71C8 (deng1)\r\n71C9 (dun4)\r\n71CA (shen1)\r\n71CB (jiao1)\r\n71CC (fen2)\r\n71CD (si1)\r\n71CE (liao2,liao3,liao4)\r\n71CF (yu4)\r\n71D0 (lin2)\r\n71D1 (tong2)\r\n71D2 (shao1)\r\n71D3 (fen2)\r\n71D4 (fan2)\r\n71D5 (yan4,yan1)\r\n71D6 (xun2)\r\n71D7 (lan4)\r\n71D8 (mei3)\r\n71D9 (tang4)\r\n71DA (yi1)\r\n71DB (jing3)\r\n71DC (men4)\r\n71DD (none0)\r\n71DE (none0)\r\n71DF (ying2)\r\n71E0 (yu4)\r\n71E1 (yi4)\r\n71E2 (xue2)\r\n71E3 (lan2)\r\n71E4 (tai4)\r\n71E5 (zao4)\r\n71E6 (can4)\r\n71E7 (sui4)\r\n71E8 (xi1)\r\n71E9 (que4)\r\n71EA (cong1)\r\n71EB (lian2)\r\n71EC (hui3)\r\n71ED (zhu2)\r\n71EE (xie4)\r\n71EF (ling2)\r\n71F0 (wei1)\r\n71F1 (yi4)\r\n71F2 (xie2)\r\n71F3 (zhao4)\r\n71F4 (hui4)\r\n71F5 (none0)\r\n71F6 (none0)\r\n71F7 (lan2)\r\n71F8 (ru2)\r\n71F9 (xian3)\r\n71FA (kao3)\r\n71FB (xun1)\r\n71FC (jin4)\r\n71FD (chou2)\r\n71FE (dao4,tao1,tao2)\r\n71FF (yao4)\r\n7200 (he4)\r\n7201 (lan4)\r\n7202 (biao1)\r\n7203 (rong2)\r\n7204 (li4)\r\n7205 (mo4)\r\n7206 (bao4)\r\n7207 (ruo4)\r\n7208 (di4)\r\n7209 (lu:4)\r\n720A (ao2)\r\n720B (xun4)\r\n720C (kuang4)\r\n720D (shuo4)\r\n720E (none0)\r\n720F (li4)\r\n7210 (lu2)\r\n7211 (jue2)\r\n7212 (liao4)\r\n7213 (yan4)\r\n7214 (xi1)\r\n7215 (xie4)\r\n7216 (long2)\r\n7217 (yan4)\r\n7218 (none0)\r\n7219 (rang3,shang4)\r\n721A (yue4)\r\n721B (lan4)\r\n721C (cong2)\r\n721D (jue2,jiao4)\r\n721E (tong2)\r\n721F (guan4)\r\n7220 (none0)\r\n7221 (che4)\r\n7222 (mi2)\r\n7223 (tang3)\r\n7224 (lan4)\r\n7225 (zhu2)\r\n7226 (lan3)\r\n7227 (ling2)\r\n7228 (cuan4)\r\n7229 (yu4)\r\n722A (zhua3,zhao3)\r\n722B (lan4)\r\n722C (pa2)\r\n722D (zheng1)\r\n722E (pao2)\r\n722F (zhao3)\r\n7230 (yuan2)\r\n7231 (ai4)\r\n7232 (wei4,wei2)\r\n7233 (none0)\r\n7234 (jue2)\r\n7235 (jue2)\r\n7236 (fu4,fu3)\r\n7237 (ye2)\r\n7238 (ba4)\r\n7239 (die1)\r\n723A (ye2)\r\n723B (yao2)\r\n723C (zu3)\r\n723D (shuang3)\r\n723E (er3)\r\n723F (pan2,qiang2,ban4)\r\n7240 (chuan2)\r\n7241 (ke1)\r\n7242 (zang1)\r\n7243 (zang1)\r\n7244 (qiang1)\r\n7245 (die2)\r\n7246 (qiang2)\r\n7247 (pian4,pian1)\r\n7248 (ban3)\r\n7249 (pan4)\r\n724A (shao2)\r\n724B (jian1)\r\n724C (pai2)\r\n724D (du2)\r\n724E (yong1)\r\n724F (tou2)\r\n7250 (tou2)\r\n7251 (bian1)\r\n7252 (die2)\r\n7253 (bang3)\r\n7254 (bo2)\r\n7255 (bang3)\r\n7256 (you3)\r\n7257 (none0)\r\n7258 (du2)\r\n7259 (ya2)\r\n725A (cheng4,cheng1)\r\n725B (niu2)\r\n725C (cheng1)\r\n725D (pin4)\r\n725E (jiu1)\r\n725F (mou2,mu4)\r\n7260 (ta1)\r\n7261 (mu3)\r\n7262 (lao2)\r\n7263 (ren4)\r\n7264 (mang2)\r\n7265 (fang1)\r\n7266 (mao2)\r\n7267 (mu4)\r\n7268 (ren4)\r\n7269 (wu4)\r\n726A (yan4)\r\n726B (fa2)\r\n726C (bei4)\r\n726D (si4)\r\n726E (jian4)\r\n726F (gu3)\r\n7270 (you4)\r\n7271 (gu3)\r\n7272 (sheng1)\r\n7273 (mu3)\r\n7274 (di3)\r\n7275 (qian1)\r\n7276 (quan4)\r\n7277 (quan2)\r\n7278 (zi4)\r\n7279 (te4)\r\n727A (xi1)\r\n727B (mang2)\r\n727C (keng1)\r\n727D (qian1)\r\n727E (wu3,wu2)\r\n727F (gu4)\r\n7280 (xi1)\r\n7281 (li2)\r\n7282 (li2)\r\n7283 (pou3)\r\n7284 (ji1)\r\n7285 (gang1)\r\n7286 (zhi2)\r\n7287 (ben1,ben4)\r\n7288 (quan2)\r\n7289 (run1)\r\n728A (du2)\r\n728B (ju4)\r\n728C (jia1)\r\n728D (jian1,qian2)\r\n728E (feng1)\r\n728F (pian1)\r\n7290 (ke1)\r\n7291 (ju2)\r\n7292 (kao4,di2)\r\n7293 (chu2)\r\n7294 (xi4)\r\n7295 (bei4)\r\n7296 (luo4)\r\n7297 (jie4)\r\n7298 (ma2)\r\n7299 (san1)\r\n729A (wei4)\r\n729B (li2)\r\n729C (dun1)\r\n729D (tong2)\r\n729E (se4)\r\n729F (jiang4)\r\n72A0 (xi1)\r\n72A1 (li4)\r\n72A2 (du2)\r\n72A3 (lie4)\r\n72A4 (pi2)\r\n72A5 (piao3)\r\n72A6 (bao4)\r\n72A7 (xi1)\r\n72A8 (chou1)\r\n72A9 (wei4)\r\n72AA (kui2)\r\n72AB (chou1)\r\n72AC (quan3,quan2)\r\n72AD (quan3)\r\n72AE (ba2)\r\n72AF (fan4)\r\n72B0 (qiu2)\r\n72B1 (bo2)\r\n72B2 (chai2)\r\n72B3 (chuo2)\r\n72B4 (an4,han1)\r\n72B5 (jie2)\r\n72B6 (zhuang4)\r\n72B7 (guang3)\r\n72B8 (ma3)\r\n72B9 (you2)\r\n72BA (kang4)\r\n72BB (bo2)\r\n72BC (hou3)\r\n72BD (ya2)\r\n72BE (han4)\r\n72BF (huan1)\r\n72C0 (zhuang4)\r\n72C1 (yun3)\r\n72C2 (kuang2)\r\n72C3 (niu3)\r\n72C4 (di2)\r\n72C5 (qing1)\r\n72C6 (zhong4)\r\n72C7 (yun3)\r\n72C8 (bei4)\r\n72C9 (pi1)\r\n72CA (ju2)\r\n72CB (ni2)\r\n72CC (sheng1)\r\n72CD (pao2)\r\n72CE (xia2)\r\n72CF (tuo2)\r\n72D0 (hu2)\r\n72D1 (ling2)\r\n72D2 (fei4)\r\n72D3 (pi1)\r\n72D4 (ni2)\r\n72D5 (sheng1)\r\n72D6 (you4)\r\n72D7 (gou3)\r\n72D8 (yue4)\r\n72D9 (ju1)\r\n72DA (dan4)\r\n72DB (bo4)\r\n72DC (gu3)\r\n72DD (xian3)\r\n72DE (ning2)\r\n72DF (huan2)\r\n72E0 (hen3)\r\n72E1 (jiao3,jia3)\r\n72E2 (he2,hao2,mo4)\r\n72E3 (zhao4)\r\n72E4 (ji2)\r\n72E5 (huan2)\r\n72E6 (shan1)\r\n72E7 (ta4)\r\n72E8 (rong2)\r\n72E9 (shou4)\r\n72EA (tong1)\r\n72EB (lao3)\r\n72EC (du2)\r\n72ED (xia2)\r\n72EE (shi1)\r\n72EF (kuai4)\r\n72F0 (zheng1)\r\n72F1 (yu4)\r\n72F2 (sun1)\r\n72F3 (yu2)\r\n72F4 (bi4)\r\n72F5 (mang2)\r\n72F6 (xi3)\r\n72F7 (juan4)\r\n72F8 (li2)\r\n72F9 (xia2)\r\n72FA (yin2)\r\n72FB (suan1)\r\n72FC (lang2)\r\n72FD (bei4)\r\n72FE (zhi4)\r\n72FF (yan2)\r\n7300 (sha1)\r\n7301 (li4)\r\n7302 (zhi4)\r\n7303 (xian3)\r\n7304 (jing1)\r\n7305 (han4)\r\n7306 (fei3)\r\n7307 (yao2)\r\n7308 (ba4,pi2)\r\n7309 (qi2)\r\n730A (ni2)\r\n730B (biao1)\r\n730C (yin4)\r\n730D (li2)\r\n730E (lie4)\r\n730F (jian1)\r\n7310 (qiang1)\r\n7311 (kun1)\r\n7312 (yan1)\r\n7313 (guo3)\r\n7314 (zong4)\r\n7315 (mi2)\r\n7316 (chang1)\r\n7317 (yi1)\r\n7318 (zhi4)\r\n7319 (zheng1)\r\n731A (ya2)\r\n731B (meng3)\r\n731C (cai1)\r\n731D (cu4)\r\n731E (she1)\r\n731F (lie4)\r\n7320 (none0)\r\n7321 (luo2)\r\n7322 (hu2)\r\n7323 (zong1)\r\n7324 (hu2)\r\n7325 (wei3)\r\n7326 (feng1)\r\n7327 (wo1)\r\n7328 (yuan2)\r\n7329 (xing1)\r\n732A (zhu1)\r\n732B (mao1,mao2)\r\n732C (wei4)\r\n732D (yuan2)\r\n732E (xian4)\r\n732F (tuan1)\r\n7330 (ya4)\r\n7331 (nao2)\r\n7332 (xie1,he4)\r\n7333 (jia1)\r\n7334 (hou2)\r\n7335 (bian1)\r\n7336 (you2)\r\n7337 (you2)\r\n7338 (mei2)\r\n7339 (cha2)\r\n733A (yao2)\r\n733B (sun1)\r\n733C (bo2)\r\n733D (ming2)\r\n733E (hua2)\r\n733F (yuan2)\r\n7340 (sou1)\r\n7341 (ma3)\r\n7342 (yuan2)\r\n7343 (dai1)\r\n7344 (yu4)\r\n7345 (shi1)\r\n7346 (hao2)\r\n7347 (none0)\r\n7348 (yi4)\r\n7349 (zhen1)\r\n734A (chuang4)\r\n734B (hao2)\r\n734C (man4)\r\n734D (jing4)\r\n734E (jiang3)\r\n734F (mo4)\r\n7350 (zhang1)\r\n7351 (chan2)\r\n7352 (ao2)\r\n7353 (ao2)\r\n7354 (hao2)\r\n7355 (cui1)\r\n7356 (ben4)\r\n7357 (jue2)\r\n7358 (bi4)\r\n7359 (bi4)\r\n735A (huang2)\r\n735B (bu3)\r\n735C (lin2)\r\n735D (yu4)\r\n735E (tong2)\r\n735F (yao4)\r\n7360 (liao2)\r\n7361 (shuo4)\r\n7362 (xiao1)\r\n7363 (shou4)\r\n7364 (none0)\r\n7365 (xi2)\r\n7366 (ge2)\r\n7367 (juan4)\r\n7368 (du2)\r\n7369 (hui4)\r\n736A (kuai4)\r\n736B (xian3)\r\n736C (xie4)\r\n736D (ta3)\r\n736E (xian3)\r\n736F (xun1)\r\n7370 (ning2)\r\n7371 (bian1)\r\n7372 (huo4)\r\n7373 (nou2)\r\n7374 (meng3)\r\n7375 (lie4)\r\n7376 (nao2)\r\n7377 (guang3)\r\n7378 (shou4)\r\n7379 (lu2)\r\n737A (ta4,ta3)\r\n737B (xian4)\r\n737C (mi2)\r\n737D (rang2)\r\n737E (huan1)\r\n737F (nao2)\r\n7380 (luo2)\r\n7381 (xian3)\r\n7382 (qi2)\r\n7383 (qu2)\r\n7384 (xuan2)\r\n7385 (miao4)\r\n7386 (zi1)\r\n7387 (lu:4,shuai4,shuo4)\r\n7388 (lu2)\r\n7389 (yu4)\r\n738A (su4)\r\n738B (wang2,wang4)\r\n738C (qiu2)\r\n738D (ga3)\r\n738E (ding1)\r\n738F (le4)\r\n7390 (ba1)\r\n7391 (ji1)\r\n7392 (hong2)\r\n7393 (di4)\r\n7394 (chuan4)\r\n7395 (gan1)\r\n7396 (jiu3)\r\n7397 (yu2)\r\n7398 (qi3)\r\n7399 (yu2)\r\n739A (yang2,chang4)\r\n739B (ma3)\r\n739C (hong2)\r\n739D (wu3)\r\n739E (fu1)\r\n739F (min2,wen2)\r\n73A0 (jie4)\r\n73A1 (ya2)\r\n73A2 (bin1,fen1)\r\n73A3 (bian4)\r\n73A4 (beng3)\r\n73A5 (yue4)\r\n73A6 (jue2)\r\n73A7 (yun3)\r\n73A8 (jue2)\r\n73A9 (wan2,wan4)\r\n73AA (jian1)\r\n73AB (mei2)\r\n73AC (dan3)\r\n73AD (pi2)\r\n73AE (wei3)\r\n73AF (huan2)\r\n73B0 (xian4)\r\n73B1 (qiang1)\r\n73B2 (ling2)\r\n73B3 (dai4)\r\n73B4 (yi4)\r\n73B5 (an2)\r\n73B6 (ping2)\r\n73B7 (dian4)\r\n73B8 (fu2)\r\n73B9 (xuan2)\r\n73BA (xi3)\r\n73BB (bo1)\r\n73BC (ci3)\r\n73BD (gou3)\r\n73BE (jia3)\r\n73BF (shao2)\r\n73C0 (po4)\r\n73C1 (ci2)\r\n73C2 (ke1)\r\n73C3 (ran3)\r\n73C4 (sheng1)\r\n73C5 (shen1)\r\n73C6 (yi2)\r\n73C7 (zu3)\r\n73C8 (jia1)\r\n73C9 (min2)\r\n73CA (shan1)\r\n73CB (liu3)\r\n73CC (bi4)\r\n73CD (zhen1)\r\n73CE (zhen1)\r\n73CF (jue2)\r\n73D0 (fa3,fa4)\r\n73D1 (long2)\r\n73D2 (jin1)\r\n73D3 (jiao4)\r\n73D4 (jian4)\r\n73D5 (li4)\r\n73D6 (guang1)\r\n73D7 (xian1)\r\n73D8 (zhou1)\r\n73D9 (gong3)\r\n73DA (yan1)\r\n73DB (xiu4)\r\n73DC (yang2)\r\n73DD (xu3)\r\n73DE (luo4)\r\n73DF (su4)\r\n73E0 (zhu1)\r\n73E1 (qin2)\r\n73E2 (ken4)\r\n73E3 (xun2)\r\n73E4 (bao3)\r\n73E5 (er3)\r\n73E6 (xiang2)\r\n73E7 (yao2)\r\n73E8 (xia2)\r\n73E9 (heng2,hang2)\r\n73EA (gui1)\r\n73EB (chong1)\r\n73EC (xu4)\r\n73ED (ban1)\r\n73EE (pei4)\r\n73EF (none0)\r\n73F0 (dang1)\r\n73F1 (ying1)\r\n73F2 (hun2,hui1)\r\n73F3 (wen2)\r\n73F4 (e2)\r\n73F5 (cheng2)\r\n73F6 (ti2,di4)\r\n73F7 (wu3)\r\n73F8 (wu2)\r\n73F9 (cheng2)\r\n73FA (jun4)\r\n73FB (mei2)\r\n73FC (bei4)\r\n73FD (ting3)\r\n73FE (xian4)\r\n73FF (chuo4)\r\n7400 (han2)\r\n7401 (xuan2)\r\n7402 (yan2)\r\n7403 (qiu2)\r\n7404 (quan3)\r\n7405 (lang2)\r\n7406 (li3)\r\n7407 (xiu4)\r\n7408 (fu2)\r\n7409 (liu2)\r\n740A (ya2,ye2)\r\n740B (xi1)\r\n740C (ling2)\r\n740D (li4)\r\n740E (jin1)\r\n740F (lian3)\r\n7410 (suo3)\r\n7411 (suo3)\r\n7412 (none0)\r\n7413 (wan2)\r\n7414 (dian4)\r\n7415 (bing3)\r\n7416 (zhan3)\r\n7417 (cui4)\r\n7418 (min2)\r\n7419 (yu4)\r\n741A (ju1)\r\n741B (chen1)\r\n741C (lai2)\r\n741D (wen2)\r\n741E (sheng4)\r\n741F (wei2)\r\n7420 (dian3)\r\n7421 (chu4)\r\n7422 (zhuo2,zuo2)\r\n7423 (pei3)\r\n7424 (cheng1)\r\n7425 (hu3)\r\n7426 (qi2)\r\n7427 (e4)\r\n7428 (kun1)\r\n7429 (chang1)\r\n742A (qi2)\r\n742B (beng3)\r\n742C (wan3)\r\n742D (lu4)\r\n742E (cong2)\r\n742F (guan3)\r\n7430 (yan3)\r\n7431 (diao1)\r\n7432 (bei4)\r\n7433 (lin2)\r\n7434 (qin2)\r\n7435 (pi2)\r\n7436 (pa2,ba5)\r\n7437 (qiang1)\r\n7438 (zhuo2)\r\n7439 (qin2)\r\n743A (fa4)\r\n743B (none0)\r\n743C (qiong2)\r\n743D (du3)\r\n743E (jie4)\r\n743F (hun2,hui1)\r\n7440 (yu3)\r\n7441 (mao4,mei4)\r\n7442 (mei2)\r\n7443 (chun1)\r\n7444 (xuan1)\r\n7445 (ti2)\r\n7446 (xing1)\r\n7447 (dai4)\r\n7448 (rou2)\r\n7449 (min2)\r\n744A (zhen1)\r\n744B (wei3)\r\n744C (ruan3)\r\n744D (huan4)\r\n744E (xie2)\r\n744F (chuan1)\r\n7450 (jian3)\r\n7451 (zhuan4)\r\n7452 (yang2)\r\n7453 (lian4)\r\n7454 (quan2)\r\n7455 (xia2)\r\n7456 (duan4)\r\n7457 (yuan4)\r\n7458 (ye2)\r\n7459 (nao3)\r\n745A (hu2)\r\n745B (ying1)\r\n745C (yu2)\r\n745D (huang2)\r\n745E (rui4)\r\n745F (se4)\r\n7460 (liu2)\r\n7461 (none0)\r\n7462 (rong2)\r\n7463 (suo3)\r\n7464 (yao2)\r\n7465 (wen1)\r\n7466 (wu3)\r\n7467 (jin1)\r\n7468 (jin4)\r\n7469 (ying2)\r\n746A (ma3)\r\n746B (tao1)\r\n746C (liu2)\r\n746D (tang2)\r\n746E (li4)\r\n746F (lang2)\r\n7470 (gui1)\r\n7471 (tian4)\r\n7472 (qiang1)\r\n7473 (cuo3)\r\n7474 (jue2)\r\n7475 (zhao3)\r\n7476 (yao2)\r\n7477 (ai4)\r\n7478 (bin1)\r\n7479 (tu2)\r\n747A (chang2)\r\n747B (kun1)\r\n747C (zhuan1)\r\n747D (cong1)\r\n747E (jin3)\r\n747F (yi1)\r\n7480 (cui3)\r\n7481 (cong1)\r\n7482 (qi2)\r\n7483 (li2,li5)\r\n7484 (ying3)\r\n7485 (suo3)\r\n7486 (qiu2)\r\n7487 (xuan2)\r\n7488 (ao2)\r\n7489 (lian2,lian3)\r\n748A (man2)\r\n748B (zhang1)\r\n748C (yin2)\r\n748D (none0)\r\n748E (ying1)\r\n748F (wei4)\r\n7490 (lu4)\r\n7491 (wu2)\r\n7492 (deng1)\r\n7493 (none0)\r\n7494 (zeng1)\r\n7495 (xun2)\r\n7496 (qu2)\r\n7497 (dang4)\r\n7498 (lin2)\r\n7499 (liao2)\r\n749A (qiong2)\r\n749B (su4)\r\n749C (huang2)\r\n749D (gui1)\r\n749E (pu2)\r\n749F (jing3)\r\n74A0 (fan2)\r\n74A1 (jin4)\r\n74A2 (liu2)\r\n74A3 (ji1)\r\n74A4 (none0)\r\n74A5 (jing3)\r\n74A6 (ai4)\r\n74A7 (bi4)\r\n74A8 (can4)\r\n74A9 (qu2)\r\n74AA (zao3)\r\n74AB (dang1)\r\n74AC (jiao3)\r\n74AD (gun4)\r\n74AE (tan3)\r\n74AF (hui4)\r\n74B0 (huan2)\r\n74B1 (se4)\r\n74B2 (sui4)\r\n74B3 (tian2)\r\n74B4 (none0)\r\n74B5 (yu2)\r\n74B6 (jin4)\r\n74B7 (fu1)\r\n74B8 (bin1)\r\n74B9 (shu2)\r\n74BA (wen4,wen2)\r\n74BB (zui3)\r\n74BC (lan2)\r\n74BD (xi3)\r\n74BE (ji4)\r\n74BF (xuan2)\r\n74C0 (ruan3)\r\n74C1 (huo4)\r\n74C2 (gai4)\r\n74C3 (lei2)\r\n74C4 (du2)\r\n74C5 (li4)\r\n74C6 (zhi2)\r\n74C7 (rou2)\r\n74C8 (li2)\r\n74C9 (zan4)\r\n74CA (qiong2)\r\n74CB (zhe2)\r\n74CC (gui1)\r\n74CD (sui4)\r\n74CE (la4)\r\n74CF (long2)\r\n74D0 (lu2)\r\n74D1 (li4)\r\n74D2 (zan4)\r\n74D3 (lan4)\r\n74D4 (ying1)\r\n74D5 (mi2)\r\n74D6 (xiang1)\r\n74D7 (xi1)\r\n74D8 (guan4)\r\n74D9 (dao4)\r\n74DA (zan4)\r\n74DB (huan2)\r\n74DC (gua1)\r\n74DD (bao2)\r\n74DE (die2)\r\n74DF (pao2)\r\n74E0 (hu4)\r\n74E1 (zhi2)\r\n74E2 (piao2)\r\n74E3 (ban4)\r\n74E4 (rang2)\r\n74E5 (li4)\r\n74E6 (wa3,wa4)\r\n74E7 (none0)\r\n74E8 (jiang1,hong2)\r\n74E9 (qian2,wa3)\r\n74EA (ban3)\r\n74EB (pen2)\r\n74EC (fang3)\r\n74ED (dan3)\r\n74EE (weng4)\r\n74EF (ou1)\r\n74F0 (none0)\r\n74F1 (none0)\r\n74F2 (none0)\r\n74F3 (hu2)\r\n74F4 (ling2)\r\n74F5 (yi2)\r\n74F6 (ping2)\r\n74F7 (ci2)\r\n74F8 (none0)\r\n74F9 (juan4)\r\n74FA (chang2)\r\n74FB (chi1)\r\n74FC (none0)\r\n74FD (dang4)\r\n74FE (meng3)\r\n74FF (bu4)\r\n7500 (chui2)\r\n7501 (ping2)\r\n7502 (bian1)\r\n7503 (zhou4)\r\n7504 (zhen1)\r\n7505 (none0)\r\n7506 (ci2)\r\n7507 (ying1)\r\n7508 (qi4)\r\n7509 (xian2)\r\n750A (lou3)\r\n750B (di4)\r\n750C (ou1)\r\n750D (meng2)\r\n750E (zhuan1)\r\n750F (beng4)\r\n7510 (lin2)\r\n7511 (zeng4)\r\n7512 (wu3)\r\n7513 (pi4)\r\n7514 (dan1)\r\n7515 (weng4)\r\n7516 (ying1)\r\n7517 (yan3)\r\n7518 (gan1)\r\n7519 (dai4)\r\n751A (shen4,shen2,she2)\r\n751B (tian2)\r\n751C (tian2)\r\n751D (han1)\r\n751E (chang2)\r\n751F (sheng1)\r\n7520 (qing2)\r\n7521 (shen1)\r\n7522 (chan3)\r\n7523 (chan3)\r\n7524 (rui2)\r\n7525 (sheng1)\r\n7526 (su1)\r\n7527 (shen1)\r\n7528 (yong4)\r\n7529 (shuai3)\r\n752A (lu4)\r\n752B (fu3)\r\n752C (yong3)\r\n752D (beng2)\r\n752E (none0)\r\n752F (ning2)\r\n7530 (tian2)\r\n7531 (you2)\r\n7532 (jia3)\r\n7533 (shen1)\r\n7534 (zha2)\r\n7535 (dian4)\r\n7536 (fu2)\r\n7537 (nan2)\r\n7538 (dian4)\r\n7539 (ping2)\r\n753A (ding1,ting3)\r\n753B (hua4)\r\n753C (ting3,ding1)\r\n753D (quan3)\r\n753E (zai1)\r\n753F (meng2)\r\n7540 (bi4)\r\n7541 (qi2)\r\n7542 (liu4)\r\n7543 (xun2)\r\n7544 (liu2)\r\n7545 (chang4)\r\n7546 (mu3)\r\n7547 (yun2)\r\n7548 (fan4)\r\n7549 (fu2)\r\n754A (geng1)\r\n754B (tian2)\r\n754C (jie4)\r\n754D (jie4)\r\n754E (quan3)\r\n754F (wei4)\r\n7550 (fu4)\r\n7551 (tian2)\r\n7552 (mu3)\r\n7553 (none0)\r\n7554 (pan4)\r\n7555 (jiang1)\r\n7556 (wa1)\r\n7557 (da2)\r\n7558 (nan2)\r\n7559 (liu2)\r\n755A (ben3)\r\n755B (zhen3)\r\n755C (chu4,xu4)\r\n755D (mu3)\r\n755E (mu3)\r\n755F (ce4)\r\n7560 (none0)\r\n7561 (gai1)\r\n7562 (bi4)\r\n7563 (da2)\r\n7564 (zhi4)\r\n7565 (lu:e4)\r\n7566 (qi2,xi1)\r\n7567 (lu:e4)\r\n7568 (pan1)\r\n7569 (none0)\r\n756A (fan1,pan1)\r\n756B (hua4)\r\n756C (yu2)\r\n756D (yu2)\r\n756E (mu3)\r\n756F (jun4)\r\n7570 (yi4)\r\n7571 (liu2)\r\n7572 (she1)\r\n7573 (die2)\r\n7574 (chou2)\r\n7575 (hua4)\r\n7576 (dang1,dang4)\r\n7577 (chuo4)\r\n7578 (ji1)\r\n7579 (wan3)\r\n757A (jiang1)\r\n757B (cheng2)\r\n757C (chang4)\r\n757D (tun3)\r\n757E (lei2)\r\n757F (ji1)\r\n7580 (cha1)\r\n7581 (liu2)\r\n7582 (die2)\r\n7583 (tuan3)\r\n7584 (lin2)\r\n7585 (jiang1)\r\n7586 (jiang1)\r\n7587 (chou2)\r\n7588 (bo4)\r\n7589 (die2)\r\n758A (die2)\r\n758B (pi3,shu1,ya3)\r\n758C (nie4)\r\n758D (dan4)\r\n758E (shu1)\r\n758F (shu1,shu4)\r\n7590 (zhi4)\r\n7591 (yi2)\r\n7592 (chuang2)\r\n7593 (nai3)\r\n7594 (ding1)\r\n7595 (bi3)\r\n7596 (jie1)\r\n7597 (liao2)\r\n7598 (gong1,gang1)\r\n7599 (ge1)\r\n759A (jiu4)\r\n759B (zhou3)\r\n759C (xia4)\r\n759D (shan4)\r\n759E (xu1)\r\n759F (nu:e4,yao4)\r\n75A0 (li4)\r\n75A1 (yang2)\r\n75A2 (chen4)\r\n75A3 (you2)\r\n75A4 (ba1)\r\n75A5 (jie4)\r\n75A6 (jue2)\r\n75A7 (xi1)\r\n75A8 (xia1)\r\n75A9 (cui4)\r\n75AA (bi4)\r\n75AB (yi4)\r\n75AC (li4)\r\n75AD (zong4)\r\n75AE (chuang1)\r\n75AF (feng1)\r\n75B0 (zhu4)\r\n75B1 (pao4)\r\n75B2 (pi2)\r\n75B3 (gan1)\r\n75B4 (ke1)\r\n75B5 (ci1,ci2)\r\n75B6 (xie4)\r\n75B7 (qi2)\r\n75B8 (dan3,da5)\r\n75B9 (zhen3)\r\n75BA (fa2)\r\n75BB (zhi3)\r\n75BC (teng2)\r\n75BD (ju1)\r\n75BE (ji2)\r\n75BF (fei4)\r\n75C0 (ju1)\r\n75C1 (dian4)\r\n75C2 (jia1)\r\n75C3 (xuan2,xian2)\r\n75C4 (zha4)\r\n75C5 (bing4)\r\n75C6 (nie4)\r\n75C7 (zheng4,zheng1)\r\n75C8 (yong1)\r\n75C9 (jing4)\r\n75CA (quan2)\r\n75CB (chong2)\r\n75CC (tong1)\r\n75CD (yi2)\r\n75CE (jie4)\r\n75CF (wei3)\r\n75D0 (hui2)\r\n75D1 (duo3)\r\n75D2 (yang3)\r\n75D3 (chi4)\r\n75D4 (zhi4)\r\n75D5 (hen2)\r\n75D6 (ya3)\r\n75D7 (mei4)\r\n75D8 (dou4)\r\n75D9 (jing4)\r\n75DA (xiao1)\r\n75DB (tong4)\r\n75DC (tu1)\r\n75DD (mang2)\r\n75DE (pi3)\r\n75DF (xiao1)\r\n75E0 (suan1)\r\n75E1 (pu1)\r\n75E2 (li4)\r\n75E3 (zhi4)\r\n75E4 (cuo2)\r\n75E5 (duo2)\r\n75E6 (wu4)\r\n75E7 (sha1)\r\n75E8 (lao2)\r\n75E9 (shou4)\r\n75EA (huan4)\r\n75EB (xian2)\r\n75EC (yi4)\r\n75ED (peng2)\r\n75EE (zhang4)\r\n75EF (guan3)\r\n75F0 (tan2)\r\n75F1 (fei4)\r\n75F2 (ma2)\r\n75F3 (lin2)\r\n75F4 (chi1)\r\n75F5 (ji4)\r\n75F6 (tian3)\r\n75F7 (an1)\r\n75F8 (chi4)\r\n75F9 (bi4)\r\n75FA (bi4)\r\n75FB (min2)\r\n75FC (gu4,gu1)\r\n75FD (dui1)\r\n75FE (e1)\r\n75FF (wei3)\r\n7600 (yu1)\r\n7601 (cui4)\r\n7602 (ya3)\r\n7603 (zhu2)\r\n7604 (xi1)\r\n7605 (dan4,dan1,dan3)\r\n7606 (shen4)\r\n7607 (zhong3)\r\n7608 (ji4,zhi4)\r\n7609 (yu4)\r\n760A (hou2)\r\n760B (feng1)\r\n760C (la4)\r\n760D (yang2)\r\n760E (shen4)\r\n760F (tu2)\r\n7610 (yu3)\r\n7611 (gua1)\r\n7612 (wen2)\r\n7613 (huan4)\r\n7614 (ku4)\r\n7615 (jia3,xia2)\r\n7616 (yin1)\r\n7617 (yi4)\r\n7618 (lou4)\r\n7619 (sao4)\r\n761A (jue2)\r\n761B (chi4)\r\n761C (xi2)\r\n761D (guan1)\r\n761E (yi4)\r\n761F (wen1)\r\n7620 (ji2)\r\n7621 (chuang1)\r\n7622 (ban1)\r\n7623 (lei3)\r\n7624 (liu2)\r\n7625 (chai4,cuo2)\r\n7626 (shou4)\r\n7627 (nu:e4,yao4)\r\n7628 (dian1)\r\n7629 (da2,da5)\r\n762A (bie1,bie3)\r\n762B (tan1)\r\n762C (zhang4)\r\n762D (biao1)\r\n762E (shen4)\r\n762F (cu4)\r\n7630 (luo3)\r\n7631 (yi4)\r\n7632 (zong4)\r\n7633 (chou1)\r\n7634 (zhang4)\r\n7635 (zhai4)\r\n7636 (sou4)\r\n7637 (suo3)\r\n7638 (que2)\r\n7639 (diao4)\r\n763A (lou4)\r\n763B (lou4)\r\n763C (mo4)\r\n763D (jin4)\r\n763E (yin3)\r\n763F (ying3)\r\n7640 (huang2)\r\n7641 (fu2)\r\n7642 (liao2)\r\n7643 (long2)\r\n7644 (qiao2)\r\n7645 (liu2)\r\n7646 (lao2)\r\n7647 (xian2)\r\n7648 (fei4)\r\n7649 (dan4,dan1,dan3)\r\n764A (yin4)\r\n764B (he4)\r\n764C (ai2,yan2)\r\n764D (ban1)\r\n764E (xian2)\r\n764F (guan1)\r\n7650 (guai4)\r\n7651 (nong2)\r\n7652 (yu4)\r\n7653 (wei2)\r\n7654 (yi4)\r\n7655 (yong1)\r\n7656 (pi3,pi4)\r\n7657 (lei3)\r\n7658 (li4,ji1)\r\n7659 (shu3)\r\n765A (dan4)\r\n765B (lin3)\r\n765C (dian4)\r\n765D (lin3)\r\n765E (lai4)\r\n765F (bie1,bie3)\r\n7660 (ji4)\r\n7661 (chi1)\r\n7662 (yang3)\r\n7663 (xuan3)\r\n7664 (jie1)\r\n7665 (zheng1,zheng4)\r\n7666 (none0)\r\n7667 (li4)\r\n7668 (huo4)\r\n7669 (lai4)\r\n766A (ji1)\r\n766B (dian1)\r\n766C (xian3,xuan3)\r\n766D (ying3)\r\n766E (yin3)\r\n766F (qu2)\r\n7670 (yong1)\r\n7671 (tan1)\r\n7672 (dian1)\r\n7673 (luo3)\r\n7674 (luan2)\r\n7675 (luan2)\r\n7676 (bo1)\r\n7677 (none0)\r\n7678 (gui3)\r\n7679 (po1)\r\n767A (fa1)\r\n767B (deng1)\r\n767C (fa1)\r\n767D (bai2)\r\n767E (bai3,bo2)\r\n767F (qie2)\r\n7680 (bi1)\r\n7681 (zao4)\r\n7682 (zao4)\r\n7683 (mao4)\r\n7684 (de5,di4,di2)\r\n7685 (pa1)\r\n7686 (jie1)\r\n7687 (huang2)\r\n7688 (gui1)\r\n7689 (ci3)\r\n768A (ling2)\r\n768B (gao1)\r\n768C (mo4)\r\n768D (ji4)\r\n768E (jiao3,jia3)\r\n768F (peng3)\r\n7690 (gao1)\r\n7691 (ai2)\r\n7692 (e2)\r\n7693 (hao4)\r\n7694 (han4)\r\n7695 (bi4)\r\n7696 (wan3,huan3)\r\n7697 (chou2)\r\n7698 (qian4)\r\n7699 (xi1)\r\n769A (ai2)\r\n769B (jiong3)\r\n769C (hao4)\r\n769D (huang3)\r\n769E (hao4)\r\n769F (ze2)\r\n76A0 (cui2)\r\n76A1 (hao4)\r\n76A2 (xiao3)\r\n76A3 (ye4)\r\n76A4 (po2)\r\n76A5 (hao4)\r\n76A6 (jiao3)\r\n76A7 (ai4)\r\n76A8 (xing1)\r\n76A9 (huang4)\r\n76AA (li4)\r\n76AB (piao3)\r\n76AC (he4)\r\n76AD (jiao4)\r\n76AE (pi2)\r\n76AF (gan3)\r\n76B0 (pao4)\r\n76B1 (zhou4)\r\n76B2 (jun1)\r\n76B3 (qiu2)\r\n76B4 (cun1)\r\n76B5 (que4)\r\n76B6 (zha1)\r\n76B7 (gu3)\r\n76B8 (jun1)\r\n76B9 (jun1)\r\n76BA (zhou4)\r\n76BB (zha1)\r\n76BC (gu3)\r\n76BD (zhan3)\r\n76BE (du2)\r\n76BF (min3)\r\n76C0 (qi3)\r\n76C1 (ying2)\r\n76C2 (yu2)\r\n76C3 (bei1)\r\n76C4 (zhao1)\r\n76C5 (zhong1)\r\n76C6 (pen2)\r\n76C7 (he2)\r\n76C8 (ying2)\r\n76C9 (he2)\r\n76CA (yi4)\r\n76CB (bo1)\r\n76CC (wan3)\r\n76CD (he2)\r\n76CE (ang4)\r\n76CF (zhan3)\r\n76D0 (yan2)\r\n76D1 (jian1,jian4)\r\n76D2 (he2)\r\n76D3 (yu1)\r\n76D4 (kui1)\r\n76D5 (fan4)\r\n76D6 (gai4,ge3)\r\n76D7 (dao4)\r\n76D8 (pan2)\r\n76D9 (fu3)\r\n76DA (qiu2)\r\n76DB (sheng4,cheng2)\r\n76DC (dao4)\r\n76DD (lu4)\r\n76DE (zhan3)\r\n76DF (meng2,ming2)\r\n76E0 (lu4)\r\n76E1 (jin4,jin3)\r\n76E2 (xu4)\r\n76E3 (jian1,jian4)\r\n76E4 (pan2)\r\n76E5 (guan4)\r\n76E6 (an1)\r\n76E7 (lu2)\r\n76E8 (xu3)\r\n76E9 (zhou1)\r\n76EA (dang4)\r\n76EB (an1)\r\n76EC (gu3)\r\n76ED (li4)\r\n76EE (mu4)\r\n76EF (ding1)\r\n76F0 (gan3)\r\n76F1 (xu1)\r\n76F2 (mang2)\r\n76F3 (mang2)\r\n76F4 (zhi2)\r\n76F5 (qi4)\r\n76F6 (wan3)\r\n76F7 (tian2)\r\n76F8 (xiang1,xiang4)\r\n76F9 (dun3)\r\n76FA (xin1)\r\n76FB (xi1)\r\n76FC (pan4)\r\n76FD (feng1)\r\n76FE (dun4,shun3)\r\n76FF (min2)\r\n7700 (ming2)\r\n7701 (sheng3,xing3)\r\n7702 (shi4)\r\n7703 (yun2)\r\n7704 (mian3,mian4)\r\n7705 (pan1)\r\n7706 (fang3)\r\n7707 (miao3)\r\n7708 (dan1)\r\n7709 (mei2)\r\n770A (mao4)\r\n770B (kan4,kan1)\r\n770C (xian4)\r\n770D (kou1)\r\n770E (shi4)\r\n770F (yang1)\r\n7710 (zheng1)\r\n7711 (yao3)\r\n7712 (shen1)\r\n7713 (huo4)\r\n7714 (da4)\r\n7715 (zhen3)\r\n7716 (kuang4)\r\n7717 (ju1)\r\n7718 (shen4)\r\n7719 (yi2)\r\n771A (sheng3)\r\n771B (mei4)\r\n771C (mo4)\r\n771D (zhu3)\r\n771E (zhen1)\r\n771F (zhen1)\r\n7720 (mian2)\r\n7721 (di1)\r\n7722 (yuan1)\r\n7723 (die2)\r\n7724 (yi2)\r\n7725 (zi4)\r\n7726 (zi4)\r\n7727 (chao3)\r\n7728 (zha3)\r\n7729 (xuan4)\r\n772A (bing3)\r\n772B (mi3)\r\n772C (long2)\r\n772D (sui1)\r\n772E (tong2)\r\n772F (mi1,mi2)\r\n7730 (die2)\r\n7731 (yi2)\r\n7732 (er4)\r\n7733 (ming3)\r\n7734 (xuan4)\r\n7735 (chi1)\r\n7736 (kuang4)\r\n7737 (juan4)\r\n7738 (mou2)\r\n7739 (zhen4)\r\n773A (tiao4)\r\n773B (yang2)\r\n773C (yan3)\r\n773D (mo4)\r\n773E (zhong4)\r\n773F (mai4)\r\n7740 (zhe5,zhuo2,zhao2,zhao1)\r\n7741 (zheng1)\r\n7742 (mei2)\r\n7743 (suo1)\r\n7744 (shao4)\r\n7745 (han4)\r\n7746 (huan3)\r\n7747 (di4)\r\n7748 (cheng3)\r\n7749 (cuo1)\r\n774A (juan4)\r\n774B (e2)\r\n774C (wan3)\r\n774D (xian4)\r\n774E (xi1)\r\n774F (kun4)\r\n7750 (lai4)\r\n7751 (jian3)\r\n7752 (shan3)\r\n7753 (tian3)\r\n7754 (hun3)\r\n7755 (wan3)\r\n7756 (ling2)\r\n7757 (shi4)\r\n7758 (qiong2)\r\n7759 (lie4)\r\n775A (ya2,ai2)\r\n775B (jing1)\r\n775C (zheng1)\r\n775D (li2)\r\n775E (lai4)\r\n775F (sui4)\r\n7760 (juan4)\r\n7761 (shui4)\r\n7762 (sui1)\r\n7763 (du1)\r\n7764 (pi4)\r\n7765 (pi4,bi4)\r\n7766 (mu4)\r\n7767 (hun1)\r\n7768 (ni4)\r\n7769 (lu4)\r\n776A (gao1)\r\n776B (jie2)\r\n776C (cai3)\r\n776D (zhou3)\r\n776E (yu2)\r\n776F (hun1)\r\n7770 (ma4)\r\n7771 (xia4)\r\n7772 (xing3)\r\n7773 (hui1)\r\n7774 (gun4)\r\n7775 (none0)\r\n7776 (chun3)\r\n7777 (jian1)\r\n7778 (mei4)\r\n7779 (du3)\r\n777A (hou2)\r\n777B (xuan1)\r\n777C (ti2)\r\n777D (kui2)\r\n777E (gao1)\r\n777F (rui4)\r\n7780 (mao4)\r\n7781 (xu4)\r\n7782 (fa1)\r\n7783 (wen1)\r\n7784 (miao2)\r\n7785 (chou3)\r\n7786 (kui4)\r\n7787 (mi1)\r\n7788 (weng3)\r\n7789 (kou4)\r\n778A (dang4)\r\n778B (chen1)\r\n778C (ke1)\r\n778D (sou3)\r\n778E (xia1)\r\n778F (qiong2)\r\n7790 (mao4)\r\n7791 (ming2)\r\n7792 (man2)\r\n7793 (shui4)\r\n7794 (ze2)\r\n7795 (zhang4)\r\n7796 (yi4)\r\n7797 (diao1)\r\n7798 (kou1)\r\n7799 (mo4)\r\n779A (shun4)\r\n779B (cong1)\r\n779C (lou2)\r\n779D (chi1)\r\n779E (man2)\r\n779F (piao3)\r\n77A0 (cheng1)\r\n77A1 (ji4)\r\n77A2 (meng2)\r\n77A3 (huan4)\r\n77A4 (run2)\r\n77A5 (pie1)\r\n77A6 (xi1)\r\n77A7 (qiao2,ya3)\r\n77A8 (pu1)\r\n77A9 (zhu3)\r\n77AA (deng4)\r\n77AB (shen3)\r\n77AC (shun4)\r\n77AD (liao4,liao3)\r\n77AE (che4)\r\n77AF (xian2)\r\n77B0 (kan4)\r\n77B1 (ye4)\r\n77B2 (xu4)\r\n77B3 (tong2)\r\n77B4 (wu2)\r\n77B5 (lin2)\r\n77B6 (kui4)\r\n77B7 (jian4)\r\n77B8 (ye4)\r\n77B9 (ai4)\r\n77BA (hui4)\r\n77BB (zhan1)\r\n77BC (jian3)\r\n77BD (gu3)\r\n77BE (zhao4)\r\n77BF (ju4,qu2,qu1)\r\n77C0 (wei2)\r\n77C1 (chou3)\r\n77C2 (ji4)\r\n77C3 (ning3)\r\n77C4 (xun1)\r\n77C5 (yao4)\r\n77C6 (huo4)\r\n77C7 (meng2)\r\n77C8 (mian2)\r\n77C9 (bin1,pin2)\r\n77CA (mian2)\r\n77CB (li4)\r\n77CC (guang4)\r\n77CD (jue2)\r\n77CE (xuan1)\r\n77CF (mian2)\r\n77D0 (huo4)\r\n77D1 (lu2)\r\n77D2 (meng2)\r\n77D3 (long2)\r\n77D4 (guan4)\r\n77D5 (man3)\r\n77D6 (xi3)\r\n77D7 (chu4)\r\n77D8 (tang3)\r\n77D9 (kan4)\r\n77DA (zhu3)\r\n77DB (mao2)\r\n77DC (jin1,qin2,guan1)\r\n77DD (lin2)\r\n77DE (yu4)\r\n77DF (shuo4)\r\n77E0 (ce4)\r\n77E1 (jue2)\r\n77E2 (shi3)\r\n77E3 (yi3)\r\n77E4 (shen3)\r\n77E5 (zhi1,zhi4)\r\n77E6 (hou2,hou4)\r\n77E7 (shen3)\r\n77E8 (ying3)\r\n77E9 (ju3,ju5)\r\n77EA (zhou1)\r\n77EB (jiao3,jia3,jiao2)\r\n77EC (cuo2)\r\n77ED (duan3)\r\n77EE (ai3)\r\n77EF (jiao3,jia3,jiao2)\r\n77F0 (zeng1)\r\n77F1 (huo4)\r\n77F2 (bai3,bai4,pai3)\r\n77F3 (shi2,dan4)\r\n77F4 (ding4)\r\n77F5 (qi4)\r\n77F6 (ji1)\r\n77F7 (zi3)\r\n77F8 (gan1)\r\n77F9 (wu4)\r\n77FA (tuo1)\r\n77FB (ku1)\r\n77FC (qiang1)\r\n77FD (xi1)\r\n77FE (fan2)\r\n77FF (kuang4)\r\n7800 (dang4)\r\n7801 (ma3)\r\n7802 (sha1)\r\n7803 (dan1)\r\n7804 (jue2)\r\n7805 (li4)\r\n7806 (fu1)\r\n7807 (min2)\r\n7808 (nuo3)\r\n7809 (hua1,xu1)\r\n780A (kang4)\r\n780B (zhi3)\r\n780C (qi4,qie4)\r\n780D (kan3)\r\n780E (jie4)\r\n780F (fen1)\r\n7810 (e4)\r\n7811 (ya4)\r\n7812 (pi1)\r\n7813 (zhe2)\r\n7814 (yan2,yan4)\r\n7815 (sui4)\r\n7816 (zhuan1)\r\n7817 (che1)\r\n7818 (dun4)\r\n7819 (pan1)\r\n781A (yan4)\r\n781B (none0)\r\n781C (feng1)\r\n781D (fa3)\r\n781E (mo4)\r\n781F (zha3,zuo4)\r\n7820 (qu1)\r\n7821 (yu4)\r\n7822 (ke1)\r\n7823 (tuo2)\r\n7824 (tuo2)\r\n7825 (di3)\r\n7826 (zhai4)\r\n7827 (zhen1)\r\n7828 (e4)\r\n7829 (fu2,fei4)\r\n782A (mu3)\r\n782B (zhu3)\r\n782C (la2,li4)\r\n782D (bian1)\r\n782E (nu3)\r\n782F (ping1)\r\n7830 (peng1)\r\n7831 (ling2)\r\n7832 (pao4)\r\n7833 (le4)\r\n7834 (po4)\r\n7835 (bo1)\r\n7836 (po4)\r\n7837 (shen1)\r\n7838 (za2)\r\n7839 (ai4)\r\n783A (li4)\r\n783B (long2)\r\n783C (tong2)\r\n783D (none0)\r\n783E (li4)\r\n783F (kuang4)\r\n7840 (chu3)\r\n7841 (keng1)\r\n7842 (quan2)\r\n7843 (zhu1)\r\n7844 (kuang1)\r\n7845 (gui1,huo4)\r\n7846 (e4)\r\n7847 (nao2)\r\n7848 (jia2)\r\n7849 (lu4)\r\n784A (wei3,kui4)\r\n784B (ai4)\r\n784C (luo4,ge4)\r\n784D (ken4)\r\n784E (xing2)\r\n784F (yan2)\r\n7850 (dong4,dong3)\r\n7851 (peng1)\r\n7852 (xi1)\r\n7853 (none0)\r\n7854 (hong2)\r\n7855 (shuo4)\r\n7856 (xia2)\r\n7857 (qiao1)\r\n7858 (none0)\r\n7859 (wei4)\r\n785A (qiao2)\r\n785B (none0)\r\n785C (keng1)\r\n785D (xiao1)\r\n785E (que4)\r\n785F (chan4)\r\n7860 (lang3)\r\n7861 (hong1)\r\n7862 (yu2)\r\n7863 (xiao1)\r\n7864 (xia2)\r\n7865 (mang3)\r\n7866 (long4)\r\n7867 (none0)\r\n7868 (che1)\r\n7869 (che4)\r\n786A (wo4)\r\n786B (liu2)\r\n786C (ying4)\r\n786D (mang2)\r\n786E (que4)\r\n786F (yan4)\r\n7870 (cuo3)\r\n7871 (kun3)\r\n7872 (yu4)\r\n7873 (none0)\r\n7874 (none0)\r\n7875 (lu3)\r\n7876 (chen3)\r\n7877 (jian3)\r\n7878 (none0)\r\n7879 (song1)\r\n787A (zhuo2)\r\n787B (keng1)\r\n787C (peng2)\r\n787D (yan3)\r\n787E (zhui4)\r\n787F (kong1)\r\n7880 (ceng2)\r\n7881 (qi2)\r\n7882 (zong4)\r\n7883 (qing4)\r\n7884 (lin2)\r\n7885 (jun1)\r\n7886 (bo1)\r\n7887 (ding4)\r\n7888 (min2)\r\n7889 (diao1)\r\n788A (jian1)\r\n788B (he4)\r\n788C (liu4,lu4)\r\n788D (ai4)\r\n788E (sui4)\r\n788F (que4)\r\n7890 (ling2)\r\n7891 (bei1)\r\n7892 (yin2)\r\n7893 (dui4)\r\n7894 (wu3)\r\n7895 (qi2)\r\n7896 (lun2)\r\n7897 (wan3)\r\n7898 (dian3)\r\n7899 (gang1)\r\n789A (bei4)\r\n789B (qi4)\r\n789C (chen3)\r\n789D (ruan3)\r\n789E (yan2)\r\n789F (die2)\r\n78A0 (ding4)\r\n78A1 (zhou5,zhou2)\r\n78A2 (tuo2)\r\n78A3 (jie2)\r\n78A4 (ying1)\r\n78A5 (bian3)\r\n78A6 (ke4)\r\n78A7 (bi4)\r\n78A8 (wei1)\r\n78A9 (shuo4,shi2)\r\n78AA (zhen1)\r\n78AB (duan4)\r\n78AC (xia2)\r\n78AD (dang4)\r\n78AE (ti2)\r\n78AF (nao3)\r\n78B0 (peng4)\r\n78B1 (jian3)\r\n78B2 (di4)\r\n78B3 (tan4)\r\n78B4 (cha2,cha1)\r\n78B5 (none0)\r\n78B6 (qi4)\r\n78B7 (none0)\r\n78B8 (feng1)\r\n78B9 (xuan4)\r\n78BA (que4)\r\n78BB (que4)\r\n78BC (ma3)\r\n78BD (gong1)\r\n78BE (nian3)\r\n78BF (su4)\r\n78C0 (e2)\r\n78C1 (ci2)\r\n78C2 (liu4)\r\n78C3 (si1)\r\n78C4 (tang2)\r\n78C5 (bang4,pang2,pang1)\r\n78C6 (hua2)\r\n78C7 (pi1)\r\n78C8 (wei3)\r\n78C9 (sang3)\r\n78CA (lei3)\r\n78CB (cuo1)\r\n78CC (tian2)\r\n78CD (xia2)\r\n78CE (xi1)\r\n78CF (lian2)\r\n78D0 (pan2)\r\n78D1 (wei4)\r\n78D2 (yun3)\r\n78D3 (dui1)\r\n78D4 (zhe2)\r\n78D5 (ke1)\r\n78D6 (la2)\r\n78D7 (none0)\r\n78D8 (qing4)\r\n78D9 (gun3)\r\n78DA (zhuan1)\r\n78DB (chan2)\r\n78DC (qi4)\r\n78DD (ao2)\r\n78DE (peng1)\r\n78DF (lu4)\r\n78E0 (lu3)\r\n78E1 (kan4)\r\n78E2 (qiang3)\r\n78E3 (chen3)\r\n78E4 (yin3)\r\n78E5 (lei3)\r\n78E6 (biao1)\r\n78E7 (qi4)\r\n78E8 (mo2,mo4)\r\n78E9 (qi1)\r\n78EA (cui1)\r\n78EB (zong1)\r\n78EC (qing4)\r\n78ED (chuo4)\r\n78EE (none0)\r\n78EF (ji1)\r\n78F0 (shan4)\r\n78F1 (lao2)\r\n78F2 (qu2)\r\n78F3 (zeng1)\r\n78F4 (deng4)\r\n78F5 (jian4)\r\n78F6 (xi4)\r\n78F7 (lin2)\r\n78F8 (ding4)\r\n78F9 (dian4)\r\n78FA (huang2)\r\n78FB (pan2)\r\n78FC (za2)\r\n78FD (qiao1)\r\n78FE (di1)\r\n78FF (li4)\r\n7900 (jian4)\r\n7901 (jiao1)\r\n7902 (xi1)\r\n7903 (zhang3)\r\n7904 (qiao2)\r\n7905 (dun1)\r\n7906 (jian3)\r\n7907 (yu4)\r\n7908 (zhui4)\r\n7909 (he2)\r\n790A (huo4)\r\n790B (zhai2)\r\n790C (lei2)\r\n790D (ke3)\r\n790E (chu3)\r\n790F (ji2)\r\n7910 (que4)\r\n7911 (dang4)\r\n7912 (wo4,yi3)\r\n7913 (jiang1)\r\n7914 (pi4)\r\n7915 (pi1)\r\n7916 (yu4)\r\n7917 (pin1)\r\n7918 (qi4)\r\n7919 (ai4)\r\n791A (ke1)\r\n791B (jian1)\r\n791C (yu4)\r\n791D (ruan3)\r\n791E (meng2)\r\n791F (pao4)\r\n7920 (zi1)\r\n7921 (bo2)\r\n7922 (none0)\r\n7923 (mie4)\r\n7924 (ca3)\r\n7925 (xian2)\r\n7926 (kuang4,gong3)\r\n7927 (lei3)\r\n7928 (lei3)\r\n7929 (zhi4)\r\n792A (li4)\r\n792B (li4)\r\n792C (fan2)\r\n792D (que4)\r\n792E (pao4)\r\n792F (ying1)\r\n7930 (li4)\r\n7931 (long2)\r\n7932 (long2)\r\n7933 (mo4)\r\n7934 (bo2)\r\n7935 (shuang1)\r\n7936 (guan4)\r\n7937 (lan2)\r\n7938 (zan3)\r\n7939 (yan2)\r\n793A (shi4)\r\n793B (shi4)\r\n793C (li3)\r\n793D (reng2)\r\n793E (she4)\r\n793F (yue4)\r\n7940 (si4)\r\n7941 (qi2)\r\n7942 (ta1)\r\n7943 (ma4)\r\n7944 (xie4)\r\n7945 (yao1)\r\n7946 (xian1)\r\n7947 (zhi3,qi2,zhi1)\r\n7948 (qi2)\r\n7949 (zhi3)\r\n794A (beng1)\r\n794B (shu1)\r\n794C (chong1)\r\n794D (none0)\r\n794E (yi1)\r\n794F (shi2)\r\n7950 (you4)\r\n7951 (zhi4)\r\n7952 (tiao2)\r\n7953 (fu2)\r\n7954 (fu4)\r\n7955 (mi4)\r\n7956 (zu3)\r\n7957 (zhi1)\r\n7958 (suan4)\r\n7959 (mei4)\r\n795A (zuo4)\r\n795B (qu1)\r\n795C (hu4)\r\n795D (zhu4)\r\n795E (shen2)\r\n795F (sui4)\r\n7960 (ci2)\r\n7961 (chai2)\r\n7962 (mi2,ni3)\r\n7963 (lu:3)\r\n7964 (yu3)\r\n7965 (xiang2)\r\n7966 (wu2)\r\n7967 (tiao1)\r\n7968 (piao4)\r\n7969 (zhu1)\r\n796A (gui3)\r\n796B (xia2)\r\n796C (zhi1)\r\n796D (ji4,zhai4)\r\n796E (gao4)\r\n796F (zhen1)\r\n7970 (gao4)\r\n7971 (shui4)\r\n7972 (jin4)\r\n7973 (zhen3)\r\n7974 (gai1,jie4)\r\n7975 (kun3)\r\n7976 (di4)\r\n7977 (dao3)\r\n7978 (huo4)\r\n7979 (tao2)\r\n797A (qi2)\r\n797B (gu4)\r\n797C (guan4)\r\n797D (zui4)\r\n797E (ling2)\r\n797F (lu4)\r\n7980 (bing3)\r\n7981 (jin4,jin1)\r\n7982 (dao3)\r\n7983 (zhi2)\r\n7984 (lu4)\r\n7985 (shan4,chan2)\r\n7986 (bei1)\r\n7987 (zhe3)\r\n7988 (hui1)\r\n7989 (you3)\r\n798A (xi4)\r\n798B (yin1)\r\n798C (zi1)\r\n798D (huo4)\r\n798E (zhen1)\r\n798F (fu2)\r\n7990 (yuan4)\r\n7991 (wu2)\r\n7992 (xian3)\r\n7993 (yang2)\r\n7994 (ti2)\r\n7995 (yi1)\r\n7996 (mei2)\r\n7997 (si1)\r\n7998 (di4)\r\n7999 (none0)\r\n799A (zhuo2)\r\n799B (zhen1)\r\n799C (yong3)\r\n799D (ji4)\r\n799E (gao4)\r\n799F (tang2)\r\n79A0 (chi3)\r\n79A1 (ma4)\r\n79A2 (ta1)\r\n79A3 (none0)\r\n79A4 (xuan1)\r\n79A5 (qi2)\r\n79A6 (yu4)\r\n79A7 (xi3)\r\n79A8 (ji1)\r\n79A9 (si4)\r\n79AA (chan2,shan4)\r\n79AB (xuan1)\r\n79AC (hui4)\r\n79AD (sui4)\r\n79AE (li3)\r\n79AF (nong2)\r\n79B0 (ni3,mi2)\r\n79B1 (dao3)\r\n79B2 (li4)\r\n79B3 (rang2,rang3)\r\n79B4 (yue4)\r\n79B5 (ti2)\r\n79B6 (zan3)\r\n79B7 (lei4)\r\n79B8 (rou2)\r\n79B9 (yu3)\r\n79BA (yu2,yu4)\r\n79BB (li2)\r\n79BC (xie4)\r\n79BD (qin2)\r\n79BE (he2)\r\n79BF (tu1)\r\n79C0 (xiu4)\r\n79C1 (si1)\r\n79C2 (ren2)\r\n79C3 (tu1)\r\n79C4 (zi3)\r\n79C5 (cha2)\r\n79C6 (gan3)\r\n79C7 (yi4)\r\n79C8 (xian1)\r\n79C9 (bing3)\r\n79CA (nian2)\r\n79CB (qiu1)\r\n79CC (qiu1)\r\n79CD (zhong3,chong2,zhong4)\r\n79CE (fen4)\r\n79CF (hao4)\r\n79D0 (yun2)\r\n79D1 (ke1)\r\n79D2 (miao3)\r\n79D3 (zhi1)\r\n79D4 (jing1)\r\n79D5 (bi3)\r\n79D6 (zhi1)\r\n79D7 (yu4)\r\n79D8 (mi4,bi4,lin2)\r\n79D9 (ku4)\r\n79DA (ban4)\r\n79DB (pi1)\r\n79DC (ni2)\r\n79DD (li4)\r\n79DE (you2)\r\n79DF (zu1)\r\n79E0 (pi1)\r\n79E1 (ba2)\r\n79E2 (ling2)\r\n79E3 (mo4)\r\n79E4 (cheng4,chen4,cheng1)\r\n79E5 (nian2)\r\n79E6 (qin2)\r\n79E7 (yang1)\r\n79E8 (zuo2)\r\n79E9 (zhi4)\r\n79EA (zhi1)\r\n79EB (shu2)\r\n79EC (ju4)\r\n79ED (zi3)\r\n79EE (tai2)\r\n79EF (ji1)\r\n79F0 (cheng1,chen4,cheng4)\r\n79F1 (tong2)\r\n79F2 (zhi4)\r\n79F3 (huo2)\r\n79F4 (he2)\r\n79F5 (yin1)\r\n79F6 (zi1)\r\n79F7 (zhi2)\r\n79F8 (jie1)\r\n79F9 (ren3)\r\n79FA (du4)\r\n79FB (yi2)\r\n79FC (zhu4)\r\n79FD (hui4)\r\n79FE (nong2)\r\n79FF (fu3)\r\n7A00 (xi1)\r\n7A01 (kao3)\r\n7A02 (lang2)\r\n7A03 (fu1,fu2)\r\n7A04 (ze4)\r\n7A05 (shui4)\r\n7A06 (lu:3)\r\n7A07 (kun3)\r\n7A08 (gan3)\r\n7A09 (jing1)\r\n7A0A (ti2)\r\n7A0B (cheng2)\r\n7A0C (tu2)\r\n7A0D (shao1,shao4)\r\n7A0E (shui4)\r\n7A0F (ya4)\r\n7A10 (lun3)\r\n7A11 (lu4)\r\n7A12 (gu4)\r\n7A13 (zuo2)\r\n7A14 (ren3)\r\n7A15 (zhun4)\r\n7A16 (bang4)\r\n7A17 (bai4,bi4)\r\n7A18 (ji1,qi2)\r\n7A19 (zhi2)\r\n7A1A (zhi4)\r\n7A1B (kun3)\r\n7A1C (leng2)\r\n7A1D (peng2)\r\n7A1E (ke1)\r\n7A1F (bing3)\r\n7A20 (chou2)\r\n7A21 (zui4)\r\n7A22 (yu4)\r\n7A23 (su1)\r\n7A24 (none0)\r\n7A25 (none0)\r\n7A26 (yi1)\r\n7A27 (xi4)\r\n7A28 (bian1)\r\n7A29 (ji4)\r\n7A2A (fu4)\r\n7A2B (bi1)\r\n7A2C (nuo4)\r\n7A2D (jie1)\r\n7A2E (zhong3,chong2,zhong4)\r\n7A2F (zong1)\r\n7A30 (xu1)\r\n7A31 (cheng1,chen4,cheng4)\r\n7A32 (dao4)\r\n7A33 (wen3)\r\n7A34 (lian2)\r\n7A35 (zi1)\r\n7A36 (yu4)\r\n7A37 (ji4)\r\n7A38 (xu4)\r\n7A39 (zhen3)\r\n7A3A (zhi4)\r\n7A3B (dao4)\r\n7A3C (jia4)\r\n7A3D (ji1,qi3)\r\n7A3E (gao3)\r\n7A3F (gao3)\r\n7A40 (gu3)\r\n7A41 (rong2)\r\n7A42 (sui4)\r\n7A43 (none0)\r\n7A44 (ji4)\r\n7A45 (kang1)\r\n7A46 (mu4)\r\n7A47 (shan1)\r\n7A48 (men2)\r\n7A49 (zhi4)\r\n7A4A (ji4)\r\n7A4B (lu4)\r\n7A4C (su1,wei4)\r\n7A4D (ji1)\r\n7A4E (ying3)\r\n7A4F (wen3)\r\n7A50 (qiu1)\r\n7A51 (se4)\r\n7A52 (none0)\r\n7A53 (yi4)\r\n7A54 (huang2)\r\n7A55 (qie4)\r\n7A56 (ji3)\r\n7A57 (sui4)\r\n7A58 (xiao1)\r\n7A59 (pu2)\r\n7A5A (jiao1)\r\n7A5B (zhuo1)\r\n7A5C (tong2)\r\n7A5D (none0)\r\n7A5E (lu:3)\r\n7A5F (sui4)\r\n7A60 (nong2)\r\n7A61 (se4)\r\n7A62 (hui4)\r\n7A63 (rang2)\r\n7A64 (nuo4)\r\n7A65 (yu4)\r\n7A66 (none0)\r\n7A67 (ji4)\r\n7A68 (tui2)\r\n7A69 (wen3)\r\n7A6A (cheng1,chen4,cheng4)\r\n7A6B (huo4)\r\n7A6C (gong3)\r\n7A6D (lu:3)\r\n7A6E (biao1)\r\n7A6F (none0)\r\n7A70 (rang2)\r\n7A71 (jue2)\r\n7A72 (li2)\r\n7A73 (zan4)\r\n7A74 (xue2,xue4)\r\n7A75 (wa1)\r\n7A76 (jiu1,jiu4)\r\n7A77 (qiong2)\r\n7A78 (xi1)\r\n7A79 (qiong2,qiong1)\r\n7A7A (kong1,kong4)\r\n7A7B (yu1)\r\n7A7C (sen1)\r\n7A7D (jing3)\r\n7A7E (yao4)\r\n7A7F (chuan1)\r\n7A80 (zhun1)\r\n7A81 (tu1,tu2)\r\n7A82 (lao2)\r\n7A83 (qie4)\r\n7A84 (zhai3,ze2)\r\n7A85 (yao3)\r\n7A86 (bian3)\r\n7A87 (bao2)\r\n7A88 (yao3)\r\n7A89 (bing3)\r\n7A8A (yu3)\r\n7A8B (zhu2)\r\n7A8C (jiao4)\r\n7A8D (qiao4)\r\n7A8E (diao4)\r\n7A8F (wu1)\r\n7A90 (gui1)\r\n7A91 (yao2)\r\n7A92 (zhi4)\r\n7A93 (chuan1)\r\n7A94 (yao3)\r\n7A95 (tiao3)\r\n7A96 (jiao4)\r\n7A97 (chuang1)\r\n7A98 (jiong3,jun3)\r\n7A99 (xiao1)\r\n7A9A (cheng2)\r\n7A9B (kou4)\r\n7A9C (cuan4)\r\n7A9D (wo1)\r\n7A9E (dan4)\r\n7A9F (ku1)\r\n7AA0 (ke1)\r\n7AA1 (zhui4)\r\n7AA2 (xu4)\r\n7AA3 (su1)\r\n7AA4 (none0)\r\n7AA5 (kui1)\r\n7AA6 (dou4)\r\n7AA7 (none0)\r\n7AA8 (yin4,xun1)\r\n7AA9 (wo1)\r\n7AAA (wa1)\r\n7AAB (ya4)\r\n7AAC (yu2)\r\n7AAD (ju4)\r\n7AAE (qiong2)\r\n7AAF (yao2)\r\n7AB0 (yao2)\r\n7AB1 (tiao4)\r\n7AB2 (liao4)\r\n7AB3 (yu3)\r\n7AB4 (tian2)\r\n7AB5 (diao4)\r\n7AB6 (ju4)\r\n7AB7 (liao2)\r\n7AB8 (xi1)\r\n7AB9 (wu4)\r\n7ABA (kui1)\r\n7ABB (chuang1)\r\n7ABC (ju3)\r\n7ABD (none0)\r\n7ABE (kuan3)\r\n7ABF (long2)\r\n7AC0 (cheng1)\r\n7AC1 (cui4)\r\n7AC2 (piao2)\r\n7AC3 (zao4)\r\n7AC4 (cuan4)\r\n7AC5 (qiao4)\r\n7AC6 (qiong2)\r\n7AC7 (dou4)\r\n7AC8 (zao4)\r\n7AC9 (zao4)\r\n7ACA (qie4)\r\n7ACB (li4)\r\n7ACC (chu4)\r\n7ACD (shi2,gong1,sheng1)\r\n7ACE (fu4)\r\n7ACF (qian1,gong1,sheng1)\r\n7AD0 (chu4)\r\n7AD1 (hong2)\r\n7AD2 (qi2,ji1)\r\n7AD3 (qian1,fen1,zhi1,yi1,gong1,sheng1)\r\n7AD4 (gong1,sheng1)\r\n7AD5 (shi2,fen1,zhi1,yi1,gong1,sheng1)\r\n7AD6 (shu4)\r\n7AD7 (miao4)\r\n7AD8 (ju3)\r\n7AD9 (zhan4)\r\n7ADA (zhu4)\r\n7ADB (ling2)\r\n7ADC (long2)\r\n7ADD (bing4,bing1)\r\n7ADE (jing4)\r\n7ADF (jing4)\r\n7AE0 (zhang1)\r\n7AE1 (yi1,gong1,sheng1,bai3,bei4,si4)\r\n7AE2 (si4,qi2)\r\n7AE3 (jun4)\r\n7AE4 (hong2)\r\n7AE5 (tong2)\r\n7AE6 (song3)\r\n7AE7 (jing4)\r\n7AE8 (diao4)\r\n7AE9 (yi4)\r\n7AEA (shu4)\r\n7AEB (jing4)\r\n7AEC (qu3)\r\n7AED (jie2)\r\n7AEE (ping2)\r\n7AEF (duan1)\r\n7AF0 (shao2)\r\n7AF1 (zhuan3)\r\n7AF2 (ceng2)\r\n7AF3 (deng1)\r\n7AF4 (cun1)\r\n7AF5 (huai1)\r\n7AF6 (jing4)\r\n7AF7 (kan4)\r\n7AF8 (jing4)\r\n7AF9 (zhu2)\r\n7AFA (zhu2)\r\n7AFB (le4)\r\n7AFC (peng2)\r\n7AFD (yu2)\r\n7AFE (chi2)\r\n7AFF (gan1)\r\n7B00 (mang2)\r\n7B01 (zhu2)\r\n7B02 (none0)\r\n7B03 (du3)\r\n7B04 (ji1)\r\n7B05 (xiao2)\r\n7B06 (ba1)\r\n7B07 (suan4)\r\n7B08 (ji2)\r\n7B09 (zhen3)\r\n7B0A (zhao4)\r\n7B0B (sun3)\r\n7B0C (ya2)\r\n7B0D (zhui4)\r\n7B0E (yuan2)\r\n7B0F (hu4)\r\n7B10 (gang1)\r\n7B11 (xiao4)\r\n7B12 (cen2)\r\n7B13 (pi2)\r\n7B14 (bi3)\r\n7B15 (jian3)\r\n7B16 (yi3)\r\n7B17 (dong1)\r\n7B18 (shan1)\r\n7B19 (sheng1)\r\n7B1A (xia2)\r\n7B1B (di2)\r\n7B1C (zhu2)\r\n7B1D (na4)\r\n7B1E (chi1)\r\n7B1F (gu1)\r\n7B20 (li4)\r\n7B21 (qie4)\r\n7B22 (min3)\r\n7B23 (bao1)\r\n7B24 (tiao2)\r\n7B25 (si4)\r\n7B26 (fu2)\r\n7B27 (ce4)\r\n7B28 (ben4)\r\n7B29 (fa2)\r\n7B2A (da2)\r\n7B2B (zi3)\r\n7B2C (di4)\r\n7B2D (ling2)\r\n7B2E (ze2,zuo2)\r\n7B2F (nu2)\r\n7B30 (fu2)\r\n7B31 (gou3)\r\n7B32 (fan2)\r\n7B33 (jia1)\r\n7B34 (ge3)\r\n7B35 (fan4)\r\n7B36 (shi3)\r\n7B37 (mao3)\r\n7B38 (po3)\r\n7B39 (none0)\r\n7B3A (jian1)\r\n7B3B (qiong2)\r\n7B3C (long3,long2)\r\n7B3D (none0)\r\n7B3E (bian1)\r\n7B3F (luo4)\r\n7B40 (gui4)\r\n7B41 (qu3,qu1)\r\n7B42 (chi2)\r\n7B43 (yin1)\r\n7B44 (yao4)\r\n7B45 (xian3)\r\n7B46 (bi3)\r\n7B47 (qiong2)\r\n7B48 (gua1)\r\n7B49 (deng3)\r\n7B4A (jiao3)\r\n7B4B (jin1)\r\n7B4C (quan2)\r\n7B4D (sun3)\r\n7B4E (ru2)\r\n7B4F (fa2)\r\n7B50 (kuang1)\r\n7B51 (zhu4,zhu2)\r\n7B52 (tong3)\r\n7B53 (ji1)\r\n7B54 (da2,da1)\r\n7B55 (hang2)\r\n7B56 (ce4)\r\n7B57 (zhong4)\r\n7B58 (kou4)\r\n7B59 (lai2)\r\n7B5A (bi4)\r\n7B5B (shai1)\r\n7B5C (dang1)\r\n7B5D (zheng1)\r\n7B5E (ce4)\r\n7B5F (fu1)\r\n7B60 (yun2,jun1)\r\n7B61 (tu2)\r\n7B62 (pa2)\r\n7B63 (li4)\r\n7B64 (lang2)\r\n7B65 (ju3)\r\n7B66 (guan3)\r\n7B67 (jian3)\r\n7B68 (han2)\r\n7B69 (tong3)\r\n7B6A (xia2)\r\n7B6B (zhi4)\r\n7B6C (cheng2)\r\n7B6D (suan4)\r\n7B6E (shi4)\r\n7B6F (zhu4)\r\n7B70 (zuo2)\r\n7B71 (xiao3)\r\n7B72 (shao1)\r\n7B73 (ting2)\r\n7B74 (jia2,ce4)\r\n7B75 (yan2)\r\n7B76 (gao3)\r\n7B77 (kuai4)\r\n7B78 (gan1)\r\n7B79 (chou2)\r\n7B7A (kuang1)\r\n7B7B (gang4)\r\n7B7C (yun2)\r\n7B7D (none0)\r\n7B7E (qian1)\r\n7B7F (xiao3)\r\n7B80 (jian3)\r\n7B81 (pu2)\r\n7B82 (lai2)\r\n7B83 (zou1)\r\n7B84 (bi4)\r\n7B85 (bi4)\r\n7B86 (bi4)\r\n7B87 (ge4)\r\n7B88 (chi2)\r\n7B89 (guai3)\r\n7B8A (yu1)\r\n7B8B (jian1)\r\n7B8C (zhao4)\r\n7B8D (gu1)\r\n7B8E (chi2)\r\n7B8F (zheng1)\r\n7B90 (qing4)\r\n7B91 (sha4)\r\n7B92 (zhou3)\r\n7B93 (lu4)\r\n7B94 (bo2)\r\n7B95 (ji1,ji5)\r\n7B96 (lin2)\r\n7B97 (suan4)\r\n7B98 (jun4)\r\n7B99 (fu1)\r\n7B9A (zha2)\r\n7B9B (gu1)\r\n7B9C (kong1)\r\n7B9D (qian2)\r\n7B9E (qian1)\r\n7B9F (jun4,jun1)\r\n7BA0 (chui2)\r\n7BA1 (guan3)\r\n7BA2 (yuan1)\r\n7BA3 (ce4)\r\n7BA4 (ju2)\r\n7BA5 (bo3)\r\n7BA6 (ze2)\r\n7BA7 (qie4)\r\n7BA8 (tuo4)\r\n7BA9 (luo2)\r\n7BAA (dan1)\r\n7BAB (xiao1)\r\n7BAC (ruo4)\r\n7BAD (jian4)\r\n7BAE (none0)\r\n7BAF (bian1)\r\n7BB0 (sun3)\r\n7BB1 (xiang1)\r\n7BB2 (xian3)\r\n7BB3 (ping2)\r\n7BB4 (zhen1)\r\n7BB5 (sheng3)\r\n7BB6 (hu2)\r\n7BB7 (shi1,yi2)\r\n7BB8 (zhu4)\r\n7BB9 (yue1)\r\n7BBA (chun1)\r\n7BBB (fu1)\r\n7BBC (wu1)\r\n7BBD (dong3)\r\n7BBE (shuo4)\r\n7BBF (ji2)\r\n7BC0 (jie2,jie1)\r\n7BC1 (huang2)\r\n7BC2 (xing1)\r\n7BC3 (mei2)\r\n7BC4 (fan4)\r\n7BC5 (chuan2)\r\n7BC6 (zhuan4)\r\n7BC7 (pian1)\r\n7BC8 (feng1)\r\n7BC9 (zhu2,zhu4)\r\n7BCA (hong2)\r\n7BCB (qie4)\r\n7BCC (hou2)\r\n7BCD (qiu1)\r\n7BCE (miao3)\r\n7BCF (qian4)\r\n7BD0 (none0)\r\n7BD1 (kui4)\r\n7BD2 (none0)\r\n7BD3 (lou3)\r\n7BD4 (yun2)\r\n7BD5 (he2)\r\n7BD6 (tang2)\r\n7BD7 (yue4)\r\n7BD8 (chou1)\r\n7BD9 (gao1)\r\n7BDA (fei3)\r\n7BDB (ruo4)\r\n7BDC (zheng1)\r\n7BDD (gou1)\r\n7BDE (nie4)\r\n7BDF (qian4)\r\n7BE0 (xiao3)\r\n7BE1 (cuan4)\r\n7BE2 (gong1)\r\n7BE3 (pang2)\r\n7BE4 (du3)\r\n7BE5 (li4)\r\n7BE6 (bi4)\r\n7BE7 (zhuo2)\r\n7BE8 (chu2)\r\n7BE9 (shai1)\r\n7BEA (chi2)\r\n7BEB (zhu2)\r\n7BEC (qiang1)\r\n7BED (long2,long3)\r\n7BEE (lan2)\r\n7BEF (jian1)\r\n7BF0 (bu4)\r\n7BF1 (li2)\r\n7BF2 (hui4)\r\n7BF3 (bi4)\r\n7BF4 (di2)\r\n7BF5 (cong1)\r\n7BF6 (yan1)\r\n7BF7 (peng2)\r\n7BF8 (sen1)\r\n7BF9 (cuan4)\r\n7BFA (pai2)\r\n7BFB (piao4)\r\n7BFC (dou1)\r\n7BFD (yu3)\r\n7BFE (mie4)\r\n7BFF (zhuan1)\r\n7C00 (ze2,kui4)\r\n7C01 (xi3)\r\n7C02 (guo2)\r\n7C03 (yi2)\r\n7C04 (hu4)\r\n7C05 (chan3)\r\n7C06 (kou4)\r\n7C07 (cu4)\r\n7C08 (ping2)\r\n7C09 (zao4)\r\n7C0A (ji1)\r\n7C0B (gui3)\r\n7C0C (su4)\r\n7C0D (lou3)\r\n7C0E (zha4)\r\n7C0F (lu4)\r\n7C10 (nian3)\r\n7C11 (suo1)\r\n7C12 (cuan4)\r\n7C13 (none0)\r\n7C14 (suo1)\r\n7C15 (le4)\r\n7C16 (duan4)\r\n7C17 (liang2)\r\n7C18 (xiao1)\r\n7C19 (bo2)\r\n7C1A (mi4)\r\n7C1B (shai1)\r\n7C1C (dang4)\r\n7C1D (liao2)\r\n7C1E (dan1)\r\n7C1F (dian4)\r\n7C20 (fu3)\r\n7C21 (jian3)\r\n7C22 (min3)\r\n7C23 (kui4)\r\n7C24 (dai4)\r\n7C25 (qiao2)\r\n7C26 (deng1)\r\n7C27 (huang2)\r\n7C28 (sun3)\r\n7C29 (lao2)\r\n7C2A (zan1)\r\n7C2B (xiao1)\r\n7C2C (lu4)\r\n7C2D (shi4)\r\n7C2E (zan1)\r\n7C2F (none0)\r\n7C30 (pai2)\r\n7C31 (qi2)\r\n7C32 (pai2)\r\n7C33 (gan4)\r\n7C34 (ju4)\r\n7C35 (du4)\r\n7C36 (lu4)\r\n7C37 (yan2)\r\n7C38 (bo4,bo3)\r\n7C39 (dang1)\r\n7C3A (sai4)\r\n7C3B (ke1)\r\n7C3C (gou4)\r\n7C3D (qian1)\r\n7C3E (lian2)\r\n7C3F (bu4)\r\n7C40 (zhou4)\r\n7C41 (lai4)\r\n7C42 (none0)\r\n7C43 (lan2)\r\n7C44 (kui4)\r\n7C45 (yu2)\r\n7C46 (yue4)\r\n7C47 (hao2)\r\n7C48 (zhen1)\r\n7C49 (tai2)\r\n7C4A (ti4)\r\n7C4B (mi2)\r\n7C4C (chou2)\r\n7C4D (ji2)\r\n7C4E (none0)\r\n7C4F (qi2)\r\n7C50 (teng2)\r\n7C51 (zhuan4)\r\n7C52 (zhou4)\r\n7C53 (fan1)\r\n7C54 (sou3)\r\n7C55 (zhou4)\r\n7C56 (qian1)\r\n7C57 (kuo4)\r\n7C58 (teng2)\r\n7C59 (lu4)\r\n7C5A (lu2)\r\n7C5B (jian1)\r\n7C5C (tuo4)\r\n7C5D (ying2)\r\n7C5E (yu4)\r\n7C5F (lai4)\r\n7C60 (long2,long3)\r\n7C61 (none0)\r\n7C62 (lian2)\r\n7C63 (lan2)\r\n7C64 (qian1)\r\n7C65 (yue4)\r\n7C66 (zhong1)\r\n7C67 (qu2)\r\n7C68 (lian2)\r\n7C69 (bian1)\r\n7C6A (duan4)\r\n7C6B (zuan3)\r\n7C6C (li2)\r\n7C6D (shai1)\r\n7C6E (luo2)\r\n7C6F (ying2)\r\n7C70 (yue4)\r\n7C71 (zhuo2)\r\n7C72 (xu1,yu1,yu4)\r\n7C73 (mi3)\r\n7C74 (di2)\r\n7C75 (fan2)\r\n7C76 (shen1)\r\n7C77 (zhe2)\r\n7C78 (shen1)\r\n7C79 (nu:3)\r\n7C7A (xie2)\r\n7C7B (lei4)\r\n7C7C (xian1)\r\n7C7D (zi3)\r\n7C7E (ni2)\r\n7C7F (cun4)\r\n7C80 (zhang4)\r\n7C81 (qian1)\r\n7C82 (none0)\r\n7C83 (bi3)\r\n7C84 (ban3)\r\n7C85 (wu4)\r\n7C86 (sha1)\r\n7C87 (kang1)\r\n7C88 (rou3)\r\n7C89 (fen3)\r\n7C8A (bi4)\r\n7C8B (cui4,sui4)\r\n7C8C (yin3)\r\n7C8D (li2)\r\n7C8E (chi3)\r\n7C8F (tai4)\r\n7C90 (none0)\r\n7C91 (ba1)\r\n7C92 (li4)\r\n7C93 (gan1)\r\n7C94 (ju4)\r\n7C95 (po4)\r\n7C96 (mo4)\r\n7C97 (cu1)\r\n7C98 (zhan1,nian2)\r\n7C99 (zhou4)\r\n7C9A (li2)\r\n7C9B (su4)\r\n7C9C (tiao4)\r\n7C9D (li4)\r\n7C9E (xi1)\r\n7C9F (su4)\r\n7CA0 (hong2)\r\n7CA1 (tong2)\r\n7CA2 (zi1,ci2)\r\n7CA3 (ce4)\r\n7CA4 (yue4)\r\n7CA5 (zhou1,yu4)\r\n7CA6 (lin2)\r\n7CA7 (zhuang1)\r\n7CA8 (bai3)\r\n7CA9 (none0)\r\n7CAA (fen4)\r\n7CAB (mian4)\r\n7CAC (qu1)\r\n7CAD (none0)\r\n7CAE (liang2)\r\n7CAF (xian4)\r\n7CB0 (fu1)\r\n7CB1 (liang2)\r\n7CB2 (can4)\r\n7CB3 (jing1,geng1)\r\n7CB4 (li3)\r\n7CB5 (yue4)\r\n7CB6 (lu4)\r\n7CB7 (ju2)\r\n7CB8 (qi2)\r\n7CB9 (cui4)\r\n7CBA (bai4)\r\n7CBB (chang2)\r\n7CBC (lin2)\r\n7CBD (zong4)\r\n7CBE (jing1)\r\n7CBF (guo3)\r\n7CC0 (none0)\r\n7CC1 (san3,shen1)\r\n7CC2 (san3,shen1)\r\n7CC3 (tang2)\r\n7CC4 (bian3)\r\n7CC5 (rou2,rou3)\r\n7CC6 (mian4)\r\n7CC7 (hou2)\r\n7CC8 (xu3)\r\n7CC9 (zong4)\r\n7CCA (hu2,hu1,hu4)\r\n7CCB (jian4)\r\n7CCC (zan1)\r\n7CCD (ci2)\r\n7CCE (li2)\r\n7CCF (xie4)\r\n7CD0 (fu1)\r\n7CD1 (nuo4)\r\n7CD2 (bei4)\r\n7CD3 (gu3,yu4)\r\n7CD4 (xiu3)\r\n7CD5 (gao1)\r\n7CD6 (tang2)\r\n7CD7 (qiu3)\r\n7CD8 (none0)\r\n7CD9 (cao1)\r\n7CDA (zhuang1)\r\n7CDB (tang2)\r\n7CDC (mi2,mei2)\r\n7CDD (san3,shen1)\r\n7CDE (fen4)\r\n7CDF (zao1)\r\n7CE0 (kang1)\r\n7CE1 (jiang4)\r\n7CE2 (mo2)\r\n7CE3 (san3)\r\n7CE4 (san3)\r\n7CE5 (nuo4)\r\n7CE6 (chi4)\r\n7CE7 (liang2)\r\n7CE8 (jiang4)\r\n7CE9 (kuai1)\r\n7CEA (bo2)\r\n7CEB (huan2)\r\n7CEC (shu3)\r\n7CED (zong4)\r\n7CEE (jian4)\r\n7CEF (nuo4)\r\n7CF0 (tuan2)\r\n7CF1 (nie4)\r\n7CF2 (li4)\r\n7CF3 (zuo4)\r\n7CF4 (di2)\r\n7CF5 (nie4)\r\n7CF6 (tiao4)\r\n7CF7 (lan2)\r\n7CF8 (mi4)\r\n7CF9 (mi4)\r\n7CFA (jiu1)\r\n7CFB (xi4,ji4)\r\n7CFC (gong1)\r\n7CFD (zheng3)\r\n7CFE (jiu1,jiu3)\r\n7CFF (you4)\r\n7D00 (ji4)\r\n7D01 (cha4)\r\n7D02 (zhou4)\r\n7D03 (xun2)\r\n7D04 (yue1,yao1)\r\n7D05 (hong2,gong1)\r\n7D06 (yu1)\r\n7D07 (he2,ge1)\r\n7D08 (wan2)\r\n7D09 (ren4)\r\n7D0A (wen3,wen4)\r\n7D0B (wen2,wen4)\r\n7D0C (qiu2)\r\n7D0D (na4)\r\n7D0E (zi1)\r\n7D0F (tou3)\r\n7D10 (niu3)\r\n7D11 (fou2)\r\n7D12 (jie4)\r\n7D13 (shu1)\r\n7D14 (chun2)\r\n7D15 (pi2,pi1)\r\n7D16 (yin3)\r\n7D17 (sha1)\r\n7D18 (hong2)\r\n7D19 (zhi3)\r\n7D1A (ji2)\r\n7D1B (fen1)\r\n7D1C (yun2)\r\n7D1D (ren2)\r\n7D1E (dan3)\r\n7D1F (jin1)\r\n7D20 (su4)\r\n7D21 (fang3)\r\n7D22 (suo3)\r\n7D23 (cui4)\r\n7D24 (jiu3)\r\n7D25 (zha2)\r\n7D26 (ba1)\r\n7D27 (jin3)\r\n7D28 (fu1)\r\n7D29 (zhi4)\r\n7D2A (qi1)\r\n7D2B (zi3)\r\n7D2C (chou2)\r\n7D2D (hong2)\r\n7D2E (zha2,za1)\r\n7D2F (lei3,lei4,lei2)\r\n7D30 (xi4)\r\n7D31 (fu2)\r\n7D32 (xie4)\r\n7D33 (shen1)\r\n7D34 (bei4)\r\n7D35 (zhu4)\r\n7D36 (qu3,qu1)\r\n7D37 (ling2)\r\n7D38 (zhu4)\r\n7D39 (shao4)\r\n7D3A (gan4)\r\n7D3B (yang1)\r\n7D3C (fu2)\r\n7D3D (tuo2)\r\n7D3E (zhen3)\r\n7D3F (dai4)\r\n7D40 (chu4)\r\n7D41 (shi1)\r\n7D42 (zhong1)\r\n7D43 (xian2)\r\n7D44 (zu3)\r\n7D45 (jiong3)\r\n7D46 (ban4)\r\n7D47 (ju4)\r\n7D48 (pa4)\r\n7D49 (shu4)\r\n7D4A (zui4)\r\n7D4B (kuang4)\r\n7D4C (jing1,jing4)\r\n7D4D (ren4)\r\n7D4E (heng4,hang2)\r\n7D4F (xie4)\r\n7D50 (jie2,jie1)\r\n7D51 (zhu1)\r\n7D52 (chou2)\r\n7D53 (gua4)\r\n7D54 (bai3)\r\n7D55 (jue2)\r\n7D56 (kuang4)\r\n7D57 (hu2)\r\n7D58 (ci4)\r\n7D59 (geng1)\r\n7D5A (geng1)\r\n7D5B (tao1)\r\n7D5C (xie2,jie2)\r\n7D5D (ku4)\r\n7D5E (jiao3,jia3)\r\n7D5F (quan1)\r\n7D60 (gai3)\r\n7D61 (luo4,lao4)\r\n7D62 (xuan4)\r\n7D63 (beng1,ping3)\r\n7D64 (xian4)\r\n7D65 (fu2)\r\n7D66 (gei3,ji3)\r\n7D67 (tong2)\r\n7D68 (rong2)\r\n7D69 (tiao4)\r\n7D6A (yin1)\r\n7D6B (lei3)\r\n7D6C (xie4)\r\n7D6D (quan4)\r\n7D6E (xu4)\r\n7D6F (hai4)\r\n7D70 (die2)\r\n7D71 (tong3)\r\n7D72 (si1)\r\n7D73 (jiang4)\r\n7D74 (xiang2)\r\n7D75 (hui4)\r\n7D76 (jue2)\r\n7D77 (zhi2)\r\n7D78 (jian3)\r\n7D79 (juan4)\r\n7D7A (chi1)\r\n7D7B (mian3)\r\n7D7C (zhen3)\r\n7D7D (lu:3)\r\n7D7E (cheng2)\r\n7D7F (qiu2)\r\n7D80 (shu1)\r\n7D81 (bang3)\r\n7D82 (tong3)\r\n7D83 (xiao1)\r\n7D84 (wan4)\r\n7D85 (qin1)\r\n7D86 (geng3)\r\n7D87 (xiu3)\r\n7D88 (ti2,di4,ti4)\r\n7D89 (xiu4)\r\n7D8A (xie2)\r\n7D8B (hong2)\r\n7D8C (xi4)\r\n7D8D (fu2)\r\n7D8E (ting2)\r\n7D8F (sui1,sui2)\r\n7D90 (dui4)\r\n7D91 (kun3)\r\n7D92 (fu1)\r\n7D93 (jing1,jing4)\r\n7D94 (hu4)\r\n7D95 (zhi1)\r\n7D96 (yan2)\r\n7D97 (jiong3)\r\n7D98 (feng2)\r\n7D99 (ji4)\r\n7D9A (xu4)\r\n7D9B (none0)\r\n7D9C (zong4,zeng4,zong1)\r\n7D9D (lin3)\r\n7D9E (duo3)\r\n7D9F (li4)\r\n7DA0 (lu:4)\r\n7DA1 (liang2)\r\n7DA2 (chou2)\r\n7DA3 (quan3)\r\n7DA4 (shao4)\r\n7DA5 (qi4)\r\n7DA6 (qi2)\r\n7DA7 (zhun3)\r\n7DA8 (qi2)\r\n7DA9 (wan3)\r\n7DAA (qian4)\r\n7DAB (xian4)\r\n7DAC (shou4)\r\n7DAD (wei2)\r\n7DAE (qi3,qing4,qing3)\r\n7DAF (tao2)\r\n7DB0 (wan3)\r\n7DB1 (gang1)\r\n7DB2 (wang3)\r\n7DB3 (beng1,beng3,beng4)\r\n7DB4 (zhui4)\r\n7DB5 (cai3)\r\n7DB6 (guo3)\r\n7DB7 (cui4)\r\n7DB8 (lun2,guan1)\r\n7DB9 (liu3)\r\n7DBA (qi3)\r\n7DBB (zhan4)\r\n7DBC (bei1)\r\n7DBD (chuo4)\r\n7DBE (ling2)\r\n7DBF (mian2)\r\n7DC0 (qi1)\r\n7DC1 (jie2)\r\n7DC2 (tan1)\r\n7DC3 (zong1)\r\n7DC4 (gun3)\r\n7DC5 (zou1)\r\n7DC6 (yi4)\r\n7DC7 (zi1)\r\n7DC8 (xing4)\r\n7DC9 (liang3)\r\n7DCA (jin3)\r\n7DCB (fei1)\r\n7DCC (rui2)\r\n7DCD (min2)\r\n7DCE (yu4)\r\n7DCF (zong3)\r\n7DD0 (fan2)\r\n7DD1 (lu:4)\r\n7DD2 (xu4)\r\n7DD3 (none0)\r\n7DD4 (shang4)\r\n7DD5 (none0)\r\n7DD6 (xu4)\r\n7DD7 (xiang1)\r\n7DD8 (jian1)\r\n7DD9 (ke4)\r\n7DDA (xian4)\r\n7DDB (ruan3)\r\n7DDC (mian2)\r\n7DDD (ji1,qi1,qi4)\r\n7DDE (duan4)\r\n7DDF (zhong4)\r\n7DE0 (di4)\r\n7DE1 (min2)\r\n7DE2 (miao2)\r\n7DE3 (yuan2)\r\n7DE4 (xie4)\r\n7DE5 (bao3)\r\n7DE6 (si1)\r\n7DE7 (qiu1)\r\n7DE8 (bian1)\r\n7DE9 (huan3)\r\n7DEA (geng1)\r\n7DEB (zong3)\r\n7DEC (mian3)\r\n7DED (wei4)\r\n7DEE (fu4)\r\n7DEF (wei3)\r\n7DF0 (yu2)\r\n7DF1 (gou1)\r\n7DF2 (miao3)\r\n7DF3 (jie2)\r\n7DF4 (lian4)\r\n7DF5 (zong1)\r\n7DF6 (bian4,pian2)\r\n7DF7 (yun4)\r\n7DF8 (yin1)\r\n7DF9 (ti2)\r\n7DFA (gua1)\r\n7DFB (zhi4)\r\n7DFC (yun1)\r\n7DFD (cheng1)\r\n7DFE (chan2)\r\n7DFF (dai4)\r\n7E00 (jia1)\r\n7E01 (yuan2)\r\n7E02 (zong3)\r\n7E03 (xu1)\r\n7E04 (sheng2)\r\n7E05 (none0)\r\n7E06 (geng1)\r\n7E07 (none0)\r\n7E08 (ying2)\r\n7E09 (jin4)\r\n7E0A (yi4)\r\n7E0B (zhui4)\r\n7E0C (ni4)\r\n7E0D (bang1)\r\n7E0E (gu3)\r\n7E0F (pan2)\r\n7E10 (zhou4)\r\n7E11 (jian1)\r\n7E12 (cuo3)\r\n7E13 (quan2)\r\n7E14 (shuang3)\r\n7E15 (yun1)\r\n7E16 (xia2)\r\n7E17 (shuai1)\r\n7E18 (xi1)\r\n7E19 (rong2)\r\n7E1A (tao1)\r\n7E1B (fu2)\r\n7E1C (yun2)\r\n7E1D (zhen3)\r\n7E1E (gao3)\r\n7E1F (ru4)\r\n7E20 (hu2)\r\n7E21 (zai3)\r\n7E22 (teng2)\r\n7E23 (xian4,xuan2)\r\n7E24 (su4)\r\n7E25 (zhen3)\r\n7E26 (zong4)\r\n7E27 (tao1)\r\n7E28 (huang3)\r\n7E29 (cai4)\r\n7E2A (bi4,bie4)\r\n7E2B (feng2,feng4)\r\n7E2C (cu4)\r\n7E2D (li2)\r\n7E2E (suo1,su4)\r\n7E2F (yin3)\r\n7E30 (xi3)\r\n7E31 (zong4,zong1)\r\n7E32 (lei2)\r\n7E33 (zhuan4)\r\n7E34 (qian4)\r\n7E35 (man4)\r\n7E36 (zhi2)\r\n7E37 (lu:3)\r\n7E38 (mo4)\r\n7E39 (piao3,piao1)\r\n7E3A (lian2)\r\n7E3B (mi2)\r\n7E3C (xuan4)\r\n7E3D (zong3)\r\n7E3E (ji1)\r\n7E3F (shan1)\r\n7E40 (sui4)\r\n7E41 (fan2,po2)\r\n7E42 (shuai4)\r\n7E43 (beng1)\r\n7E44 (yi1)\r\n7E45 (sao1)\r\n7E46 (mou2,miao4,miu4)\r\n7E47 (zhou4,yao2,you2)\r\n7E48 (qiang3)\r\n7E49 (hun2)\r\n7E4A (xian1)\r\n7E4B (xi4,ji4)\r\n7E4C (none0)\r\n7E4D (xiu4)\r\n7E4E (ran2)\r\n7E4F (xuan4)\r\n7E50 (hui4)\r\n7E51 (qiao1)\r\n7E52 (zeng1,zeng4)\r\n7E53 (zuo3)\r\n7E54 (zhi1)\r\n7E55 (shan4)\r\n7E56 (san3)\r\n7E57 (lin2)\r\n7E58 (yu4)\r\n7E59 (fan1)\r\n7E5A (liao2)\r\n7E5B (chuo4)\r\n7E5C (zun1)\r\n7E5D (jian4)\r\n7E5E (rao4,rao3)\r\n7E5F (chan3)\r\n7E60 (rui3)\r\n7E61 (xiu4)\r\n7E62 (hui4)\r\n7E63 (hua4)\r\n7E64 (zuan3)\r\n7E65 (xi1)\r\n7E66 (qiang3)\r\n7E67 (none0)\r\n7E68 (da2)\r\n7E69 (sheng2)\r\n7E6A (hui4)\r\n7E6B (xi4,ji4)\r\n7E6C (se4)\r\n7E6D (jian3)\r\n7E6E (jiang1)\r\n7E6F (huan2)\r\n7E70 (qiao1,zao3)\r\n7E71 (cong1)\r\n7E72 (jie4)\r\n7E73 (jiao3,jia3,zhuo2)\r\n7E74 (bo4)\r\n7E75 (chan2)\r\n7E76 (yi4)\r\n7E77 (nao2)\r\n7E78 (sui4)\r\n7E79 (yi4)\r\n7E7A (shai3)\r\n7E7B (xu1)\r\n7E7C (ji4)\r\n7E7D (bin1)\r\n7E7E (qian3)\r\n7E7F (jian4,kan3)\r\n7E80 (pu2)\r\n7E81 (xun1)\r\n7E82 (zuan3)\r\n7E83 (qi2)\r\n7E84 (peng2)\r\n7E85 (li4)\r\n7E86 (mo4)\r\n7E87 (lei4)\r\n7E88 (xie2)\r\n7E89 (zuan3)\r\n7E8A (kuang4)\r\n7E8B (you1)\r\n7E8C (xu4)\r\n7E8D (lei2)\r\n7E8E (xian1)\r\n7E8F (chan2)\r\n7E90 (none0)\r\n7E91 (lu2)\r\n7E92 (chan2)\r\n7E93 (ying1)\r\n7E94 (cai2)\r\n7E95 (xiang1)\r\n7E96 (xian1)\r\n7E97 (zui1)\r\n7E98 (zuan3)\r\n7E99 (luo4)\r\n7E9A (xi3)\r\n7E9B (dao4,du2)\r\n7E9C (lan4,lan3)\r\n7E9D (lei2)\r\n7E9E (lian4)\r\n7E9F (mi4)\r\n7EA0 (jiu1)\r\n7EA1 (yu1)\r\n7EA2 (hong2,gong1)\r\n7EA3 (zhou4)\r\n7EA4 (xian1,qian4)\r\n7EA5 (he2,ge1)\r\n7EA6 (yue1,yao1)\r\n7EA7 (ji2)\r\n7EA8 (wan2)\r\n7EA9 (kuang4)\r\n7EAA (ji4,ji3)\r\n7EAB (ren4)\r\n7EAC (wei3)\r\n7EAD (yun2)\r\n7EAE (hong2)\r\n7EAF (chun2)\r\n7EB0 (pi1)\r\n7EB1 (sha1)\r\n7EB2 (gang1)\r\n7EB3 (na4)\r\n7EB4 (ren4)\r\n7EB5 (zong4)\r\n7EB6 (lun2,guan1)\r\n7EB7 (fen1)\r\n7EB8 (zhi3)\r\n7EB9 (wen2,wen4)\r\n7EBA (fang3)\r\n7EBB (zhu4)\r\n7EBC (zhen4)\r\n7EBD (niu3)\r\n7EBE (shu1)\r\n7EBF (xian4)\r\n7EC0 (gan4)\r\n7EC1 (xie4)\r\n7EC2 (fu2)\r\n7EC3 (lian4)\r\n7EC4 (zu3)\r\n7EC5 (shen1)\r\n7EC6 (xi4)\r\n7EC7 (zhi1)\r\n7EC8 (zhong1)\r\n7EC9 (zhou4)\r\n7ECA (ban4)\r\n7ECB (fu2)\r\n7ECC (chu4)\r\n7ECD (shao4)\r\n7ECE (yi4)\r\n7ECF (jing1,jing4)\r\n7ED0 (dai4)\r\n7ED1 (bang3)\r\n7ED2 (rong2)\r\n7ED3 (jie2,jie1)\r\n7ED4 (ku4)\r\n7ED5 (rao3,rao4,rao5)\r\n7ED6 (die2)\r\n7ED7 (hang2)\r\n7ED8 (hui4)\r\n7ED9 (ji3,gei3)\r\n7EDA (xuan4)\r\n7EDB (jiang4)\r\n7EDC (luo4,lao4)\r\n7EDD (jue2)\r\n7EDE (jiao3,jia3)\r\n7EDF (tong3)\r\n7EE0 (geng3)\r\n7EE1 (xiao1)\r\n7EE2 (juan4)\r\n7EE3 (xiu4)\r\n7EE4 (xi4)\r\n7EE5 (sui2)\r\n7EE6 (tao1)\r\n7EE7 (ji4)\r\n7EE8 (ti2,ti4,di4)\r\n7EE9 (ji4,ji1)\r\n7EEA (xu4)\r\n7EEB (ling2)\r\n7EEC (yin1)\r\n7EED (xu4)\r\n7EEE (qi3)\r\n7EEF (fei1)\r\n7EF0 (chuo4,chao1,chuo5)\r\n7EF1 (shang4)\r\n7EF2 (gun3)\r\n7EF3 (sheng2)\r\n7EF4 (wei2)\r\n7EF5 (mian2)\r\n7EF6 (shou4)\r\n7EF7 (beng1,beng3,beng4)\r\n7EF8 (chou2)\r\n7EF9 (tao2)\r\n7EFA (liu3)\r\n7EFB (quan3)\r\n7EFC (zong1,zeng4)\r\n7EFD (zhan4)\r\n7EFE (wan3)\r\n7EFF (lu:4,lu4)\r\n7F00 (zhui4)\r\n7F01 (zi1)\r\n7F02 (ke4)\r\n7F03 (xiang1)\r\n7F04 (jian1)\r\n7F05 (mian3)\r\n7F06 (lan3)\r\n7F07 (ti2)\r\n7F08 (miao3)\r\n7F09 (ji1,qi1)\r\n7F0A (yun4)\r\n7F0B (hui4)\r\n7F0C (si1)\r\n7F0D (duo3)\r\n7F0E (duan4)\r\n7F0F (bian4,pian2)\r\n7F10 (xian4)\r\n7F11 (gou1)\r\n7F12 (zhui4)\r\n7F13 (huan3)\r\n7F14 (di4)\r\n7F15 (lu:3)\r\n7F16 (bian1)\r\n7F17 (min2)\r\n7F18 (yuan2)\r\n7F19 (jin4)\r\n7F1A (fu4)\r\n7F1B (ru4)\r\n7F1C (zhen3)\r\n7F1D (feng2,feng4)\r\n7F1E (cui1)\r\n7F1F (gao3)\r\n7F20 (chan2)\r\n7F21 (li2)\r\n7F22 (yi4)\r\n7F23 (jian1)\r\n7F24 (bin1)\r\n7F25 (piao1,piao3)\r\n7F26 (man4)\r\n7F27 (lei2)\r\n7F28 (ying1)\r\n7F29 (suo1,su4)\r\n7F2A (mou2,miao4,miu4)\r\n7F2B (sao1)\r\n7F2C (xie2)\r\n7F2D (liao2)\r\n7F2E (shan4)\r\n7F2F (zeng1,zeng4)\r\n7F30 (jiang1)\r\n7F31 (qian3)\r\n7F32 (qiao1,sao1,zao3)\r\n7F33 (huan2)\r\n7F34 (jiao3,zhuo2,jia3)\r\n7F35 (zuan3)\r\n7F36 (fou3)\r\n7F37 (xie4)\r\n7F38 (gang1)\r\n7F39 (fou3)\r\n7F3A (que1)\r\n7F3B (fou3)\r\n7F3C (que1)\r\n7F3D (bo1)\r\n7F3E (ping2)\r\n7F3F (hou4)\r\n7F40 (none0)\r\n7F41 (gang1)\r\n7F42 (ying1)\r\n7F43 (ying1)\r\n7F44 (qing4)\r\n7F45 (xia4)\r\n7F46 (guan4)\r\n7F47 (zun1)\r\n7F48 (tan2)\r\n7F49 (none0)\r\n7F4A (qing4)\r\n7F4B (weng4)\r\n7F4C (ying1)\r\n7F4D (lei2)\r\n7F4E (tan2)\r\n7F4F (lu2)\r\n7F50 (guan4)\r\n7F51 (wang3)\r\n7F52 (gang1)\r\n7F53 (wang3)\r\n7F54 (wang3)\r\n7F55 (han3)\r\n7F56 (none0)\r\n7F57 (luo2,luo1,luo5)\r\n7F58 (fu2,fou2)\r\n7F59 (mi2)\r\n7F5A (fa2)\r\n7F5B (gu1)\r\n7F5C (zhu3)\r\n7F5D (ju1)\r\n7F5E (mao2)\r\n7F5F (gu3)\r\n7F60 (min2)\r\n7F61 (gang1)\r\n7F62 (ba4,ba5)\r\n7F63 (gua4)\r\n7F64 (ti2)\r\n7F65 (juan4)\r\n7F66 (fu1)\r\n7F67 (lin2,sen1)\r\n7F68 (yan3)\r\n7F69 (zhao4)\r\n7F6A (zui4)\r\n7F6B (gua4)\r\n7F6C (zhuo2)\r\n7F6D (yu4)\r\n7F6E (zhi4)\r\n7F6F (an3)\r\n7F70 (fa2)\r\n7F71 (lan3)\r\n7F72 (shu3,shu4)\r\n7F73 (si1)\r\n7F74 (pi2)\r\n7F75 (ma4)\r\n7F76 (liu3)\r\n7F77 (ba4,ba5,pi2)\r\n7F78 (fa2)\r\n7F79 (li2)\r\n7F7A (chao1)\r\n7F7B (wei4)\r\n7F7C (bi4)\r\n7F7D (ji4)\r\n7F7E (zeng1)\r\n7F7F (tong2)\r\n7F80 (liu3)\r\n7F81 (ji1)\r\n7F82 (juan4)\r\n7F83 (mi4)\r\n7F84 (zhao4)\r\n7F85 (luo2,luo1)\r\n7F86 (pi2,biao1)\r\n7F87 (ji1)\r\n7F88 (ji1)\r\n7F89 (luan2)\r\n7F8A (yang2)\r\n7F8B (mie1)\r\n7F8C (qiang1)\r\n7F8D (ta4)\r\n7F8E (mei3)\r\n7F8F (yang3)\r\n7F90 (you3)\r\n7F91 (you3)\r\n7F92 (fen2)\r\n7F93 (ba1)\r\n7F94 (gao1)\r\n7F95 (yang4)\r\n7F96 (gu3)\r\n7F97 (qiang1)\r\n7F98 (zang1)\r\n7F99 (gao1)\r\n7F9A (ling2)\r\n7F9B (yi4)\r\n7F9C (zhu4)\r\n7F9D (di1)\r\n7F9E (xiu1)\r\n7F9F (qiang3)\r\n7FA0 (yi2)\r\n7FA1 (xian4)\r\n7FA2 (rong2)\r\n7FA3 (qun2)\r\n7FA4 (qun2)\r\n7FA5 (qian1,qiang3)\r\n7FA6 (huan2)\r\n7FA7 (suo1)\r\n7FA8 (xian4)\r\n7FA9 (yi4)\r\n7FAA (yang3)\r\n7FAB (qiang1)\r\n7FAC (xian2)\r\n7FAD (yu2)\r\n7FAE (geng1)\r\n7FAF (jie2)\r\n7FB0 (tang1)\r\n7FB1 (yuan2)\r\n7FB2 (xi1)\r\n7FB3 (fan2)\r\n7FB4 (shan1)\r\n7FB5 (fen4)\r\n7FB6 (shan1)\r\n7FB7 (lian3)\r\n7FB8 (lei2)\r\n7FB9 (geng1)\r\n7FBA (nou2)\r\n7FBB (qiang4)\r\n7FBC (chan4)\r\n7FBD (yu3)\r\n7FBE (gong4)\r\n7FBF (yi4)\r\n7FC0 (chong2,chong1)\r\n7FC1 (weng1)\r\n7FC2 (fen1)\r\n7FC3 (hong2)\r\n7FC4 (chi4)\r\n7FC5 (chi4)\r\n7FC6 (cui2)\r\n7FC7 (fu2,pei4)\r\n7FC8 (xia2)\r\n7FC9 (pen3)\r\n7FCA (yi4)\r\n7FCB (la1)\r\n7FCC (yi4)\r\n7FCD (pi1,po1)\r\n7FCE (ling2)\r\n7FCF (liu4)\r\n7FD0 (zhi4)\r\n7FD1 (qu2)\r\n7FD2 (xi2)\r\n7FD3 (xie2)\r\n7FD4 (xiang2)\r\n7FD5 (xi1,xi4)\r\n7FD6 (xi4)\r\n7FD7 (qi2)\r\n7FD8 (qiao2,qiao4)\r\n7FD9 (hui4)\r\n7FDA (hui1)\r\n7FDB (shu4)\r\n7FDC (se4)\r\n7FDD (hong2)\r\n7FDE (jiang1)\r\n7FDF (zhai2,di2)\r\n7FE0 (cui4)\r\n7FE1 (fei3)\r\n7FE2 (tao1)\r\n7FE3 (sha4)\r\n7FE4 (chi4)\r\n7FE5 (zhu4)\r\n7FE6 (jian3)\r\n7FE7 (xuan1)\r\n7FE8 (shi4)\r\n7FE9 (pian1)\r\n7FEA (zong1)\r\n7FEB (wan4)\r\n7FEC (hui1)\r\n7FED (hou2)\r\n7FEE (he2)\r\n7FEF (he4)\r\n7FF0 (han4)\r\n7FF1 (ao2)\r\n7FF2 (piao1)\r\n7FF3 (yi4)\r\n7FF4 (lian2)\r\n7FF5 (qu2)\r\n7FF6 (none0)\r\n7FF7 (lin2)\r\n7FF8 (pen3)\r\n7FF9 (qiao2,qiao4)\r\n7FFA (ao2)\r\n7FFB (fan1)\r\n7FFC (yi4)\r\n7FFD (hui4)\r\n7FFE (xuan1)\r\n7FFF (dao4)\r\n8000 (yao4,yue4)\r\n8001 (lao3)\r\n8002 (none0)\r\n8003 (kao3)\r\n8004 (mao4)\r\n8005 (zhe3)\r\n8006 (qi2)\r\n8007 (gou3)\r\n8008 (gou2)\r\n8009 (gou3)\r\n800A (die2)\r\n800B (die2)\r\n800C (er2)\r\n800D (shua3)\r\n800E (ruan3)\r\n800F (er2)\r\n8010 (nai4)\r\n8011 (zhuan1,duan1)\r\n8012 (lei3)\r\n8013 (ting1)\r\n8014 (zi3)\r\n8015 (geng1)\r\n8016 (chao4)\r\n8017 (hao4)\r\n8018 (yun2)\r\n8019 (pa2,ba4)\r\n801A (pi1)\r\n801B (chi2)\r\n801C (si4)\r\n801D (qu4)\r\n801E (jia1)\r\n801F (ju4)\r\n8020 (huo1)\r\n8021 (chu2)\r\n8022 (lao4)\r\n8023 (lun3)\r\n8024 (ji2)\r\n8025 (tang1,tang3)\r\n8026 (ou3)\r\n8027 (lou2)\r\n8028 (nou4)\r\n8029 (jiang3)\r\n802A (pang3)\r\n802B (ze2)\r\n802C (lou2)\r\n802D (ji1)\r\n802E (lao4)\r\n802F (huo4)\r\n8030 (you1)\r\n8031 (mo4)\r\n8032 (huai2)\r\n8033 (er3)\r\n8034 (zhe2)\r\n8035 (ding1)\r\n8036 (ye1,ye2)\r\n8037 (da1)\r\n8038 (song3)\r\n8039 (qin2)\r\n803A (yun2)\r\n803B (chi3)\r\n803C (dan1)\r\n803D (dan1)\r\n803E (hong2)\r\n803F (geng3)\r\n8040 (zhi2)\r\n8041 (none0)\r\n8042 (nie4)\r\n8043 (dan1)\r\n8044 (zhen3)\r\n8045 (che4)\r\n8046 (ling2)\r\n8047 (zheng1)\r\n8048 (you3)\r\n8049 (wa1)\r\n804A (liao2)\r\n804B (long2)\r\n804C (zhi2)\r\n804D (ning2)\r\n804E (tiao1)\r\n804F (er2,er4)\r\n8050 (ya4)\r\n8051 (die2)\r\n8052 (guo1,gua1)\r\n8053 (none0)\r\n8054 (lian2)\r\n8055 (hao4)\r\n8056 (sheng4)\r\n8057 (lie4)\r\n8058 (pin4)\r\n8059 (jing1)\r\n805A (ju4)\r\n805B (bi4)\r\n805C (di3)\r\n805D (guo2)\r\n805E (wen2,wen4)\r\n805F (xu4)\r\n8060 (ping1)\r\n8061 (cong1)\r\n8062 (none0)\r\n8063 (none0)\r\n8064 (ting2)\r\n8065 (yu3)\r\n8066 (cong1)\r\n8067 (kui2)\r\n8068 (lian2)\r\n8069 (kui4)\r\n806A (cong1)\r\n806B (lian2)\r\n806C (weng3)\r\n806D (kui4)\r\n806E (lian2)\r\n806F (lian2)\r\n8070 (cong1)\r\n8071 (ao2)\r\n8072 (sheng1)\r\n8073 (song3)\r\n8074 (ting1)\r\n8075 (kui4)\r\n8076 (nie4)\r\n8077 (zhi2)\r\n8078 (dan1)\r\n8079 (ning2)\r\n807A (none0)\r\n807B (ji1)\r\n807C (ting1)\r\n807D (ting1,ting4)\r\n807E (long2)\r\n807F (yu4)\r\n8080 (yu4)\r\n8081 (zhao4)\r\n8082 (si4)\r\n8083 (su4)\r\n8084 (yi4)\r\n8085 (su4)\r\n8086 (si4)\r\n8087 (zhao4)\r\n8088 (zhao4)\r\n8089 (rou4)\r\n808A (yi4)\r\n808B (lei4,le4,le1)\r\n808C (ji1)\r\n808D (qiu2)\r\n808E (ken3)\r\n808F (cao4)\r\n8090 (ge1)\r\n8091 (di4)\r\n8092 (huan2)\r\n8093 (huang1)\r\n8094 (yi3)\r\n8095 (ren4)\r\n8096 (xiao4,xiao1)\r\n8097 (ru3)\r\n8098 (zhou3)\r\n8099 (yuan1)\r\n809A (du4,du3)\r\n809B (gang1)\r\n809C (rong2)\r\n809D (gan1)\r\n809E (cha1)\r\n809F (wo4)\r\n80A0 (chang2)\r\n80A1 (gu3)\r\n80A2 (zhi1)\r\n80A3 (qin2)\r\n80A4 (fu1)\r\n80A5 (fei2)\r\n80A6 (ban1)\r\n80A7 (pei1)\r\n80A8 (pang4)\r\n80A9 (jian1)\r\n80AA (fang2)\r\n80AB (zhun1)\r\n80AC (you2)\r\n80AD (na4)\r\n80AE (ang1)\r\n80AF (ken3)\r\n80B0 (ran2)\r\n80B1 (gong1)\r\n80B2 (yu4,yo1)\r\n80B3 (wen3)\r\n80B4 (yao2)\r\n80B5 (jin4)\r\n80B6 (pi2)\r\n80B7 (qian3)\r\n80B8 (xi4)\r\n80B9 (xi4)\r\n80BA (fei4)\r\n80BB (ken3)\r\n80BC (jing3)\r\n80BD (tai4)\r\n80BE (shen4)\r\n80BF (zhong3)\r\n80C0 (zhang4)\r\n80C1 (xie2)\r\n80C2 (shen4)\r\n80C3 (wei4)\r\n80C4 (zhou4)\r\n80C5 (die2)\r\n80C6 (dan3)\r\n80C7 (fei4)\r\n80C8 (ba2)\r\n80C9 (bo2)\r\n80CA (qu2)\r\n80CB (tian2)\r\n80CC (bei4,bei1)\r\n80CD (gua1)\r\n80CE (tai1)\r\n80CF (zi3)\r\n80D0 (ku1)\r\n80D1 (zhi1)\r\n80D2 (ni4)\r\n80D3 (ping2)\r\n80D4 (zi4)\r\n80D5 (fu4)\r\n80D6 (pang4,pan2)\r\n80D7 (zhen1)\r\n80D8 (xian2)\r\n80D9 (zuo4)\r\n80DA (pei1)\r\n80DB (jia3)\r\n80DC (sheng4,sheng1)\r\n80DD (zhi1)\r\n80DE (bao1)\r\n80DF (mu3)\r\n80E0 (qu1)\r\n80E1 (hu2)\r\n80E2 (ke1)\r\n80E3 (yi3)\r\n80E4 (yin4)\r\n80E5 (xu1)\r\n80E6 (yang1)\r\n80E7 (long2)\r\n80E8 (dong4)\r\n80E9 (ka3)\r\n80EA (lu2)\r\n80EB (jing4)\r\n80EC (nu3)\r\n80ED (yan1)\r\n80EE (pang1)\r\n80EF (kua4)\r\n80F0 (yi2)\r\n80F1 (guang1)\r\n80F2 (hai3,gai3)\r\n80F3 (ge1,ga1,ge2)\r\n80F4 (dong4)\r\n80F5 (zhi4)\r\n80F6 (jiao1)\r\n80F7 (xiong1)\r\n80F8 (xiong1)\r\n80F9 (er2)\r\n80FA (an4)\r\n80FB (xing2)\r\n80FC (pian2)\r\n80FD (neng2)\r\n80FE (zi4)\r\n80FF (none0)\r\n8100 (cheng2)\r\n8101 (tiao4)\r\n8102 (zhi1)\r\n8103 (cui4)\r\n8104 (mei2)\r\n8105 (xie2)\r\n8106 (cui4)\r\n8107 (xie2)\r\n8108 (mo4,mai4)\r\n8109 (mai4,mo4)\r\n810A (ji3,ji2)\r\n810B (xie2)\r\n810C (none0)\r\n810D (kuai4)\r\n810E (sa4)\r\n810F (zang4,zang1)\r\n8110 (qi2)\r\n8111 (nao3)\r\n8112 (mi3)\r\n8113 (nong2)\r\n8114 (luan2)\r\n8115 (wan3)\r\n8116 (bo2)\r\n8117 (wen3)\r\n8118 (wan3)\r\n8119 (qiu2)\r\n811A (jiao3,jue2,jia3)\r\n811B (jing4)\r\n811C (you3)\r\n811D (heng1)\r\n811E (cuo3)\r\n811F (lie4)\r\n8120 (shan1)\r\n8121 (ting3)\r\n8122 (mei2)\r\n8123 (chun2)\r\n8124 (shen4)\r\n8125 (xie2)\r\n8126 (none0)\r\n8127 (juan1)\r\n8128 (cu4)\r\n8129 (xiu1)\r\n812A (xin4)\r\n812B (tuo1)\r\n812C (pao1)\r\n812D (cheng2)\r\n812E (nei3)\r\n812F (fu3,pu2)\r\n8130 (dou4)\r\n8131 (tuo1)\r\n8132 (niao4)\r\n8133 (nao3)\r\n8134 (pi3)\r\n8135 (gu3)\r\n8136 (luo2)\r\n8137 (li4)\r\n8138 (lian3)\r\n8139 (zhang4)\r\n813A (cui4)\r\n813B (jie2)\r\n813C (liang3)\r\n813D (shui2)\r\n813E (pi2)\r\n813F (biao1)\r\n8140 (lun2)\r\n8141 (pian2)\r\n8142 (guo4)\r\n8143 (juan4)\r\n8144 (chui2,zhui1)\r\n8145 (dan4)\r\n8146 (tian3)\r\n8147 (nei3)\r\n8148 (jing1)\r\n8149 (jie1)\r\n814A (la4,xi1)\r\n814B (ye4,yi4)\r\n814C (a1,yan1)\r\n814D (ren3)\r\n814E (shen4)\r\n814F (chuo4,duo2)\r\n8150 (fu3)\r\n8151 (fu3)\r\n8152 (ju1)\r\n8153 (fei2)\r\n8154 (qiang1)\r\n8155 (wan4)\r\n8156 (dong4)\r\n8157 (pi2)\r\n8158 (guo2)\r\n8159 (zong1)\r\n815A (ding4)\r\n815B (wu1)\r\n815C (mei2)\r\n815D (ruan3)\r\n815E (zhuan4,dun4)\r\n815F (zhi4)\r\n8160 (cou4)\r\n8161 (gua1,luo2)\r\n8162 (ou3)\r\n8163 (di4)\r\n8164 (an1)\r\n8165 (xing1)\r\n8166 (nao3)\r\n8167 (shu4)\r\n8168 (shuan4)\r\n8169 (nan3)\r\n816A (yun4)\r\n816B (zhong3)\r\n816C (rou2)\r\n816D (e4)\r\n816E (sai1)\r\n816F (tu2)\r\n8170 (yao1)\r\n8171 (jian4)\r\n8172 (wei3)\r\n8173 (jiao3)\r\n8174 (yu2)\r\n8175 (jia1)\r\n8176 (duan4)\r\n8177 (bi4)\r\n8178 (chang2)\r\n8179 (fu4)\r\n817A (xian4)\r\n817B (ni4)\r\n817C (mian3)\r\n817D (wa4)\r\n817E (teng2)\r\n817F (tui3)\r\n8180 (bang3,pang1,pang2,bang4)\r\n8181 (qian3)\r\n8182 (lu:3)\r\n8183 (wa4)\r\n8184 (shou4)\r\n8185 (tang2)\r\n8186 (su4)\r\n8187 (zhui4)\r\n8188 (ge2)\r\n8189 (yi4)\r\n818A (bo2,bo5)\r\n818B (liao2)\r\n818C (ji2)\r\n818D (pi2)\r\n818E (xie2)\r\n818F (gao1,gao4)\r\n8190 (lu:3)\r\n8191 (bin4)\r\n8192 (none0)\r\n8193 (chang2)\r\n8194 (lu4)\r\n8195 (guo2)\r\n8196 (pang1)\r\n8197 (chuai2)\r\n8198 (biao1)\r\n8199 (jiang3)\r\n819A (fu1)\r\n819B (tang2)\r\n819C (mo2,mo4)\r\n819D (xi1)\r\n819E (zhuan1)\r\n819F (lu:4)\r\n81A0 (jiao1)\r\n81A1 (ying4)\r\n81A2 (lu:2)\r\n81A3 (zhi4)\r\n81A4 (xue3)\r\n81A5 (chun1)\r\n81A6 (lin4)\r\n81A7 (tong2)\r\n81A8 (peng2)\r\n81A9 (ni4)\r\n81AA (chuai4)\r\n81AB (liao2)\r\n81AC (cui4)\r\n81AD (gui1)\r\n81AE (xiao1)\r\n81AF (teng1)\r\n81B0 (fan2)\r\n81B1 (zhi2)\r\n81B2 (jiao1)\r\n81B3 (shan4)\r\n81B4 (hu1)\r\n81B5 (cui4)\r\n81B6 (run4)\r\n81B7 (xin4)\r\n81B8 (sui3)\r\n81B9 (fen4)\r\n81BA (ying1)\r\n81BB (shan1)\r\n81BC (gua1)\r\n81BD (dan3)\r\n81BE (kuai4)\r\n81BF (nong2)\r\n81C0 (tun2)\r\n81C1 (lian2)\r\n81C2 (bei5,bi4,bei4)\r\n81C3 (yong1)\r\n81C4 (jue2)\r\n81C5 (chu4)\r\n81C6 (yi4)\r\n81C7 (juan3)\r\n81C8 (la4,xi1)\r\n81C9 (lian3)\r\n81CA (sao1,sao4)\r\n81CB (tun2)\r\n81CC (gu3)\r\n81CD (qi2)\r\n81CE (cui4)\r\n81CF (bin4)\r\n81D0 (xun1)\r\n81D1 (nao4,ru2)\r\n81D2 (huo4)\r\n81D3 (zang4)\r\n81D4 (xian4)\r\n81D5 (biao1)\r\n81D6 (xing4)\r\n81D7 (kuan1)\r\n81D8 (la4,xi1)\r\n81D9 (yan1)\r\n81DA (lu2)\r\n81DB (hu4)\r\n81DC (za1)\r\n81DD (luo3)\r\n81DE (qu2)\r\n81DF (zang4)\r\n81E0 (luan2)\r\n81E1 (ni2)\r\n81E2 (za1)\r\n81E3 (chen2)\r\n81E4 (qian1)\r\n81E5 (wo4)\r\n81E6 (guang4,wang3)\r\n81E7 (zang1)\r\n81E8 (lin2)\r\n81E9 (guang4)\r\n81EA (zi4)\r\n81EB (jiao3)\r\n81EC (nie4)\r\n81ED (chou4,xiu4)\r\n81EE (ji4)\r\n81EF (gao1)\r\n81F0 (chou4,xiu4)\r\n81F1 (mian2)\r\n81F2 (nie4)\r\n81F3 (zhi4)\r\n81F4 (zhi4)\r\n81F5 (ge2)\r\n81F6 (jian4)\r\n81F7 (die2)\r\n81F8 (zhi4)\r\n81F9 (xiu1)\r\n81FA (tai2,tai1)\r\n81FB (zhen1)\r\n81FC (jiu4)\r\n81FD (xian4)\r\n81FE (yu2)\r\n81FF (cha2)\r\n8200 (yao3)\r\n8201 (yu2)\r\n8202 (chong1)\r\n8203 (xi4)\r\n8204 (xi4)\r\n8205 (jiu4)\r\n8206 (yu2)\r\n8207 (yu3,yu4)\r\n8208 (xing1,xing4)\r\n8209 (ju3)\r\n820A (jiu4)\r\n820B (xin4)\r\n820C (she2)\r\n820D (she4,she3)\r\n820E (she3,she4)\r\n820F (jiu3)\r\n8210 (shi4)\r\n8211 (tan1)\r\n8212 (shu1)\r\n8213 (shi4)\r\n8214 (tian3)\r\n8215 (dan4)\r\n8216 (pu4)\r\n8217 (pu4,pu1)\r\n8218 (guan3)\r\n8219 (hua4)\r\n821A (tian4)\r\n821B (chuan3)\r\n821C (shun4)\r\n821D (xia2)\r\n821E (wu3)\r\n821F (zhou1)\r\n8220 (dao1)\r\n8221 (chuan2)\r\n8222 (shan1)\r\n8223 (yi3)\r\n8224 (none0)\r\n8225 (pa1)\r\n8226 (tai4)\r\n8227 (fan2)\r\n8228 (ban3)\r\n8229 (chuan2)\r\n822A (hang2)\r\n822B (fang3)\r\n822C (ban1,bo1,pan2)\r\n822D (bi3)\r\n822E (lu2)\r\n822F (zhong1)\r\n8230 (jian4)\r\n8231 (cang1)\r\n8232 (ling2)\r\n8233 (zhu2)\r\n8234 (ze2)\r\n8235 (duo4,tuo2)\r\n8236 (bo2)\r\n8237 (xian2)\r\n8238 (ge3)\r\n8239 (chuan2)\r\n823A (jia2,xia2)\r\n823B (lu2)\r\n823C (hong2)\r\n823D (pang2)\r\n823E (xi1)\r\n823F (none0)\r\n8240 (fu2)\r\n8241 (zao4)\r\n8242 (feng2)\r\n8243 (li2)\r\n8244 (shao1)\r\n8245 (yu2)\r\n8246 (lang2)\r\n8247 (ting3)\r\n8248 (none0)\r\n8249 (wei3)\r\n824A (bo2)\r\n824B (meng3)\r\n824C (nian4)\r\n824D (ju1)\r\n824E (huang2)\r\n824F (shou3)\r\n8250 (zong1)\r\n8251 (bian4)\r\n8252 (mao4)\r\n8253 (die2)\r\n8254 (none0)\r\n8255 (bang4)\r\n8256 (cha1)\r\n8257 (yi4)\r\n8258 (sou1,sao1)\r\n8259 (cang1)\r\n825A (cao2)\r\n825B (lou2)\r\n825C (dai4)\r\n825D (none0)\r\n825E (yao4)\r\n825F (chong1,tong2)\r\n8260 (none0)\r\n8261 (dang1)\r\n8262 (qiang2)\r\n8263 (lu3)\r\n8264 (yi3)\r\n8265 (jie4)\r\n8266 (jian4)\r\n8267 (huo4)\r\n8268 (meng2)\r\n8269 (qi2)\r\n826A (lu3)\r\n826B (lu2)\r\n826C (chan2)\r\n826D (shuang1)\r\n826E (gen4,gen3)\r\n826F (liang2)\r\n8270 (jian1)\r\n8271 (jian1)\r\n8272 (se4,shai3)\r\n8273 (yan4)\r\n8274 (fu2)\r\n8275 (ping2)\r\n8276 (yan4)\r\n8277 (yan4)\r\n8278 (cao3)\r\n8279 (cao3)\r\n827A (yi4)\r\n827B (le4)\r\n827C (ting1)\r\n827D (jiao1)\r\n827E (ai4,yi4)\r\n827F (nai3)\r\n8280 (tiao2)\r\n8281 (jiao1)\r\n8282 (jie2,jie1)\r\n8283 (peng2)\r\n8284 (wan2)\r\n8285 (yi4)\r\n8286 (chai1)\r\n8287 (mian2)\r\n8288 (mi3)\r\n8289 (gan4)\r\n828A (qian1)\r\n828B (yu4)\r\n828C (yu4)\r\n828D (shao2)\r\n828E (xiong1)\r\n828F (du4)\r\n8290 (xia4)\r\n8291 (qi3)\r\n8292 (mang2,wang2)\r\n8293 (zi3)\r\n8294 (hui4)\r\n8295 (sui1)\r\n8296 (zhi4)\r\n8297 (xiang1)\r\n8298 (bi4,pi2)\r\n8299 (fu2)\r\n829A (tun2)\r\n829B (wei3)\r\n829C (wu2)\r\n829D (zhi1)\r\n829E (qi3)\r\n829F (shan1)\r\n82A0 (wen2)\r\n82A1 (qian4)\r\n82A2 (ren2)\r\n82A3 (fou2)\r\n82A4 (kou1)\r\n82A5 (jie4,gai4)\r\n82A6 (lu2,lu3)\r\n82A7 (zhu4)\r\n82A8 (ji1)\r\n82A9 (qin2)\r\n82AA (qi2)\r\n82AB (yan2,yuan2)\r\n82AC (fen1)\r\n82AD (ba1)\r\n82AE (rui4)\r\n82AF (xin1,xin4)\r\n82B0 (ji4)\r\n82B1 (hua1)\r\n82B2 (hua1)\r\n82B3 (fang1)\r\n82B4 (wu4)\r\n82B5 (jue2)\r\n82B6 (gou1)\r\n82B7 (zhi3)\r\n82B8 (yun2)\r\n82B9 (qin2)\r\n82BA (ao3)\r\n82BB (chu2)\r\n82BC (mao4)\r\n82BD (ya2,di2)\r\n82BE (fei4,fu2)\r\n82BF (reng4)\r\n82C0 (hang2)\r\n82C1 (cong1)\r\n82C2 (yin2)\r\n82C3 (you3)\r\n82C4 (bian4)\r\n82C5 (yi4)\r\n82C6 (none0)\r\n82C7 (wei3)\r\n82C8 (li4)\r\n82C9 (pi3)\r\n82CA (e4)\r\n82CB (xian4)\r\n82CC (chang2)\r\n82CD (cang1)\r\n82CE (zhu4,ning2)\r\n82CF (su1)\r\n82D0 (yi2,ti2)\r\n82D1 (yuan4)\r\n82D2 (ran3)\r\n82D3 (ling2)\r\n82D4 (tai2,tai1)\r\n82D5 (tiao2,shao2)\r\n82D6 (di2)\r\n82D7 (miao2)\r\n82D8 (qing3)\r\n82D9 (li4)\r\n82DA (rao2)\r\n82DB (ke1)\r\n82DC (mu4)\r\n82DD (pei4)\r\n82DE (bao1)\r\n82DF (gou3)\r\n82E0 (min2)\r\n82E1 (yi3)\r\n82E2 (yi3)\r\n82E3 (ju4,qu3)\r\n82E4 (pie3)\r\n82E5 (ruo4,re3)\r\n82E6 (ku3)\r\n82E7 (zhu4,ning2)\r\n82E8 (ni3)\r\n82E9 (bo2)\r\n82EA (bing3)\r\n82EB (shan1,shan4)\r\n82EC (qiu2)\r\n82ED (yao3)\r\n82EE (xian1)\r\n82EF (ben3)\r\n82F0 (hong2)\r\n82F1 (ying1)\r\n82F2 (zha3)\r\n82F3 (dong1)\r\n82F4 (ju1)\r\n82F5 (die2)\r\n82F6 (nie2)\r\n82F7 (gan1)\r\n82F8 (hu1)\r\n82F9 (ping2,pin2)\r\n82FA (mei2)\r\n82FB (fu2)\r\n82FC (sheng1)\r\n82FD (gu1)\r\n82FE (bi4)\r\n82FF (wei4)\r\n8300 (fu2)\r\n8301 (zhuo2)\r\n8302 (mao4)\r\n8303 (fan4)\r\n8304 (qie2,jia1)\r\n8305 (mao2)\r\n8306 (mao2,mao3)\r\n8307 (ba2)\r\n8308 (zi3,ci2)\r\n8309 (mo4)\r\n830A (zi1)\r\n830B (di3)\r\n830C (chi2)\r\n830D (gou3)\r\n830E (jing1)\r\n830F (long2)\r\n8310 (none0)\r\n8311 (niao3)\r\n8312 (none0)\r\n8313 (xue2)\r\n8314 (ying2)\r\n8315 (qiong2)\r\n8316 (ge2)\r\n8317 (ming2)\r\n8318 (li4)\r\n8319 (rong2)\r\n831A (yin4)\r\n831B (gen4)\r\n831C (qian4,xi1)\r\n831D (chai3)\r\n831E (chen2)\r\n831F (yu4)\r\n8320 (xiu1)\r\n8321 (zi4)\r\n8322 (lie4)\r\n8323 (wu2)\r\n8324 (duo1)\r\n8325 (kui1)\r\n8326 (ce4)\r\n8327 (jian3)\r\n8328 (ci2)\r\n8329 (gou3)\r\n832A (guang1)\r\n832B (mang2)\r\n832C (cha2,zha1)\r\n832D (jiao1)\r\n832E (jiao1)\r\n832F (fu2)\r\n8330 (yu2)\r\n8331 (zhu1)\r\n8332 (zi1)\r\n8333 (jiang1)\r\n8334 (hui2)\r\n8335 (yin1)\r\n8336 (cha2)\r\n8337 (fa2)\r\n8338 (rong2,rong3)\r\n8339 (ru2,ru4)\r\n833A (chong1)\r\n833B (mang3)\r\n833C (tong2)\r\n833D (zhong4)\r\n833E (none0)\r\n833F (zhu2)\r\n8340 (xun2)\r\n8341 (huan2)\r\n8342 (kua1)\r\n8343 (quan2)\r\n8344 (gai1)\r\n8345 (da2)\r\n8346 (jing1)\r\n8347 (xing4)\r\n8348 (chuan3)\r\n8349 (cao3)\r\n834A (jing1)\r\n834B (er2)\r\n834C (an4)\r\n834D (shou1)\r\n834E (chi2)\r\n834F (ren3)\r\n8350 (jian4)\r\n8351 (ti2,yi2)\r\n8352 (huang1,huang5)\r\n8353 (ping2)\r\n8354 (li4)\r\n8355 (jin1)\r\n8356 (lao3,pei2)\r\n8357 (rong2)\r\n8358 (zhuang1)\r\n8359 (da2)\r\n835A (jia2)\r\n835B (rao2)\r\n835C (bi4)\r\n835D (ce4)\r\n835E (qiao2)\r\n835F (hui4)\r\n8360 (ji4,qi2)\r\n8361 (dang4)\r\n8362 (none0)\r\n8363 (rong2)\r\n8364 (hun1,xun1)\r\n8365 (ying2,xing2)\r\n8366 (luo4)\r\n8367 (ying2)\r\n8368 (qian2,xun2)\r\n8369 (jin4)\r\n836A (sun1)\r\n836B (yin4,yin1)\r\n836C (mai3)\r\n836D (hong2)\r\n836E (zhou4)\r\n836F (yao4)\r\n8370 (du4)\r\n8371 (wei3)\r\n8372 (chu4)\r\n8373 (dou4)\r\n8374 (fu1)\r\n8375 (ren3)\r\n8376 (yin2)\r\n8377 (he2,he4)\r\n8378 (bi2)\r\n8379 (bu4)\r\n837A (yun2)\r\n837B (di2)\r\n837C (tu2)\r\n837D (sui1)\r\n837E (sui1)\r\n837F (cheng2)\r\n8380 (chen2)\r\n8381 (wu2)\r\n8382 (bie2)\r\n8383 (xi1)\r\n8384 (geng3)\r\n8385 (li4)\r\n8386 (pu2)\r\n8387 (zhu4)\r\n8388 (mo4)\r\n8389 (li4)\r\n838A (zhuang1)\r\n838B (ji2)\r\n838C (duo2)\r\n838D (qiu2)\r\n838E (sha1,suo1)\r\n838F (suo1)\r\n8390 (chen2)\r\n8391 (feng1)\r\n8392 (ju3)\r\n8393 (mei2)\r\n8394 (meng2)\r\n8395 (xing4)\r\n8396 (jing1)\r\n8397 (che1)\r\n8398 (xin1,shen1)\r\n8399 (jun1)\r\n839A (yan2,yan4)\r\n839B (ting2)\r\n839C (you2)\r\n839D (cuo4)\r\n839E (guan1,guan3,wan3,wan1)\r\n839F (han4)\r\n83A0 (you3)\r\n83A1 (cuo4)\r\n83A2 (jia2)\r\n83A3 (wang4)\r\n83A4 (you2)\r\n83A5 (niu3,chou3)\r\n83A6 (shao1)\r\n83A7 (xian4)\r\n83A8 (lang4,liang2,lang2)\r\n83A9 (fu2,piao3)\r\n83AA (e2)\r\n83AB (mo4)\r\n83AC (wen4)\r\n83AD (jie2)\r\n83AE (nan2)\r\n83AF (mu4)\r\n83B0 (kan3)\r\n83B1 (lai2)\r\n83B2 (lian2)\r\n83B3 (shi4,shi2)\r\n83B4 (wo1,zhua1)\r\n83B5 (tu2,tu4)\r\n83B6 (xian1)\r\n83B7 (huo4)\r\n83B8 (you2)\r\n83B9 (ying2)\r\n83BA (ying1)\r\n83BB (none0)\r\n83BC (chun2)\r\n83BD (mang3)\r\n83BE (mang3)\r\n83BF (ci4)\r\n83C0 (yu4,wan3)\r\n83C1 (jing1)\r\n83C2 (di4)\r\n83C3 (qu2)\r\n83C4 (dong1)\r\n83C5 (jian1)\r\n83C6 (zou1)\r\n83C7 (gu1)\r\n83C8 (la1)\r\n83C9 (lu4,lu:4)\r\n83CA (ju2)\r\n83CB (wei4)\r\n83CC (jun1,jun4)\r\n83CD (nie4)\r\n83CE (kun1)\r\n83CF (he2)\r\n83D0 (pu2)\r\n83D1 (zai1)\r\n83D2 (gao3)\r\n83D3 (guo3)\r\n83D4 (fu2)\r\n83D5 (lun2)\r\n83D6 (chang1)\r\n83D7 (chou2)\r\n83D8 (song1)\r\n83D9 (chui2)\r\n83DA (zhan4)\r\n83DB (men2)\r\n83DC (cai4)\r\n83DD (ba2)\r\n83DE (li2)\r\n83DF (tu4,tu2)\r\n83E0 (bo1)\r\n83E1 (han4)\r\n83E2 (bao4)\r\n83E3 (qin4)\r\n83E4 (juan3)\r\n83E5 (xi1)\r\n83E6 (qin2)\r\n83E7 (di3)\r\n83E8 (jie1)\r\n83E9 (pu2)\r\n83EA (dang4)\r\n83EB (jin3)\r\n83EC (zhao3)\r\n83ED (tai2)\r\n83EE (geng1)\r\n83EF (hua2,hua4,hua1)\r\n83F0 (gu1)\r\n83F1 (ling2)\r\n83F2 (fei1,fei3)\r\n83F3 (jin1)\r\n83F4 (an4)\r\n83F5 (wang3)\r\n83F6 (beng3)\r\n83F7 (zhou3)\r\n83F8 (yan1)\r\n83F9 (zu1)\r\n83FA (jian1)\r\n83FB (lin3)\r\n83FC (tan3)\r\n83FD (shu1,shu2)\r\n83FE (tian2)\r\n83FF (dao4)\r\n8400 (hu3)\r\n8401 (ji1,qi2)\r\n8402 (he2)\r\n8403 (cui4)\r\n8404 (tao2)\r\n8405 (chun1)\r\n8406 (bei1,bi4)\r\n8407 (chang2)\r\n8408 (huan2)\r\n8409 (fei2)\r\n840A (lai2)\r\n840B (qi1)\r\n840C (meng2)\r\n840D (ping2)\r\n840E (wei3,wei1)\r\n840F (dan4)\r\n8410 (sha4)\r\n8411 (huan2)\r\n8412 (yan3)\r\n8413 (yi2)\r\n8414 (tiao2)\r\n8415 (qi2,ji4)\r\n8416 (wan3)\r\n8417 (ce4)\r\n8418 (nai4)\r\n8419 (none0)\r\n841A (tuo4)\r\n841B (jiu1)\r\n841C (tie1)\r\n841D (luo2)\r\n841E (none0)\r\n841F (none0)\r\n8420 (meng2)\r\n8421 (none0)\r\n8422 (none0)\r\n8423 (ding4)\r\n8424 (ying2)\r\n8425 (ying2)\r\n8426 (ying2)\r\n8427 (xiao1)\r\n8428 (sa4)\r\n8429 (qiu1)\r\n842A (ke1)\r\n842B (xiang4)\r\n842C (wan4,mo4)\r\n842D (yu3)\r\n842E (yu4)\r\n842F (fu4)\r\n8430 (lian4)\r\n8431 (xuan1)\r\n8432 (xuan1)\r\n8433 (nan2)\r\n8434 (ze2)\r\n8435 (wo1)\r\n8436 (chun3)\r\n8437 (xiao1)\r\n8438 (yu2)\r\n8439 (pian1,bian3)\r\n843A (mao4)\r\n843B (an1)\r\n843C (e4)\r\n843D (luo4,la4,lao4,luo1)\r\n843E (ying2)\r\n843F (huo2)\r\n8440 (gua1)\r\n8441 (jiang1)\r\n8442 (wan3)\r\n8443 (zuo2)\r\n8444 (zuo4)\r\n8445 (ju1)\r\n8446 (bao3)\r\n8447 (rou2)\r\n8448 (xi3)\r\n8449 (xie2,ye4,she4)\r\n844A (an1)\r\n844B (qu2)\r\n844C (jian1)\r\n844D (fu2)\r\n844E (lu:4)\r\n844F (lu:4)\r\n8450 (pen2)\r\n8451 (feng1,feng4)\r\n8452 (hong2)\r\n8453 (hong2)\r\n8454 (hou2)\r\n8455 (yan2)\r\n8456 (tu1)\r\n8457 (zhu4,zhe5,zhao1,zhao2,zhu3,zi1,zhuo2)\r\n8458 (zi1)\r\n8459 (xiang1)\r\n845A (shen4,ren4)\r\n845B (ge3,ge2)\r\n845C (qia1)\r\n845D (jing4)\r\n845E (mi3)\r\n845F (huang2)\r\n8460 (shen1)\r\n8461 (pu2)\r\n8462 (ge3)\r\n8463 (dong3)\r\n8464 (zhou4)\r\n8465 (qian2)\r\n8466 (wei3)\r\n8467 (bo2)\r\n8468 (wei1)\r\n8469 (pa1)\r\n846A (ji4)\r\n846B (hu2)\r\n846C (zang4)\r\n846D (jia1)\r\n846E (duan4)\r\n846F (yao4)\r\n8470 (jun4)\r\n8471 (cong1)\r\n8472 (quan2)\r\n8473 (wei1)\r\n8474 (xian2)\r\n8475 (kui2)\r\n8476 (ting2)\r\n8477 (hun1,xun1)\r\n8478 (xi3)\r\n8479 (shi1)\r\n847A (qi4)\r\n847B (lan2)\r\n847C (zong1)\r\n847D (yao1)\r\n847E (yuan1)\r\n847F (mei2)\r\n8480 (yun1)\r\n8481 (shu4)\r\n8482 (di4)\r\n8483 (zhuan4)\r\n8484 (guan1)\r\n8485 (none0)\r\n8486 (qiong2)\r\n8487 (chan3)\r\n8488 (kai3)\r\n8489 (kui4)\r\n848A (none0)\r\n848B (jiang3)\r\n848C (lou2)\r\n848D (wei3)\r\n848E (pai4)\r\n848F (none0)\r\n8490 (sou1)\r\n8491 (yin1)\r\n8492 (shi1)\r\n8493 (chun2)\r\n8494 (shi4,shi2)\r\n8495 (yun1)\r\n8496 (zhen1)\r\n8497 (lang4)\r\n8498 (nu2)\r\n8499 (meng3,meng2,meng1)\r\n849A (he2)\r\n849B (que1)\r\n849C (suan4)\r\n849D (yuan2)\r\n849E (li4)\r\n849F (ju3)\r\n84A0 (xi2)\r\n84A1 (bang4,pang2)\r\n84A2 (chu2)\r\n84A3 (xu2)\r\n84A4 (tu2)\r\n84A5 (liu2)\r\n84A6 (huo4)\r\n84A7 (zhen1)\r\n84A8 (qian4)\r\n84A9 (zu1)\r\n84AA (po4)\r\n84AB (cuo1)\r\n84AC (yuan1)\r\n84AD (chu2)\r\n84AE (yu4)\r\n84AF (kuai3)\r\n84B0 (pan2)\r\n84B1 (pu2)\r\n84B2 (pu2)\r\n84B3 (na4)\r\n84B4 (shuo4)\r\n84B5 (xi1)\r\n84B6 (fen2)\r\n84B7 (yun2)\r\n84B8 (zheng1)\r\n84B9 (jian1)\r\n84BA (ji2)\r\n84BB (ruo4)\r\n84BC (cang1)\r\n84BD (en1)\r\n84BE (mi2)\r\n84BF (hao1)\r\n84C0 (sun1)\r\n84C1 (zhen1)\r\n84C2 (ming2)\r\n84C3 (none0)\r\n84C4 (xu4)\r\n84C5 (liu2)\r\n84C6 (xi2)\r\n84C7 (gu1)\r\n84C8 (lang2)\r\n84C9 (rong2)\r\n84CA (weng3)\r\n84CB (gai4,ge3,he2)\r\n84CC (cuo4)\r\n84CD (shi1)\r\n84CE (tang2)\r\n84CF (luo3)\r\n84D0 (ru4)\r\n84D1 (suo1)\r\n84D2 (xian1)\r\n84D3 (bei4)\r\n84D4 (yao3)\r\n84D5 (gui4)\r\n84D6 (bi4)\r\n84D7 (zong3)\r\n84D8 (gun3)\r\n84D9 (none0)\r\n84DA (xiu1)\r\n84DB (ce4)\r\n84DC (none0)\r\n84DD (lan2,lan5,la5)\r\n84DE (none0)\r\n84DF (ji4)\r\n84E0 (li2)\r\n84E1 (can1)\r\n84E2 (lang2)\r\n84E3 (yu4)\r\n84E4 (none0)\r\n84E5 (ying2)\r\n84E6 (mo4)\r\n84E7 (diao4)\r\n84E8 (xiu1)\r\n84E9 (wu4)\r\n84EA (tong1)\r\n84EB (zhu2)\r\n84EC (peng2)\r\n84ED (an1)\r\n84EE (lian2)\r\n84EF (cong1)\r\n84F0 (xi3)\r\n84F1 (ping2)\r\n84F2 (qiu1,ou1)\r\n84F3 (jin4)\r\n84F4 (chun2)\r\n84F5 (jie2)\r\n84F6 (wei3)\r\n84F7 (tui1)\r\n84F8 (cao2)\r\n84F9 (yu4)\r\n84FA (yi4)\r\n84FB (ji2)\r\n84FC (liao3,lu4)\r\n84FD (bi4)\r\n84FE (lu3)\r\n84FF (xu5,su4)\r\n8500 (bu4)\r\n8501 (zhang1)\r\n8502 (luo2)\r\n8503 (qiang2)\r\n8504 (man4)\r\n8505 (yan2)\r\n8506 (leng2)\r\n8507 (ji4)\r\n8508 (biao1,piao4)\r\n8509 (gun3)\r\n850A (han3)\r\n850B (di2)\r\n850C (su4)\r\n850D (lu4)\r\n850E (she4)\r\n850F (shang1)\r\n8510 (di2)\r\n8511 (mie4)\r\n8512 (xun1)\r\n8513 (man4,wan4,man2)\r\n8514 (bo5,bu3,bo2)\r\n8515 (di4)\r\n8516 (cuo2)\r\n8517 (zhe4)\r\n8518 (sen1)\r\n8519 (xuan4)\r\n851A (yu4,wei4)\r\n851B (hu2)\r\n851C (ao2)\r\n851D (mi3)\r\n851E (lou2)\r\n851F (cu4)\r\n8520 (zhong1)\r\n8521 (cai4)\r\n8522 (po2)\r\n8523 (jiang3)\r\n8524 (mi4)\r\n8525 (cong1)\r\n8526 (niao3)\r\n8527 (hui4)\r\n8528 (jun4)\r\n8529 (yin2)\r\n852A (jian4)\r\n852B (nian1)\r\n852C (shu1)\r\n852D (yin4,yin1)\r\n852E (kui4)\r\n852F (chen2)\r\n8530 (hu4)\r\n8531 (sha1)\r\n8532 (kou4)\r\n8533 (qian4)\r\n8534 (ma2,ma1)\r\n8535 (cang2,zang4)\r\n8536 (ze2)\r\n8537 (qiang2)\r\n8538 (dou1)\r\n8539 (lian3)\r\n853A (lin4)\r\n853B (kou4)\r\n853C (ai3)\r\n853D (bi4)\r\n853E (li2)\r\n853F (wei3)\r\n8540 (ji2)\r\n8541 (qian2,xun2)\r\n8542 (sheng4)\r\n8543 (fan2,fan1,bo1)\r\n8544 (meng2)\r\n8545 (ou3)\r\n8546 (chan3)\r\n8547 (dian3)\r\n8548 (xun4,jun4)\r\n8549 (jiao1,qiao2)\r\n854A (rui3)\r\n854B (rui3)\r\n854C (lei3)\r\n854D (yu2)\r\n854E (qiao2)\r\n854F (chu2)\r\n8550 (hua2,hua1,hua4)\r\n8551 (jian1)\r\n8552 (mai3)\r\n8553 (yun2)\r\n8554 (bao1)\r\n8555 (you2)\r\n8556 (qu2)\r\n8557 (lu4)\r\n8558 (rao2)\r\n8559 (hui4)\r\n855A (e4)\r\n855B (ti2)\r\n855C (fei3)\r\n855D (jue2)\r\n855E (zui4)\r\n855F (fa4)\r\n8560 (ru2)\r\n8561 (fen2)\r\n8562 (kui4)\r\n8563 (shun4)\r\n8564 (rui2)\r\n8565 (ya3)\r\n8566 (xu1)\r\n8567 (fu4)\r\n8568 (jue2)\r\n8569 (dang4)\r\n856A (wu2)\r\n856B (tong2)\r\n856C (si1)\r\n856D (xiao1)\r\n856E (xi4)\r\n856F (yong1)\r\n8570 (wen1)\r\n8571 (shao1)\r\n8572 (qi2)\r\n8573 (jian1)\r\n8574 (yun4)\r\n8575 (sun1)\r\n8576 (ling2)\r\n8577 (yu4)\r\n8578 (xia2)\r\n8579 (weng4)\r\n857A (ji2)\r\n857B (hong2,hong4)\r\n857C (si4)\r\n857D (deng1)\r\n857E (lei3)\r\n857F (xuan1)\r\n8580 (yun4)\r\n8581 (yu4)\r\n8582 (xi2)\r\n8583 (hao4)\r\n8584 (bo2,bao2,bo4)\r\n8585 (hao1)\r\n8586 (ai4)\r\n8587 (wei1,wei2)\r\n8588 (hui4)\r\n8589 (wei4)\r\n858A (ji4)\r\n858B (ci2)\r\n858C (xiang1)\r\n858D (luan4)\r\n858E (mie4)\r\n858F (yi4)\r\n8590 (leng2)\r\n8591 (jiang1)\r\n8592 (can4)\r\n8593 (shen1,can1,cen1)\r\n8594 (qiang2)\r\n8595 (lian2)\r\n8596 (ke1)\r\n8597 (yuan2)\r\n8598 (da2)\r\n8599 (ti4)\r\n859A (tang2)\r\n859B (xue1)\r\n859C (bi4,bo4)\r\n859D (zhan1)\r\n859E (sun1)\r\n859F (lian4,xian1)\r\n85A0 (fan2)\r\n85A1 (ding3)\r\n85A2 (xiao4)\r\n85A3 (gu3)\r\n85A4 (xie4)\r\n85A5 (shu3)\r\n85A6 (jian4)\r\n85A7 (kao3)\r\n85A8 (hong1)\r\n85A9 (sa4)\r\n85AA (xin1)\r\n85AB (xun1)\r\n85AC (yao4)\r\n85AD (bai4)\r\n85AE (sou3)\r\n85AF (shu3)\r\n85B0 (xun1)\r\n85B1 (dui4)\r\n85B2 (pin2)\r\n85B3 (wei3)\r\n85B4 (neng2)\r\n85B5 (chou2)\r\n85B6 (mai2)\r\n85B7 (ru2)\r\n85B8 (piao1)\r\n85B9 (tai2)\r\n85BA (qi2,ji4)\r\n85BB (zao3)\r\n85BC (chen2)\r\n85BD (zhen1)\r\n85BE (er3)\r\n85BF (ni3)\r\n85C0 (ying2)\r\n85C1 (gao3)\r\n85C2 (cong4)\r\n85C3 (xiao1)\r\n85C4 (qi2)\r\n85C5 (fa2)\r\n85C6 (jian3)\r\n85C7 (xu4)\r\n85C8 (kui1)\r\n85C9 (jie4,ji2)\r\n85CA (bian3)\r\n85CB (di2)\r\n85CC (mi4)\r\n85CD (lan2,la5)\r\n85CE (jin4)\r\n85CF (zang4,cang2)\r\n85D0 (miao3)\r\n85D1 (qiong2)\r\n85D2 (qie4)\r\n85D3 (xian3,li4)\r\n85D4 (none0)\r\n85D5 (ou3)\r\n85D6 (xian2)\r\n85D7 (su4)\r\n85D8 (lu:2)\r\n85D9 (yi4)\r\n85DA (xu4)\r\n85DB (xie3)\r\n85DC (li2)\r\n85DD (yi4)\r\n85DE (la3)\r\n85DF (lei3)\r\n85E0 (jiao4)\r\n85E1 (di2)\r\n85E2 (zhi3)\r\n85E3 (pi2)\r\n85E4 (teng2)\r\n85E5 (yao4,yue4)\r\n85E6 (mo4,mo2)\r\n85E7 (huan3)\r\n85E8 (biao1)\r\n85E9 (fan1,fan2)\r\n85EA (sou3)\r\n85EB (tan2)\r\n85EC (tui1)\r\n85ED (qiong2)\r\n85EE (qiao2)\r\n85EF (wei4)\r\n85F0 (liu2)\r\n85F1 (hui2)\r\n85F2 (shu1)\r\n85F3 (gao3)\r\n85F4 (yun4)\r\n85F5 (none0)\r\n85F6 (li4)\r\n85F7 (zhu1,shu3)\r\n85F8 (zhu1)\r\n85F9 (ai3)\r\n85FA (lin4)\r\n85FB (zao3)\r\n85FC (xuan1)\r\n85FD (chen4)\r\n85FE (lai4)\r\n85FF (huo4)\r\n8600 (tuo4)\r\n8601 (wu4,e4)\r\n8602 (rui3)\r\n8603 (rui3)\r\n8604 (qi2)\r\n8605 (heng2)\r\n8606 (lu2,lu3)\r\n8607 (su1)\r\n8608 (tui2)\r\n8609 (mang2)\r\n860A (yun4)\r\n860B (pin2,ping2)\r\n860C (yu3)\r\n860D (xun1)\r\n860E (ji4)\r\n860F (jiong1)\r\n8610 (xuan1)\r\n8611 (mo2)\r\n8612 (none0)\r\n8613 (su1)\r\n8614 (jiong1)\r\n8615 (none0)\r\n8616 (nie4)\r\n8617 (bo4,nie4)\r\n8618 (rang2)\r\n8619 (yi4)\r\n861A (xian3,li4)\r\n861B (yu2)\r\n861C (ju2)\r\n861D (lian4)\r\n861E (lian4,lian3)\r\n861F (yin3)\r\n8620 (qiang2)\r\n8621 (ying1)\r\n8622 (long2)\r\n8623 (tou3)\r\n8624 (wei3)\r\n8625 (yue4)\r\n8626 (ling2)\r\n8627 (qu2)\r\n8628 (yao2)\r\n8629 (fan2)\r\n862A (mi2)\r\n862B (lan2)\r\n862C (kui1)\r\n862D (lan2)\r\n862E (ji4)\r\n862F (dang4)\r\n8630 (none0)\r\n8631 (lei4)\r\n8632 (lei3)\r\n8633 (tong4)\r\n8634 (feng1)\r\n8635 (zhi2)\r\n8636 (wei4)\r\n8637 (kui2)\r\n8638 (zhan4)\r\n8639 (huai4)\r\n863A (li2)\r\n863B (ji4)\r\n863C (mi2)\r\n863D (lei3)\r\n863E (huai4)\r\n863F (luo2)\r\n8640 (ji1)\r\n8641 (nao2)\r\n8642 (lu4)\r\n8643 (jian1)\r\n8644 (none0)\r\n8645 (none0)\r\n8646 (lei3)\r\n8647 (quan3)\r\n8648 (xiao1)\r\n8649 (yi4)\r\n864A (luan2)\r\n864B (men2)\r\n864C (bie1)\r\n864D (hu1)\r\n864E (hu3,hu4)\r\n864F (lu3)\r\n8650 (nu:e4)\r\n8651 (lu:4)\r\n8652 (zhi4)\r\n8653 (xiao1)\r\n8654 (qian2)\r\n8655 (chu4,chu3)\r\n8656 (hu1)\r\n8657 (xu1)\r\n8658 (cuo2)\r\n8659 (fu2)\r\n865A (xu1)\r\n865B (xu1)\r\n865C (lu3)\r\n865D (hu3,hu4)\r\n865E (yu2)\r\n865F (hao4,hao2)\r\n8660 (jiao1)\r\n8661 (ju4)\r\n8662 (guo2)\r\n8663 (bao4)\r\n8664 (yan2)\r\n8665 (zhan4)\r\n8666 (zhan4)\r\n8667 (kui1)\r\n8668 (ban1)\r\n8669 (xi4)\r\n866A (shu2)\r\n866B (chong2,hui3)\r\n866C (qiu2)\r\n866D (diao1)\r\n866E (ji3)\r\n866F (qiu2)\r\n8670 (ding1)\r\n8671 (shi1)\r\n8672 (none0)\r\n8673 (di4)\r\n8674 (zhe2)\r\n8675 (she2,yi2)\r\n8676 (yu1)\r\n8677 (gan1)\r\n8678 (zi3)\r\n8679 (hong2,jiang4)\r\n867A (hui3,hui1)\r\n867B (meng2)\r\n867C (ge4)\r\n867D (sui1)\r\n867E (xia1,ha2)\r\n867F (chai4)\r\n8680 (shi2)\r\n8681 (yi3)\r\n8682 (ma3,ma1,ma4)\r\n8683 (xiang4)\r\n8684 (fang1)\r\n8685 (e4)\r\n8686 (pa1)\r\n8687 (chi3)\r\n8688 (qian1)\r\n8689 (wen2)\r\n868A (wen2)\r\n868B (rui4)\r\n868C (bang4,beng4)\r\n868D (pi2)\r\n868E (yue4)\r\n868F (yue4)\r\n8690 (jun1)\r\n8691 (qi2)\r\n8692 (ran2)\r\n8693 (yin3)\r\n8694 (qi2,chi2)\r\n8695 (can2,tian3)\r\n8696 (yuan2)\r\n8697 (jue2)\r\n8698 (hui2)\r\n8699 (qian2)\r\n869A (qi2)\r\n869B (zhong4)\r\n869C (ya2)\r\n869D (hao2)\r\n869E (mu4)\r\n869F (wang2)\r\n86A0 (fen2)\r\n86A1 (fen2)\r\n86A2 (hang2)\r\n86A3 (gong1)\r\n86A4 (zao3)\r\n86A5 (fu3)\r\n86A6 (ran2)\r\n86A7 (jie4)\r\n86A8 (fu2)\r\n86A9 (chi1)\r\n86AA (dou3)\r\n86AB (bao4)\r\n86AC (xian3)\r\n86AD (ni3)\r\n86AE (te4)\r\n86AF (qiu1)\r\n86B0 (you2)\r\n86B1 (zha4)\r\n86B2 (ping2)\r\n86B3 (chi2)\r\n86B4 (you4)\r\n86B5 (he2,ke4)\r\n86B6 (han1)\r\n86B7 (ju4)\r\n86B8 (li4)\r\n86B9 (fu4)\r\n86BA (ran2)\r\n86BB (zha2)\r\n86BC (gou3)\r\n86BD (pi2)\r\n86BE (bo3)\r\n86BF (xian2)\r\n86C0 (zhu4)\r\n86C1 (diao1)\r\n86C2 (bie3)\r\n86C3 (bing3)\r\n86C4 (gu1,gu3)\r\n86C5 (ran2)\r\n86C6 (qu1,ju1)\r\n86C7 (she2,yi2)\r\n86C8 (tie4)\r\n86C9 (ling2)\r\n86CA (gu3)\r\n86CB (dan4)\r\n86CC (gu3)\r\n86CD (ying2)\r\n86CE (li4)\r\n86CF (cheng1)\r\n86D0 (qu1)\r\n86D1 (mou2)\r\n86D2 (ge2)\r\n86D3 (ci4)\r\n86D4 (hui2)\r\n86D5 (hui2)\r\n86D6 (mang2)\r\n86D7 (fu4)\r\n86D8 (yang2)\r\n86D9 (wa1)\r\n86DA (lie4)\r\n86DB (zhu1)\r\n86DC (yi1)\r\n86DD (xian2)\r\n86DE (kuo4)\r\n86DF (jiao1)\r\n86E0 (li4)\r\n86E1 (yi4)\r\n86E2 (ping2)\r\n86E3 (ji1)\r\n86E4 (ha2,ge2)\r\n86E5 (she2)\r\n86E6 (yi2)\r\n86E7 (wang3)\r\n86E8 (mo4)\r\n86E9 (qiong2)\r\n86EA (qie4)\r\n86EB (gui3)\r\n86EC (gong3)\r\n86ED (zhi4)\r\n86EE (man2)\r\n86EF (none0)\r\n86F0 (zhe2)\r\n86F1 (jia2)\r\n86F2 (nao2)\r\n86F3 (si1)\r\n86F4 (qi2)\r\n86F5 (xing1)\r\n86F6 (lie4)\r\n86F7 (qiu2)\r\n86F8 (shao1,xiao1)\r\n86F9 (yong3)\r\n86FA (jia2)\r\n86FB (tui4,shui4)\r\n86FC (che1)\r\n86FD (bai4)\r\n86FE (e2,yi3)\r\n86FF (han4)\r\n8700 (shu3)\r\n8701 (xuan2)\r\n8702 (feng1)\r\n8703 (shen4)\r\n8704 (zhen4)\r\n8705 (fu3)\r\n8706 (xian4,xian3)\r\n8707 (zhe2,zhe1)\r\n8708 (wu2)\r\n8709 (fu2)\r\n870A (li2)\r\n870B (lang2)\r\n870C (bi4)\r\n870D (chu2)\r\n870E (yuan1)\r\n870F (you3)\r\n8710 (jie2)\r\n8711 (dan4)\r\n8712 (yan2)\r\n8713 (ting2)\r\n8714 (dian4)\r\n8715 (tui4)\r\n8716 (hui2)\r\n8717 (wo1)\r\n8718 (zhi1)\r\n8719 (song1)\r\n871A (fei1,fei3)\r\n871B (ju1)\r\n871C (mi4)\r\n871D (qi2)\r\n871E (qi2)\r\n871F (yu4)\r\n8720 (jun3)\r\n8721 (la4,zha4)\r\n8722 (meng3)\r\n8723 (qiang1)\r\n8724 (si1)\r\n8725 (xi1)\r\n8726 (lun2)\r\n8727 (li4)\r\n8728 (die2)\r\n8729 (tiao2)\r\n872A (tao1)\r\n872B (kun1)\r\n872C (gan1)\r\n872D (han4)\r\n872E (yu4)\r\n872F (bang4,beng4)\r\n8730 (fei2)\r\n8731 (pi2)\r\n8732 (wei3)\r\n8733 (dun1)\r\n8734 (yi4)\r\n8735 (yuan1)\r\n8736 (su4)\r\n8737 (quan2)\r\n8738 (qian3)\r\n8739 (rui4)\r\n873A (ni2)\r\n873B (qing1)\r\n873C (wei4)\r\n873D (liang3)\r\n873E (guo3)\r\n873F (wan1,wan3)\r\n8740 (dong1)\r\n8741 (e4)\r\n8742 (ban3)\r\n8743 (zhuo2)\r\n8744 (wang3)\r\n8745 (can2)\r\n8746 (yang3)\r\n8747 (ying2)\r\n8748 (guo1)\r\n8749 (chan2)\r\n874A (none0)\r\n874B (la4,zha4)\r\n874C (ke1)\r\n874D (ji2)\r\n874E (xie1,he2)\r\n874F (ting2)\r\n8750 (mai4)\r\n8751 (xu1)\r\n8752 (mian2)\r\n8753 (yu2)\r\n8754 (jie1)\r\n8755 (shi2)\r\n8756 (xuan1)\r\n8757 (huang2)\r\n8758 (yan3)\r\n8759 (bian1)\r\n875A (rou2)\r\n875B (wei1)\r\n875C (fu4)\r\n875D (yuan2)\r\n875E (mei4)\r\n875F (wei4)\r\n8760 (fu2)\r\n8761 (ruan3)\r\n8762 (xie2)\r\n8763 (you2)\r\n8764 (you2,qiu2)\r\n8765 (mao2)\r\n8766 (xia1,ha2)\r\n8767 (ying1)\r\n8768 (shi1)\r\n8769 (chong2)\r\n876A (tang1)\r\n876B (zhu1)\r\n876C (zong1)\r\n876D (ti2)\r\n876E (fu4)\r\n876F (yuan2)\r\n8770 (kui2)\r\n8771 (meng2)\r\n8772 (la4)\r\n8773 (du2)\r\n8774 (hu2)\r\n8775 (qiu1)\r\n8776 (die2)\r\n8777 (li4,xi2)\r\n8778 (gua1,wo1)\r\n8779 (yun1)\r\n877A (ju3)\r\n877B (nan3)\r\n877C (lou2)\r\n877D (chun1)\r\n877E (rong2)\r\n877F (ying2)\r\n8780 (jiang1)\r\n8781 (tun4)\r\n8782 (lang2)\r\n8783 (pang2)\r\n8784 (si1,shi1)\r\n8785 (xi1)\r\n8786 (xi1)\r\n8787 (xi1)\r\n8788 (yuan2)\r\n8789 (weng1)\r\n878A (lian2)\r\n878B (sou1)\r\n878C (ban1)\r\n878D (rong2)\r\n878E (rong2)\r\n878F (ji2)\r\n8790 (wu1)\r\n8791 (xiu4)\r\n8792 (han4)\r\n8793 (qin2)\r\n8794 (yi2)\r\n8795 (bi1)\r\n8796 (hua2)\r\n8797 (tang2)\r\n8798 (yi3)\r\n8799 (du4)\r\n879A (nai4)\r\n879B (he2)\r\n879C (hu2)\r\n879D (xi1)\r\n879E (ma3,ma1,ma4)\r\n879F (ming2)\r\n87A0 (yi4)\r\n87A1 (wen2)\r\n87A2 (ying2)\r\n87A3 (teng2,te4)\r\n87A4 (yu3)\r\n87A5 (cang1)\r\n87A6 (none0)\r\n87A7 (none0)\r\n87A8 (man3)\r\n87A9 (none0)\r\n87AA (shang1)\r\n87AB (shi4,zhe1)\r\n87AC (cao2)\r\n87AD (chi1)\r\n87AE (di4)\r\n87AF (ao2)\r\n87B0 (lu4)\r\n87B1 (wei4)\r\n87B2 (zhi4)\r\n87B3 (tang2)\r\n87B4 (chen2)\r\n87B5 (piao1)\r\n87B6 (qu2)\r\n87B7 (pi2)\r\n87B8 (yu2)\r\n87B9 (jian4)\r\n87BA (luo2)\r\n87BB (lou2)\r\n87BC (qin3)\r\n87BD (zhong1)\r\n87BE (yin3)\r\n87BF (jiang1)\r\n87C0 (shuai4,shuo4)\r\n87C1 (wen2)\r\n87C2 (jiao1)\r\n87C3 (wan4)\r\n87C4 (zhe2,zhi2)\r\n87C5 (zhe4)\r\n87C6 (ma2,ma5)\r\n87C7 (ma2)\r\n87C8 (guo1)\r\n87C9 (liao4)\r\n87CA (mao2)\r\n87CB (xi1)\r\n87CC (cong1)\r\n87CD (li2)\r\n87CE (man3)\r\n87CF (xiao1)\r\n87D0 (none0)\r\n87D1 (zhang1)\r\n87D2 (mang3)\r\n87D3 (xiang4)\r\n87D4 (mo4)\r\n87D5 (zi1)\r\n87D6 (si1)\r\n87D7 (qiu1)\r\n87D8 (te4)\r\n87D9 (zhi2)\r\n87DA (peng2)\r\n87DB (peng2)\r\n87DC (jiao3)\r\n87DD (qu2)\r\n87DE (bie2)\r\n87DF (liao3)\r\n87E0 (pan2)\r\n87E1 (gui3)\r\n87E2 (xi3)\r\n87E3 (ji3)\r\n87E4 (zhuan1)\r\n87E5 (huang2)\r\n87E6 (fei4)\r\n87E7 (lao2)\r\n87E8 (jue2)\r\n87E9 (jue2)\r\n87EA (hui4)\r\n87EB (yin2)\r\n87EC (chan2)\r\n87ED (jiao1)\r\n87EE (shan4)\r\n87EF (rao2,nao2)\r\n87F0 (xiao1)\r\n87F1 (wu2)\r\n87F2 (chong2)\r\n87F3 (xun2)\r\n87F4 (si1)\r\n87F5 (none0)\r\n87F6 (cheng1)\r\n87F7 (dang1)\r\n87F8 (li3,li2)\r\n87F9 (xie4)\r\n87FA (shan4)\r\n87FB (yi3)\r\n87FC (jing3)\r\n87FD (da2)\r\n87FE (chan2)\r\n87FF (qi4)\r\n8800 (zi1)\r\n8801 (xiang4)\r\n8802 (she4)\r\n8803 (luo3)\r\n8804 (qin2)\r\n8805 (ying2)\r\n8806 (chai4)\r\n8807 (li4)\r\n8808 (ze2)\r\n8809 (xuan1)\r\n880A (lian2)\r\n880B (zhu2)\r\n880C (ze2)\r\n880D (xie1)\r\n880E (mang3)\r\n880F (xie4,xie3)\r\n8810 (qi2)\r\n8811 (rong2)\r\n8812 (jian3)\r\n8813 (meng3)\r\n8814 (hao2)\r\n8815 (ru2,ruan3)\r\n8816 (huo4)\r\n8817 (zhuo2)\r\n8818 (jie2)\r\n8819 (bin1)\r\n881A (he4)\r\n881B (mie4)\r\n881C (fan2)\r\n881D (lei2)\r\n881E (jie2)\r\n881F (la4,zha4)\r\n8820 (mi4)\r\n8821 (li3,li2)\r\n8822 (chun3)\r\n8823 (li4)\r\n8824 (qiu1)\r\n8825 (nie4)\r\n8826 (lu2)\r\n8827 (du4)\r\n8828 (xiao1)\r\n8829 (zhu1)\r\n882A (long2)\r\n882B (li4)\r\n882C (long2)\r\n882D (feng1)\r\n882E (ye1)\r\n882F (pi2)\r\n8830 (rang2)\r\n8831 (gu3)\r\n8832 (juan1)\r\n8833 (ying1)\r\n8834 (none0)\r\n8835 (xi1)\r\n8836 (can2)\r\n8837 (qu2)\r\n8838 (quan2)\r\n8839 (du4)\r\n883A (can2)\r\n883B (man2)\r\n883C (qu2)\r\n883D (jie2)\r\n883E (zhu2)\r\n883F (zha2)\r\n8840 (xue4,xie3)\r\n8841 (huang1)\r\n8842 (nu:4)\r\n8843 (pei1)\r\n8844 (nu:4)\r\n8845 (xin4)\r\n8846 (zhong4)\r\n8847 (mo4)\r\n8848 (er4)\r\n8849 (mie4)\r\n884A (mie4)\r\n884B (shi4)\r\n884C (xing2,hang2,hang4,xing4,heng2)\r\n884D (yan3)\r\n884E (kan4)\r\n884F (yuan4)\r\n8850 (none0)\r\n8851 (ling2)\r\n8852 (xuan4)\r\n8853 (shu4,zhu2)\r\n8854 (xian2)\r\n8855 (tong4)\r\n8856 (long4)\r\n8857 (jie1)\r\n8858 (xian2)\r\n8859 (ya2)\r\n885A (hu2)\r\n885B (wei4)\r\n885C (dao4)\r\n885D (chong1,chong4)\r\n885E (wei4)\r\n885F (dao4)\r\n8860 (zhun1)\r\n8861 (heng2)\r\n8862 (qu2)\r\n8863 (yi1,yi4,yi3)\r\n8864 (yi1)\r\n8865 (bu3)\r\n8866 (gan3)\r\n8867 (yu2)\r\n8868 (biao3)\r\n8869 (cha4,cha3)\r\n886A (yi2)\r\n886B (shan1)\r\n886C (chen4)\r\n886D (fu1)\r\n886E (gun3)\r\n886F (fen1)\r\n8870 (shuai1,cui1)\r\n8871 (jie2,ji2)\r\n8872 (na4)\r\n8873 (zhong1)\r\n8874 (dan3)\r\n8875 (ri4)\r\n8876 (zhong4)\r\n8877 (zhong1)\r\n8878 (xie4)\r\n8879 (qi2,zhi1)\r\n887A (xie2)\r\n887B (ran2)\r\n887C (zhi1)\r\n887D (ren4)\r\n887E (qin1)\r\n887F (jin1)\r\n8880 (jun1)\r\n8881 (yuan2)\r\n8882 (mei4)\r\n8883 (chai4)\r\n8884 (ao3)\r\n8885 (niao3)\r\n8886 (hui1)\r\n8887 (ran2)\r\n8888 (jia1)\r\n8889 (tuo2)\r\n888A (ling3)\r\n888B (dai4)\r\n888C (bao4)\r\n888D (pao2)\r\n888E (yao4)\r\n888F (zuo4)\r\n8890 (bi4)\r\n8891 (shao4)\r\n8892 (tan3)\r\n8893 (ju3)\r\n8894 (he4)\r\n8895 (xue4)\r\n8896 (xiu4)\r\n8897 (zhen3)\r\n8898 (yi2)\r\n8899 (pa4)\r\n889A (bo1,fu2)\r\n889B (di1)\r\n889C (wa4)\r\n889D (fu4)\r\n889E (gun3)\r\n889F (zhi4)\r\n88A0 (zhi4)\r\n88A1 (ran2)\r\n88A2 (pan4)\r\n88A3 (yi4)\r\n88A4 (mao4)\r\n88A5 (none0)\r\n88A6 (na4)\r\n88A7 (kou1)\r\n88A8 (xuan4)\r\n88A9 (chan1)\r\n88AA (qu1)\r\n88AB (bei4,pi1)\r\n88AC (yu4)\r\n88AD (xi2)\r\n88AE (none0)\r\n88AF (bo2)\r\n88B0 (none0)\r\n88B1 (fu2)\r\n88B2 (yi2)\r\n88B3 (chi3)\r\n88B4 (ku4)\r\n88B5 (ren4)\r\n88B6 (jiang4)\r\n88B7 (jia2,qia1)\r\n88B8 (cun2)\r\n88B9 (mo4)\r\n88BA (jie2)\r\n88BB (er2)\r\n88BC (ge1)\r\n88BD (ru2)\r\n88BE (zhu1)\r\n88BF (gui1)\r\n88C0 (yin1)\r\n88C1 (cai2)\r\n88C2 (lie4,lie3)\r\n88C3 (none0)\r\n88C4 (none0)\r\n88C5 (zhuang1)\r\n88C6 (dang1)\r\n88C7 (none0)\r\n88C8 (kun1)\r\n88C9 (ken4)\r\n88CA (niao3)\r\n88CB (shu4)\r\n88CC (jia2)\r\n88CD (kun3)\r\n88CE (cheng2,cheng3)\r\n88CF (li3)\r\n88D0 (juan1)\r\n88D1 (shen1)\r\n88D2 (pou2)\r\n88D3 (ge2)\r\n88D4 (yi4)\r\n88D5 (yu4)\r\n88D6 (chen3)\r\n88D7 (liu2)\r\n88D8 (qiu2)\r\n88D9 (qun2)\r\n88DA (ji4)\r\n88DB (yi4)\r\n88DC (bu3)\r\n88DD (zhuang1)\r\n88DE (shui4)\r\n88DF (sha1)\r\n88E0 (qun2)\r\n88E1 (li3)\r\n88E2 (lian2)\r\n88E3 (lian3)\r\n88E4 (ku4)\r\n88E5 (jian3)\r\n88E6 (fou2)\r\n88E7 (tan3)\r\n88E8 (bi4,pi2,bei1)\r\n88E9 (gun1)\r\n88EA (tao2)\r\n88EB (yuan1)\r\n88EC (ling2)\r\n88ED (chi3)\r\n88EE (chang1)\r\n88EF (chou2)\r\n88F0 (duo1)\r\n88F1 (biao3)\r\n88F2 (liang3)\r\n88F3 (shang5,chang2)\r\n88F4 (pei2)\r\n88F5 (pei2)\r\n88F6 (fei1)\r\n88F7 (yuan1)\r\n88F8 (luo3)\r\n88F9 (guo3)\r\n88FA (yan3)\r\n88FB (du3)\r\n88FC (ti4,xi1,xi2)\r\n88FD (zhi4)\r\n88FE (ju1)\r\n88FF (qi3)\r\n8900 (ji4)\r\n8901 (zhi2)\r\n8902 (gua4)\r\n8903 (ken4)\r\n8904 (none0)\r\n8905 (ti4)\r\n8906 (shi4)\r\n8907 (fu4)\r\n8908 (chong2)\r\n8909 (xie1)\r\n890A (bian3)\r\n890B (die2)\r\n890C (kun1,hui1)\r\n890D (duan1)\r\n890E (xiu4)\r\n890F (xiu4)\r\n8910 (he4,he2)\r\n8911 (yuan4)\r\n8912 (bao1)\r\n8913 (bao3)\r\n8914 (fu4)\r\n8915 (yu2)\r\n8916 (tuan4)\r\n8917 (yan3)\r\n8918 (hui1)\r\n8919 (bei4)\r\n891A (chu3,zhu3)\r\n891B (lu:3)\r\n891C (none0)\r\n891D (none0)\r\n891E (yun3)\r\n891F (ta1)\r\n8920 (gou1)\r\n8921 (da1)\r\n8922 (huai2)\r\n8923 (rong2)\r\n8924 (yuan4)\r\n8925 (ru4)\r\n8926 (nai4)\r\n8927 (jiong3)\r\n8928 (suo3)\r\n8929 (ban1)\r\n892A (tun4,tui4)\r\n892B (chi3)\r\n892C (sang3)\r\n892D (niao3)\r\n892E (ying1)\r\n892F (jie4)\r\n8930 (qian1)\r\n8931 (huai2)\r\n8932 (ku4)\r\n8933 (lian2)\r\n8934 (lan2)\r\n8935 (li2)\r\n8936 (zhe3,zhe2,xi2)\r\n8937 (shi1)\r\n8938 (lu:3)\r\n8939 (yi4)\r\n893A (die1)\r\n893B (xie4)\r\n893C (xian1)\r\n893D (wei4)\r\n893E (biao3)\r\n893F (cao2)\r\n8940 (ji1)\r\n8941 (qiang3)\r\n8942 (sen1)\r\n8943 (bao1)\r\n8944 (xiang1)\r\n8945 (none0)\r\n8946 (pu2)\r\n8947 (jian3)\r\n8948 (zhuan4)\r\n8949 (jian4)\r\n894A (zui4)\r\n894B (ji2)\r\n894C (dan1)\r\n894D (za2)\r\n894E (fan2)\r\n894F (bo1)\r\n8950 (xiang4)\r\n8951 (xin2)\r\n8952 (bie2,bi4)\r\n8953 (rao2)\r\n8954 (man3)\r\n8955 (lan2)\r\n8956 (ao3)\r\n8957 (duo2)\r\n8958 (hui4)\r\n8959 (cao4)\r\n895A (sui4)\r\n895B (nong2)\r\n895C (chan1)\r\n895D (lian4,lian3)\r\n895E (bi4)\r\n895F (jin1)\r\n8960 (dang1)\r\n8961 (shu2)\r\n8962 (tan3)\r\n8963 (bi4)\r\n8964 (lan2)\r\n8965 (pu2)\r\n8966 (ru2)\r\n8967 (zhi3)\r\n8968 (none0)\r\n8969 (shu3)\r\n896A (wa4)\r\n896B (shi4)\r\n896C (bai3)\r\n896D (xie2)\r\n896E (bo2)\r\n896F (chen4)\r\n8970 (lai3)\r\n8971 (long2)\r\n8972 (xi2)\r\n8973 (xian1)\r\n8974 (lan2)\r\n8975 (zhe2)\r\n8976 (dai4)\r\n8977 (none0)\r\n8978 (zan4)\r\n8979 (shi1)\r\n897A (jian3)\r\n897B (pan4)\r\n897C (yi4)\r\n897D (none0)\r\n897E (ya4)\r\n897F (xi1)\r\n8980 (xi1)\r\n8981 (yao4,yao1)\r\n8982 (feng3)\r\n8983 (tan2,qin2)\r\n8984 (none0)\r\n8985 (none0)\r\n8986 (fu4)\r\n8987 (ba4)\r\n8988 (he2)\r\n8989 (ji1)\r\n898A (ji1)\r\n898B (jian4,xian4)\r\n898C (guan1)\r\n898D (bian4)\r\n898E (yan4)\r\n898F (gui1)\r\n8990 (jue2,jiao4)\r\n8991 (pian3)\r\n8992 (mao2)\r\n8993 (mi4)\r\n8994 (mi4)\r\n8995 (mie4)\r\n8996 (shi4)\r\n8997 (si1)\r\n8998 (zhan1,chan1)\r\n8999 (luo2)\r\n899A (jue2,jiao4)\r\n899B (mo4)\r\n899C (tiao4)\r\n899D (lian2)\r\n899E (yao4)\r\n899F (zhi4)\r\n89A0 (jun1)\r\n89A1 (xi2)\r\n89A2 (shan3)\r\n89A3 (wei1)\r\n89A4 (xi4)\r\n89A5 (tian3)\r\n89A6 (yu2)\r\n89A7 (lan3)\r\n89A8 (e4)\r\n89A9 (du3)\r\n89AA (qin1,qing4)\r\n89AB (pang3)\r\n89AC (ji4)\r\n89AD (ming2)\r\n89AE (ping1)\r\n89AF (gou4)\r\n89B0 (qu4,qu1)\r\n89B1 (zhan4)\r\n89B2 (jin3,jin4)\r\n89B3 (guan1,guan4)\r\n89B4 (deng1)\r\n89B5 (jian4)\r\n89B6 (luo2)\r\n89B7 (qu4,qu1)\r\n89B8 (jian4)\r\n89B9 (wei2)\r\n89BA (jue2,jiao4)\r\n89BB (qu4)\r\n89BC (luo2)\r\n89BD (lan3)\r\n89BE (shen3)\r\n89BF (di2)\r\n89C0 (guan1,guan4)\r\n89C1 (jian4,xian4)\r\n89C2 (guan1,guan4)\r\n89C3 (yan4)\r\n89C4 (gui1)\r\n89C5 (mi4)\r\n89C6 (shi4)\r\n89C7 (chan1)\r\n89C8 (lan3)\r\n89C9 (jue2,jiao4)\r\n89CA (ji4)\r\n89CB (xi2)\r\n89CC (di2)\r\n89CD (tian3)\r\n89CE (yu2)\r\n89CF (gou4)\r\n89D0 (jin4)\r\n89D1 (qu4,qu1)\r\n89D2 (jiao3,jue2,jia3)\r\n89D3 (jiu1)\r\n89D4 (jin1)\r\n89D5 (cu1)\r\n89D6 (jue2)\r\n89D7 (zhi4)\r\n89D8 (chao4)\r\n89D9 (ji2)\r\n89DA (gu1)\r\n89DB (dan4)\r\n89DC (zui3,zi1)\r\n89DD (di3)\r\n89DE (shang1)\r\n89DF (hua4)\r\n89E0 (quan2)\r\n89E1 (ge2)\r\n89E2 (zhi4)\r\n89E3 (jie3,jie4,xie4)\r\n89E4 (gui3)\r\n89E5 (gong1)\r\n89E6 (chu4)\r\n89E7 (jie3,jie4,xie4)\r\n89E8 (huan4)\r\n89E9 (qiu2)\r\n89EA (xing1)\r\n89EB (su4)\r\n89EC (ni2)\r\n89ED (ji1)\r\n89EE (lu4)\r\n89EF (zhi4)\r\n89F0 (zhu1)\r\n89F1 (bi4)\r\n89F2 (xing1)\r\n89F3 (hu2)\r\n89F4 (shang1)\r\n89F5 (gong1)\r\n89F6 (zhi4)\r\n89F7 (xue2)\r\n89F8 (chu4)\r\n89F9 (xi1)\r\n89FA (yi2)\r\n89FB (li4)\r\n89FC (jue2)\r\n89FD (xi1)\r\n89FE (yan4)\r\n89FF (xi1)\r\n8A00 (yan2)\r\n8A01 (yan2)\r\n8A02 (ding4)\r\n8A03 (fu4)\r\n8A04 (qiu2)\r\n8A05 (qiu2)\r\n8A06 (jiao4)\r\n8A07 (hong1)\r\n8A08 (ji4)\r\n8A09 (fan4)\r\n8A0A (xun4)\r\n8A0B (diao4)\r\n8A0C (hong2,hong4)\r\n8A0D (cha4)\r\n8A0E (tao3)\r\n8A0F (xu1)\r\n8A10 (jie2)\r\n8A11 (yi2)\r\n8A12 (ren4)\r\n8A13 (xun4)\r\n8A14 (yin2)\r\n8A15 (shan4)\r\n8A16 (qi4)\r\n8A17 (tuo1)\r\n8A18 (ji4)\r\n8A19 (xun4)\r\n8A1A (yin2)\r\n8A1B (e2)\r\n8A1C (fen1)\r\n8A1D (ya4)\r\n8A1E (yao1)\r\n8A1F (song4)\r\n8A20 (shen3)\r\n8A21 (yin2)\r\n8A22 (xin1)\r\n8A23 (jue2)\r\n8A24 (xiao2)\r\n8A25 (ne4,na4)\r\n8A26 (chen2)\r\n8A27 (you2)\r\n8A28 (zhi3)\r\n8A29 (xiong1)\r\n8A2A (fang3)\r\n8A2B (xin4)\r\n8A2C (chao1)\r\n8A2D (she4)\r\n8A2E (xian1)\r\n8A2F (sa3)\r\n8A30 (zhun1)\r\n8A31 (xu3,hu3)\r\n8A32 (yi4)\r\n8A33 (yi4)\r\n8A34 (su4)\r\n8A35 (chi1)\r\n8A36 (he1)\r\n8A37 (shen1)\r\n8A38 (he2)\r\n8A39 (xu4)\r\n8A3A (zhen3,zhen1)\r\n8A3B (zhu4)\r\n8A3C (zheng4)\r\n8A3D (gou4)\r\n8A3E (zi3,zi1)\r\n8A3F (zi3)\r\n8A40 (zhan1)\r\n8A41 (gu3)\r\n8A42 (fu4)\r\n8A43 (jian3)\r\n8A44 (die2)\r\n8A45 (ling2)\r\n8A46 (di3)\r\n8A47 (yang4)\r\n8A48 (li4)\r\n8A49 (nao2)\r\n8A4A (pan4)\r\n8A4B (zhou4)\r\n8A4C (gan4)\r\n8A4D (shi4)\r\n8A4E (ju4)\r\n8A4F (ao4)\r\n8A50 (zha4)\r\n8A51 (tuo1)\r\n8A52 (yi2)\r\n8A53 (qu3)\r\n8A54 (zhao4)\r\n8A55 (ping2)\r\n8A56 (bi4)\r\n8A57 (xiong4)\r\n8A58 (chu4,qu1)\r\n8A59 (ba2)\r\n8A5A (da2)\r\n8A5B (zu3)\r\n8A5C (tao1)\r\n8A5D (zhu3)\r\n8A5E (ci2)\r\n8A5F (zhe2)\r\n8A60 (yong3)\r\n8A61 (xu3)\r\n8A62 (xun2)\r\n8A63 (yi4)\r\n8A64 (huang3)\r\n8A65 (he2)\r\n8A66 (shi4)\r\n8A67 (cha2)\r\n8A68 (jiao1)\r\n8A69 (shi1)\r\n8A6A (hen3)\r\n8A6B (cha4)\r\n8A6C (gou4)\r\n8A6D (gui3)\r\n8A6E (quan2)\r\n8A6F (hui4)\r\n8A70 (jie2)\r\n8A71 (hua4)\r\n8A72 (gai1)\r\n8A73 (xiang2)\r\n8A74 (hui4)\r\n8A75 (shen1)\r\n8A76 (chou2)\r\n8A77 (tong2)\r\n8A78 (mi2)\r\n8A79 (zhan1)\r\n8A7A (ming2)\r\n8A7B (e4)\r\n8A7C (hui1)\r\n8A7D (yan2)\r\n8A7E (xiong1)\r\n8A7F (gua4)\r\n8A80 (er4)\r\n8A81 (beng3)\r\n8A82 (tiao3,diao4)\r\n8A83 (chi3)\r\n8A84 (lei3)\r\n8A85 (zhu1)\r\n8A86 (kuang1)\r\n8A87 (kua1)\r\n8A88 (wu2)\r\n8A89 (yu4)\r\n8A8A (teng2)\r\n8A8B (ji4)\r\n8A8C (zhi4)\r\n8A8D (ren4)\r\n8A8E (su4)\r\n8A8F (lang3)\r\n8A90 (e2)\r\n8A91 (kuang2)\r\n8A92 (e^1,e^2,e^3,e^4)\r\n8A93 (shi4)\r\n8A94 (ting3)\r\n8A95 (dan4)\r\n8A96 (bei4)\r\n8A97 (chan2)\r\n8A98 (you4)\r\n8A99 (heng2)\r\n8A9A (qiao4)\r\n8A9B (qin1)\r\n8A9C (shua4)\r\n8A9D (an1)\r\n8A9E (yu3,yu4)\r\n8A9F (xiao4)\r\n8AA0 (cheng2)\r\n8AA1 (jie4)\r\n8AA2 (xian4)\r\n8AA3 (wu1,wu2)\r\n8AA4 (wu4)\r\n8AA5 (gao4)\r\n8AA6 (song4)\r\n8AA7 (pu3)\r\n8AA8 (hui4,hui3)\r\n8AA9 (jing4)\r\n8AAA (shuo1,shui4,yue4)\r\n8AAB (zhen4)\r\n8AAC (shuo1,shui4,yue4)\r\n8AAD (du2,dou4)\r\n8AAE (none0)\r\n8AAF (chang4)\r\n8AB0 (shui2,shei2)\r\n8AB1 (jie2)\r\n8AB2 (ke4)\r\n8AB3 (qu1)\r\n8AB4 (cong2)\r\n8AB5 (xiao2)\r\n8AB6 (sui4)\r\n8AB7 (wang3)\r\n8AB8 (xuan2)\r\n8AB9 (fei3)\r\n8ABA (chi1)\r\n8ABB (ta4)\r\n8ABC (yi2,yi4)\r\n8ABD (na2)\r\n8ABE (yin2)\r\n8ABF (diao4,tiao2)\r\n8AC0 (pi3)\r\n8AC1 (chuo4)\r\n8AC2 (chan3)\r\n8AC3 (chen1)\r\n8AC4 (zhun1)\r\n8AC5 (ji1)\r\n8AC6 (qi1)\r\n8AC7 (tan2)\r\n8AC8 (chui4)\r\n8AC9 (wei3)\r\n8ACA (ju1)\r\n8ACB (qing3)\r\n8ACC (jian4)\r\n8ACD (zheng1,zheng4)\r\n8ACE (ze2)\r\n8ACF (zou1)\r\n8AD0 (qian1)\r\n8AD1 (zhuo2)\r\n8AD2 (liang4)\r\n8AD3 (jian4)\r\n8AD4 (zhu4)\r\n8AD5 (hao2)\r\n8AD6 (lun4,lun2)\r\n8AD7 (shen3)\r\n8AD8 (biao3)\r\n8AD9 (huai4)\r\n8ADA (pian2)\r\n8ADB (yu2)\r\n8ADC (die2)\r\n8ADD (xu3)\r\n8ADE (pian2,pian3)\r\n8ADF (shi4)\r\n8AE0 (xuan1)\r\n8AE1 (shi4)\r\n8AE2 (hun4)\r\n8AE3 (hua4)\r\n8AE4 (e4)\r\n8AE5 (zhong4)\r\n8AE6 (di4)\r\n8AE7 (xie2)\r\n8AE8 (fu2)\r\n8AE9 (pu3)\r\n8AEA (ting2)\r\n8AEB (jian4)\r\n8AEC (qi3)\r\n8AED (yu4)\r\n8AEE (zi1)\r\n8AEF (chuan2)\r\n8AF0 (xi3)\r\n8AF1 (hui4)\r\n8AF2 (yin1)\r\n8AF3 (an1)\r\n8AF4 (xian2)\r\n8AF5 (nan2)\r\n8AF6 (chen2)\r\n8AF7 (feng1,feng3,feng4)\r\n8AF8 (zhu1)\r\n8AF9 (yang2)\r\n8AFA (yan4)\r\n8AFB (heng1,heng2)\r\n8AFC (xuan1)\r\n8AFD (ge2)\r\n8AFE (nuo4)\r\n8AFF (qi4)\r\n8B00 (mou2)\r\n8B01 (ye4)\r\n8B02 (wei4)\r\n8B03 (none0)\r\n8B04 (teng2)\r\n8B05 (zou1,zhou1)\r\n8B06 (shan4)\r\n8B07 (jian3)\r\n8B08 (bo2)\r\n8B09 (none0)\r\n8B0A (huang3)\r\n8B0B (huo4)\r\n8B0C (ge1)\r\n8B0D (ying2)\r\n8B0E (mi2,mei4)\r\n8B0F (xiao3,sou3)\r\n8B10 (mi4)\r\n8B11 (xi4)\r\n8B12 (qiang1)\r\n8B13 (chen1)\r\n8B14 (nu:e4,xue4)\r\n8B15 (si1)\r\n8B16 (su4)\r\n8B17 (bang4)\r\n8B18 (chi2)\r\n8B19 (qian1)\r\n8B1A (shi4,yi4)\r\n8B1B (jiang3)\r\n8B1C (yuan4)\r\n8B1D (xie4)\r\n8B1E (xue4)\r\n8B1F (tao1)\r\n8B20 (yao2)\r\n8B21 (yao2)\r\n8B22 (hu4)\r\n8B23 (yu2)\r\n8B24 (biao1)\r\n8B25 (cong4)\r\n8B26 (qing3,qing4)\r\n8B27 (li2)\r\n8B28 (mo2)\r\n8B29 (mo4)\r\n8B2A (shang1)\r\n8B2B (zhe2)\r\n8B2C (miu4)\r\n8B2D (jian3)\r\n8B2E (ze2)\r\n8B2F (zha1)\r\n8B30 (lian2)\r\n8B31 (lou2)\r\n8B32 (can1)\r\n8B33 (ou1)\r\n8B34 (guan4)\r\n8B35 (xi2)\r\n8B36 (zhuo2)\r\n8B37 (ao2)\r\n8B38 (ao2)\r\n8B39 (jin3)\r\n8B3A (zhe2)\r\n8B3B (yi2)\r\n8B3C (hu1)\r\n8B3D (jiang4)\r\n8B3E (man2,man4)\r\n8B3F (chao2)\r\n8B40 (han4)\r\n8B41 (hua2)\r\n8B42 (chan3)\r\n8B43 (xu1)\r\n8B44 (zeng1)\r\n8B45 (se4)\r\n8B46 (xi1)\r\n8B47 (she1)\r\n8B48 (dui4)\r\n8B49 (zheng4)\r\n8B4A (nao2)\r\n8B4B (lan2)\r\n8B4C (e2)\r\n8B4D (ying4)\r\n8B4E (jue2)\r\n8B4F (ji1)\r\n8B50 (zun3)\r\n8B51 (jiao3)\r\n8B52 (bo4)\r\n8B53 (hui4)\r\n8B54 (zhuan4)\r\n8B55 (wu2)\r\n8B56 (jian4,zen4)\r\n8B57 (zha2)\r\n8B58 (shi4,zhi4)\r\n8B59 (qiao2,qiao4)\r\n8B5A (tan2)\r\n8B5B (zen4)\r\n8B5C (pu3)\r\n8B5D (sheng2)\r\n8B5E (xuan1)\r\n8B5F (zao4)\r\n8B60 (zhan1)\r\n8B61 (dang3)\r\n8B62 (sui4)\r\n8B63 (qian1)\r\n8B64 (ji1)\r\n8B65 (jiao4)\r\n8B66 (jing3)\r\n8B67 (lian2)\r\n8B68 (nou4)\r\n8B69 (yi1)\r\n8B6A (ai4)\r\n8B6B (zhan1)\r\n8B6C (pi4)\r\n8B6D (hui3)\r\n8B6E (hua4)\r\n8B6F (yi4)\r\n8B70 (yi4)\r\n8B71 (shan4)\r\n8B72 (rang4)\r\n8B73 (nou4)\r\n8B74 (qian3)\r\n8B75 (zhui4)\r\n8B76 (ta4)\r\n8B77 (hu4)\r\n8B78 (zhou1)\r\n8B79 (hao2)\r\n8B7A (ni3)\r\n8B7B (ying1)\r\n8B7C (jian4,jian1)\r\n8B7D (yu4)\r\n8B7E (jian3)\r\n8B7F (hui4)\r\n8B80 (du2,dou4)\r\n8B81 (zhe2)\r\n8B82 (xuan4)\r\n8B83 (zan4)\r\n8B84 (lei3)\r\n8B85 (shen3)\r\n8B86 (wei4)\r\n8B87 (chan3)\r\n8B88 (li4)\r\n8B89 (yi2)\r\n8B8A (bian4)\r\n8B8B (zhe2)\r\n8B8C (yan4)\r\n8B8D (e4)\r\n8B8E (chou2)\r\n8B8F (wei4)\r\n8B90 (chou2)\r\n8B91 (yao4)\r\n8B92 (chan2)\r\n8B93 (rang4)\r\n8B94 (yin3)\r\n8B95 (lan2)\r\n8B96 (chen4)\r\n8B97 (huo4)\r\n8B98 (zhe2)\r\n8B99 (huan1)\r\n8B9A (zan4)\r\n8B9B (yi4)\r\n8B9C (dang3)\r\n8B9D (zhan1)\r\n8B9E (yan4)\r\n8B9F (du2)\r\n8BA0 (yan2)\r\n8BA1 (ji4)\r\n8BA2 (ding4)\r\n8BA3 (fu4)\r\n8BA4 (ren4)\r\n8BA5 (ji1)\r\n8BA6 (jie2)\r\n8BA7 (hong4)\r\n8BA8 (tao3)\r\n8BA9 (rang4)\r\n8BAA (shan4)\r\n8BAB (qi4)\r\n8BAC (tuo1)\r\n8BAD (xun4)\r\n8BAE (yi4)\r\n8BAF (xun4)\r\n8BB0 (ji4)\r\n8BB1 (ren4)\r\n8BB2 (jiang3)\r\n8BB3 (hui4)\r\n8BB4 (ou1)\r\n8BB5 (ju4)\r\n8BB6 (ya4)\r\n8BB7 (ne4)\r\n8BB8 (xu3)\r\n8BB9 (e2)\r\n8BBA (lun4,lun2)\r\n8BBB (xiong1)\r\n8BBC (song4)\r\n8BBD (feng3)\r\n8BBE (she4)\r\n8BBF (fang3)\r\n8BC0 (jue2)\r\n8BC1 (zheng4)\r\n8BC2 (gu3)\r\n8BC3 (he1)\r\n8BC4 (ping2)\r\n8BC5 (zu3)\r\n8BC6 (shi1,zhi4)\r\n8BC7 (xiong4)\r\n8BC8 (zha4)\r\n8BC9 (su4)\r\n8BCA (zhen3)\r\n8BCB (di3)\r\n8BCC (zhou1)\r\n8BCD (ci2)\r\n8BCE (qu1)\r\n8BCF (zhao4)\r\n8BD0 (bi4)\r\n8BD1 (yi4)\r\n8BD2 (yi2)\r\n8BD3 (kuang1)\r\n8BD4 (lei3)\r\n8BD5 (shi4)\r\n8BD6 (gua4)\r\n8BD7 (shi1)\r\n8BD8 (jie2,ji2)\r\n8BD9 (hui1)\r\n8BDA (cheng2)\r\n8BDB (zhu1)\r\n8BDC (shen1)\r\n8BDD (hua4)\r\n8BDE (dan4)\r\n8BDF (gou4)\r\n8BE0 (quan2)\r\n8BE1 (gui3)\r\n8BE2 (xun2)\r\n8BE3 (yi4)\r\n8BE4 (zheng4)\r\n8BE5 (gai1)\r\n8BE6 (xiang2)\r\n8BE7 (cha4)\r\n8BE8 (hun4)\r\n8BE9 (xu3)\r\n8BEA (zhou1)\r\n8BEB (jie4)\r\n8BEC (wu1)\r\n8BED (yu3,yu4)\r\n8BEE (qiao4)\r\n8BEF (wu4)\r\n8BF0 (gao4)\r\n8BF1 (you4)\r\n8BF2 (hui4)\r\n8BF3 (kuang2)\r\n8BF4 (shuo1,shui4,yue4)\r\n8BF5 (song4)\r\n8BF6 (ei4,ei2,ei3,ai3,e^1,e^2,e^3,e^4)\r\n8BF7 (qing3)\r\n8BF8 (zhu1)\r\n8BF9 (zou1)\r\n8BFA (nuo4)\r\n8BFB (du2,dou4)\r\n8BFC (zhuo2)\r\n8BFD (fei3)\r\n8BFE (ke4)\r\n8BFF (wei3)\r\n8C00 (yu2)\r\n8C01 (shei2,shui2)\r\n8C02 (shen3)\r\n8C03 (diao4,tiao2)\r\n8C04 (chan3)\r\n8C05 (liang4)\r\n8C06 (zhun1)\r\n8C07 (sui4)\r\n8C08 (tan2)\r\n8C09 (shen3)\r\n8C0A (yi4)\r\n8C0B (mou2)\r\n8C0C (chen2)\r\n8C0D (die2)\r\n8C0E (huang3)\r\n8C0F (jian4)\r\n8C10 (xie2)\r\n8C11 (xue4)\r\n8C12 (ye4)\r\n8C13 (wei4)\r\n8C14 (e4)\r\n8C15 (yu4)\r\n8C16 (xuan1)\r\n8C17 (chan2)\r\n8C18 (zi1)\r\n8C19 (an1)\r\n8C1A (yan4)\r\n8C1B (di4)\r\n8C1C (mi2,mei4)\r\n8C1D (pian3)\r\n8C1E (xu3)\r\n8C1F (mo2)\r\n8C20 (dang3)\r\n8C21 (su4)\r\n8C22 (xie4)\r\n8C23 (yao2)\r\n8C24 (bang4)\r\n8C25 (shi4)\r\n8C26 (qian1)\r\n8C27 (mi4)\r\n8C28 (jin3)\r\n8C29 (man2,man4)\r\n8C2A (zhe2)\r\n8C2B (jian3)\r\n8C2C (miu4)\r\n8C2D (tan2)\r\n8C2E (jian4,zen4)\r\n8C2F (qiao2,qiao4)\r\n8C30 (lan2)\r\n8C31 (pu3)\r\n8C32 (jue2)\r\n8C33 (yan4)\r\n8C34 (qian3)\r\n8C35 (zhan1)\r\n8C36 (chen4)\r\n8C37 (gu3,yu4)\r\n8C38 (qian1)\r\n8C39 (hong2)\r\n8C3A (ya2)\r\n8C3B (jue2)\r\n8C3C (hong2)\r\n8C3D (han1)\r\n8C3E (hong1)\r\n8C3F (qi1,xi1)\r\n8C40 (xi1)\r\n8C41 (huo4,huo1,hua2)\r\n8C42 (liao2)\r\n8C43 (han3)\r\n8C44 (du2)\r\n8C45 (long2)\r\n8C46 (dou4)\r\n8C47 (jiang1)\r\n8C48 (qi3,kai3)\r\n8C49 (chi3)\r\n8C4A (feng1,li3)\r\n8C4B (deng1)\r\n8C4C (wan1)\r\n8C4D (bi1)\r\n8C4E (shu4)\r\n8C4F (xian4)\r\n8C50 (feng1)\r\n8C51 (zhi4)\r\n8C52 (zhi4)\r\n8C53 (yan4)\r\n8C54 (yan4)\r\n8C55 (shi3)\r\n8C56 (chu4)\r\n8C57 (hui1)\r\n8C58 (tun2)\r\n8C59 (yi4)\r\n8C5A (tun2)\r\n8C5B (yi4)\r\n8C5C (jian1)\r\n8C5D (ba1)\r\n8C5E (hou4)\r\n8C5F (e4)\r\n8C60 (cu2)\r\n8C61 (xiang4)\r\n8C62 (huan4)\r\n8C63 (jian1)\r\n8C64 (ken3)\r\n8C65 (gai1)\r\n8C66 (qu2)\r\n8C67 (fu1)\r\n8C68 (xi1)\r\n8C69 (bin1)\r\n8C6A (hao2)\r\n8C6B (yu4)\r\n8C6C (zhu1)\r\n8C6D (jia1)\r\n8C6E (fen2)\r\n8C6F (xi1)\r\n8C70 (hu4)\r\n8C71 (wen1)\r\n8C72 (huan2)\r\n8C73 (bin1)\r\n8C74 (di2)\r\n8C75 (zong1)\r\n8C76 (fen2)\r\n8C77 (yi4)\r\n8C78 (zhi4)\r\n8C79 (bao4)\r\n8C7A (chai2)\r\n8C7B (han4,an4)\r\n8C7C (pi2)\r\n8C7D (na4)\r\n8C7E (pi1)\r\n8C7F (gou3)\r\n8C80 (duo4)\r\n8C81 (you4)\r\n8C82 (diao1)\r\n8C83 (mo4)\r\n8C84 (si4)\r\n8C85 (xiu1)\r\n8C86 (huan2)\r\n8C87 (kun1)\r\n8C88 (he2)\r\n8C89 (he2,hao2,mo4)\r\n8C8A (mo4)\r\n8C8B (an4)\r\n8C8C (mao4)\r\n8C8D (li2)\r\n8C8E (ni2)\r\n8C8F (bi3)\r\n8C90 (yu3)\r\n8C91 (jia1)\r\n8C92 (tuan1)\r\n8C93 (mao1)\r\n8C94 (pi2)\r\n8C95 (xi1)\r\n8C96 (e4)\r\n8C97 (ju4)\r\n8C98 (mo4)\r\n8C99 (chu1)\r\n8C9A (tan2)\r\n8C9B (huan1)\r\n8C9C (qu2)\r\n8C9D (bei4)\r\n8C9E (zhen1)\r\n8C9F (yuan2,yun2,yun4)\r\n8CA0 (fu4)\r\n8CA1 (cai2)\r\n8CA2 (gong4)\r\n8CA3 (te4)\r\n8CA4 (yi2)\r\n8CA5 (hang2)\r\n8CA6 (wan4)\r\n8CA7 (pin2)\r\n8CA8 (huo4)\r\n8CA9 (fan4)\r\n8CAA (tan1)\r\n8CAB (guan4)\r\n8CAC (ze2,zhai4)\r\n8CAD (zhi4)\r\n8CAE (er4)\r\n8CAF (zhu3,zhu4)\r\n8CB0 (shi4)\r\n8CB1 (bi4)\r\n8CB2 (zi1)\r\n8CB3 (er4)\r\n8CB4 (gui4)\r\n8CB5 (pian1)\r\n8CB6 (bian3)\r\n8CB7 (mai3)\r\n8CB8 (dai4)\r\n8CB9 (sheng4)\r\n8CBA (kuang4)\r\n8CBB (fei4)\r\n8CBC (tie1)\r\n8CBD (yi2)\r\n8CBE (chi2,chi1)\r\n8CBF (mao4)\r\n8CC0 (he4)\r\n8CC1 (bi4,ben1)\r\n8CC2 (lu4)\r\n8CC3 (lin4,ren4)\r\n8CC4 (hui4,hui3)\r\n8CC5 (gai1)\r\n8CC6 (pian2)\r\n8CC7 (zi1)\r\n8CC8 (jia3,gu3,jia4)\r\n8CC9 (xu4)\r\n8CCA (zei2,ze2)\r\n8CCB (jiao3)\r\n8CCC (gai1)\r\n8CCD (zang1)\r\n8CCE (jian4)\r\n8CCF (ying4)\r\n8CD0 (xun4)\r\n8CD1 (zhen4)\r\n8CD2 (she1)\r\n8CD3 (bin1)\r\n8CD4 (bin1)\r\n8CD5 (qiu2)\r\n8CD6 (she1)\r\n8CD7 (chuan4)\r\n8CD8 (zang1)\r\n8CD9 (zhou1)\r\n8CDA (lai4)\r\n8CDB (zan4)\r\n8CDC (si4,ci4)\r\n8CDD (chen1)\r\n8CDE (shang3)\r\n8CDF (tian3)\r\n8CE0 (pei2)\r\n8CE1 (geng1)\r\n8CE2 (xian2)\r\n8CE3 (mai4)\r\n8CE4 (jian4)\r\n8CE5 (sui4)\r\n8CE6 (fu4)\r\n8CE7 (dan3)\r\n8CE8 (cong2)\r\n8CE9 (cong2)\r\n8CEA (zhi2,zhi4)\r\n8CEB (ji1)\r\n8CEC (zhang4)\r\n8CED (du3)\r\n8CEE (jin4)\r\n8CEF (xiong1)\r\n8CF0 (shun3)\r\n8CF1 (yun3)\r\n8CF2 (bao3)\r\n8CF3 (zai1)\r\n8CF4 (lai4)\r\n8CF5 (feng4)\r\n8CF6 (cang4)\r\n8CF7 (ji1)\r\n8CF8 (sheng4)\r\n8CF9 (ai4)\r\n8CFA (zhuan4,zuan4)\r\n8CFB (fu4)\r\n8CFC (gou4)\r\n8CFD (sai4)\r\n8CFE (ze2)\r\n8CFF (liao2)\r\n8D00 (wei4)\r\n8D01 (bai4)\r\n8D02 (chen3)\r\n8D03 (zhuan4)\r\n8D04 (zhi4)\r\n8D05 (zhui4)\r\n8D06 (biao1)\r\n8D07 (yun1)\r\n8D08 (zeng4)\r\n8D09 (tan3)\r\n8D0A (zan4)\r\n8D0B (yan4)\r\n8D0C (none0)\r\n8D0D (shan4)\r\n8D0E (wan4)\r\n8D0F (ying2)\r\n8D10 (jin4)\r\n8D11 (gan3)\r\n8D12 (xian2)\r\n8D13 (zang1)\r\n8D14 (bi4)\r\n8D15 (du2)\r\n8D16 (shu2)\r\n8D17 (yan4)\r\n8D18 (none0)\r\n8D19 (xuan4)\r\n8D1A (long4)\r\n8D1B (gan4)\r\n8D1C (zang1)\r\n8D1D (bei4)\r\n8D1E (zhen1)\r\n8D1F (fu4)\r\n8D20 (yuan2,yun2,yun4)\r\n8D21 (gong4)\r\n8D22 (cai2)\r\n8D23 (ze2)\r\n8D24 (xian2)\r\n8D25 (bai4)\r\n8D26 (zhang4)\r\n8D27 (huo4)\r\n8D28 (zhi4)\r\n8D29 (fan4)\r\n8D2A (tan1)\r\n8D2B (pin2)\r\n8D2C (bian3)\r\n8D2D (gou4)\r\n8D2E (zhu4)\r\n8D2F (guan4)\r\n8D30 (er4)\r\n8D31 (jian4)\r\n8D32 (bi4,ben1)\r\n8D33 (shi4)\r\n8D34 (tie1)\r\n8D35 (gui4)\r\n8D36 (kuang4)\r\n8D37 (dai4)\r\n8D38 (mao4)\r\n8D39 (fei4)\r\n8D3A (he4)\r\n8D3B (yi2)\r\n8D3C (zei2)\r\n8D3D (zhi4)\r\n8D3E (jia3,gu3)\r\n8D3F (hui4)\r\n8D40 (zi1)\r\n8D41 (lin4)\r\n8D42 (lu4)\r\n8D43 (zang1)\r\n8D44 (zi1)\r\n8D45 (gai1)\r\n8D46 (jin4)\r\n8D47 (qiu2)\r\n8D48 (zhen4)\r\n8D49 (lai4)\r\n8D4A (she1)\r\n8D4B (fu4)\r\n8D4C (du3)\r\n8D4D (ji1)\r\n8D4E (shu2)\r\n8D4F (shang3)\r\n8D50 (ci4)\r\n8D51 (bi4)\r\n8D52 (zhou1)\r\n8D53 (geng1)\r\n8D54 (pei2)\r\n8D55 (dan3)\r\n8D56 (lai4)\r\n8D57 (feng4)\r\n8D58 (zhui4)\r\n8D59 (fu4)\r\n8D5A (zhuan4,zuan4)\r\n8D5B (sai4)\r\n8D5C (ze2)\r\n8D5D (yan4)\r\n8D5E (zan4)\r\n8D5F (yun1)\r\n8D60 (zeng4)\r\n8D61 (shan4)\r\n8D62 (ying2)\r\n8D63 (gan4)\r\n8D64 (chi4)\r\n8D65 (xi1)\r\n8D66 (she4)\r\n8D67 (nan3)\r\n8D68 (xiong2)\r\n8D69 (xi4)\r\n8D6A (cheng1)\r\n8D6B (he4)\r\n8D6C (cheng1)\r\n8D6D (zhe3)\r\n8D6E (xia2)\r\n8D6F (tang2)\r\n8D70 (zou3)\r\n8D71 (zou3)\r\n8D72 (li4)\r\n8D73 (jiu1,jiu3)\r\n8D74 (fu4)\r\n8D75 (zhao4)\r\n8D76 (gan3)\r\n8D77 (qi3)\r\n8D78 (shan4)\r\n8D79 (qiong2)\r\n8D7A (qin2)\r\n8D7B (xian3)\r\n8D7C (ci1)\r\n8D7D (jue2)\r\n8D7E (qin3)\r\n8D7F (chi2)\r\n8D80 (ci1)\r\n8D81 (chen4)\r\n8D82 (chen4)\r\n8D83 (die2)\r\n8D84 (ju1,qie4,qie5,ju4)\r\n8D85 (chao1)\r\n8D86 (di1)\r\n8D87 (se4)\r\n8D88 (zhan1)\r\n8D89 (zhu2)\r\n8D8A (yue4)\r\n8D8B (qu1)\r\n8D8C (jie2)\r\n8D8D (chi2)\r\n8D8E (chu2)\r\n8D8F (gua1)\r\n8D90 (xue4)\r\n8D91 (zi1)\r\n8D92 (tiao2)\r\n8D93 (duo3)\r\n8D94 (lie4)\r\n8D95 (gan3)\r\n8D96 (suo1)\r\n8D97 (cu4)\r\n8D98 (xi2)\r\n8D99 (zhao4)\r\n8D9A (su4)\r\n8D9B (yin3)\r\n8D9C (ju2)\r\n8D9D (jian4)\r\n8D9E (que4)\r\n8D9F (tang4,tang1)\r\n8DA0 (chuo4)\r\n8DA1 (cui3)\r\n8DA2 (lu4)\r\n8DA3 (qu4,cu4)\r\n8DA4 (dang4)\r\n8DA5 (qiu1)\r\n8DA6 (zi1)\r\n8DA7 (ti2)\r\n8DA8 (qu1,cu4)\r\n8DA9 (chi4)\r\n8DAA (huang2)\r\n8DAB (qiao2)\r\n8DAC (qiao1)\r\n8DAD (yao4)\r\n8DAE (zao4)\r\n8DAF (yue4)\r\n8DB0 (none0)\r\n8DB1 (zan3)\r\n8DB2 (zan3,zan4)\r\n8DB3 (zu2,ju4)\r\n8DB4 (pa1)\r\n8DB5 (bao4,bo1)\r\n8DB6 (ku4)\r\n8DB7 (he2)\r\n8DB8 (dun3)\r\n8DB9 (jue2)\r\n8DBA (fu1)\r\n8DBB (chen3)\r\n8DBC (jian3)\r\n8DBD (fang4)\r\n8DBE (zhi3)\r\n8DBF (ta1)\r\n8DC0 (yue4)\r\n8DC1 (pa2)\r\n8DC2 (qi2)\r\n8DC3 (yue4)\r\n8DC4 (qiang1,qiang4)\r\n8DC5 (tuo4)\r\n8DC6 (tai2)\r\n8DC7 (yi4)\r\n8DC8 (nian3)\r\n8DC9 (ling2)\r\n8DCA (mei4)\r\n8DCB (ba2)\r\n8DCC (die1,die2)\r\n8DCD (ku1)\r\n8DCE (tuo2)\r\n8DCF (jia1)\r\n8DD0 (ci3)\r\n8DD1 (pao3,pao2)\r\n8DD2 (qia3)\r\n8DD3 (zhu4)\r\n8DD4 (ju1)\r\n8DD5 (die2)\r\n8DD6 (zhi2,zhi1)\r\n8DD7 (fu1)\r\n8DD8 (pan2)\r\n8DD9 (ju3)\r\n8DDA (shan1)\r\n8DDB (bo3)\r\n8DDC (ni2)\r\n8DDD (ju4)\r\n8DDE (li4,luo4)\r\n8DDF (gen1)\r\n8DE0 (yi2)\r\n8DE1 (ji1)\r\n8DE2 (dai4)\r\n8DE3 (xian3)\r\n8DE4 (jiao1)\r\n8DE5 (duo4)\r\n8DE6 (chu2)\r\n8DE7 (quan2)\r\n8DE8 (kua4)\r\n8DE9 (zhuai3,shi4)\r\n8DEA (gui4)\r\n8DEB (qiong2)\r\n8DEC (kui3)\r\n8DED (xiang2)\r\n8DEE (chi4)\r\n8DEF (lu4)\r\n8DF0 (beng4)\r\n8DF1 (zhi4)\r\n8DF2 (jia2)\r\n8DF3 (tiao4)\r\n8DF4 (cai3)\r\n8DF5 (jian4)\r\n8DF6 (da5)\r\n8DF7 (qiao1)\r\n8DF8 (bi4)\r\n8DF9 (xian1)\r\n8DFA (duo4)\r\n8DFB (ji1)\r\n8DFC (ju2)\r\n8DFD (ji4)\r\n8DFE (shu2)\r\n8DFF (tu2)\r\n8E00 (chu4)\r\n8E01 (xing4)\r\n8E02 (nie4)\r\n8E03 (xiao1)\r\n8E04 (bo2)\r\n8E05 (xue2)\r\n8E06 (qun1)\r\n8E07 (mou3)\r\n8E08 (shu1)\r\n8E09 (liang4,liang2)\r\n8E0A (yong3)\r\n8E0B (jiao3,jia3,jue2)\r\n8E0C (chou2)\r\n8E0D (xiao4)\r\n8E0E (none0)\r\n8E0F (ta4,ta1)\r\n8E10 (jian4)\r\n8E11 (qi2)\r\n8E12 (wo1)\r\n8E13 (wei3)\r\n8E14 (chuo1)\r\n8E15 (jie2)\r\n8E16 (ji2)\r\n8E17 (nie1)\r\n8E18 (ju2)\r\n8E19 (ju1)\r\n8E1A (lun2)\r\n8E1B (lu4)\r\n8E1C (leng4)\r\n8E1D (huai2)\r\n8E1E (ju4)\r\n8E1F (chi2)\r\n8E20 (wan4)\r\n8E21 (quan2)\r\n8E22 (ti1)\r\n8E23 (bo2)\r\n8E24 (zu2)\r\n8E25 (qie4)\r\n8E26 (qi1)\r\n8E27 (cu4)\r\n8E28 (zong1)\r\n8E29 (cai3)\r\n8E2A (zong1)\r\n8E2B (pan2)\r\n8E2C (zhi4)\r\n8E2D (zheng1)\r\n8E2E (dian3,die1)\r\n8E2F (zhi2)\r\n8E30 (yu2)\r\n8E31 (duo2)\r\n8E32 (dun4)\r\n8E33 (chun3)\r\n8E34 (yong3)\r\n8E35 (zhong3)\r\n8E36 (di4)\r\n8E37 (zha3)\r\n8E38 (chen3)\r\n8E39 (chuai4)\r\n8E3A (jian4)\r\n8E3B (gua1)\r\n8E3C (tang2)\r\n8E3D (ju3)\r\n8E3E (fu2)\r\n8E3F (zu2)\r\n8E40 (die2)\r\n8E41 (pian2)\r\n8E42 (rou2)\r\n8E43 (nuo4)\r\n8E44 (ti2)\r\n8E45 (cha3)\r\n8E46 (tui3)\r\n8E47 (jian3)\r\n8E48 (dao3)\r\n8E49 (cuo1)\r\n8E4A (xi1,qi1)\r\n8E4B (ta4)\r\n8E4C (qiang1,qiang4)\r\n8E4D (zhan3)\r\n8E4E (dian1)\r\n8E4F (ti2)\r\n8E50 (ji2)\r\n8E51 (nie4)\r\n8E52 (pan2)\r\n8E53 (liu4)\r\n8E54 (zhan4)\r\n8E55 (bi4)\r\n8E56 (chong1)\r\n8E57 (lu4)\r\n8E58 (liao2)\r\n8E59 (cu4)\r\n8E5A (tang1)\r\n8E5B (dai4)\r\n8E5C (su4)\r\n8E5D (xi3)\r\n8E5E (kui3)\r\n8E5F (ji1)\r\n8E60 (zhi2)\r\n8E61 (qiang1)\r\n8E62 (di2,zhi2)\r\n8E63 (man2,pan2)\r\n8E64 (zong1)\r\n8E65 (lian2)\r\n8E66 (beng4)\r\n8E67 (zao1)\r\n8E68 (nian3)\r\n8E69 (bie2)\r\n8E6A (tui2)\r\n8E6B (ju2)\r\n8E6C (deng4,deng1)\r\n8E6D (ceng4)\r\n8E6E (xian1)\r\n8E6F (fan2)\r\n8E70 (chu2)\r\n8E71 (zhong1)\r\n8E72 (dun1,cun2)\r\n8E73 (bo1)\r\n8E74 (cu4)\r\n8E75 (zu2)\r\n8E76 (jue2,jue3)\r\n8E77 (jue2)\r\n8E78 (lin2)\r\n8E79 (ta4)\r\n8E7A (qiao1)\r\n8E7B (qiao1)\r\n8E7C (pu3,pu2)\r\n8E7D (liao1)\r\n8E7E (dun1)\r\n8E7F (cuan1)\r\n8E80 (kuang4)\r\n8E81 (zao4)\r\n8E82 (ta4)\r\n8E83 (bi4)\r\n8E84 (bi4)\r\n8E85 (zhu2)\r\n8E86 (ju4)\r\n8E87 (chu2)\r\n8E88 (qiao4)\r\n8E89 (dun3)\r\n8E8A (chou2)\r\n8E8B (ji1,ji4)\r\n8E8C (wu3)\r\n8E8D (yue4)\r\n8E8E (nian3)\r\n8E8F (lin4)\r\n8E90 (lie4)\r\n8E91 (zhi2)\r\n8E92 (li4)\r\n8E93 (zhi4)\r\n8E94 (chan2)\r\n8E95 (chu2)\r\n8E96 (duan4)\r\n8E97 (wei4)\r\n8E98 (long2)\r\n8E99 (lin4)\r\n8E9A (xian1)\r\n8E9B (wei4)\r\n8E9C (zuan1)\r\n8E9D (lan2)\r\n8E9E (xie4)\r\n8E9F (rang2)\r\n8EA0 (xie4)\r\n8EA1 (nie4)\r\n8EA2 (ta4)\r\n8EA3 (qu2)\r\n8EA4 (jie4)\r\n8EA5 (cuan1)\r\n8EA6 (zuan1)\r\n8EA7 (xi3)\r\n8EA8 (kui2)\r\n8EA9 (jue2)\r\n8EAA (lin4)\r\n8EAB (shen1,juan1)\r\n8EAC (gong1)\r\n8EAD (dan1)\r\n8EAE (none0)\r\n8EAF (qu1)\r\n8EB0 (ti3)\r\n8EB1 (duo3)\r\n8EB2 (duo3)\r\n8EB3 (gong1)\r\n8EB4 (lang2)\r\n8EB5 (none0)\r\n8EB6 (luo3)\r\n8EB7 (ai3)\r\n8EB8 (ji1)\r\n8EB9 (ju2)\r\n8EBA (tang3)\r\n8EBB (none0)\r\n8EBC (none0)\r\n8EBD (yan3)\r\n8EBE (none0)\r\n8EBF (kang1)\r\n8EC0 (qu1)\r\n8EC1 (lou2)\r\n8EC2 (lao4)\r\n8EC3 (duo3)\r\n8EC4 (zhi2)\r\n8EC5 (none0)\r\n8EC6 (ti3)\r\n8EC7 (dao4)\r\n8EC8 (none0)\r\n8EC9 (yu4)\r\n8ECA (che1,ju1)\r\n8ECB (ya4,zha2,ga2)\r\n8ECC (gui3)\r\n8ECD (jun1)\r\n8ECE (wei4)\r\n8ECF (yue4)\r\n8ED0 (xin4)\r\n8ED1 (di4)\r\n8ED2 (xuan1)\r\n8ED3 (fan4)\r\n8ED4 (ren4)\r\n8ED5 (shan1)\r\n8ED6 (qiang2)\r\n8ED7 (shu1)\r\n8ED8 (tun2)\r\n8ED9 (chen2)\r\n8EDA (dai4)\r\n8EDB (e4)\r\n8EDC (na4)\r\n8EDD (qi2)\r\n8EDE (mao2)\r\n8EDF (ruan3)\r\n8EE0 (ren4)\r\n8EE1 (qian2)\r\n8EE2 (zhuan3,zhuai3,zhuan4)\r\n8EE3 (hong1)\r\n8EE4 (hu1)\r\n8EE5 (qu2)\r\n8EE6 (huang4)\r\n8EE7 (di3)\r\n8EE8 (ling2)\r\n8EE9 (dai4)\r\n8EEA (ao1)\r\n8EEB (zhen3)\r\n8EEC (fan4)\r\n8EED (kuang1)\r\n8EEE (ang3)\r\n8EEF (peng1)\r\n8EF0 (bei4)\r\n8EF1 (gu1)\r\n8EF2 (gu1)\r\n8EF3 (pao2)\r\n8EF4 (zhu4)\r\n8EF5 (rong3,fu3)\r\n8EF6 (e4)\r\n8EF7 (ba2)\r\n8EF8 (zhou2,zhou4,zhu2)\r\n8EF9 (zhi3)\r\n8EFA (yao2)\r\n8EFB (ke1,ke3)\r\n8EFC (yi4)\r\n8EFD (qing1)\r\n8EFE (shi4)\r\n8EFF (ping2)\r\n8F00 (er2)\r\n8F01 (qiong2)\r\n8F02 (ju2)\r\n8F03 (jiao4,jiao3)\r\n8F04 (guang1)\r\n8F05 (lu4)\r\n8F06 (kai3)\r\n8F07 (quan2)\r\n8F08 (zhou1)\r\n8F09 (zai4,zai3)\r\n8F0A (zhi4)\r\n8F0B (ju1)\r\n8F0C (liang4)\r\n8F0D (yu4)\r\n8F0E (shao1)\r\n8F0F (you2)\r\n8F10 (huan3)\r\n8F11 (yun3)\r\n8F12 (zhe2)\r\n8F13 (wan3)\r\n8F14 (fu3)\r\n8F15 (qing1)\r\n8F16 (zhou1)\r\n8F17 (ni2)\r\n8F18 (ling2)\r\n8F19 (zhe2)\r\n8F1A (zhan4)\r\n8F1B (liang4)\r\n8F1C (zi1)\r\n8F1D (hui1)\r\n8F1E (wang3)\r\n8F1F (chuo4)\r\n8F20 (guo3)\r\n8F21 (kan3)\r\n8F22 (yi3)\r\n8F23 (peng2)\r\n8F24 (qian4)\r\n8F25 (gun3)\r\n8F26 (nian3)\r\n8F27 (ping2)\r\n8F28 (guan3)\r\n8F29 (bei4)\r\n8F2A (lun2)\r\n8F2B (pai2)\r\n8F2C (liang2)\r\n8F2D (ruan3)\r\n8F2E (rou2)\r\n8F2F (ji2)\r\n8F30 (yang2)\r\n8F31 (xian2)\r\n8F32 (chuan2)\r\n8F33 (cou4)\r\n8F34 (chun1)\r\n8F35 (ge2)\r\n8F36 (you2)\r\n8F37 (hong1)\r\n8F38 (shu1)\r\n8F39 (fu4)\r\n8F3A (zi1)\r\n8F3B (fu2)\r\n8F3C (wen1)\r\n8F3D (ben4)\r\n8F3E (zhan3)\r\n8F3F (yu2)\r\n8F40 (wen1)\r\n8F41 (tao1)\r\n8F42 (gu3,gu1)\r\n8F43 (zhen1)\r\n8F44 (xia2)\r\n8F45 (yuan2)\r\n8F46 (lu4)\r\n8F47 (jiu1)\r\n8F48 (chao2)\r\n8F49 (zhuan3,zhuai3,zhuan4)\r\n8F4A (wei4)\r\n8F4B (hun2)\r\n8F4C (none0)\r\n8F4D (che4,zhe2)\r\n8F4E (jiao4)\r\n8F4F (zhan4)\r\n8F50 (pu2)\r\n8F51 (lao3)\r\n8F52 (fen2)\r\n8F53 (fan1)\r\n8F54 (lin2)\r\n8F55 (ge2)\r\n8F56 (se4)\r\n8F57 (kan3)\r\n8F58 (huan4)\r\n8F59 (yi3)\r\n8F5A (ji2)\r\n8F5B (dui4)\r\n8F5C (er2)\r\n8F5D (yu2)\r\n8F5E (xian4)\r\n8F5F (hong1)\r\n8F60 (lei2)\r\n8F61 (pei4)\r\n8F62 (li4)\r\n8F63 (li4)\r\n8F64 (lu2)\r\n8F65 (lin2)\r\n8F66 (che1,ju1)\r\n8F67 (ya4,zha2,ga2)\r\n8F68 (gui3)\r\n8F69 (xuan1)\r\n8F6A (dai4)\r\n8F6B (ren4)\r\n8F6C (zhuan3,zhuan4,zhuai3)\r\n8F6D (e4)\r\n8F6E (lun2)\r\n8F6F (ruan3)\r\n8F70 (hong1)\r\n8F71 (gu1)\r\n8F72 (ke1,ke3)\r\n8F73 (lu2,lu5)\r\n8F74 (zhou2,zhou4)\r\n8F75 (zhi3)\r\n8F76 (yi4)\r\n8F77 (hu1)\r\n8F78 (zhen3)\r\n8F79 (li4)\r\n8F7A (yao2)\r\n8F7B (qing1)\r\n8F7C (shi4)\r\n8F7D (zai3,zai4)\r\n8F7E (zhi4)\r\n8F7F (jiao4)\r\n8F80 (zhou1)\r\n8F81 (quan2)\r\n8F82 (lu4)\r\n8F83 (jiao4)\r\n8F84 (zhe2)\r\n8F85 (fu3)\r\n8F86 (liang4)\r\n8F87 (nian3)\r\n8F88 (bei4)\r\n8F89 (hui1)\r\n8F8A (gun3)\r\n8F8B (wang3)\r\n8F8C (liang2)\r\n8F8D (chuo4)\r\n8F8E (zi1)\r\n8F8F (cou4)\r\n8F90 (fu2)\r\n8F91 (ji2,ji5)\r\n8F92 (wen1)\r\n8F93 (shu1)\r\n8F94 (pei4)\r\n8F95 (yuan2)\r\n8F96 (xia2)\r\n8F97 (zhan3)\r\n8F98 (lu4)\r\n8F99 (zhe2)\r\n8F9A (lin2)\r\n8F9B (xin1)\r\n8F9C (gu1)\r\n8F9D (ci2)\r\n8F9E (ci2)\r\n8F9F (pi4,bi4,pi1)\r\n8FA0 (zui4)\r\n8FA1 (bian4)\r\n8FA2 (la4)\r\n8FA3 (la4)\r\n8FA4 (ci2)\r\n8FA5 (xue1)\r\n8FA6 (ban4)\r\n8FA7 (bian4)\r\n8FA8 (bian4)\r\n8FA9 (bian4)\r\n8FAA (none0)\r\n8FAB (bian4)\r\n8FAC (ban1)\r\n8FAD (ci2)\r\n8FAE (bian4)\r\n8FAF (bian4)\r\n8FB0 (chen2)\r\n8FB1 (ru3,ru4)\r\n8FB2 (nong2)\r\n8FB3 (nong2)\r\n8FB4 (zhen3)\r\n8FB5 (chuo4)\r\n8FB6 (chuo4)\r\n8FB7 (none0)\r\n8FB8 (reng2)\r\n8FB9 (bian1,bian5)\r\n8FBA (bian1)\r\n8FBB (none0)\r\n8FBC (none0)\r\n8FBD (liao2)\r\n8FBE (da2)\r\n8FBF (chan1)\r\n8FC0 (gan1)\r\n8FC1 (qian1)\r\n8FC2 (yu1)\r\n8FC3 (yu1)\r\n8FC4 (qi4)\r\n8FC5 (xun4)\r\n8FC6 (yi3,yi2)\r\n8FC7 (guo4,guo1)\r\n8FC8 (mai4)\r\n8FC9 (qi2)\r\n8FCA (za1)\r\n8FCB (wang4)\r\n8FCC (none0)\r\n8FCD (zhun1)\r\n8FCE (ying2)\r\n8FCF (ti4)\r\n8FD0 (yun4)\r\n8FD1 (jin4)\r\n8FD2 (hang2)\r\n8FD3 (ya4)\r\n8FD4 (fan3)\r\n8FD5 (wu3)\r\n8FD6 (ta4)\r\n8FD7 (e2)\r\n8FD8 (hai2,huan2)\r\n8FD9 (zhei4,zhe4)\r\n8FDA (none0)\r\n8FDB (jin4)\r\n8FDC (yuan3)\r\n8FDD (wei2)\r\n8FDE (lian2)\r\n8FDF (chi2)\r\n8FE0 (che4)\r\n8FE1 (ni4)\r\n8FE2 (tiao2)\r\n8FE3 (zhi4)\r\n8FE4 (yi3,yi2)\r\n8FE5 (jiong3)\r\n8FE6 (jia1)\r\n8FE7 (chen2)\r\n8FE8 (dai4)\r\n8FE9 (er3)\r\n8FEA (di2)\r\n8FEB (po4,pai3)\r\n8FEC (wang3)\r\n8FED (die2)\r\n8FEE (ze2)\r\n8FEF (tao2)\r\n8FF0 (shu4)\r\n8FF1 (tuo2)\r\n8FF2 (none0)\r\n8FF3 (jing4)\r\n8FF4 (hui2)\r\n8FF5 (tong2)\r\n8FF6 (you4)\r\n8FF7 (mi2)\r\n8FF8 (beng4)\r\n8FF9 (ji1,ji4)\r\n8FFA (nai3)\r\n8FFB (yi2)\r\n8FFC (jie2)\r\n8FFD (zhui1)\r\n8FFE (lie4)\r\n8FFF (xun4)\r\n9000 (tui4)\r\n9001 (song4)\r\n9002 (shi4,kuo4)\r\n9003 (tao2)\r\n9004 (pang2)\r\n9005 (hou4)\r\n9006 (ni4)\r\n9007 (dun4)\r\n9008 (jiong3)\r\n9009 (xuan3)\r\n900A (xun4)\r\n900B (bu1)\r\n900C (you2)\r\n900D (xiao1)\r\n900E (qiu2)\r\n900F (tou4)\r\n9010 (zhu2)\r\n9011 (qiu2)\r\n9012 (di4)\r\n9013 (di4)\r\n9014 (tu2)\r\n9015 (jing4)\r\n9016 (ti4)\r\n9017 (dou4)\r\n9018 (yi3)\r\n9019 (zhe4,zhei4)\r\n901A (tong1,tong4)\r\n901B (guang4)\r\n901C (wu4)\r\n901D (shi4)\r\n901E (cheng3)\r\n901F (su4)\r\n9020 (zao4)\r\n9021 (qun1)\r\n9022 (feng2)\r\n9023 (lian2)\r\n9024 (suo4)\r\n9025 (hui2)\r\n9026 (li3)\r\n9027 (none0)\r\n9028 (zui4)\r\n9029 (ben1)\r\n902A (cuo4)\r\n902B (jue2)\r\n902C (beng4)\r\n902D (huan4)\r\n902E (dai4,dai3)\r\n902F (lu4)\r\n9030 (you2)\r\n9031 (zhou1)\r\n9032 (jin4)\r\n9033 (yu4)\r\n9034 (chuo4)\r\n9035 (kui2)\r\n9036 (wei1)\r\n9037 (ti4)\r\n9038 (yi4)\r\n9039 (da2)\r\n903A (yuan3)\r\n903B (luo2)\r\n903C (bi1)\r\n903D (nuo4)\r\n903E (yu2)\r\n903F (dang4)\r\n9040 (sui2)\r\n9041 (dun4)\r\n9042 (sui4,sui2)\r\n9043 (yan3)\r\n9044 (chuan2)\r\n9045 (chi2)\r\n9046 (ti2)\r\n9047 (yu4)\r\n9048 (shi2)\r\n9049 (zhen1)\r\n904A (you2)\r\n904B (yun4)\r\n904C (e4)\r\n904D (bian4,pian4)\r\n904E (guo4,guo1)\r\n904F (e4)\r\n9050 (xia2)\r\n9051 (huang2)\r\n9052 (qiu2)\r\n9053 (dao4)\r\n9054 (da2)\r\n9055 (wei2)\r\n9056 (none0)\r\n9057 (yi2,wei4)\r\n9058 (gou4)\r\n9059 (yao2)\r\n905A (chu4)\r\n905B (liu2,liu4)\r\n905C (xun4)\r\n905D (ta4)\r\n905E (di4)\r\n905F (chi2)\r\n9060 (yuan3,yuan4)\r\n9061 (su4)\r\n9062 (ta4,ta1)\r\n9063 (qian3)\r\n9064 (none0)\r\n9065 (yao2)\r\n9066 (guan4)\r\n9067 (zhang1)\r\n9068 (ao2)\r\n9069 (shi4,kuo4)\r\n906A (ce4)\r\n906B (su4)\r\n906C (su4)\r\n906D (zao1)\r\n906E (zhe1,zhe5)\r\n906F (dun4)\r\n9070 (zhi4)\r\n9071 (lou2)\r\n9072 (chi2)\r\n9073 (cuo1)\r\n9074 (lin2)\r\n9075 (zun1)\r\n9076 (rao4)\r\n9077 (qian1)\r\n9078 (xuan3)\r\n9079 (yu4)\r\n907A (yi2,wei4)\r\n907B (wu4)\r\n907C (liao2)\r\n907D (ju4)\r\n907E (shi4)\r\n907F (bi4)\r\n9080 (yao1)\r\n9081 (mai4)\r\n9082 (xie4)\r\n9083 (sui4)\r\n9084 (huan2,hai2,xuan2)\r\n9085 (zhan1)\r\n9086 (deng4)\r\n9087 (er3)\r\n9088 (miao3)\r\n9089 (bian1)\r\n908A (bian1)\r\n908B (la1)\r\n908C (li2)\r\n908D (yuan2)\r\n908E (you2)\r\n908F (luo2)\r\n9090 (li3)\r\n9091 (yi4)\r\n9092 (ting2)\r\n9093 (deng4)\r\n9094 (qi3)\r\n9095 (yong1)\r\n9096 (shan1)\r\n9097 (han2)\r\n9098 (yu2)\r\n9099 (mang2)\r\n909A (ru2)\r\n909B (qiong2)\r\n909C (none0)\r\n909D (kuang4)\r\n909E (fu1)\r\n909F (kang4)\r\n90A0 (bin1)\r\n90A1 (fang1)\r\n90A2 (xing2)\r\n90A3 (nei4,na4,na1,na3)\r\n90A4 (none0)\r\n90A5 (shen3)\r\n90A6 (bang1)\r\n90A7 (yuan2)\r\n90A8 (cun1)\r\n90A9 (huo3)\r\n90AA (xie2,ye2)\r\n90AB (bang1)\r\n90AC (wu1)\r\n90AD (ju4)\r\n90AE (you2)\r\n90AF (han2)\r\n90B0 (tai2)\r\n90B1 (qiu1)\r\n90B2 (bi4)\r\n90B3 (pi1)\r\n90B4 (bing3)\r\n90B5 (shao4)\r\n90B6 (bei4)\r\n90B7 (wa3)\r\n90B8 (di3)\r\n90B9 (zou1)\r\n90BA (ye4)\r\n90BB (lin2)\r\n90BC (kuang1)\r\n90BD (gui1)\r\n90BE (zhu1)\r\n90BF (shi1)\r\n90C0 (ku1)\r\n90C1 (yu4)\r\n90C2 (gai1)\r\n90C3 (he2)\r\n90C4 (qie4)\r\n90C5 (zhi4)\r\n90C6 (ji2)\r\n90C7 (xun2,huan2)\r\n90C8 (hou4)\r\n90C9 (xing2)\r\n90CA (jiao1)\r\n90CB (xi1)\r\n90CC (gui1)\r\n90CD (nuo2)\r\n90CE (lang2,lang4)\r\n90CF (jia2)\r\n90D0 (kuai4)\r\n90D1 (zheng4)\r\n90D2 (lang2,lang4)\r\n90D3 (yun4)\r\n90D4 (yan2)\r\n90D5 (cheng2)\r\n90D6 (dou1)\r\n90D7 (xi1)\r\n90D8 (lu:3)\r\n90D9 (fu3)\r\n90DA (wu2)\r\n90DB (fu2)\r\n90DC (gao4)\r\n90DD (hao3)\r\n90DE (lang2)\r\n90DF (jia2)\r\n90E0 (geng3)\r\n90E1 (jun4)\r\n90E2 (ying3)\r\n90E3 (bo2)\r\n90E4 (xi4)\r\n90E5 (bei4)\r\n90E6 (li4)\r\n90E7 (yun2)\r\n90E8 (bu4)\r\n90E9 (xiao2)\r\n90EA (qi1)\r\n90EB (pi2)\r\n90EC (qing1)\r\n90ED (guo1)\r\n90EE (none0)\r\n90EF (tan2)\r\n90F0 (zou1)\r\n90F1 (ping2)\r\n90F2 (lai2)\r\n90F3 (ni2)\r\n90F4 (chen1)\r\n90F5 (you2)\r\n90F6 (bu4)\r\n90F7 (xiang1)\r\n90F8 (dan1)\r\n90F9 (ju2)\r\n90FA (yong1)\r\n90FB (qiao1)\r\n90FC (yi1)\r\n90FD (dou1,du1)\r\n90FE (yan3)\r\n90FF (mei2)\r\n9100 (ruo4)\r\n9101 (bei4)\r\n9102 (e4)\r\n9103 (yu2)\r\n9104 (juan4)\r\n9105 (yu3)\r\n9106 (yun4)\r\n9107 (hou4)\r\n9108 (kui2)\r\n9109 (xiang1)\r\n910A (xiang1)\r\n910B (sou1)\r\n910C (tang2)\r\n910D (ming2)\r\n910E (xi4)\r\n910F (ru4)\r\n9110 (chu4)\r\n9111 (zi1)\r\n9112 (zou1)\r\n9113 (ju2)\r\n9114 (wu1)\r\n9115 (xiang1)\r\n9116 (yun2)\r\n9117 (hao4)\r\n9118 (yong1)\r\n9119 (bi3,bi4)\r\n911A (mao4)\r\n911B (chao2)\r\n911C (fu1)\r\n911D (liao3)\r\n911E (yin2)\r\n911F (zhuan1)\r\n9120 (hu4)\r\n9121 (qiao1)\r\n9122 (yan1)\r\n9123 (zhang1)\r\n9124 (fan4)\r\n9125 (wu3)\r\n9126 (xu3)\r\n9127 (deng4)\r\n9128 (bi4)\r\n9129 (xin2)\r\n912A (bi4)\r\n912B (ceng2)\r\n912C (wei2)\r\n912D (zheng4)\r\n912E (mao4)\r\n912F (shan4)\r\n9130 (lin2)\r\n9131 (po2)\r\n9132 (dan1)\r\n9133 (meng2)\r\n9134 (ye4)\r\n9135 (cao1)\r\n9136 (kuai4)\r\n9137 (feng1)\r\n9138 (meng2)\r\n9139 (zou1)\r\n913A (kuang4)\r\n913B (lian3)\r\n913C (zan4)\r\n913D (chan2)\r\n913E (you1)\r\n913F (qi2)\r\n9140 (yan1)\r\n9141 (chan2)\r\n9142 (cuo2)\r\n9143 (ling2)\r\n9144 (huan1)\r\n9145 (xi1)\r\n9146 (feng1)\r\n9147 (zan4)\r\n9148 (li4)\r\n9149 (you3)\r\n914A (ding3,ding1)\r\n914B (qiu2)\r\n914C (zhuo2)\r\n914D (pei4)\r\n914E (zhou4)\r\n914F (yi2,yi4,yi3)\r\n9150 (gan1)\r\n9151 (yu3)\r\n9152 (jiu3)\r\n9153 (yan3)\r\n9154 (zui4)\r\n9155 (mao2)\r\n9156 (dan1,zhen4)\r\n9157 (xu4)\r\n9158 (tou2)\r\n9159 (zhen1)\r\n915A (fen1)\r\n915B (none0)\r\n915C (none0)\r\n915D (yun4)\r\n915E (tai4)\r\n915F (tian1)\r\n9160 (qia3)\r\n9161 (tuo2)\r\n9162 (zuo4,cu4)\r\n9163 (han1)\r\n9164 (gu1)\r\n9165 (su1)\r\n9166 (fa1,po1)\r\n9167 (chou2)\r\n9168 (dai4)\r\n9169 (ming3,ming2)\r\n916A (lao4,luo4)\r\n916B (chuo4)\r\n916C (chou2)\r\n916D (you4)\r\n916E (tong2)\r\n916F (zhi3)\r\n9170 (xian1)\r\n9171 (jiang4)\r\n9172 (cheng2)\r\n9173 (yin4)\r\n9174 (tu2)\r\n9175 (jiao4,xiao4)\r\n9176 (mei2)\r\n9177 (ku4)\r\n9178 (suan1)\r\n9179 (lei4)\r\n917A (pu2)\r\n917B (zui4)\r\n917C (hai3)\r\n917D (yan4)\r\n917E (shi1,shai1)\r\n917F (niang4,nian4,niang2)\r\n9180 (wei2)\r\n9181 (lu4)\r\n9182 (lan3)\r\n9183 (yan1)\r\n9184 (tao2)\r\n9185 (pei1)\r\n9186 (zhan3)\r\n9187 (chun2)\r\n9188 (tan2)\r\n9189 (zui4)\r\n918A (chuo4)\r\n918B (cu4)\r\n918C (kun1)\r\n918D (ti2)\r\n918E (xian2)\r\n918F (du1)\r\n9190 (hu2)\r\n9191 (xu3)\r\n9192 (xing3)\r\n9193 (tan3)\r\n9194 (qiu2)\r\n9195 (chun2)\r\n9196 (yun4)\r\n9197 (fa1,po1)\r\n9198 (ke1)\r\n9199 (sou1)\r\n919A (mi2)\r\n919B (quan2)\r\n919C (chou3)\r\n919D (cuo2)\r\n919E (yun4)\r\n919F (yong4)\r\n91A0 (ang4)\r\n91A1 (zha4)\r\n91A2 (hai3)\r\n91A3 (tang2)\r\n91A4 (jiang4)\r\n91A5 (piao3)\r\n91A6 (lao2)\r\n91A7 (yu4)\r\n91A8 (li2)\r\n91A9 (zao2)\r\n91AA (lao2)\r\n91AB (yi1)\r\n91AC (jiang4)\r\n91AD (bu2)\r\n91AE (jiao4)\r\n91AF (xi1,xi4)\r\n91B0 (tan2)\r\n91B1 (fa1,po4)\r\n91B2 (nong2)\r\n91B3 (yi4)\r\n91B4 (li3)\r\n91B5 (ju4)\r\n91B6 (yan4)\r\n91B7 (yi4)\r\n91B8 (niang4)\r\n91B9 (ru2)\r\n91BA (xun1)\r\n91BB (chou2)\r\n91BC (yan4)\r\n91BD (ling2)\r\n91BE (mi2)\r\n91BF (mi2)\r\n91C0 (niang4)\r\n91C1 (xin4)\r\n91C2 (jiao4)\r\n91C3 (shi1)\r\n91C4 (mi2)\r\n91C5 (yan4)\r\n91C6 (bian4)\r\n91C7 (cai3,cai4)\r\n91C8 (shi4)\r\n91C9 (you4)\r\n91CA (shi4)\r\n91CB (shi4)\r\n91CC (li3,li5)\r\n91CD (zhong4,chong2)\r\n91CE (ye3)\r\n91CF (liang4,liang2,liang5)\r\n91D0 (li2,xi1)\r\n91D1 (jin1)\r\n91D2 (jin1)\r\n91D3 (ga2)\r\n91D4 (yi3)\r\n91D5 (liao3,liao4)\r\n91D6 (dao1)\r\n91D7 (zhao1)\r\n91D8 (ding1,ding4)\r\n91D9 (li4)\r\n91DA (qiu2)\r\n91DB (he2)\r\n91DC (fu3)\r\n91DD (zhen1)\r\n91DE (zhi2)\r\n91DF (ba1)\r\n91E0 (luan4)\r\n91E1 (fu3)\r\n91E2 (nai3)\r\n91E3 (diao4)\r\n91E4 (shan4,shan1)\r\n91E5 (qiao3)\r\n91E6 (kou4)\r\n91E7 (chuan4)\r\n91E8 (zi3)\r\n91E9 (fan2)\r\n91EA (yu2)\r\n91EB (hua2)\r\n91EC (han4)\r\n91ED (gong1,gang1)\r\n91EE (qi2)\r\n91EF (mang2)\r\n91F0 (jian4)\r\n91F1 (di4)\r\n91F2 (si4)\r\n91F3 (xi4)\r\n91F4 (yi4)\r\n91F5 (chai1)\r\n91F6 (ta1,tuo2)\r\n91F7 (tu3)\r\n91F8 (xi4)\r\n91F9 (nu:3)\r\n91FA (qian1)\r\n91FB (none0)\r\n91FC (jian4)\r\n91FD (pi1)\r\n91FE (ye2)\r\n91FF (yin2)\r\n9200 (ba3,pa2)\r\n9201 (fang1)\r\n9202 (chen2)\r\n9203 (jian1)\r\n9204 (tou3)\r\n9205 (yue4)\r\n9206 (yan2)\r\n9207 (fu1)\r\n9208 (bu4)\r\n9209 (na4)\r\n920A (xin1)\r\n920B (e2)\r\n920C (jue2)\r\n920D (dun4)\r\n920E (gou1)\r\n920F (yin3)\r\n9210 (qian2)\r\n9211 (ban3)\r\n9212 (ji2)\r\n9213 (ren2)\r\n9214 (chao1)\r\n9215 (niu3)\r\n9216 (fen1)\r\n9217 (yun3)\r\n9218 (yi2)\r\n9219 (qin2)\r\n921A (pi2)\r\n921B (guo1)\r\n921C (hong2)\r\n921D (yin2)\r\n921E (jun1)\r\n921F (shi1)\r\n9220 (yi4)\r\n9221 (zhong1)\r\n9222 (nie1)\r\n9223 (gai4)\r\n9224 (ri4)\r\n9225 (huo2,huo3)\r\n9226 (tai4)\r\n9227 (kang4)\r\n9228 (none0)\r\n9229 (lu2)\r\n922A (none0)\r\n922B (none0)\r\n922C (duo2)\r\n922D (zi1)\r\n922E (ni2)\r\n922F (tu2)\r\n9230 (shi4)\r\n9231 (min2)\r\n9232 (gu1)\r\n9233 (ke1)\r\n9234 (ling2)\r\n9235 (bing3)\r\n9236 (yi2)\r\n9237 (gu1,gu3)\r\n9238 (ba2)\r\n9239 (pi1,pi2)\r\n923A (yu4)\r\n923B (si4)\r\n923C (zuo2)\r\n923D (bu4,bu1)\r\n923E (you2)\r\n923F (dian4,tian2)\r\n9240 (jia3)\r\n9241 (zhen1)\r\n9242 (shi3)\r\n9243 (shi4)\r\n9244 (tie3)\r\n9245 (ju4)\r\n9246 (zhan1)\r\n9247 (ta1,tuo2)\r\n9248 (she2,tuo2,ta1)\r\n9249 (xuan4)\r\n924A (zhao1)\r\n924B (bao4)\r\n924C (he2)\r\n924D (bi4)\r\n924E (sheng1)\r\n924F (chu2)\r\n9250 (shi2)\r\n9251 (bo2)\r\n9252 (zhu4)\r\n9253 (chi4)\r\n9254 (za1)\r\n9255 (po3)\r\n9256 (tong2)\r\n9257 (qian2)\r\n9258 (fu2)\r\n9259 (zhai3)\r\n925A (liu3,mao3)\r\n925B (qian1,yan2)\r\n925C (fu2)\r\n925D (li4)\r\n925E (yue4)\r\n925F (pi1)\r\n9260 (yang1)\r\n9261 (ban4)\r\n9262 (bo1)\r\n9263 (jie2)\r\n9264 (gou1)\r\n9265 (shu4)\r\n9266 (zheng1)\r\n9267 (mu3)\r\n9268 (ni2)\r\n9269 (xi3)\r\n926A (di4)\r\n926B (jia1)\r\n926C (mu4)\r\n926D (tan3)\r\n926E (shen1)\r\n926F (yi3)\r\n9270 (si1)\r\n9271 (kuang4)\r\n9272 (ka1)\r\n9273 (bei3)\r\n9274 (jian4)\r\n9275 (tong2)\r\n9276 (xing2)\r\n9277 (hong2)\r\n9278 (jiao3,jia3)\r\n9279 (chi3)\r\n927A (er3)\r\n927B (ge4)\r\n927C (bing3)\r\n927D (shi4)\r\n927E (mou2)\r\n927F (jia2,ha1)\r\n9280 (yin2)\r\n9281 (jun1)\r\n9282 (zhou1)\r\n9283 (chong4)\r\n9284 (shang4)\r\n9285 (tong2)\r\n9286 (mo4)\r\n9287 (lei4)\r\n9288 (ji1)\r\n9289 (yu4)\r\n928A (xu4)\r\n928B (ren2)\r\n928C (cun4)\r\n928D (zhi4)\r\n928E (qiong2)\r\n928F (shan4)\r\n9290 (chi4)\r\n9291 (xian3,xi3)\r\n9292 (xing2)\r\n9293 (quan2)\r\n9294 (pi1)\r\n9295 (yi2)\r\n9296 (zhu1)\r\n9297 (hou2)\r\n9298 (ming2)\r\n9299 (kua3)\r\n929A (yao2,diao4,tiao2)\r\n929B (xian1)\r\n929C (xian2)\r\n929D (xiu1)\r\n929E (jun1)\r\n929F (cha1)\r\n92A0 (lao3)\r\n92A1 (ji2)\r\n92A2 (yong3)\r\n92A3 (ru2)\r\n92A4 (mi3)\r\n92A5 (yi1)\r\n92A6 (yin1)\r\n92A7 (guang1)\r\n92A8 (an1,an3)\r\n92A9 (diu1)\r\n92AA (you3)\r\n92AB (se4)\r\n92AC (kao4)\r\n92AD (qian2)\r\n92AE (luan2)\r\n92AF (none0)\r\n92B0 (ai1)\r\n92B1 (diao4)\r\n92B2 (han4)\r\n92B3 (rui4)\r\n92B4 (shi4)\r\n92B5 (keng1)\r\n92B6 (qiu2)\r\n92B7 (xiao1)\r\n92B8 (zhe2)\r\n92B9 (xiu4)\r\n92BA (zang4)\r\n92BB (ti4,ti1)\r\n92BC (cuo4)\r\n92BD (gua1)\r\n92BE (gong3)\r\n92BF (zhong1)\r\n92C0 (dou4)\r\n92C1 (lu:3)\r\n92C2 (mei2)\r\n92C3 (lang2)\r\n92C4 (wan3)\r\n92C5 (xin1)\r\n92C6 (yun2)\r\n92C7 (bei4)\r\n92C8 (wu4)\r\n92C9 (su4)\r\n92CA (yu4)\r\n92CB (chan2)\r\n92CC (ting3,ding4)\r\n92CD (bo2)\r\n92CE (han4)\r\n92CF (jia2)\r\n92D0 (hong2)\r\n92D1 (cuan1)\r\n92D2 (feng1)\r\n92D3 (chan1)\r\n92D4 (wan3)\r\n92D5 (zhi4)\r\n92D6 (si1)\r\n92D7 (xuan1)\r\n92D8 (wu2)\r\n92D9 (wu2)\r\n92DA (tiao2)\r\n92DB (gong3)\r\n92DC (zhuo2)\r\n92DD (lu:e4)\r\n92DE (xing2)\r\n92DF (qin3)\r\n92E0 (shen4)\r\n92E1 (han2)\r\n92E2 (none0)\r\n92E3 (ye2)\r\n92E4 (chu2)\r\n92E5 (zeng4)\r\n92E6 (ju2,ju1)\r\n92E7 (xian4)\r\n92E8 (e2)\r\n92E9 (mang2)\r\n92EA (pu1,pu4)\r\n92EB (li2)\r\n92EC (shi4)\r\n92ED (rui4)\r\n92EE (cheng2)\r\n92EF (gao4)\r\n92F0 (li3)\r\n92F1 (te4)\r\n92F2 (none0)\r\n92F3 (zhu4)\r\n92F4 (none0)\r\n92F5 (tu1)\r\n92F6 (liu3)\r\n92F7 (zui4)\r\n92F8 (ju4,ju1)\r\n92F9 (chang3)\r\n92FA (yuan1)\r\n92FB (jian4)\r\n92FC (gang1,gang4)\r\n92FD (diao4)\r\n92FE (tao2)\r\n92FF (chang2)\r\n9300 (lun2)\r\n9301 (guo3)\r\n9302 (ling2)\r\n9303 (bei1)\r\n9304 (lu4)\r\n9305 (li2)\r\n9306 (qing1,qiang1)\r\n9307 (pei2)\r\n9308 (juan3)\r\n9309 (min2)\r\n930A (zui4)\r\n930B (peng2)\r\n930C (an4)\r\n930D (pi2)\r\n930E (xian4)\r\n930F (ya4)\r\n9310 (zhui1)\r\n9311 (lei4)\r\n9312 (a1,e1)\r\n9313 (kong1)\r\n9314 (ta4)\r\n9315 (kun1)\r\n9316 (du3)\r\n9317 (wei4)\r\n9318 (chui2)\r\n9319 (zi1)\r\n931A (zheng1,zheng4)\r\n931B (ben1)\r\n931C (nie4)\r\n931D (cong2)\r\n931E (chun2)\r\n931F (tan2)\r\n9320 (ding4)\r\n9321 (qi2)\r\n9322 (qian2)\r\n9323 (zhuo2)\r\n9324 (qi2)\r\n9325 (yu4)\r\n9326 (jin3)\r\n9327 (guan3)\r\n9328 (mao2)\r\n9329 (chang1)\r\n932A (dian3)\r\n932B (xi2,xi1)\r\n932C (lian4)\r\n932D (tao2)\r\n932E (gu4)\r\n932F (cuo4,cu4)\r\n9330 (shu4)\r\n9331 (zhen1)\r\n9332 (lu4)\r\n9333 (meng3)\r\n9334 (lu4)\r\n9335 (hua1)\r\n9336 (biao3)\r\n9337 (ga2)\r\n9338 (lai2)\r\n9339 (ken3)\r\n933A (zhui4)\r\n933B (none0)\r\n933C (nai4)\r\n933D (wan3)\r\n933E (zan4)\r\n933F (none0)\r\n9340 (de2)\r\n9341 (xian1)\r\n9342 (none0)\r\n9343 (huo1)\r\n9344 (liang4)\r\n9345 (none0)\r\n9346 (men2)\r\n9347 (kai3)\r\n9348 (ying1)\r\n9349 (di1)\r\n934A (lian4)\r\n934B (guo1)\r\n934C (xian3)\r\n934D (du4)\r\n934E (tu2)\r\n934F (wei2)\r\n9350 (cong1)\r\n9351 (fu4)\r\n9352 (rou2)\r\n9353 (ji2)\r\n9354 (e4)\r\n9355 (rou3)\r\n9356 (chen3)\r\n9357 (ti2)\r\n9358 (zha2)\r\n9359 (hong4)\r\n935A (yang2)\r\n935B (duan4)\r\n935C (xia1)\r\n935D (yu2)\r\n935E (keng1)\r\n935F (xing1)\r\n9360 (huang2)\r\n9361 (wei3)\r\n9362 (fu4)\r\n9363 (zhao1)\r\n9364 (cha2,cha1)\r\n9365 (qie4)\r\n9366 (she2)\r\n9367 (hong1)\r\n9368 (kui2)\r\n9369 (nuo4)\r\n936A (mou2)\r\n936B (qiao1)\r\n936C (qiao1)\r\n936D (hou2)\r\n936E (zhen1)\r\n936F (huo1)\r\n9370 (huan2)\r\n9371 (ye4)\r\n9372 (min2)\r\n9373 (jian4)\r\n9374 (duan3)\r\n9375 (jian4)\r\n9376 (si1)\r\n9377 (kui1)\r\n9378 (hu2)\r\n9379 (xuan1)\r\n937A (zang1,zhe3)\r\n937B (jie2)\r\n937C (zhen1)\r\n937D (bian1)\r\n937E (zhong1)\r\n937F (zi1)\r\n9380 (xiu1)\r\n9381 (ye2)\r\n9382 (mei3)\r\n9383 (pai4)\r\n9384 (ai1)\r\n9385 (jie4)\r\n9386 (none0)\r\n9387 (mei2)\r\n9388 (cha1)\r\n9389 (ta4)\r\n938A (bang4)\r\n938B (xia2)\r\n938C (lian2)\r\n938D (suo3)\r\n938E (xi4)\r\n938F (liu2)\r\n9390 (zu2)\r\n9391 (ye4)\r\n9392 (nou4)\r\n9393 (weng1)\r\n9394 (rong2)\r\n9395 (tang2)\r\n9396 (suo3)\r\n9397 (qiang1)\r\n9398 (ge2)\r\n9399 (shuo4)\r\n939A (chui2)\r\n939B (bo2)\r\n939C (pan2)\r\n939D (ta3)\r\n939E (bi4)\r\n939F (sang3)\r\n93A0 (gang1)\r\n93A1 (zi1)\r\n93A2 (wu1)\r\n93A3 (ying4,ying2)\r\n93A4 (huang3)\r\n93A5 (tiao2)\r\n93A6 (liu2,liu4)\r\n93A7 (kai3)\r\n93A8 (sun3)\r\n93A9 (sha1)\r\n93AA (sou1)\r\n93AB (wan4)\r\n93AC (hao4,gao3)\r\n93AD (zhen4)\r\n93AE (zhen4)\r\n93AF (luo3)\r\n93B0 (yi4)\r\n93B1 (yuan2)\r\n93B2 (tang3)\r\n93B3 (nie4)\r\n93B4 (xi2)\r\n93B5 (jia1)\r\n93B6 (ge1)\r\n93B7 (ma3)\r\n93B8 (juan1)\r\n93B9 (rong2)\r\n93BA (none0)\r\n93BB (suo3)\r\n93BC (none0)\r\n93BD (none0)\r\n93BE (none0)\r\n93BF (na2)\r\n93C0 (lu3)\r\n93C1 (suo3)\r\n93C2 (kou1)\r\n93C3 (zu2,cu4)\r\n93C4 (tuan2)\r\n93C5 (xiu1)\r\n93C6 (guan4)\r\n93C7 (xuan4)\r\n93C8 (lian4)\r\n93C9 (shou4)\r\n93CA (ao4)\r\n93CB (man3)\r\n93CC (mo4)\r\n93CD (luo2)\r\n93CE (bi4)\r\n93CF (wei4)\r\n93D0 (liu2)\r\n93D1 (di2,di1)\r\n93D2 (qiao1)\r\n93D3 (huo1)\r\n93D4 (yin2)\r\n93D5 (lu4)\r\n93D6 (ao2)\r\n93D7 (keng1)\r\n93D8 (qiang1)\r\n93D9 (cui1)\r\n93DA (qi4)\r\n93DB (chang2)\r\n93DC (tang1,tang2)\r\n93DD (man4)\r\n93DE (yong1)\r\n93DF (chan3)\r\n93E0 (feng1)\r\n93E1 (jing4)\r\n93E2 (biao1)\r\n93E3 (shu4)\r\n93E4 (lou4)\r\n93E5 (xiu4)\r\n93E6 (cong1)\r\n93E7 (long2)\r\n93E8 (zan4)\r\n93E9 (jian4)\r\n93EA (cao2)\r\n93EB (li2)\r\n93EC (xia4)\r\n93ED (xi1)\r\n93EE (kang1)\r\n93EF (none0)\r\n93F0 (beng4)\r\n93F1 (none0)\r\n93F2 (none0)\r\n93F3 (zheng1)\r\n93F4 (lu4)\r\n93F5 (hua2)\r\n93F6 (ji2)\r\n93F7 (pu2)\r\n93F8 (hui4)\r\n93F9 (qiang1,qiang3)\r\n93FA (po1)\r\n93FB (lin2)\r\n93FC (suo3)\r\n93FD (xiu4)\r\n93FE (san3)\r\n93FF (cheng1)\r\n9400 (kui4)\r\n9401 (san3)\r\n9402 (liu4,liu2)\r\n9403 (nao2)\r\n9404 (huang2)\r\n9405 (pie3)\r\n9406 (sui4)\r\n9407 (fan2)\r\n9408 (qiao2)\r\n9409 (chuan1)\r\n940A (yang2)\r\n940B (tang4,tang1)\r\n940C (xiang4)\r\n940D (jue2)\r\n940E (jiao1)\r\n940F (zun1)\r\n9410 (liao2,liao4)\r\n9411 (jie2)\r\n9412 (lao2)\r\n9413 (dui4,dun1)\r\n9414 (tan2,chan2,xin2)\r\n9415 (zan1)\r\n9416 (ji1)\r\n9417 (jian3,jian4)\r\n9418 (zhong1)\r\n9419 (deng1,deng4)\r\n941A (lou4,lue2)\r\n941B (ying4)\r\n941C (dui4)\r\n941D (jue2)\r\n941E (nou4)\r\n941F (ti4)\r\n9420 (pu3)\r\n9421 (tie3)\r\n9422 (none0)\r\n9423 (none0)\r\n9424 (ding3)\r\n9425 (shan4)\r\n9426 (kai1)\r\n9427 (jian3,jian4)\r\n9428 (fei4)\r\n9429 (sui4)\r\n942A (lu3)\r\n942B (juan1)\r\n942C (hui4)\r\n942D (yu4)\r\n942E (lian2)\r\n942F (zhuo2)\r\n9430 (qiao1)\r\n9431 (qian1)\r\n9432 (zhuo2)\r\n9433 (lei2)\r\n9434 (bi4)\r\n9435 (tie3)\r\n9436 (huan2)\r\n9437 (ye4)\r\n9438 (duo2)\r\n9439 (guo3)\r\n943A (dang1,cheng1)\r\n943B (ju4)\r\n943C (fen2)\r\n943D (da2)\r\n943E (bei4)\r\n943F (yi4)\r\n9440 (ai4)\r\n9441 (dang1,zheng1)\r\n9442 (xun4)\r\n9443 (diao4,yao2)\r\n9444 (zhu4)\r\n9445 (heng2)\r\n9446 (zhui4)\r\n9447 (ji1)\r\n9448 (nie1)\r\n9449 (ta4)\r\n944A (huo4)\r\n944B (qing4)\r\n944C (bin1)\r\n944D (ying1)\r\n944E (kui4)\r\n944F (ning2)\r\n9450 (xu1)\r\n9451 (jian4)\r\n9452 (jian4)\r\n9453 (qiang1)\r\n9454 (cha3)\r\n9455 (zhi4)\r\n9456 (mie4)\r\n9457 (li2)\r\n9458 (lei2)\r\n9459 (ji1)\r\n945A (zuan4,zuan1)\r\n945B (kuang4)\r\n945C (shang3)\r\n945D (peng2)\r\n945E (la4)\r\n945F (du2)\r\n9460 (shuo4)\r\n9461 (chuo4)\r\n9462 (lu:4)\r\n9463 (biao1)\r\n9464 (bao4)\r\n9465 (lu3)\r\n9466 (none0)\r\n9467 (none0)\r\n9468 (long2)\r\n9469 (e4)\r\n946A (lu2)\r\n946B (xin1)\r\n946C (jian4)\r\n946D (lan4,lan2)\r\n946E (bo2)\r\n946F (jian1)\r\n9470 (yao4,yue4)\r\n9471 (chan2)\r\n9472 (xiang1)\r\n9473 (jian4)\r\n9474 (xi4)\r\n9475 (guan4)\r\n9476 (cang2)\r\n9477 (nie4)\r\n9478 (lei3)\r\n9479 (cuan1)\r\n947A (qu2)\r\n947B (pan4)\r\n947C (luo2)\r\n947D (zuan4,zuan1,zuan3)\r\n947E (luan2)\r\n947F (zao2,zuo4)\r\n9480 (nie4)\r\n9481 (jue2)\r\n9482 (tang3)\r\n9483 (shu3)\r\n9484 (lan2)\r\n9485 (jin1)\r\n9486 (ga2)\r\n9487 (yi3)\r\n9488 (zhen1)\r\n9489 (ding1,ding4)\r\n948A (zhao1)\r\n948B (po1)\r\n948C (liao3,liao4)\r\n948D (tu3)\r\n948E (qian1)\r\n948F (chuan4)\r\n9490 (shan4,shan1)\r\n9491 (sa4)\r\n9492 (fan2)\r\n9493 (diao4)\r\n9494 (men2)\r\n9495 (nu:3)\r\n9496 (yang2)\r\n9497 (chai1)\r\n9498 (xing2)\r\n9499 (gai4)\r\n949A (bu4)\r\n949B (tai4)\r\n949C (ju4)\r\n949D (dun4)\r\n949E (chao1)\r\n949F (zhong1)\r\n94A0 (na4)\r\n94A1 (bei4)\r\n94A2 (gang1,gang4)\r\n94A3 (ban3)\r\n94A4 (qian2)\r\n94A5 (yao4,yue4)\r\n94A6 (qin1)\r\n94A7 (jun1)\r\n94A8 (wu1)\r\n94A9 (gou1)\r\n94AA (kang4)\r\n94AB (fang1)\r\n94AC (huo3)\r\n94AD (tou3)\r\n94AE (niu3)\r\n94AF (ba3,pa2)\r\n94B0 (yu4)\r\n94B1 (qian2)\r\n94B2 (zheng1,zheng4)\r\n94B3 (qian2)\r\n94B4 (gu3)\r\n94B5 (bo1)\r\n94B6 (ke1)\r\n94B7 (po3)\r\n94B8 (bu1)\r\n94B9 (bo2)\r\n94BA (yue4)\r\n94BB (zuan4,zuan1)\r\n94BC (mu4)\r\n94BD (tan3)\r\n94BE (jia3)\r\n94BF (dian4,tian2)\r\n94C0 (you2)\r\n94C1 (tie3)\r\n94C2 (bo2)\r\n94C3 (ling2)\r\n94C4 (shuo4)\r\n94C5 (qian1,yan2)\r\n94C6 (mao3)\r\n94C7 (bao4)\r\n94C8 (shi4)\r\n94C9 (xuan4)\r\n94CA (tuo2,she2,ta1)\r\n94CB (bi4)\r\n94CC (ni2)\r\n94CD (pi2,pi1)\r\n94CE (duo2)\r\n94CF (xing2)\r\n94D0 (kao4)\r\n94D1 (lao3)\r\n94D2 (er3)\r\n94D3 (mang2)\r\n94D4 (ya4)\r\n94D5 (you3)\r\n94D6 (cheng2)\r\n94D7 (jia2)\r\n94D8 (ye2)\r\n94D9 (nao2)\r\n94DA (zhi4)\r\n94DB (dang1,cheng1)\r\n94DC (tong2)\r\n94DD (lu:3)\r\n94DE (diao4)\r\n94DF (yin1)\r\n94E0 (kai3)\r\n94E1 (zha2)\r\n94E2 (zhu1)\r\n94E3 (xian3,xi3)\r\n94E4 (ting3,ding4)\r\n94E5 (diu1)\r\n94E6 (xian1)\r\n94E7 (hua2)\r\n94E8 (quan2)\r\n94E9 (sha1)\r\n94EA (ha1)\r\n94EB (yao2,diao4,tiao2)\r\n94EC (ge4)\r\n94ED (ming2)\r\n94EE (zheng1,zheng4)\r\n94EF (se4)\r\n94F0 (jiao3,jia3)\r\n94F1 (yi1)\r\n94F2 (chan3)\r\n94F3 (chong4)\r\n94F4 (tang1)\r\n94F5 (an3)\r\n94F6 (yin2)\r\n94F7 (ru2)\r\n94F8 (zhu4)\r\n94F9 (lao2)\r\n94FA (pu1,pu4)\r\n94FB (wu2)\r\n94FC (lai2)\r\n94FD (te4)\r\n94FE (lian4)\r\n94FF (keng1)\r\n9500 (xiao1)\r\n9501 (suo3)\r\n9502 (li3)\r\n9503 (zeng4)\r\n9504 (chu2)\r\n9505 (guo1)\r\n9506 (gao4)\r\n9507 (e2)\r\n9508 (xiu4)\r\n9509 (cuo4)\r\n950A (lu:e4)\r\n950B (feng1)\r\n950C (xin1)\r\n950D (liu3)\r\n950E (kai1)\r\n950F (jian3,jian4)\r\n9510 (rui4)\r\n9511 (ti1)\r\n9512 (lang2)\r\n9513 (qin3)\r\n9514 (ju1,ju2)\r\n9515 (a1)\r\n9516 (qing1,qiang1)\r\n9517 (zhe3,zang1)\r\n9518 (nuo4)\r\n9519 (cuo4)\r\n951A (mao2)\r\n951B (ben1)\r\n951C (qi2)\r\n951D (de2)\r\n951E (ke4)\r\n951F (kun1)\r\n9520 (chang1)\r\n9521 (xi1)\r\n9522 (gu4)\r\n9523 (luo2)\r\n9524 (chui2)\r\n9525 (zhui1)\r\n9526 (jin3)\r\n9527 (zhi4)\r\n9528 (xian1)\r\n9529 (juan3)\r\n952A (huo4,huo1)\r\n952B (pei2)\r\n952C (tan2)\r\n952D (ding4)\r\n952E (jian4)\r\n952F (ju4,ju1)\r\n9530 (meng3)\r\n9531 (zi1)\r\n9532 (qie4)\r\n9533 (ying1)\r\n9534 (kai3)\r\n9535 (qiang1)\r\n9536 (si1)\r\n9537 (e4)\r\n9538 (cha1)\r\n9539 (qiao1)\r\n953A (zhong1)\r\n953B (duan4)\r\n953C (sou1)\r\n953D (huang2)\r\n953E (huan2)\r\n953F (ai1)\r\n9540 (du4)\r\n9541 (mei3)\r\n9542 (lou4)\r\n9543 (zi1)\r\n9544 (fei4)\r\n9545 (mei2)\r\n9546 (mo4)\r\n9547 (zhen4)\r\n9548 (bo2)\r\n9549 (ge2)\r\n954A (nie4)\r\n954B (tang3)\r\n954C (juan1)\r\n954D (nie4)\r\n954E (na2)\r\n954F (liu2,liu4)\r\n9550 (hao4,gao3)\r\n9551 (bang4)\r\n9552 (yi4)\r\n9553 (jia1)\r\n9554 (bin1)\r\n9555 (rong2)\r\n9556 (biao1)\r\n9557 (tang1,tang2)\r\n9558 (man4)\r\n9559 (luo2)\r\n955A (beng4)\r\n955B (yong1)\r\n955C (jing4)\r\n955D (di2,di1)\r\n955E (zu2)\r\n955F (xuan4)\r\n9560 (liu2)\r\n9561 (chan2,xin2,tan2)\r\n9562 (jue2)\r\n9563 (liao4)\r\n9564 (pu2)\r\n9565 (lu3)\r\n9566 (dun1,dui4)\r\n9567 (lan2)\r\n9568 (pu3)\r\n9569 (cuan1)\r\n956A (qiang1,qiang3)\r\n956B (deng4)\r\n956C (huo4)\r\n956D (lei2)\r\n956E (huan2)\r\n956F (zhuo2)\r\n9570 (lian2)\r\n9571 (yi4)\r\n9572 (cha3)\r\n9573 (biao1)\r\n9574 (la4)\r\n9575 (chan2)\r\n9576 (xiang1)\r\n9577 (chang2,zhang3)\r\n9578 (chang2,zhang3)\r\n9579 (jiu3)\r\n957A (ao3)\r\n957B (die2)\r\n957C (qu1)\r\n957D (liao2)\r\n957E (mi2)\r\n957F (zhang3,chang2)\r\n9580 (men2)\r\n9581 (ma4)\r\n9582 (shuan1)\r\n9583 (shan3)\r\n9584 (huo2)\r\n9585 (men2)\r\n9586 (yan4,yan2)\r\n9587 (bi4)\r\n9588 (han4)\r\n9589 (bi4)\r\n958A (none0)\r\n958B (kai1)\r\n958C (kang4,kang1)\r\n958D (beng1)\r\n958E (hong2)\r\n958F (run4)\r\n9590 (san4)\r\n9591 (xian2)\r\n9592 (xian2)\r\n9593 (jian1,jian4)\r\n9594 (min3)\r\n9595 (xia1)\r\n9596 (min3)\r\n9597 (dou4)\r\n9598 (zha2)\r\n9599 (nao4)\r\n959A (none0)\r\n959B (peng1)\r\n959C (ke3)\r\n959D (ling2)\r\n959E (bian4)\r\n959F (bi4)\r\n95A0 (run4)\r\n95A1 (he2)\r\n95A2 (guan1)\r\n95A3 (ge2)\r\n95A4 (he2,ge2)\r\n95A5 (fa2)\r\n95A6 (chu4)\r\n95A7 (hong4,hong1,hong3)\r\n95A8 (gui1)\r\n95A9 (min3)\r\n95AA (none0)\r\n95AB (kun3)\r\n95AC (lang3,lang2,lang4)\r\n95AD (lu:2)\r\n95AE (ting2)\r\n95AF (sha4)\r\n95B0 (yan2)\r\n95B1 (yue4)\r\n95B2 (yue4)\r\n95B3 (chan3)\r\n95B4 (qu4)\r\n95B5 (lin4)\r\n95B6 (chang1)\r\n95B7 (shai4)\r\n95B8 (kun3)\r\n95B9 (yan1)\r\n95BA (min2,wen2)\r\n95BB (yan2)\r\n95BC (e4,yan1)\r\n95BD (hun1)\r\n95BE (yu4)\r\n95BF (wen2)\r\n95C0 (xiang4)\r\n95C1 (none0)\r\n95C2 (xiang4)\r\n95C3 (qu4)\r\n95C4 (yao3)\r\n95C5 (wen2)\r\n95C6 (ban3)\r\n95C7 (an4)\r\n95C8 (wei2)\r\n95C9 (yin1)\r\n95CA (kuo4)\r\n95CB (que4)\r\n95CC (lan2)\r\n95CD (du1,she2)\r\n95CE (none0)\r\n95CF (none0)\r\n95D0 (tian2)\r\n95D1 (nie4)\r\n95D2 (da2,ta4)\r\n95D3 (kai3)\r\n95D4 (he2)\r\n95D5 (que4,que1)\r\n95D6 (chuang3,chuang4)\r\n95D7 (guan1)\r\n95D8 (dou4,dou3)\r\n95D9 (qi3)\r\n95DA (kui1)\r\n95DB (tang2)\r\n95DC (guan1)\r\n95DD (piao2)\r\n95DE (kan4,han3,kan3)\r\n95DF (xi1)\r\n95E0 (hui4)\r\n95E1 (chan3)\r\n95E2 (pi4,bi4,pi1)\r\n95E3 (dang4)\r\n95E4 (huan2)\r\n95E5 (ta4)\r\n95E6 (wen2)\r\n95E7 (none0)\r\n95E8 (men2)\r\n95E9 (shuan1)\r\n95EA (shan3)\r\n95EB (yan2)\r\n95EC (han4)\r\n95ED (bi4)\r\n95EE (wen4)\r\n95EF (chuang3)\r\n95F0 (run4)\r\n95F1 (wei2)\r\n95F2 (xian2)\r\n95F3 (hong2)\r\n95F4 (jian1,jian4)\r\n95F5 (min3)\r\n95F6 (kang1,kang4)\r\n95F7 (men4,men1)\r\n95F8 (zha2)\r\n95F9 (nao4)\r\n95FA (gui1)\r\n95FB (wen2)\r\n95FC (ta4)\r\n95FD (min3)\r\n95FE (lu:2)\r\n95FF (kai3)\r\n9600 (fa2)\r\n9601 (ge2)\r\n9602 (he2)\r\n9603 (kun3)\r\n9604 (jiu1)\r\n9605 (yue4)\r\n9606 (lang2,lang4)\r\n9607 (du1,she2)\r\n9608 (yu4)\r\n9609 (yan1)\r\n960A (chang1)\r\n960B (xi4)\r\n960C (wen2)\r\n960D (hun1)\r\n960E (yan2)\r\n960F (yan1,e4)\r\n9610 (chan3)\r\n9611 (lan2)\r\n9612 (qu4)\r\n9613 (hui4)\r\n9614 (kuo4)\r\n9615 (que4)\r\n9616 (he2)\r\n9617 (tian2)\r\n9618 (da2,ta4)\r\n9619 (que1,que4)\r\n961A (kan4,han3,kan3)\r\n961B (huan2)\r\n961C (fu4)\r\n961D (fu4,yi4)\r\n961E (le4)\r\n961F (dui4)\r\n9620 (xin4,shen1)\r\n9621 (qian1)\r\n9622 (wu4)\r\n9623 (yi4)\r\n9624 (tuo2)\r\n9625 (yin1)\r\n9626 (yang2)\r\n9627 (dou3)\r\n9628 (e4)\r\n9629 (sheng1)\r\n962A (ban3)\r\n962B (pei2)\r\n962C (keng1)\r\n962D (yun3)\r\n962E (ruan3)\r\n962F (zhi3)\r\n9630 (pi2)\r\n9631 (jing3)\r\n9632 (fang2)\r\n9633 (yang2)\r\n9634 (yin1)\r\n9635 (zhen4)\r\n9636 (jie1)\r\n9637 (cheng1)\r\n9638 (e4)\r\n9639 (qu1)\r\n963A (di3)\r\n963B (zu3)\r\n963C (zuo4)\r\n963D (dian4,yan2)\r\n963E (ling3)\r\n963F (a1,e1,a5,a2,a4)\r\n9640 (tuo2)\r\n9641 (tuo2)\r\n9642 (po1,bei1,pi2)\r\n9643 (bing3)\r\n9644 (fu4)\r\n9645 (ji4)\r\n9646 (lu4,liu4)\r\n9647 (long3)\r\n9648 (chen2)\r\n9649 (xing2)\r\n964A (duo4)\r\n964B (lou4)\r\n964C (mo4)\r\n964D (jiang4,xiang2)\r\n964E (shu1)\r\n964F (duo4)\r\n9650 (xian4)\r\n9651 (er2)\r\n9652 (gui3)\r\n9653 (wu1)\r\n9654 (gai1)\r\n9655 (shan3)\r\n9656 (jun4)\r\n9657 (qiao4)\r\n9658 (xing2)\r\n9659 (chun2)\r\n965A (fu4)\r\n965B (bi4)\r\n965C (shan3)\r\n965D (shan3,xia2)\r\n965E (sheng1)\r\n965F (zhi4)\r\n9660 (pu1)\r\n9661 (dou3)\r\n9662 (yuan4)\r\n9663 (zhen4)\r\n9664 (chu2)\r\n9665 (xian4)\r\n9666 (zhi4)\r\n9667 (nie4)\r\n9668 (yun3)\r\n9669 (xian3)\r\n966A (pei2)\r\n966B (pei2)\r\n966C (zou1)\r\n966D (yi1,yi3)\r\n966E (dui4)\r\n966F (lun2)\r\n9670 (yin1)\r\n9671 (ju2)\r\n9672 (chui2)\r\n9673 (chen2)\r\n9674 (pi2)\r\n9675 (ling2)\r\n9676 (tao2,yao2)\r\n9677 (xian4)\r\n9678 (lu4,liu4)\r\n9679 (none0)\r\n967A (xian3)\r\n967B (yin1)\r\n967C (zhu3)\r\n967D (yang2)\r\n967E (reng2)\r\n967F (shan3)\r\n9680 (chong2)\r\n9681 (yan4)\r\n9682 (yin1)\r\n9683 (yu2)\r\n9684 (ti2)\r\n9685 (yu2)\r\n9686 (long2,long1)\r\n9687 (wei1)\r\n9688 (wei1)\r\n9689 (nie4)\r\n968A (dui4)\r\n968B (sui2)\r\n968C (an3)\r\n968D (huang2)\r\n968E (jie1)\r\n968F (sui2)\r\n9690 (yin3)\r\n9691 (gai1)\r\n9692 (yan3)\r\n9693 (hui1)\r\n9694 (ge2)\r\n9695 (yun3)\r\n9696 (wu4)\r\n9697 (wei3,kui2)\r\n9698 (ai4)\r\n9699 (xi4)\r\n969A (tang2)\r\n969B (ji4)\r\n969C (zhang4)\r\n969D (dao3)\r\n969E (ao2)\r\n969F (xi4)\r\n96A0 (yin3)\r\n96A1 (sa4)\r\n96A2 (rao4)\r\n96A3 (lin2)\r\n96A4 (tui2)\r\n96A5 (deng4)\r\n96A6 (pi2)\r\n96A7 (sui4)\r\n96A8 (sui2)\r\n96A9 (yu4)\r\n96AA (xian3)\r\n96AB (fen1)\r\n96AC (ni3)\r\n96AD (er2)\r\n96AE (ji1)\r\n96AF (dao3)\r\n96B0 (xi2)\r\n96B1 (yin3,yin4)\r\n96B2 (zhi4)\r\n96B3 (hui1)\r\n96B4 (long3)\r\n96B5 (xi1)\r\n96B6 (li4)\r\n96B7 (li4)\r\n96B8 (li4)\r\n96B9 (zhui1,cui1)\r\n96BA (he4)\r\n96BB (zhi1)\r\n96BC (sun3,zhun3)\r\n96BD (juan4,jun4)\r\n96BE (nan2,nan4)\r\n96BF (yi4)\r\n96C0 (que4,qiao1,qiao3)\r\n96C1 (yan4)\r\n96C2 (qin2)\r\n96C3 (ya3)\r\n96C4 (xiong2)\r\n96C5 (ya3,ya1)\r\n96C6 (ji2)\r\n96C7 (gu4)\r\n96C8 (huan2)\r\n96C9 (zhi4)\r\n96CA (gou4)\r\n96CB (jun4,juan4)\r\n96CC (ci2,ci1)\r\n96CD (yong1)\r\n96CE (ju1)\r\n96CF (chu2)\r\n96D0 (hu1)\r\n96D1 (za2)\r\n96D2 (luo4)\r\n96D3 (yu2)\r\n96D4 (chou2)\r\n96D5 (diao1)\r\n96D6 (sui1)\r\n96D7 (han4)\r\n96D8 (huo4)\r\n96D9 (shuang1)\r\n96DA (guan4)\r\n96DB (chu2)\r\n96DC (za2)\r\n96DD (yong1)\r\n96DE (ji1)\r\n96DF (sui2)\r\n96E0 (chou2)\r\n96E1 (liu4)\r\n96E2 (li2)\r\n96E3 (nan2,nan4)\r\n96E4 (xue2)\r\n96E5 (za2)\r\n96E6 (ji2)\r\n96E7 (ji2)\r\n96E8 (yu3,yu4)\r\n96E9 (yu2)\r\n96EA (xue3,xue4)\r\n96EB (na3)\r\n96EC (fou3)\r\n96ED (se4)\r\n96EE (mu4)\r\n96EF (wen2)\r\n96F0 (fen1)\r\n96F1 (pang2)\r\n96F2 (yun2)\r\n96F3 (li4)\r\n96F4 (li4)\r\n96F5 (yang1)\r\n96F6 (ling2)\r\n96F7 (lei2)\r\n96F8 (an2)\r\n96F9 (bao2)\r\n96FA (meng2)\r\n96FB (dian4)\r\n96FC (dang4)\r\n96FD (hang2,yu2)\r\n96FE (wu4)\r\n96FF (zhao4)\r\n9700 (xu1)\r\n9701 (ji4)\r\n9702 (mu4)\r\n9703 (chen2)\r\n9704 (xiao1)\r\n9705 (zha2)\r\n9706 (ting2)\r\n9707 (zhen4)\r\n9708 (pei4)\r\n9709 (mei2)\r\n970A (ling2)\r\n970B (qi1)\r\n970C (chou1)\r\n970D (huo4)\r\n970E (sha4)\r\n970F (fei1)\r\n9710 (weng1)\r\n9711 (zhan1)\r\n9712 (ying1)\r\n9713 (ni2)\r\n9714 (chou4)\r\n9715 (tun2)\r\n9716 (lin2)\r\n9717 (none0)\r\n9718 (dong4)\r\n9719 (ying1,ji1)\r\n971A (wu4)\r\n971B (ling2)\r\n971C (shuang1)\r\n971D (ling2)\r\n971E (xia2)\r\n971F (hong2)\r\n9720 (yin1)\r\n9721 (mai4)\r\n9722 (mo4)\r\n9723 (yun3)\r\n9724 (liu4)\r\n9725 (meng4)\r\n9726 (bin1)\r\n9727 (wu4)\r\n9728 (wei4)\r\n9729 (kuo4)\r\n972A (yin2)\r\n972B (xi2)\r\n972C (yi4)\r\n972D (ai3)\r\n972E (dan4)\r\n972F (deng4)\r\n9730 (xian4,san3)\r\n9731 (yu4)\r\n9732 (lu4,lou4)\r\n9733 (long2,long1)\r\n9734 (dai4)\r\n9735 (ji2)\r\n9736 (pang2)\r\n9737 (yang2)\r\n9738 (ba4)\r\n9739 (pi1)\r\n973A (wei2)\r\n973B (none0)\r\n973C (xi3)\r\n973D (ji4)\r\n973E (mai2)\r\n973F (meng4)\r\n9740 (meng2)\r\n9741 (lei2)\r\n9742 (li4)\r\n9743 (huo4,sui3)\r\n9744 (ai3)\r\n9745 (fei4)\r\n9746 (dai4)\r\n9747 (long2)\r\n9748 (ling2)\r\n9749 (ai4)\r\n974A (feng1)\r\n974B (li4)\r\n974C (bao3)\r\n974D (none0)\r\n974E (he4)\r\n974F (he4)\r\n9750 (bing4)\r\n9751 (qing1)\r\n9752 (qing1)\r\n9753 (jing4,liang4)\r\n9754 (qi2)\r\n9755 (zhen1)\r\n9756 (jing4)\r\n9757 (cheng1)\r\n9758 (qing4)\r\n9759 (jing4)\r\n975A (jing4,liang4)\r\n975B (dian4)\r\n975C (jing4)\r\n975D (tian1)\r\n975E (fei1)\r\n975F (fei1)\r\n9760 (kao4)\r\n9761 (mi3,mi2)\r\n9762 (mian4)\r\n9763 (mian4)\r\n9764 (pao4)\r\n9765 (ye4)\r\n9766 (tian3,mian3)\r\n9767 (hui4)\r\n9768 (ye4)\r\n9769 (ge2,ji2,ji3)\r\n976A (ding1)\r\n976B (ren4)\r\n976C (jian1)\r\n976D (ren4)\r\n976E (di2)\r\n976F (du4)\r\n9770 (wu4)\r\n9771 (ren4)\r\n9772 (qin2)\r\n9773 (jin4)\r\n9774 (xue1)\r\n9775 (niu3)\r\n9776 (ba3)\r\n9777 (yin3)\r\n9778 (sa3)\r\n9779 (ren4)\r\n977A (mo4)\r\n977B (zu3)\r\n977C (da2)\r\n977D (ban4)\r\n977E (yi4)\r\n977F (yao4)\r\n9780 (tao2)\r\n9781 (bei4,tuo2)\r\n9782 (jia2)\r\n9783 (hong2)\r\n9784 (pao2)\r\n9785 (yang1,yang4,yang3)\r\n9786 (mo4)\r\n9787 (yin1)\r\n9788 (jia2)\r\n9789 (tao2)\r\n978A (ji2)\r\n978B (xie2)\r\n978C (an1)\r\n978D (an1)\r\n978E (hen2)\r\n978F (gong3)\r\n9790 (gong3)\r\n9791 (da2)\r\n9792 (qiao2)\r\n9793 (ting1)\r\n9794 (man2,wan3)\r\n9795 (ying4)\r\n9796 (sui1)\r\n9797 (tiao2)\r\n9798 (qiao4,shao1)\r\n9799 (xuan4)\r\n979A (kong4)\r\n979B (beng3)\r\n979C (ta4)\r\n979D (zhang3)\r\n979E (bing3)\r\n979F (kuo4)\r\n97A0 (ju1,ju2)\r\n97A1 (la5)\r\n97A2 (xie4)\r\n97A3 (rou2)\r\n97A4 (bang1)\r\n97A5 (yi4,eng1)\r\n97A6 (qiu1)\r\n97A7 (qiu1)\r\n97A8 (he2)\r\n97A9 (xiao4)\r\n97AA (mu4)\r\n97AB (ju1,ju2)\r\n97AC (jian1)\r\n97AD (bian1)\r\n97AE (di1)\r\n97AF (jian1)\r\n97B0 (none0)\r\n97B1 (tao1)\r\n97B2 (gou1)\r\n97B3 (ta4)\r\n97B4 (bei4)\r\n97B5 (xie2)\r\n97B6 (pan2)\r\n97B7 (ge2)\r\n97B8 (bi4)\r\n97B9 (kuo4,kui1)\r\n97BA (tang1)\r\n97BB (lou2)\r\n97BC (gui4)\r\n97BD (qiao2)\r\n97BE (xue1)\r\n97BF (ji1)\r\n97C0 (jian1)\r\n97C1 (jiang1)\r\n97C2 (chan4)\r\n97C3 (da2)\r\n97C4 (huo4)\r\n97C5 (xian3)\r\n97C6 (qian1)\r\n97C7 (du2)\r\n97C8 (wa4)\r\n97C9 (jian1)\r\n97CA (lan2)\r\n97CB (wei2)\r\n97CC (ren4)\r\n97CD (fu2)\r\n97CE (mei4)\r\n97CF (juan4)\r\n97D0 (ge2)\r\n97D1 (wei3)\r\n97D2 (qiao4)\r\n97D3 (han2)\r\n97D4 (chang4)\r\n97D5 (none0)\r\n97D6 (rou2)\r\n97D7 (xun4)\r\n97D8 (she4)\r\n97D9 (wei3)\r\n97DA (ge2)\r\n97DB (bei4)\r\n97DC (tao1)\r\n97DD (gou4)\r\n97DE (yun4)\r\n97DF (gao1)\r\n97E0 (bi4)\r\n97E1 (wei3)\r\n97E2 (hui4)\r\n97E3 (shu3)\r\n97E4 (wa4)\r\n97E5 (du2)\r\n97E6 (wei2)\r\n97E7 (ren4)\r\n97E8 (fu2)\r\n97E9 (han2)\r\n97EA (wei3)\r\n97EB (yun4)\r\n97EC (tao1)\r\n97ED (jiu3)\r\n97EE (jiu3)\r\n97EF (xian1)\r\n97F0 (xie4)\r\n97F1 (xian1)\r\n97F2 (ji1)\r\n97F3 (yin1)\r\n97F4 (za2)\r\n97F5 (yun4)\r\n97F6 (shao2)\r\n97F7 (luo4)\r\n97F8 (peng2)\r\n97F9 (huang2)\r\n97FA (ying1)\r\n97FB (yun4)\r\n97FC (peng2)\r\n97FD (yin1,an1)\r\n97FE (yin1)\r\n97FF (xiang3)\r\n9800 (hu4)\r\n9801 (ye4)\r\n9802 (ding3)\r\n9803 (qing3,qing1)\r\n9804 (pan4)\r\n9805 (xiang4)\r\n9806 (shun4)\r\n9807 (han1)\r\n9808 (xu1)\r\n9809 (yi2)\r\n980A (xu1)\r\n980B (gu4)\r\n980C (song4)\r\n980D (kui3)\r\n980E (qi2)\r\n980F (hang2)\r\n9810 (yu4)\r\n9811 (wan2)\r\n9812 (ban1)\r\n9813 (dun4,du2)\r\n9814 (di2)\r\n9815 (dan1)\r\n9816 (pan4)\r\n9817 (po3)\r\n9818 (ling3)\r\n9819 (cheng1)\r\n981A (jing3,geng3)\r\n981B (lei3)\r\n981C (he2,han4)\r\n981D (qiao1)\r\n981E (e4)\r\n981F (e2)\r\n9820 (wei3)\r\n9821 (jie2,xie2)\r\n9822 (gua1)\r\n9823 (shen3)\r\n9824 (yi2)\r\n9825 (yi2)\r\n9826 (ke1,ke2)\r\n9827 (dui1)\r\n9828 (pian1)\r\n9829 (ping1)\r\n982A (lei4)\r\n982B (fu3)\r\n982C (jia2)\r\n982D (tou2,tou5)\r\n982E (hui4)\r\n982F (kui2)\r\n9830 (jia2)\r\n9831 (le4)\r\n9832 (ting3)\r\n9833 (cheng1)\r\n9834 (ying3)\r\n9835 (jun1)\r\n9836 (hu2)\r\n9837 (han4)\r\n9838 (jing3,geng3)\r\n9839 (tui2)\r\n983A (tui2)\r\n983B (pin2)\r\n983C (lai4)\r\n983D (tui2)\r\n983E (zi1)\r\n983F (zi1)\r\n9840 (chui2)\r\n9841 (ding4)\r\n9842 (lai4)\r\n9843 (yan2)\r\n9844 (han4)\r\n9845 (qian1)\r\n9846 (ke1)\r\n9847 (cui4)\r\n9848 (jiong3)\r\n9849 (qin3)\r\n984A (yi2)\r\n984B (sai1)\r\n984C (ti2)\r\n984D (e2)\r\n984E (e4)\r\n984F (yan2)\r\n9850 (hun2)\r\n9851 (kan3)\r\n9852 (yong2)\r\n9853 (zhuan1)\r\n9854 (yan2)\r\n9855 (xian3)\r\n9856 (xin4)\r\n9857 (yi3)\r\n9858 (yuan4)\r\n9859 (sang3)\r\n985A (dian1)\r\n985B (dian1)\r\n985C (jiang3)\r\n985D (ku1)\r\n985E (lei4)\r\n985F (liao2)\r\n9860 (piao4)\r\n9861 (yi4)\r\n9862 (man2,man1)\r\n9863 (qi1)\r\n9864 (yao2)\r\n9865 (hao4)\r\n9866 (qiao2)\r\n9867 (gu4)\r\n9868 (xun4)\r\n9869 (qian1)\r\n986A (hui1)\r\n986B (zhan4,chan4)\r\n986C (ru2)\r\n986D (hong1)\r\n986E (bin1)\r\n986F (xian3)\r\n9870 (pin2)\r\n9871 (lu2)\r\n9872 (lan3)\r\n9873 (nie4)\r\n9874 (quan2)\r\n9875 (ye4)\r\n9876 (ding3)\r\n9877 (qing3)\r\n9878 (han1)\r\n9879 (xiang4)\r\n987A (shun4)\r\n987B (xu1)\r\n987C (xu1)\r\n987D (wan2)\r\n987E (gu4)\r\n987F (dun4,du2)\r\n9880 (qi2)\r\n9881 (ban1)\r\n9882 (song4)\r\n9883 (hang2)\r\n9884 (yu4)\r\n9885 (lu2)\r\n9886 (ling3)\r\n9887 (po1)\r\n9888 (jing3,geng3)\r\n9889 (jie2,xie2)\r\n988A (jia2)\r\n988B (ting3)\r\n988C (he2,ge2)\r\n988D (ying3)\r\n988E (jiong3)\r\n988F (ke1,ke2)\r\n9890 (yi2)\r\n9891 (pin2)\r\n9892 (hui4)\r\n9893 (tui2)\r\n9894 (han4)\r\n9895 (ying3)\r\n9896 (ying3)\r\n9897 (ke1)\r\n9898 (ti2)\r\n9899 (yong2)\r\n989A (e4)\r\n989B (zhuan1)\r\n989C (yan2)\r\n989D (e2)\r\n989E (nie4)\r\n989F (man1)\r\n98A0 (dian1)\r\n98A1 (sang3)\r\n98A2 (hao4)\r\n98A3 (lei4)\r\n98A4 (zhan4,chan4)\r\n98A5 (ru2)\r\n98A6 (pin2)\r\n98A7 (quan2)\r\n98A8 (feng1)\r\n98A9 (biao1)\r\n98AA (none0)\r\n98AB (fu2)\r\n98AC (xia1)\r\n98AD (zhan3)\r\n98AE (biao1)\r\n98AF (sa4)\r\n98B0 (fa1)\r\n98B1 (tai2)\r\n98B2 (lie4)\r\n98B3 (gua1)\r\n98B4 (xuan4)\r\n98B5 (shao4)\r\n98B6 (ju4)\r\n98B7 (biao1)\r\n98B8 (si1)\r\n98B9 (wei3)\r\n98BA (yang2)\r\n98BB (yao2)\r\n98BC (sou1)\r\n98BD (kai3)\r\n98BE (sao1)\r\n98BF (fan2)\r\n98C0 (liu2)\r\n98C1 (xi2)\r\n98C2 (liao2)\r\n98C3 (piao1)\r\n98C4 (piao1)\r\n98C5 (liu2)\r\n98C6 (biao1)\r\n98C7 (biao1)\r\n98C8 (biao1)\r\n98C9 (liao2)\r\n98CA (none0)\r\n98CB (se4)\r\n98CC (feng1)\r\n98CD (biao1)\r\n98CE (feng1)\r\n98CF (yang2)\r\n98D0 (zhan3)\r\n98D1 (biao1)\r\n98D2 (sa4)\r\n98D3 (ju4)\r\n98D4 (si1)\r\n98D5 (sou1)\r\n98D6 (yao2)\r\n98D7 (liu2)\r\n98D8 (piao1)\r\n98D9 (biao1)\r\n98DA (biao1)\r\n98DB (fei1)\r\n98DC (fan1)\r\n98DD (fei1)\r\n98DE (fei1)\r\n98DF (shi2,si4,yi4)\r\n98E0 (shi2,si4)\r\n98E1 (can1)\r\n98E2 (ji1)\r\n98E3 (ding4)\r\n98E4 (si4)\r\n98E5 (tuo2)\r\n98E6 (jian1)\r\n98E7 (sun1)\r\n98E8 (xiang3)\r\n98E9 (tun5,tun2)\r\n98EA (ren4)\r\n98EB (yu4)\r\n98EC (juan4)\r\n98ED (chi4)\r\n98EE (yin3,yin4)\r\n98EF (fan4)\r\n98F0 (fan4)\r\n98F1 (sun1)\r\n98F2 (yin3,yin4)\r\n98F3 (zhu4)\r\n98F4 (yi2)\r\n98F5 (zhai3)\r\n98F6 (bi4)\r\n98F7 (jie3)\r\n98F8 (tao1)\r\n98F9 (liu3)\r\n98FA (ci2)\r\n98FB (tie4)\r\n98FC (si4)\r\n98FD (bao3)\r\n98FE (shi4)\r\n98FF (duo4)\r\n9900 (hai4)\r\n9901 (ren4)\r\n9902 (tian3)\r\n9903 (jiao3,jia3)\r\n9904 (jia2)\r\n9905 (bing3)\r\n9906 (yao2)\r\n9907 (tong2)\r\n9908 (ci2)\r\n9909 (xiang3)\r\n990A (yang3,yang4)\r\n990B (yang3)\r\n990C (er3)\r\n990D (yan4)\r\n990E (le5)\r\n990F (yi1)\r\n9910 (can1)\r\n9911 (bo1)\r\n9912 (nei3)\r\n9913 (e4)\r\n9914 (bu1)\r\n9915 (jun4)\r\n9916 (dou4)\r\n9917 (su4)\r\n9918 (yu2)\r\n9919 (shi4)\r\n991A (yao2)\r\n991B (hun2)\r\n991C (guo3)\r\n991D (shi4)\r\n991E (jian4)\r\n991F (zhui4)\r\n9920 (bing3)\r\n9921 (xian4)\r\n9922 (bu4)\r\n9923 (ye4)\r\n9924 (tan2)\r\n9925 (fei3)\r\n9926 (zhang1)\r\n9927 (wei4)\r\n9928 (guan3)\r\n9929 (e4)\r\n992A (nuan3)\r\n992B (hun2)\r\n992C (hu2,hu1,hu4)\r\n992D (huang2)\r\n992E (tie4)\r\n992F (hui4)\r\n9930 (jian1)\r\n9931 (hou2)\r\n9932 (he2)\r\n9933 (xing2,tang2)\r\n9934 (fen1)\r\n9935 (wei4)\r\n9936 (gu3)\r\n9937 (cha1)\r\n9938 (song4)\r\n9939 (tang2,xing2)\r\n993A (bo2)\r\n993B (gao1)\r\n993C (xi4)\r\n993D (kui4)\r\n993E (liu4,liu2)\r\n993F (sou1)\r\n9940 (tao2)\r\n9941 (ye4)\r\n9942 (yun2)\r\n9943 (mo2)\r\n9944 (tang2)\r\n9945 (man2)\r\n9946 (bi4)\r\n9947 (yu4)\r\n9948 (xiu1)\r\n9949 (jin3)\r\n994A (san3)\r\n994B (kui4)\r\n994C (zhuan4)\r\n994D (shan4)\r\n994E (chi4)\r\n994F (dan4)\r\n9950 (yi4)\r\n9951 (ji1)\r\n9952 (rao2)\r\n9953 (cheng1)\r\n9954 (yong1)\r\n9955 (tao1)\r\n9956 (hui4)\r\n9957 (xiang3)\r\n9958 (zhan1)\r\n9959 (fen1)\r\n995A (hai4)\r\n995B (meng2)\r\n995C (yan4)\r\n995D (mo2)\r\n995E (chan2)\r\n995F (xiang3)\r\n9960 (luo2)\r\n9961 (zuan4,zan4)\r\n9962 (nang3,nang2)\r\n9963 (shi2,si4)\r\n9964 (ding4)\r\n9965 (ji1)\r\n9966 (tuo1)\r\n9967 (xing2,tang2)\r\n9968 (tun5,tun2)\r\n9969 (xi4)\r\n996A (ren4)\r\n996B (yu4)\r\n996C (chi4)\r\n996D (fan4)\r\n996E (yin3,yin4)\r\n996F (jian4)\r\n9970 (shi4)\r\n9971 (bao3)\r\n9972 (si4)\r\n9973 (duo4)\r\n9974 (yi2)\r\n9975 (er3)\r\n9976 (rao2)\r\n9977 (xiang3)\r\n9978 (he2)\r\n9979 (le5)\r\n997A (jiao3,jia3)\r\n997B (xi1)\r\n997C (bing3)\r\n997D (bo1)\r\n997E (dou4)\r\n997F (e4)\r\n9980 (yu2)\r\n9981 (nei3)\r\n9982 (jun4)\r\n9983 (guo3)\r\n9984 (hun2)\r\n9985 (xian4)\r\n9986 (guan3)\r\n9987 (cha1)\r\n9988 (kui4)\r\n9989 (gu3)\r\n998A (sou1)\r\n998B (chan2)\r\n998C (ye4)\r\n998D (mo2)\r\n998E (bo2)\r\n998F (liu4,liu2)\r\n9990 (xiu1)\r\n9991 (jin3)\r\n9992 (man2)\r\n9993 (san3)\r\n9994 (zhuan4)\r\n9995 (nang3,nang2)\r\n9996 (shou3)\r\n9997 (kui2)\r\n9998 (guo2)\r\n9999 (xiang1)\r\n999A (fen2)\r\n999B (ba2)\r\n999C (ni3)\r\n999D (bi4)\r\n999E (bo2)\r\n999F (tu2)\r\n99A0 (han1)\r\n99A1 (fei1)\r\n99A2 (jian1)\r\n99A3 (yan3)\r\n99A4 (ai3)\r\n99A5 (fu4)\r\n99A6 (xian1)\r\n99A7 (wen1)\r\n99A8 (xin1,xing1)\r\n99A9 (fen2)\r\n99AA (bin1)\r\n99AB (xing1)\r\n99AC (ma3)\r\n99AD (yu4)\r\n99AE (feng2,ping2)\r\n99AF (han4)\r\n99B0 (di4)\r\n99B1 (tuo2,duo4)\r\n99B2 (tuo1)\r\n99B3 (chi2)\r\n99B4 (xun4,xun2)\r\n99B5 (zhu4)\r\n99B6 (zhi1)\r\n99B7 (pei4)\r\n99B8 (xin4)\r\n99B9 (ri4)\r\n99BA (sa4)\r\n99BB (yin3)\r\n99BC (wen2)\r\n99BD (zhi2)\r\n99BE (dan4)\r\n99BF (lu:2)\r\n99C0 (you2)\r\n99C1 (bo2)\r\n99C2 (bao3)\r\n99C3 (kuai4)\r\n99C4 (tuo2,duo4)\r\n99C5 (yi4)\r\n99C6 (qu1)\r\n99C7 (wen2)\r\n99C8 (qu1)\r\n99C9 (jiong1)\r\n99CA (bo3)\r\n99CB (zhao1)\r\n99CC (yuan1)\r\n99CD (peng1)\r\n99CE (zhou4)\r\n99CF (ju4)\r\n99D0 (zhu4)\r\n99D1 (nu2)\r\n99D2 (ju1)\r\n99D3 (pi1)\r\n99D4 (zang3)\r\n99D5 (jia4)\r\n99D6 (ling2)\r\n99D7 (zhen1)\r\n99D8 (tai2)\r\n99D9 (fu4)\r\n99DA (yang3)\r\n99DB (shi3)\r\n99DC (bi4)\r\n99DD (tuo2)\r\n99DE (tuo2)\r\n99DF (si4)\r\n99E0 (liu2)\r\n99E1 (ma4)\r\n99E2 (pian2)\r\n99E3 (tao2)\r\n99E4 (zhi4)\r\n99E5 (rong2)\r\n99E6 (teng2)\r\n99E7 (dong4)\r\n99E8 (xun2)\r\n99E9 (quan2)\r\n99EA (shen1)\r\n99EB (jiong1)\r\n99EC (er3)\r\n99ED (hai4,xie4)\r\n99EE (bo2)\r\n99EF (none0)\r\n99F0 (yin1)\r\n99F1 (luo4)\r\n99F2 (none0)\r\n99F3 (dan4)\r\n99F4 (xie4)\r\n99F5 (liu2)\r\n99F6 (ju2)\r\n99F7 (song3)\r\n99F8 (qin1)\r\n99F9 (mang2)\r\n99FA (liang2)\r\n99FB (han4)\r\n99FC (tu2)\r\n99FD (xuan4)\r\n99FE (tui4)\r\n99FF (jun4)\r\n9A00 (e2)\r\n9A01 (cheng3)\r\n9A02 (xing1)\r\n9A03 (ai2)\r\n9A04 (lu4)\r\n9A05 (zhui1)\r\n9A06 (zhou1)\r\n9A07 (she4)\r\n9A08 (pian2)\r\n9A09 (kun1)\r\n9A0A (tao2)\r\n9A0B (lai2)\r\n9A0C (zong1)\r\n9A0D (ke4)\r\n9A0E (qi2,ji4)\r\n9A0F (qi2)\r\n9A10 (yan4)\r\n9A11 (fei1)\r\n9A12 (sao1)\r\n9A13 (yan4)\r\n9A14 (jie2,ge3)\r\n9A15 (yao3)\r\n9A16 (wu4)\r\n9A17 (pian4)\r\n9A18 (cong1)\r\n9A19 (pian4)\r\n9A1A (qian2)\r\n9A1B (fei1)\r\n9A1C (huang2)\r\n9A1D (jian1)\r\n9A1E (huo4)\r\n9A1F (yu4)\r\n9A20 (ti2)\r\n9A21 (quan2)\r\n9A22 (xia2)\r\n9A23 (zong1)\r\n9A24 (kui2)\r\n9A25 (rou2)\r\n9A26 (si1)\r\n9A27 (gua1)\r\n9A28 (tuo2,tan2)\r\n9A29 (kui4)\r\n9A2A (sou1)\r\n9A2B (qian1)\r\n9A2C (cheng2)\r\n9A2D (zhi4)\r\n9A2E (liu2)\r\n9A2F (pang2)\r\n9A30 (teng2)\r\n9A31 (xi1)\r\n9A32 (cao3)\r\n9A33 (du2)\r\n9A34 (yan4)\r\n9A35 (yuan2)\r\n9A36 (zou1)\r\n9A37 (sao1)\r\n9A38 (shan4)\r\n9A39 (li2)\r\n9A3A (zhi4)\r\n9A3B (shuang3)\r\n9A3C (lu4)\r\n9A3D (xi2)\r\n9A3E (luo2)\r\n9A3F (zhang1)\r\n9A40 (mo4)\r\n9A41 (ao4)\r\n9A42 (can1)\r\n9A43 (piao4,biao1)\r\n9A44 (cong1)\r\n9A45 (qu1)\r\n9A46 (bi4)\r\n9A47 (zhi4)\r\n9A48 (yu4)\r\n9A49 (xu1)\r\n9A4A (hua2)\r\n9A4B (bo1)\r\n9A4C (su4)\r\n9A4D (xiao1)\r\n9A4E (lin2)\r\n9A4F (zhan4)\r\n9A50 (dun1)\r\n9A51 (liu2)\r\n9A52 (tuo2)\r\n9A53 (zeng1)\r\n9A54 (tan2)\r\n9A55 (jiao1)\r\n9A56 (tie3)\r\n9A57 (yan4)\r\n9A58 (luo2)\r\n9A59 (zhan1)\r\n9A5A (jing1)\r\n9A5B (yi4)\r\n9A5C (ye4)\r\n9A5D (tuo4)\r\n9A5E (bin1)\r\n9A5F (zou4,zhou4)\r\n9A60 (yan4)\r\n9A61 (peng2)\r\n9A62 (lu:2)\r\n9A63 (teng2)\r\n9A64 (xiang1)\r\n9A65 (ji4)\r\n9A66 (shuang1)\r\n9A67 (ju2)\r\n9A68 (xi1)\r\n9A69 (huan1)\r\n9A6A (li2)\r\n9A6B (biao1)\r\n9A6C (ma3)\r\n9A6D (yu4)\r\n9A6E (tuo2,duo4)\r\n9A6F (xun4)\r\n9A70 (chi2)\r\n9A71 (qu1)\r\n9A72 (ri4)\r\n9A73 (bo2)\r\n9A74 (lu:2)\r\n9A75 (zang3)\r\n9A76 (shi3)\r\n9A77 (si4)\r\n9A78 (fu4)\r\n9A79 (ju1)\r\n9A7A (zou1)\r\n9A7B (zhu4)\r\n9A7C (tuo2)\r\n9A7D (nu2)\r\n9A7E (jia4)\r\n9A7F (yi4)\r\n9A80 (tai2,dai4)\r\n9A81 (xiao1)\r\n9A82 (ma4)\r\n9A83 (yin1)\r\n9A84 (jiao1)\r\n9A85 (hua2)\r\n9A86 (luo4)\r\n9A87 (hai4)\r\n9A88 (pian2)\r\n9A89 (biao1)\r\n9A8A (li2)\r\n9A8B (cheng3)\r\n9A8C (yan4)\r\n9A8D (xing1)\r\n9A8E (qin1)\r\n9A8F (jun4)\r\n9A90 (qi2)\r\n9A91 (qi2)\r\n9A92 (ke4)\r\n9A93 (zhui1)\r\n9A94 (zong1)\r\n9A95 (su4)\r\n9A96 (can1)\r\n9A97 (pian4)\r\n9A98 (zhi4)\r\n9A99 (kui2)\r\n9A9A (sao1)\r\n9A9B (wu4)\r\n9A9C (ao4)\r\n9A9D (liu2)\r\n9A9E (qian1)\r\n9A9F (shan4)\r\n9AA0 (piao4,biao1)\r\n9AA1 (luo2)\r\n9AA2 (cong1)\r\n9AA3 (zhan4,chan3)\r\n9AA4 (zhou4)\r\n9AA5 (ji4)\r\n9AA6 (shuang1)\r\n9AA7 (xiang1)\r\n9AA8 (gu2,gu3,gu1)\r\n9AA9 (wei3)\r\n9AAA (wei3)\r\n9AAB (wei3)\r\n9AAC (yu2)\r\n9AAD (gan4)\r\n9AAE (yi4)\r\n9AAF (ang1)\r\n9AB0 (tou2,shai3)\r\n9AB1 (jie4,xie4)\r\n9AB2 (bo2)\r\n9AB3 (bi4)\r\n9AB4 (ci1)\r\n9AB5 (ti3)\r\n9AB6 (di3)\r\n9AB7 (ku1)\r\n9AB8 (hai2)\r\n9AB9 (qiao1)\r\n9ABA (hou2)\r\n9ABB (kua4)\r\n9ABC (ge2)\r\n9ABD (tui3)\r\n9ABE (geng3)\r\n9ABF (pian2)\r\n9AC0 (bi4)\r\n9AC1 (ke1)\r\n9AC2 (qia4)\r\n9AC3 (yu2)\r\n9AC4 (sui3)\r\n9AC5 (lou2)\r\n9AC6 (bo2)\r\n9AC7 (xiao1)\r\n9AC8 (bang3)\r\n9AC9 (bo1)\r\n9ACA (cuo1)\r\n9ACB (kuan1)\r\n9ACC (bin4)\r\n9ACD (mo2)\r\n9ACE (liao2)\r\n9ACF (lou2)\r\n9AD0 (nao2)\r\n9AD1 (du2)\r\n9AD2 (zang1)\r\n9AD3 (sui3)\r\n9AD4 (ti3)\r\n9AD5 (bin4)\r\n9AD6 (kuan1)\r\n9AD7 (lu2)\r\n9AD8 (gao1)\r\n9AD9 (gao1)\r\n9ADA (qiao4)\r\n9ADB (kao1)\r\n9ADC (qiao1)\r\n9ADD (lao4)\r\n9ADE (zao4)\r\n9ADF (biao1,shan1)\r\n9AE0 (kun1)\r\n9AE1 (kun1)\r\n9AE2 (ti4)\r\n9AE3 (fang3)\r\n9AE4 (xiu1)\r\n9AE5 (ran2)\r\n9AE6 (mao2)\r\n9AE7 (dan4)\r\n9AE8 (kun1)\r\n9AE9 (bin4)\r\n9AEA (fa4)\r\n9AEB (tiao2)\r\n9AEC (pi1)\r\n9AED (zi1)\r\n9AEE (fa4,fa3)\r\n9AEF (ran2,ran3)\r\n9AF0 (ti4)\r\n9AF1 (pao4)\r\n9AF2 (pi4)\r\n9AF3 (mao2)\r\n9AF4 (fu2,fo2)\r\n9AF5 (er2)\r\n9AF6 (rong2)\r\n9AF7 (qu1)\r\n9AF8 (none0)\r\n9AF9 (xiu1)\r\n9AFA (gua4)\r\n9AFB (ji4)\r\n9AFC (peng2)\r\n9AFD (zhua1)\r\n9AFE (shao1)\r\n9AFF (sha1)\r\n9B00 (ti4)\r\n9B01 (li4)\r\n9B02 (bin4)\r\n9B03 (zong1)\r\n9B04 (ti4)\r\n9B05 (peng2)\r\n9B06 (song1)\r\n9B07 (zheng1)\r\n9B08 (quan2,qian2)\r\n9B09 (zong1)\r\n9B0A (shun4)\r\n9B0B (jian1)\r\n9B0C (duo3)\r\n9B0D (hu2)\r\n9B0E (la4)\r\n9B0F (jiu1)\r\n9B10 (qi2)\r\n9B11 (lian2)\r\n9B12 (zhen3)\r\n9B13 (bin4)\r\n9B14 (peng2)\r\n9B15 (mo4)\r\n9B16 (san1)\r\n9B17 (man2)\r\n9B18 (man2)\r\n9B19 (seng1)\r\n9B1A (xu1)\r\n9B1B (lie4)\r\n9B1C (qian1)\r\n9B1D (qian1)\r\n9B1E (nong2)\r\n9B1F (huan2)\r\n9B20 (kuai4)\r\n9B21 (ning2)\r\n9B22 (bin4)\r\n9B23 (lie4)\r\n9B24 (rang2)\r\n9B25 (dou4,dou3)\r\n9B26 (dou4,dou3)\r\n9B27 (nao4)\r\n9B28 (hong4)\r\n9B29 (xi4)\r\n9B2A (dou4,dou3)\r\n9B2B (kan4)\r\n9B2C (dou4)\r\n9B2D (dou4,dou3)\r\n9B2E (jiu1)\r\n9B2F (chang4)\r\n9B30 (yu4)\r\n9B31 (yu4)\r\n9B32 (li4,ge2)\r\n9B33 (juan4)\r\n9B34 (fu3)\r\n9B35 (qian2)\r\n9B36 (gui1)\r\n9B37 (zong1)\r\n9B38 (liu4)\r\n9B39 (gui1)\r\n9B3A (shang1)\r\n9B3B (yu4)\r\n9B3C (gui3)\r\n9B3D (mei4)\r\n9B3E (ji4)\r\n9B3F (qi2)\r\n9B40 (jie4)\r\n9B41 (kui2)\r\n9B42 (hun2)\r\n9B43 (ba2)\r\n9B44 (po4,tuo4,bo2)\r\n9B45 (mei4)\r\n9B46 (xu1)\r\n9B47 (yan3)\r\n9B48 (xiao1)\r\n9B49 (liang3)\r\n9B4A (yu4)\r\n9B4B (tui2)\r\n9B4C (qi1)\r\n9B4D (wang3)\r\n9B4E (liang3)\r\n9B4F (wei4)\r\n9B50 (jian1)\r\n9B51 (chi1)\r\n9B52 (piao1)\r\n9B53 (bi4)\r\n9B54 (mo2)\r\n9B55 (ji3)\r\n9B56 (xu1)\r\n9B57 (chou3)\r\n9B58 (yan3)\r\n9B59 (zhan3)\r\n9B5A (yu2)\r\n9B5B (dao1)\r\n9B5C (ren2)\r\n9B5D (ji4)\r\n9B5E (ba1)\r\n9B5F (hong1)\r\n9B60 (tuo1)\r\n9B61 (diao4)\r\n9B62 (ji3)\r\n9B63 (yu2)\r\n9B64 (e2)\r\n9B65 (que4)\r\n9B66 (sha1)\r\n9B67 (hang2)\r\n9B68 (tun2)\r\n9B69 (mo4)\r\n9B6A (gai4)\r\n9B6B (shen3)\r\n9B6C (fan3)\r\n9B6D (yuan2)\r\n9B6E (pi2)\r\n9B6F (lu3)\r\n9B70 (wen2)\r\n9B71 (hu2)\r\n9B72 (lu2)\r\n9B73 (za2)\r\n9B74 (fang2)\r\n9B75 (fen4)\r\n9B76 (na4)\r\n9B77 (you2)\r\n9B78 (none0)\r\n9B79 (none0)\r\n9B7A (he2,ge3)\r\n9B7B (xia2)\r\n9B7C (qu1)\r\n9B7D (han1)\r\n9B7E (pi2)\r\n9B7F (ling2)\r\n9B80 (tuo2)\r\n9B81 (ba4)\r\n9B82 (qiu2)\r\n9B83 (ping2)\r\n9B84 (fu2)\r\n9B85 (bi4)\r\n9B86 (ji4)\r\n9B87 (wei4)\r\n9B88 (ju1)\r\n9B89 (diao1)\r\n9B8A (ba4)\r\n9B8B (you2)\r\n9B8C (gun3)\r\n9B8D (pi2)\r\n9B8E (nian2)\r\n9B8F (xing1)\r\n9B90 (tai2)\r\n9B91 (bao4)\r\n9B92 (fu4)\r\n9B93 (zha3,zha4)\r\n9B94 (ju4)\r\n9B95 (gu1)\r\n9B96 (none0)\r\n9B97 (none0)\r\n9B98 (none0)\r\n9B99 (ta4)\r\n9B9A (jie2)\r\n9B9B (shua1)\r\n9B9C (hou4)\r\n9B9D (xiang3)\r\n9B9E (er2)\r\n9B9F (an4)\r\n9BA0 (wei2)\r\n9BA1 (tiao1)\r\n9BA2 (zhu1)\r\n9BA3 (yin4)\r\n9BA4 (lie4)\r\n9BA5 (luo4)\r\n9BA6 (tong2)\r\n9BA7 (yi2)\r\n9BA8 (qi2)\r\n9BA9 (bing4)\r\n9BAA (wei3)\r\n9BAB (jiao1)\r\n9BAC (pu4)\r\n9BAD (gui1,xie2)\r\n9BAE (xian1,xian3)\r\n9BAF (ge2)\r\n9BB0 (hui2)\r\n9BB1 (none0)\r\n9BB2 (none0)\r\n9BB3 (kao3)\r\n9BB4 (none0)\r\n9BB5 (duo2)\r\n9BB6 (jun1)\r\n9BB7 (ti2)\r\n9BB8 (mian3)\r\n9BB9 (shao1)\r\n9BBA (za3)\r\n9BBB (suo1)\r\n9BBC (qin1)\r\n9BBD (yu2)\r\n9BBE (nei3)\r\n9BBF (zhe2)\r\n9BC0 (gun3)\r\n9BC1 (geng3)\r\n9BC2 (none0)\r\n9BC3 (wu2)\r\n9BC4 (qiu2)\r\n9BC5 (ting2)\r\n9BC6 (fu3)\r\n9BC7 (huan4)\r\n9BC8 (chou2)\r\n9BC9 (li3)\r\n9BCA (sha1)\r\n9BCB (sha1)\r\n9BCC (gao4)\r\n9BCD (meng2)\r\n9BCE (none0)\r\n9BCF (none0)\r\n9BD0 (none0)\r\n9BD1 (none0)\r\n9BD2 (yong3)\r\n9BD3 (ni2)\r\n9BD4 (zi1)\r\n9BD5 (qi2)\r\n9BD6 (qing1,zheng1)\r\n9BD7 (xiang3)\r\n9BD8 (nei3)\r\n9BD9 (chun2)\r\n9BDA (ji4)\r\n9BDB (diao1)\r\n9BDC (qie4)\r\n9BDD (gu4)\r\n9BDE (zhou3)\r\n9BDF (dong1)\r\n9BE0 (lai2)\r\n9BE1 (fei1)\r\n9BE2 (ni2)\r\n9BE3 (yi4)\r\n9BE4 (kun1)\r\n9BE5 (lu4)\r\n9BE6 (jiu4)\r\n9BE7 (chang1)\r\n9BE8 (jing1)\r\n9BE9 (lun2)\r\n9BEA (ling2)\r\n9BEB (zou1)\r\n9BEC (li2)\r\n9BED (meng3)\r\n9BEE (zong1)\r\n9BEF (zhi2)\r\n9BF0 (nian2,nian3)\r\n9BF1 (none0)\r\n9BF2 (none0)\r\n9BF3 (none0)\r\n9BF4 (shi1)\r\n9BF5 (sao1)\r\n9BF6 (hun3)\r\n9BF7 (ti2)\r\n9BF8 (hou2)\r\n9BF9 (xing1)\r\n9BFA (ju1)\r\n9BFB (la4)\r\n9BFC (zong1)\r\n9BFD (ji4)\r\n9BFE (bian1)\r\n9BFF (bian1)\r\n9C00 (huan4)\r\n9C01 (quan2)\r\n9C02 (ji4)\r\n9C03 (wei1)\r\n9C04 (wei1)\r\n9C05 (yu2)\r\n9C06 (chun1)\r\n9C07 (rou2)\r\n9C08 (die2)\r\n9C09 (huang2)\r\n9C0A (lian4)\r\n9C0B (yan3)\r\n9C0C (qiu1)\r\n9C0D (qiu1)\r\n9C0E (jian4)\r\n9C0F (bi4)\r\n9C10 (e4)\r\n9C11 (yang2)\r\n9C12 (fu4)\r\n9C13 (sai1,xi3)\r\n9C14 (jian3)\r\n9C15 (ha2,xia1)\r\n9C16 (tuo3)\r\n9C17 (hu2)\r\n9C18 (none0)\r\n9C19 (ruo4)\r\n9C1A (none0)\r\n9C1B (wen1)\r\n9C1C (jian1)\r\n9C1D (hao4)\r\n9C1E (wu1,wu4)\r\n9C1F (pang2)\r\n9C20 (sao1)\r\n9C21 (liu2)\r\n9C22 (ma3)\r\n9C23 (shi2)\r\n9C24 (shi1)\r\n9C25 (guan1)\r\n9C26 (zi1)\r\n9C27 (teng2)\r\n9C28 (ta4,ta3)\r\n9C29 (yao2)\r\n9C2A (ge2)\r\n9C2B (rong2)\r\n9C2C (qian2)\r\n9C2D (qi2)\r\n9C2E (wen1)\r\n9C2F (ruo4)\r\n9C30 (none0)\r\n9C31 (lian2)\r\n9C32 (ao2)\r\n9C33 (le4)\r\n9C34 (hui1)\r\n9C35 (min3)\r\n9C36 (ji4)\r\n9C37 (tiao2)\r\n9C38 (qu1)\r\n9C39 (jian1)\r\n9C3A (sao1)\r\n9C3B (man2)\r\n9C3C (xi2)\r\n9C3D (qiu2)\r\n9C3E (biao4)\r\n9C3F (ji1)\r\n9C40 (ji4)\r\n9C41 (zhu2)\r\n9C42 (jiang1)\r\n9C43 (qiu1)\r\n9C44 (zhuan1)\r\n9C45 (yong1)\r\n9C46 (zhang1)\r\n9C47 (kang1)\r\n9C48 (xue3)\r\n9C49 (bie1)\r\n9C4A (jue2)\r\n9C4B (qu1)\r\n9C4C (xiang4)\r\n9C4D (bo1)\r\n9C4E (jiao1)\r\n9C4F (xun2)\r\n9C50 (su4)\r\n9C51 (huang2)\r\n9C52 (zun1,zun4)\r\n9C53 (shan4)\r\n9C54 (shan4)\r\n9C55 (fan1)\r\n9C56 (gui4)\r\n9C57 (lin2)\r\n9C58 (xun2)\r\n9C59 (miao2)\r\n9C5A (xi3)\r\n9C5B (none0)\r\n9C5C (xiang1)\r\n9C5D (fen4)\r\n9C5E (guan1)\r\n9C5F (hou4)\r\n9C60 (kuai4)\r\n9C61 (zei2)\r\n9C62 (sao1)\r\n9C63 (zhan1)\r\n9C64 (gan3)\r\n9C65 (gui4)\r\n9C66 (sheng2)\r\n9C67 (li3)\r\n9C68 (chang2)\r\n9C69 (none0)\r\n9C6A (none0)\r\n9C6B (ai4)\r\n9C6C (ru2)\r\n9C6D (ji4)\r\n9C6E (xu4)\r\n9C6F (huo4)\r\n9C70 (none0)\r\n9C71 (li4)\r\n9C72 (lie4)\r\n9C73 (li4)\r\n9C74 (mie4)\r\n9C75 (zhen1)\r\n9C76 (xiang3)\r\n9C77 (e4)\r\n9C78 (lu2)\r\n9C79 (guan4)\r\n9C7A (li2)\r\n9C7B (xian1)\r\n9C7C (yu2)\r\n9C7D (dao1)\r\n9C7E (ji3)\r\n9C7F (you2)\r\n9C80 (tun2)\r\n9C81 (lu3)\r\n9C82 (fang2)\r\n9C83 (ba1)\r\n9C84 (ke3)\r\n9C85 (ba4)\r\n9C86 (ping2)\r\n9C87 (nian2)\r\n9C88 (lu2)\r\n9C89 (you2)\r\n9C8A (zha3)\r\n9C8B (fu4)\r\n9C8C (ba4,bo2)\r\n9C8D (bao4)\r\n9C8E (hou4)\r\n9C8F (pi2)\r\n9C90 (tai2)\r\n9C91 (gui1,xie2)\r\n9C92 (jie2)\r\n9C93 (kao4)\r\n9C94 (wei3)\r\n9C95 (er2)\r\n9C96 (tong2)\r\n9C97 (zei2)\r\n9C98 (hou4)\r\n9C99 (kuai4)\r\n9C9A (ji4)\r\n9C9B (jiao1)\r\n9C9C (xian1,xian3)\r\n9C9D (zha3)\r\n9C9E (xiang3)\r\n9C9F (xun2)\r\n9CA0 (geng3)\r\n9CA1 (li2)\r\n9CA2 (lian2)\r\n9CA3 (jian1)\r\n9CA4 (li3)\r\n9CA5 (shi2)\r\n9CA6 (tiao2)\r\n9CA7 (gun3)\r\n9CA8 (sha1)\r\n9CA9 (huan4)\r\n9CAA (jun1)\r\n9CAB (ji4)\r\n9CAC (yong3)\r\n9CAD (qing1,zheng1)\r\n9CAE (ling2)\r\n9CAF (qi2)\r\n9CB0 (zou1)\r\n9CB1 (fei1)\r\n9CB2 (kun1)\r\n9CB3 (chang1)\r\n9CB4 (gu4)\r\n9CB5 (ni2)\r\n9CB6 (nian2)\r\n9CB7 (diao1)\r\n9CB8 (jing1)\r\n9CB9 (shen1)\r\n9CBA (shi1)\r\n9CBB (zi1)\r\n9CBC (fen4)\r\n9CBD (die2)\r\n9CBE (bi1)\r\n9CBF (chang2)\r\n9CC0 (ti2)\r\n9CC1 (wen1)\r\n9CC2 (wei1)\r\n9CC3 (sai1)\r\n9CC4 (e4)\r\n9CC5 (qiu1)\r\n9CC6 (fu4)\r\n9CC7 (huang2)\r\n9CC8 (quan2)\r\n9CC9 (jiang1)\r\n9CCA (bian1)\r\n9CCB (sao1)\r\n9CCC (ao2)\r\n9CCD (qi2)\r\n9CCE (ta3)\r\n9CCF (guan1)\r\n9CD0 (yao2)\r\n9CD1 (pang2)\r\n9CD2 (jian1)\r\n9CD3 (le4)\r\n9CD4 (biao4)\r\n9CD5 (xue3)\r\n9CD6 (bie1)\r\n9CD7 (man2)\r\n9CD8 (min3)\r\n9CD9 (yong1)\r\n9CDA (wei4)\r\n9CDB (xi2)\r\n9CDC (gui4)\r\n9CDD (shan4)\r\n9CDE (lin2)\r\n9CDF (zun1)\r\n9CE0 (hu4)\r\n9CE1 (gan3)\r\n9CE2 (li3)\r\n9CE3 (shan4)\r\n9CE4 (guan3)\r\n9CE5 (niao3)\r\n9CE6 (yi3)\r\n9CE7 (fu2)\r\n9CE8 (li4)\r\n9CE9 (jiu1)\r\n9CEA (bu3)\r\n9CEB (yan4)\r\n9CEC (fu2)\r\n9CED (diao1)\r\n9CEE (ji1)\r\n9CEF (feng4)\r\n9CF0 (none0)\r\n9CF1 (gan1)\r\n9CF2 (shi1)\r\n9CF3 (feng4)\r\n9CF4 (ming2)\r\n9CF5 (bao3)\r\n9CF6 (yuan1)\r\n9CF7 (zhi1)\r\n9CF8 (hu4)\r\n9CF9 (qian2)\r\n9CFA (fu1)\r\n9CFB (fen1)\r\n9CFC (wen2)\r\n9CFD (jian1)\r\n9CFE (shi1)\r\n9CFF (yu4)\r\n9D00 (fou3)\r\n9D01 (yiao1)\r\n9D02 (ju2)\r\n9D03 (jue2)\r\n9D04 (pi1)\r\n9D05 (huan1)\r\n9D06 (zhen4)\r\n9D07 (bao3)\r\n9D08 (yan4)\r\n9D09 (ya1)\r\n9D0A (zheng4)\r\n9D0B (fang1)\r\n9D0C (feng4)\r\n9D0D (wen2)\r\n9D0E (ou1)\r\n9D0F (te4)\r\n9D10 (jia1)\r\n9D11 (nu1)\r\n9D12 (ling2)\r\n9D13 (mie4)\r\n9D14 (fu2)\r\n9D15 (tuo2)\r\n9D16 (wen2)\r\n9D17 (li4)\r\n9D18 (bian4)\r\n9D19 (zhi4)\r\n9D1A (ge1)\r\n9D1B (yuan1)\r\n9D1C (zi1)\r\n9D1D (qu2)\r\n9D1E (xiao1)\r\n9D1F (chi1,zhi1)\r\n9D20 (dan4)\r\n9D21 (ju1)\r\n9D22 (you4)\r\n9D23 (gu1)\r\n9D24 (zhong1)\r\n9D25 (yu4)\r\n9D26 (yang1)\r\n9D27 (rong4)\r\n9D28 (ya1)\r\n9D29 (zhi4)\r\n9D2A (yu4)\r\n9D2B (none0)\r\n9D2C (ying1)\r\n9D2D (zhui1)\r\n9D2E (wu1)\r\n9D2F (er2)\r\n9D30 (gua1)\r\n9D31 (ai4)\r\n9D32 (zhi1)\r\n9D33 (yan4)\r\n9D34 (heng2)\r\n9D35 (jiao1)\r\n9D36 (ji2)\r\n9D37 (lie4)\r\n9D38 (zhu1)\r\n9D39 (ren2)\r\n9D3A (ti2)\r\n9D3B (hong2)\r\n9D3C (luo4)\r\n9D3D (ru2)\r\n9D3E (mou2)\r\n9D3F (ge1)\r\n9D40 (ren4)\r\n9D41 (jiao1)\r\n9D42 (xiu1)\r\n9D43 (zhou1)\r\n9D44 (chi1)\r\n9D45 (luo4)\r\n9D46 (none0)\r\n9D47 (none0)\r\n9D48 (none0)\r\n9D49 (luan2)\r\n9D4A (jia2)\r\n9D4B (ji4)\r\n9D4C (yu2)\r\n9D4D (huan1)\r\n9D4E (tuo3)\r\n9D4F (bu1)\r\n9D50 (wu2)\r\n9D51 (juan1)\r\n9D52 (yu4)\r\n9D53 (bo2)\r\n9D54 (xun4)\r\n9D55 (xun4)\r\n9D56 (bi4)\r\n9D57 (xi1)\r\n9D58 (jun4)\r\n9D59 (ju2)\r\n9D5A (tu2,tu1)\r\n9D5B (jing1)\r\n9D5C (ti2,ti4)\r\n9D5D (e2)\r\n9D5E (e2)\r\n9D5F (kuang2)\r\n9D60 (hu2,gu3)\r\n9D61 (wu3)\r\n9D62 (shen1)\r\n9D63 (la4)\r\n9D64 (none0)\r\n9D65 (none0)\r\n9D66 (lu4)\r\n9D67 (bing4)\r\n9D68 (shu1)\r\n9D69 (fu2)\r\n9D6A (an1)\r\n9D6B (zhao4)\r\n9D6C (peng2)\r\n9D6D (qin2)\r\n9D6E (qian1)\r\n9D6F (bei1)\r\n9D70 (diao1)\r\n9D71 (lu4)\r\n9D72 (que4,qiao3)\r\n9D73 (jian1)\r\n9D74 (ju2)\r\n9D75 (tu4)\r\n9D76 (ya1)\r\n9D77 (yuan1)\r\n9D78 (qi2)\r\n9D79 (li2)\r\n9D7A (ye4)\r\n9D7B (zhui1)\r\n9D7C (kong1)\r\n9D7D (duo4)\r\n9D7E (kun1)\r\n9D7F (sheng1)\r\n9D80 (qi2)\r\n9D81 (jing1)\r\n9D82 (ni2)\r\n9D83 (e4)\r\n9D84 (jing1)\r\n9D85 (zi1)\r\n9D86 (lai2)\r\n9D87 (dong1)\r\n9D88 (qi1)\r\n9D89 (chun2)\r\n9D8A (geng1)\r\n9D8B (ju1)\r\n9D8C (qu1)\r\n9D8D (none0)\r\n9D8E (none0)\r\n9D8F (ji1)\r\n9D90 (shu4)\r\n9D91 (none0)\r\n9D92 (chi3)\r\n9D93 (miao2)\r\n9D94 (rou2)\r\n9D95 (fu2)\r\n9D96 (qiu1)\r\n9D97 (ti2)\r\n9D98 (hu2)\r\n9D99 (ti2)\r\n9D9A (e4)\r\n9D9B (jie1)\r\n9D9C (mao2)\r\n9D9D (fu2)\r\n9D9E (chun1)\r\n9D9F (tu2)\r\n9DA0 (yan3)\r\n9DA1 (he2)\r\n9DA2 (yuan2)\r\n9DA3 (pian1,bin4)\r\n9DA4 (yun4)\r\n9DA5 (mei2)\r\n9DA6 (hu2)\r\n9DA7 (ying1)\r\n9DA8 (dun4)\r\n9DA9 (mu4,wu4)\r\n9DAA (ju2)\r\n9DAB (none0)\r\n9DAC (cang1)\r\n9DAD (fang3)\r\n9DAE (ge4)\r\n9DAF (ying1)\r\n9DB0 (yuan2)\r\n9DB1 (xuan1)\r\n9DB2 (weng1)\r\n9DB3 (shi1)\r\n9DB4 (he4,hao2)\r\n9DB5 (chu2)\r\n9DB6 (tang2)\r\n9DB7 (xia4)\r\n9DB8 (ruo4)\r\n9DB9 (liu2)\r\n9DBA (ji2)\r\n9DBB (gu3,hu2,gu2)\r\n9DBC (jian1)\r\n9DBD (zhun3)\r\n9DBE (han4)\r\n9DBF (zi1)\r\n9DC0 (ci2)\r\n9DC1 (yi4,ni4)\r\n9DC2 (yao4)\r\n9DC3 (yan4)\r\n9DC4 (ji1)\r\n9DC5 (li4,piao3)\r\n9DC6 (tian2)\r\n9DC7 (kou4)\r\n9DC8 (ti1)\r\n9DC9 (ti1)\r\n9DCA (ni4)\r\n9DCB (tu2)\r\n9DCC (ma3)\r\n9DCD (jiao1)\r\n9DCE (liu2)\r\n9DCF (zhen1)\r\n9DD0 (chen2)\r\n9DD1 (li4)\r\n9DD2 (zhuan1)\r\n9DD3 (zhe4)\r\n9DD4 (ao2)\r\n9DD5 (yao3)\r\n9DD6 (yi1)\r\n9DD7 (ou1)\r\n9DD8 (chi4)\r\n9DD9 (zhi4)\r\n9DDA (liao2,liu4)\r\n9DDB (rong2)\r\n9DDC (lou2)\r\n9DDD (bi4)\r\n9DDE (shuang1)\r\n9DDF (zhuo2)\r\n9DE0 (yu2)\r\n9DE1 (wu2)\r\n9DE2 (jue2)\r\n9DE3 (yin2)\r\n9DE4 (tan2)\r\n9DE5 (si1)\r\n9DE6 (jiao1)\r\n9DE7 (yi4)\r\n9DE8 (hua1)\r\n9DE9 (bi4)\r\n9DEA (ying1)\r\n9DEB (su4)\r\n9DEC (huang2)\r\n9DED (fan2)\r\n9DEE (jiao1)\r\n9DEF (liao2)\r\n9DF0 (yan4)\r\n9DF1 (kao1)\r\n9DF2 (jiu4)\r\n9DF3 (xian2)\r\n9DF4 (xian2)\r\n9DF5 (tu2)\r\n9DF6 (mai3)\r\n9DF7 (zun1)\r\n9DF8 (yu4)\r\n9DF9 (ying1)\r\n9DFA (lu4)\r\n9DFB (tuan2)\r\n9DFC (xian2)\r\n9DFD (xue2)\r\n9DFE (yi4)\r\n9DFF (pi4)\r\n9E00 (shu2)\r\n9E01 (luo2)\r\n9E02 (qi1)\r\n9E03 (yi2)\r\n9E04 (ji1)\r\n9E05 (zhe2)\r\n9E06 (yu2)\r\n9E07 (zhan1)\r\n9E08 (ye4)\r\n9E09 (yang2)\r\n9E0A (pi4)\r\n9E0B (ning2)\r\n9E0C (hu4)\r\n9E0D (mi2)\r\n9E0E (ying1)\r\n9E0F (meng2)\r\n9E10 (di2)\r\n9E11 (yue4)\r\n9E12 (yu2)\r\n9E13 (lei3)\r\n9E14 (bo2)\r\n9E15 (lu2)\r\n9E16 (he4)\r\n9E17 (long2)\r\n9E18 (shuang1)\r\n9E19 (yue4)\r\n9E1A (ying1)\r\n9E1B (guan4)\r\n9E1C (qu2)\r\n9E1D (li2)\r\n9E1E (luan2)\r\n9E1F (niao3,diao3)\r\n9E20 (jiu1)\r\n9E21 (ji1)\r\n9E22 (yuan1)\r\n9E23 (ming2)\r\n9E24 (shi1)\r\n9E25 (ou1)\r\n9E26 (ya1)\r\n9E27 (cang1)\r\n9E28 (bao3)\r\n9E29 (zhen4)\r\n9E2A (gu1)\r\n9E2B (dong1)\r\n9E2C (lu2)\r\n9E2D (ya1)\r\n9E2E (xiao1)\r\n9E2F (yang1)\r\n9E30 (ling2)\r\n9E31 (chi1)\r\n9E32 (qu2)\r\n9E33 (yuan1)\r\n9E34 (xue2)\r\n9E35 (tuo2)\r\n9E36 (si1)\r\n9E37 (zhi4)\r\n9E38 (er2)\r\n9E39 (gua1)\r\n9E3A (xiu1)\r\n9E3B (heng2)\r\n9E3C (zhou1)\r\n9E3D (ge1)\r\n9E3E (luan2)\r\n9E3F (hong2)\r\n9E40 (wu2)\r\n9E41 (bo2)\r\n9E42 (li2)\r\n9E43 (juan1)\r\n9E44 (hu2,gu3)\r\n9E45 (e2)\r\n9E46 (yu4)\r\n9E47 (xian2)\r\n9E48 (ti2)\r\n9E49 (wu3)\r\n9E4A (que4)\r\n9E4B (miao2)\r\n9E4C (an1)\r\n9E4D (kun1)\r\n9E4E (bei1)\r\n9E4F (peng2)\r\n9E50 (qian1)\r\n9E51 (chun2)\r\n9E52 (geng1)\r\n9E53 (yuan1)\r\n9E54 (su4)\r\n9E55 (hu2)\r\n9E56 (he2)\r\n9E57 (e4)\r\n9E58 (gu3,hu2)\r\n9E59 (qiu1)\r\n9E5A (ci2)\r\n9E5B (mei2)\r\n9E5C (wu4)\r\n9E5D (yi4)\r\n9E5E (yao4)\r\n9E5F (weng1)\r\n9E60 (liu2)\r\n9E61 (ji2)\r\n9E62 (yi4)\r\n9E63 (jian1)\r\n9E64 (he4)\r\n9E65 (yi1)\r\n9E66 (ying1)\r\n9E67 (zhe4)\r\n9E68 (liu4)\r\n9E69 (liao2)\r\n9E6A (jiao1)\r\n9E6B (jiu4)\r\n9E6C (yu4)\r\n9E6D (lu4)\r\n9E6E (huan2)\r\n9E6F (zhan1)\r\n9E70 (ying1)\r\n9E71 (hu4)\r\n9E72 (meng2)\r\n9E73 (guan4)\r\n9E74 (shuang1)\r\n9E75 (lu3)\r\n9E76 (jin1)\r\n9E77 (ling2)\r\n9E78 (jian3)\r\n9E79 (xian2)\r\n9E7A (cuo2)\r\n9E7B (jian3)\r\n9E7C (jian3)\r\n9E7D (yan2)\r\n9E7E (cuo2)\r\n9E7F (lu4)\r\n9E80 (you1)\r\n9E81 (cu1)\r\n9E82 (ji3)\r\n9E83 (biao1)\r\n9E84 (cu1)\r\n9E85 (pao2)\r\n9E86 (zhu4)\r\n9E87 (jun1,qun2)\r\n9E88 (zhu3)\r\n9E89 (jian1,qian1)\r\n9E8A (mi2)\r\n9E8B (mi2)\r\n9E8C (wu2)\r\n9E8D (liu2)\r\n9E8E (chen2)\r\n9E8F (jun1,qun2)\r\n9E90 (lin2)\r\n9E91 (ni2)\r\n9E92 (qi2)\r\n9E93 (lu4)\r\n9E94 (jiu4)\r\n9E95 (jun1,qun2)\r\n9E96 (jing1)\r\n9E97 (li4,li2)\r\n9E98 (xiang1)\r\n9E99 (yan2)\r\n9E9A (jia1)\r\n9E9B (mi2)\r\n9E9C (li4)\r\n9E9D (she4)\r\n9E9E (zhang1)\r\n9E9F (lin2)\r\n9EA0 (jing1)\r\n9EA1 (qi2)\r\n9EA2 (ling2)\r\n9EA3 (yan2)\r\n9EA4 (cu1)\r\n9EA5 (mai4)\r\n9EA6 (mai4)\r\n9EA7 (ge1)\r\n9EA8 (chao3)\r\n9EA9 (fu1)\r\n9EAA (mian4)\r\n9EAB (mian3)\r\n9EAC (fu1)\r\n9EAD (pao4)\r\n9EAE (qu4)\r\n9EAF (qu1,qu3)\r\n9EB0 (mou2)\r\n9EB1 (fu1)\r\n9EB2 (xian4)\r\n9EB3 (lai2)\r\n9EB4 (qu1,qu2)\r\n9EB5 (mian4)\r\n9EB6 (chi1,li2)\r\n9EB7 (feng1)\r\n9EB8 (fu1)\r\n9EB9 (qu1)\r\n9EBA (mian4)\r\n9EBB (ma2,ma1)\r\n9EBC (ma2,me5,mo5)\r\n9EBD (mo2,me5)\r\n9EBE (hui1)\r\n9EBF (none0)\r\n9EC0 (zou1)\r\n9EC1 (nen1)\r\n9EC2 (fen2)\r\n9EC3 (huang2)\r\n9EC4 (huang2)\r\n9EC5 (jin1)\r\n9EC6 (guang1)\r\n9EC7 (tian1)\r\n9EC8 (tou3)\r\n9EC9 (hong2)\r\n9ECA (xi1)\r\n9ECB (kuang4)\r\n9ECC (hong2)\r\n9ECD (shu3)\r\n9ECE (li2)\r\n9ECF (nian2)\r\n9ED0 (chi1,li2)\r\n9ED1 (hei1)\r\n9ED2 (hei1)\r\n9ED3 (yi4)\r\n9ED4 (qian2)\r\n9ED5 (zhen3)\r\n9ED6 (xi4)\r\n9ED7 (tuan3)\r\n9ED8 (mo4)\r\n9ED9 (mo4)\r\n9EDA (qian2)\r\n9EDB (dai4)\r\n9EDC (chu4)\r\n9EDD (you3)\r\n9EDE (dian3)\r\n9EDF (yi1)\r\n9EE0 (xia2)\r\n9EE1 (yan3)\r\n9EE2 (qu1)\r\n9EE3 (mei3)\r\n9EE4 (yan3)\r\n9EE5 (qing2,jing1)\r\n9EE6 (yu4)\r\n9EE7 (li2)\r\n9EE8 (dang3)\r\n9EE9 (du2)\r\n9EEA (can3)\r\n9EEB (yin1)\r\n9EEC (an4)\r\n9EED (yan3)\r\n9EEE (tan2)\r\n9EEF (an4)\r\n9EF0 (zhen3)\r\n9EF1 (dai4)\r\n9EF2 (can3)\r\n9EF3 (yi1)\r\n9EF4 (mei2)\r\n9EF5 (dan3)\r\n9EF6 (yan3)\r\n9EF7 (du2)\r\n9EF8 (lu2)\r\n9EF9 (zhi3)\r\n9EFA (fen3)\r\n9EFB (fu2)\r\n9EFC (fu3)\r\n9EFD (min3,mian3)\r\n9EFE (min3,mian3)\r\n9EFF (yuan2)\r\n9F00 (cu4)\r\n9F01 (qu4)\r\n9F02 (chao2)\r\n9F03 (wa1)\r\n9F04 (zhu1)\r\n9F05 (zhi1)\r\n9F06 (mang2)\r\n9F07 (ao2)\r\n9F08 (bie1)\r\n9F09 (tuo2)\r\n9F0A (bi4)\r\n9F0B (yuan2)\r\n9F0C (chao2)\r\n9F0D (tuo2)\r\n9F0E (ding3)\r\n9F0F (mi4)\r\n9F10 (nai4)\r\n9F11 (ding3)\r\n9F12 (zi1)\r\n9F13 (gu3,hu2)\r\n9F14 (gu3)\r\n9F15 (dong1)\r\n9F16 (fen2)\r\n9F17 (tao2)\r\n9F18 (yuan1)\r\n9F19 (pi2)\r\n9F1A (chang1)\r\n9F1B (gao1)\r\n9F1C (qi4)\r\n9F1D (yuan1)\r\n9F1E (tang1)\r\n9F1F (teng1)\r\n9F20 (shu3)\r\n9F21 (shu3)\r\n9F22 (fen2)\r\n9F23 (fei4)\r\n9F24 (wen2)\r\n9F25 (ba2)\r\n9F26 (diao1)\r\n9F27 (tuo2)\r\n9F28 (tong2)\r\n9F29 (qu2)\r\n9F2A (sheng1)\r\n9F2B (shi2)\r\n9F2C (you4)\r\n9F2D (shi2)\r\n9F2E (ting2)\r\n9F2F (wu2)\r\n9F30 (nian4)\r\n9F31 (jing1)\r\n9F32 (hun2)\r\n9F33 (ju2)\r\n9F34 (yan3)\r\n9F35 (tu2)\r\n9F36 (si1)\r\n9F37 (xi1)\r\n9F38 (xian3)\r\n9F39 (yan3)\r\n9F3A (lei2)\r\n9F3B (bi2)\r\n9F3C (yao2)\r\n9F3D (yan3,qui2)\r\n9F3E (han1)\r\n9F3F (hui1)\r\n9F40 (wu4)\r\n9F41 (hou1)\r\n9F42 (xi4)\r\n9F43 (ge2)\r\n9F44 (zha1)\r\n9F45 (xiu4)\r\n9F46 (weng4)\r\n9F47 (zha1)\r\n9F48 (nong2)\r\n9F49 (nang4)\r\n9F4A (qi2,zhai1)\r\n9F4B (zhai1)\r\n9F4C (ji4)\r\n9F4D (zi1,ji1)\r\n9F4E (ji1)\r\n9F4F (ji1)\r\n9F50 (qi2,ji4,qi4)\r\n9F51 (ji1)\r\n9F52 (chi3)\r\n9F53 (chen3)\r\n9F54 (chen4)\r\n9F55 (he2)\r\n9F56 (ya2)\r\n9F57 (ken3)\r\n9F58 (xie4)\r\n9F59 (bao1)\r\n9F5A (ze2)\r\n9F5B (shi4)\r\n9F5C (zi1)\r\n9F5D (chi1)\r\n9F5E (nian4)\r\n9F5F (ju3)\r\n9F60 (tiao2)\r\n9F61 (ling2)\r\n9F62 (ling2)\r\n9F63 (chu1)\r\n9F64 (quan2)\r\n9F65 (xie4)\r\n9F66 (yin2,ken3)\r\n9F67 (nie4)\r\n9F68 (jiu4)\r\n9F69 (nie4)\r\n9F6A (chuo4)\r\n9F6B (kun3)\r\n9F6C (yu3)\r\n9F6D (chu3)\r\n9F6E (yi3)\r\n9F6F (ni2)\r\n9F70 (cuo4)\r\n9F71 (chuo4)\r\n9F72 (qu3)\r\n9F73 (nian3)\r\n9F74 (xian3)\r\n9F75 (yu2)\r\n9F76 (e4)\r\n9F77 (wo4)\r\n9F78 (yi4)\r\n9F79 (chi1)\r\n9F7A (zou1)\r\n9F7B (dian1)\r\n9F7C (chu3)\r\n9F7D (jin4)\r\n9F7E (ya4)\r\n9F7F (chi3)\r\n9F80 (chen4)\r\n9F81 (he2)\r\n9F82 (yin2)\r\n9F83 (ju3)\r\n9F84 (ling2)\r\n9F85 (bao1)\r\n9F86 (tiao2)\r\n9F87 (zi1)\r\n9F88 (yin2,ken3)\r\n9F89 (yu3)\r\n9F8A (chuo4)\r\n9F8B (qu3)\r\n9F8C (wo4)\r\n9F8D (long2)\r\n9F8E (pang2)\r\n9F8F (gong1)\r\n9F90 (pang2)\r\n9F91 (yan3)\r\n9F92 (long2)\r\n9F93 (long2)\r\n9F94 (gong1)\r\n9F95 (kan1)\r\n9F96 (ta4)\r\n9F97 (ling2)\r\n9F98 (ta4)\r\n9F99 (long2)\r\n9F9A (gong1)\r\n9F9B (kan1)\r\n9F9C (gui1,jun1,qiu1)\r\n9F9D (qiu1)\r\n9F9E (bie1)\r\n9F9F (gui1,jun1,qiu1)\r\n9FA0 (yue4)\r\n9FA1 (chui1)\r\n9FA2 (he2)\r\n9FA3 (jue2)\r\n9FA4 (xie2)\r\n9FA5 (yue4)"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCAttributedLabel.h",
    "content": "//\n//  RCAttributedLabel.h\n//  iOS-IMKit\n//\n//  Created by YangZigang on 14/10/29.\n//  Copyright (c) 2014年 RongCloud. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n/**\n *  RCAttributedLabelClickedTextInfo\n */\n@interface RCAttributedLabelClickedTextInfo : NSObject\n/**\n *  NSTextCheckingType\n */\n@property(nonatomic, assign) NSTextCheckingType textCheckingType;\n/**\n *  text\n */\n@property(nonatomic, strong) NSString *text;\n\n@end\n\n/**\n *  RCAttributedDataSource\n */\n@protocol RCAttributedDataSource <NSObject>\n/**\n *  attributeDictionaryForTextType\n *\n *  @param textType textType\n *\n *  @return return NSDictionary\n */\n- (NSDictionary *)attributeDictionaryForTextType:(NSTextCheckingTypes)textType;\n/**\n *  highlightedAttributeDictionaryForTextType\n *\n *  @param textType textType\n *\n *  @return NSDictionary\n */\n- (NSDictionary *)highlightedAttributeDictionaryForTextType:(NSTextCheckingType)textType;\n\n@end\n\n@protocol RCAttributedLabelDelegate;\n\n/**\n *  Override UILabel @property to accept both NSString and NSAttributedString\n */\n@protocol RCAttributedLabel <NSObject>\n\n/**\n *  text\n */\n@property (nonatomic, copy) id text;\n\n@end\n/**\n *  RCAttributedLabel\n */\n@interface RCAttributedLabel : UILabel <RCAttributedDataSource,UIGestureRecognizerDelegate>\n/**\n * 可以通过设置attributeDataSource或者attributeDictionary、highlightedAttributeDictionary来自定义不同文本的字体颜色\n */\n@property(nonatomic, strong) id<RCAttributedDataSource> attributeDataSource;\n/**\n * 可以通过设置attributedStrings可以给一些字符添加点击事件等，例如在实现的会话列表里修改文本消息内容\n *  -(void)willDisplayConversationTableCell:(RCMessageBaseCell *)cell atIndexPath:(NSIndexPath *)indexPath{\n *\n *   if ([cell isKindOfClass:[RCTextMessageCell class]]) {\n *      RCTextMessageCell *newCell = (RCTextMessageCell *)cell;\n *      if (newCell.textLabel.text.length>3) {\n *          NSTextCheckingResult *textCheckingResult = [NSTextCheckingResult linkCheckingResultWithRange:(NSMakeRange(0, 3)) URL:[NSURL URLWithString:@\"http://www.baidu.com\"]];\n *          [newCell.textLabel.attributedStrings addObject:textCheckingResult];\n *          [newCell.textLabel setTextHighlighted:YES atPoint:CGPointMake(0, 3)];\n *       }\n *    }\n *}\n *\n */\n@property(nonatomic, strong) NSMutableArray *attributedStrings;\n/*!\n 点击回调\n */\n@property (nonatomic, assign) id <RCAttributedLabelDelegate> delegate;\n/**\n *  attributeDictionary\n */\n@property(nonatomic, strong) NSDictionary *attributeDictionary;\n/**\n *  highlightedAttributeDictionary\n */\n@property(nonatomic, strong) NSDictionary *highlightedAttributeDictionary;\n/**\n *  NSTextCheckingTypes 格式类型\n */\n@property(nonatomic, assign) NSTextCheckingTypes textCheckingTypes;\n/**\n *  NSTextCheckingTypes current格式类型\n */\n@property(nonatomic, readonly, assign) NSTextCheckingType currentTextCheckingType;\n/**\n *  setTextdataDetectorEnabled\n *\n *  @param text                text\n *  @param dataDetectorEnabled dataDetectorEnabled\n */\n- (void)setText:(NSString *)text dataDetectorEnabled:(BOOL)dataDetectorEnabled;\n/**\n *  textInfoAtPoint\n *\n *  @param point point\n *\n *  @return RCAttributedLabelClickedTextInfo\n */\n- (RCAttributedLabelClickedTextInfo *)textInfoAtPoint:(CGPoint)point;\n/**\n *  setTextHighlighted\n *\n *  @param highlighted highlighted\n *  @param point       point\n */\n- (void)setTextHighlighted:(BOOL)highlighted atPoint:(CGPoint)point;\n\n@end\n\n/*!\n RCAttributedLabel点击回调\n */\n@protocol RCAttributedLabelDelegate <NSObject>\n@optional\n\n/*!\n 点击URL的回调\n \n @param label 当前Label\n @param url   点击的URL\n */\n- (void)attributedLabel:(RCAttributedLabel *)label didSelectLinkWithURL:(NSURL *)url;\n\n/*!\n 点击电话号码的回调\n \n @param label       当前Label\n @param phoneNumber 点击的URL\n */\n- (void)attributedLabel:(RCAttributedLabel *)label didSelectLinkWithPhoneNumber:(NSString *)phoneNumber;\n\n/*!\n 点击Label的回调\n \n @param label   当前Label\n @param content 点击的内容\n */\n- (void)attributedLabel:(RCAttributedLabel *)label didTapLabel:(NSString *)content;\n\n@end\n\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCBaseViewController.h",
    "content": "//\n//  RCBaseViewController.h\n//  RongIMKit\n//\n//  Created by xugang on 15/1/22.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#ifndef __RCBaseViewController\n#define __RCBaseViewController\n#import <UIKit/UIKit.h>\n#import <RongIMLib/RongIMLib.h>\n\n/*!\n IMKit ViewController基类\n \n @discussion 主要定义了View的默认大小。\n */\n@interface RCBaseViewController : UIViewController\n@end\n#endif"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCChatSessionInputBarControl.h",
    "content": "//\n//  RCChatSessionInputBarControl.h\n//  RongIMKit\n//\n//  Created by xugang on 15/2/12.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#ifndef __RCChatSessionInputBarControl\n#define __RCChatSessionInputBarControl\n#import <UIKit/UIKit.h>\n#import <RongIMLib/RongIMLib.h>\n#import \"RCTextView.h\"\n\n#define Height_ChatSessionInputBar 50.0f\n\n/*!\n 输入工具栏的显示布局\n */\ntypedef NS_ENUM(NSInteger, RCChatSessionInputBarControlStyle) {\n    /*!\n     切换-输入框-扩展\n     */\n    RC_CHAT_INPUT_BAR_STYLE_SWITCH_CONTAINER_EXTENTION = 0,\n    /*!\n     扩展-输入框-切换\n     */\n    RC_CHAT_INPUT_BAR_STYLE_EXTENTION_CONTAINER_SWITCH = 1,\n    /*!\n     输入框-切换-扩展\n     */\n    RC_CHAT_INPUT_BAR_STYLE_CONTAINER_SWITCH_EXTENTION = 2,\n    /*!\n     输入框-扩展-切换\n     */\n    RC_CHAT_INPUT_BAR_STYLE_CONTAINER_EXTENTION_SWITCH = 3,\n    /*!\n     切换-输入框\n     */\n    RC_CHAT_INPUT_BAR_STYLE_SWITCH_CONTAINER = 4,\n    /*!\n     输入框-切换\n     */\n    RC_CHAT_INPUT_BAR_STYLE_CONTAINER_SWITCH = 5,\n    /*!\n     扩展-输入框\n     */\n    RC_CHAT_INPUT_BAR_STYLE_EXTENTION_CONTAINER = 6,\n    /*!\n     输入框-扩展\n     */\n    RC_CHAT_INPUT_BAR_STYLE_CONTAINER_EXTENTION = 7,\n    /*!\n     输入框\n     */\n    RC_CHAT_INPUT_BAR_STYLE_CONTAINER = 8,\n};\n\n/*!\n 输入工具栏的菜单类型\n */\ntypedef NS_ENUM(NSInteger, RCChatSessionInputBarControlType) {\n    /*!\n     默认类型，非公众服务\n     */\n    RCChatSessionInputBarControlDefaultType = 0,\n    /*!\n     公众服务\n     */\n    RCChatSessionInputBarControlPubType = 1\n};\n\n/*!\n 输入工具栏的输入模式\n */\ntypedef NS_ENUM(NSInteger, RCChatSessionInputBarInputType) {\n    /*!\n     文本输入模式\n     */\n    RCChatSessionInputBarInputText = 0,\n    /*!\n     语音输入模式\n     */\n    RCChatSessionInputBarInputVoice = 1,\n    /*!\n     扩展输入模式\n     */\n    RCChatSessionInputBarInputExtention = 2\n};\n\n/*!\n 输入工具栏的输入模式\n */\ntypedef NS_ENUM(NSInteger, KBottomBarStatus) {\n    /*!\n     初始状态\n     */\n    KBottomBarDefaultStatus = 0,\n    /*!\n     文本输入状态\n     */\n    KBottomBarKeyboardStatus,\n    /*!\n     功能板输入模式\n     */\n    KBottomBarPluginStatus,\n    /*!\n     表情输入模式\n     */\n    KBottomBarEmojiStatus,\n    /*!\n     语音消息输入模式\n     */\n    KBottomBarRecordStatus\n};\n\n/*!\n 输入工具栏的点击监听器\n */\n@protocol RCChatSessionInputBarControlDelegate;\n\n/*!\n 输入工具栏\n */\n@interface RCChatSessionInputBarControl : UIView\n\n/*!\n 输入工具栏的点击回调监听\n */\n@property(weak, nonatomic) id<RCChatSessionInputBarControlDelegate> delegate;\n\n/*!\n 公众服务菜单的容器View\n */\n@property(weak, nonatomic) UIView *clientView;\n\n/*!\n 公众服务菜单切换的按钮\n */\n@property(strong, nonatomic) UIButton *pubSwitchButton;\n\n/*!\n 容器View\n */\n@property(strong, nonatomic) UIView *inputContainerView;\n\n/*!\n 公众服务菜单的容器View\n */\n@property(strong, nonatomic) UIView *menuContainerView;\n\n/*!\n 语音与文本输入切换的按钮\n */\n@property(strong, nonatomic) UIButton *switchButton;\n\n/*!\n 录制语音消息的按钮\n */\n@property(strong, nonatomic) UIButton *recordButton;\n\n/*!\n 文本输入框\n */\n@property(strong, nonatomic) RCTextView *inputTextView;\n\n/*!\n 表情的按钮\n */\n@property(strong, nonatomic) UIButton *emojiButton;\n\n/*!\n 扩展输入的按钮\n */\n@property(strong, nonatomic) UIButton *additionalButton;\n\n/*!\n 所处的聊天界面View\n */\n@property(assign, nonatomic, readonly) UIView *contextView;\n\n/*!\n Frame 起点X坐标\n */\n@property(assign, nonatomic) float currentPositionY;\n\n/*!\n Frame 起点Y坐标\n */\n@property(assign, nonatomic) float originalPositionY;\n\n/*!\n 文本输入框的高度\n */\n@property(assign, nonatomic) float inputTextview_height;\n\n/*!\n 公众服务账号菜单\n */\n@property(strong, nonatomic) RCPublicServiceMenu *publicServiceMenu;\n\n/*!\n 初始化输入工具栏\n \n @param frame       显示的Frame\n @param contextView 所处的聊天界面View\n @param type        菜单类型\n @param style       显示布局\n @return            输入工具栏对象\n */\n- (id)initWithFrame:(CGRect)frame\n    withContextView:(UIView *)contextView\n               type:(RCChatSessionInputBarControlType)type\n              style:(RCChatSessionInputBarControlStyle)style;\n\n/*!\n 设置输入工具栏的样式\n \n @param type  菜单类型\n @param style 显示布局\n \n @discussion 您可以在聊天界面RCConversationViewController的viewDidLoad之后设置，改变输入工具栏的样式。\n */\n- (void)setInputBarType:(RCChatSessionInputBarControlType)type style:(RCChatSessionInputBarControlStyle)style;\n\n/**\n *  dismiss公众账号弹出菜单\n */\n- (void)dismissPublicServiceMenuPopupView;\n@end\n\n/*!\n 输入工具栏的点击监听器\n */\n@protocol RCChatSessionInputBarControlDelegate <NSObject>\n\n@optional\n\n/*!\n 键盘积即将显示的回调\n \n @param keyboardFrame 键盘最终需要显示的Frame\n */\n- (void)keyboardWillShowWithFrame:(CGRect)keyboardFrame;\n\n/*!\n 键盘即将隐藏的回调\n */\n- (void)keyboardWillHide;\n\n/*!\n 输入工具栏尺寸（高度）发生变化的回调\n \n @param frame 输入工具栏最终需要显示的Frame\n */\n- (void)chatSessionInputBarControlContentSizeChanged:(CGRect)frame;\n\n/*!\n 点击键盘Return按钮的回调\n \n @param inputControl 当前输入工具栏\n @param text         当前输入框中国的文本内容\n */\n- (void)didTouchKeyboardReturnKey:(RCChatSessionInputBarControl *)inputControl text:(NSString *)text;\n\n/*!\n 点击表情按钮的回调\n \n @param sender 表情按钮\n */\n- (void)didTouchEmojiButton:(UIButton *)sender;\n\n/*!\n 点击扩展输入按钮的回调\n \n @param sender 扩展输入的按钮\n */\n- (void)didTouchAddtionalButton:(UIButton *)sender;\n\n/*!\n 输入模式发生变化的回调\n \n @param switched 文本输入框最终是否隐藏\n */\n- (void)didTouchSwitchButton:(BOOL)switched;\n\n/*!\n 点击公众服务的菜单切换按钮的回调\n \n @param switched 文本输入框最终是否隐藏\n */\n- (void)didTouchPubSwitchButton:(BOOL)switched;\n\n/*!\n 点击录音按钮回调\n \n @param sender 录音按钮\n @param event  点击事件\n */\n- (void)didTouchRecordButon:(UIButton *)sender event:(UIControlEvents)event;\n\n/*!\n 输入框中内容发生变化的回调\n \n @param inputTextView 文本输入框\n @param range         当前操作的范围\n @param text          插入的文本\n */\n- (void)inputTextView:(UITextView *)inputTextView\nshouldChangeTextInRange:(NSRange)range\n      replacementText:(NSString *)text;\n\n/*!\n 公众服务菜单的点击回调\n \n @param selectedMenuItem 点击的公众服务菜单项\n */\n- (void)onPublicServiceMenuItemSelected:(RCPublicServiceMenuItem *)selectedMenuItem;\n\n@end\n\n#endif"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCContentView.h",
    "content": "//\n//  RCContentView.h\n//  RongIMKit\n//\n//  Created by xugang on 3/31/15.\n//  Copyright (c) 2015 RongCloud. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n/*!\n 消息内容的View\n */\n@interface RCContentView : UIView\n\n/*!\n Frame发生变化的回调\n */\n@property(nonatomic, copy) void (^eventBlock)(CGRect frame);\n\n/*!\n 注册Frame发生变化的回调\n \n @param eventBlock Frame发生变化的回调\n */\n- (void)registerFrameChangedEvent:(void (^)(CGRect frame))eventBlock;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCConversationBaseCell.h",
    "content": "//\n//  RCConversationBaseTableCell.h\n//  RongIMKit\n//\n//  Created by xugang on 15/1/24.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#ifndef __RCConversationBaseTableCell\n#define __RCConversationBaseTableCell\n#import <UIKit/UIKit.h>\n#import \"RCConversationModel.h\"\n\n/*!\n 会话Cell基类\n */\n@interface RCConversationBaseCell : UITableViewCell\n\n/*!\n 会话Cell的数据模型\n */\n@property(nonatomic, strong) RCConversationModel *model;\n\n/*!\n 设置会话Cell的数据模型\n \n @param model 会话Cell的数据模型\n */\n- (void)setDataModel:(RCConversationModel *)model;\n\n@end\n#endif"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCConversationCell.h",
    "content": "//\n//  RCConversationTableCell.h\n//  RongIMKit\n//\n//  Created by xugang on 15/1/24.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#ifndef __RCConversationTableCell\n#define __RCConversationTableCell\n#import <UIKit/UIKit.h>\n#import \"RCConversationBaseCell.h\"\n#import \"RCMessageBubbleTipView.h\"\n#import \"RCThemeDefine.h\"\n\n#define CONVERSATION_ITEM_HEIGHT 65.0f\n@protocol RCConversationCellDelegate;\n@class RCloudImageView;\n\n/*!\n 会话Cell类\n */\n@interface RCConversationCell : RCConversationBaseCell\n\n/*!\n 会话Cell的点击监听器\n */\n@property(weak, nonatomic) id<RCConversationCellDelegate> delegate;\n\n/*!\n Cell的头像背景View\n */\n@property(strong, nonatomic) UIView *headerImageViewBackgroundView;\n\n/*!\n Cell头像View\n */\n@property(strong, nonatomic) RCloudImageView *headerImageView;\n\n/*!\n 会话的标题\n */\n@property(strong, nonatomic) UILabel *conversationTitle;\n\n/*!\n 显示最后一条内容的Label\n */\n@property(strong, nonatomic) UILabel *messageContentLabel;\n\n/*!\n 显示最后一条消息发送时间的Label\n */\n@property(strong, nonatomic) UILabel *messageCreatedTimeLabel;\n\n/*!\n 头像右上角未读消息提示的View\n */\n@property(strong, nonatomic) RCMessageBubbleTipView *bubbleTipView;\n\n/*!\n 会话免打扰状态显示的View\n */\n@property(strong, nonatomic) UIImageView *conversationStatusImageView;\n\n/*!\n Cell中显示的头像形状\n \n @discussion 默认值为当前IMKit的全局设置值（RCIM中的globalConversationAvatarStyle）。\n */\n@property(nonatomic) RCUserAvatarStyle portraitStyle;\n\n/*!\n 是否进行新消息提醒\n \n @discussion 此属性默认会根据会话设置的提醒状态进行设置。\n */\n@property(nonatomic) BOOL enableNotification;\n\n/*!\n 会话中有未读消息时，是否在头像右上角的bubbleTipView中显示数字\n \n @discussion 默认值为YES。\n 您可以在RCConversationListViewController的willDisplayConversationTableCell:atIndexPath:回调中进行设置。\n */\n@property(nonatomic) BOOL isShowNotificationNumber;\n\n/*!\n Cell的背景颜色\n */\n@property(nonatomic) UIColor *cellBackgroundColor;\n\n/*!\n 置顶Cell的背景颜色\n */\n@property(nonatomic) UIColor *topCellBackgroundColor;\n\n/*!\n 显示最后一台消息发送状态\n */\n@property(strong, nonatomic) UIImageView *lastSendMessageStatusView;\n\n/*!\n 设置Cell中显示的头像形状\n \n @param portraitStyle 头像形状\n \n @discussion 此设置仅当前会话Cell有效。\n */\n- (void)setHeaderImagePortraitStyle:(RCUserAvatarStyle)portraitStyle;\n\n/*!\n 设置当前会话Cell的数据模型\n \n @param model 会话Cell的数据模型\n */\n- (void)setDataModel:(RCConversationModel *)model;\n\n@end\n\n/*!\n 会话Cell的点击监听器\n */\n@protocol RCConversationCellDelegate <NSObject>\n\n/*!\n 点击Cell头像的回调\n \n @param model 会话Cell的数据模型\n */\n- (void)didTapCellPortrait:(RCConversationModel *)model;\n\n/*!\n 长按Cell头像的回调\n \n @param model 会话Cell的数据模型\n */\n- (void)didLongPressCellPortrait:(RCConversationModel *)model;\n\n@end\n#endif"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCConversationListViewController.h",
    "content": "//\n//  RCConversationListViewController.h\n//  RongIMKit\n//\n//  Created by xugang on 15/1/22.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#ifndef __RCConversationListViewController\n#define __RCConversationListViewController\n#import <UIKit/UIKit.h>\n#import \"RCConversationModel.h\"\n#import \"RCBaseViewController.h\"\n#import \"RCThemeDefine.h\"\n#import \"RCConversationBaseCell.h\"\n\n@class RCNetworkIndicatorView;\n\n/*!\n 会话列表界面类\n */\n@interface RCConversationListViewController: RCBaseViewController <UITableViewDataSource, UITableViewDelegate>\n\n#pragma mark - 初始化\n\n/*!\n 初始化会话列表\n \n @param displayConversationTypeArray        列表中需要显示的会话类型数组(需要将RCConversationType转为NSNumber构建Array)\n @param collectionConversationTypeArray     列表中需要聚合为一条显示的会话类型数组(需要将RCConversationType转为NSNumber构建Array)\n @return                                    会话列表对象\n \n @discussion 聚合为一条显示指的是，将指定会话类型的所有会话在会话列表中聚合显示成一条，点击进入会显示该会话类型的所有会话列表。\n */\n- (id)initWithDisplayConversationTypes:(NSArray *)displayConversationTypeArray\n            collectionConversationType:(NSArray *)collectionConversationTypeArray;\n\n#pragma mark - 设置需要显示和聚合显示的会话类型\n\n/*!\n 列表中需要显示的会话类型数组\n \n @discussion 数组中的元素为RCConversationType转换的NSNumber\n */\n@property(nonatomic, strong) NSArray *displayConversationTypeArray;\n\n/*!\n 列表中需要聚合为一条显示的会话类型数组\n \n @discussion 数组中的元素为RCConversationType转换的NSNumber\n */\n@property(nonatomic, strong) NSArray *collectionConversationTypeArray;\n\n/*!\n 设置在列表中需要显示的会话类型\n \n @param conversationTypeArray   列表中需要显示的会话类型数组(需要将RCConversationType转为NSNumber构建Array)\n */\n- (void)setDisplayConversationTypes:(NSArray *)conversationTypeArray;\n\n/*!\n 设置在列表中需要聚合为一条显示的会话类型\n \n @param conversationTypeArray   列表中需要聚合为一条显示的会话类型数组(需要将RCConversationType转为NSNumber构建Array)\n */\n- (void)setCollectionConversationType:(NSArray *)conversationTypeArray;\n\n/*!\n 当前会话列表是否为从聚合Cell点击进入的子会话列表\n \n @discussion 您在点击会话列表中的聚合Cell跳转到到子会话列表时，需要将此属性设置为YES。\n */\n@property(nonatomic, assign) BOOL isEnteredToCollectionViewController;\n\n#pragma mark - 列表属性\n/*!\n 列表中会话数据模型的数据源\n \n @discussion 数据源中存放的元素为会话Cell的数据模型，即RCConversationModel对象。\n */\n@property(nonatomic, strong) NSMutableArray *conversationListDataSource;\n\n/*!\n 列表的TableView\n */\n@property(nonatomic, strong) UITableView *conversationListTableView;\n\n#pragma mark - 网络连接变化状态提醒\n\n/*!\n 当网络断开时，是否在Tabel View Header中显示网络连接不可用的提示。\n \n @discussion 默认值为YES。\n */\n@property(nonatomic, assign) BOOL isShowNetworkIndicatorView;\n\n/*!\n 当连接状态变化SDK自动重连时，是否在NavigationBar中显示连接中的提示。\n \n @discussion 默认是是NO。\n */\n@property(nonatomic) BOOL showConnectingStatusOnNavigatorBar;\n\n#pragma mark - 显示相关\n\n/*!\n 列表为空时显示的View\n */\n@property(nonatomic, strong) UIView *emptyConversationView;\n\n/*!\n Cell的背景颜色\n */\n@property(nonatomic) UIColor *cellBackgroundColor;\n\n/*!\n 置顶会话的Cell背景颜色\n */\n@property(nonatomic) UIColor *topCellBackgroundColor;\n\n/*!\n 设置在会话列表中显示的头像形状，矩形或者圆形（全局有效）\n \n @param avatarStyle 显示的头像形状\n \n @discussion 默认值为矩形，即RC_USER_AVATAR_RECTANGLE。\n 请在viewDidLoad之前设置，此设置在SDK中全局有效。\n */\n- (void)setConversationAvatarStyle:(RCUserAvatarStyle)avatarStyle;\n\n/*!\n 设置会话列表界面中显示的头像大小（全局有效），高度必须大于或者等于36\n \n @param size 显示的头像大小\n \n @discussion  默认值为46*46。\n 请在viewDidLoad之前设置，此设置在SDK中全局有效。\n */\n- (void)setConversationPortraitSize:(CGSize)size;\n\n#pragma mark - UI操作回调\n\n#pragma mark 点击事件的回调\n/*!\n 点击会话列表中Cell的回调\n \n @param conversationModelType   当前点击的会话的Model类型\n @param model                   当前点击的会话的Model\n @param indexPath               当前会话在列表数据源中的索引值\n \n @discussion 您需要重写此点击事件，跳转到指定会话的聊天界面。\n 如果点击聚合Cell进入具体的子会话列表，在跳转时，需要将isEnteredToCollectionViewController设置为YES。\n */\n- (void)onSelectedTableRow:(RCConversationModelType)conversationModelType\n         conversationModel:(RCConversationModel *)model\n               atIndexPath:(NSIndexPath *)indexPath;\n\n/*!\n 点击Cell头像的回调\n \n @param model   会话Cell的数据模型\n */\n- (void)didTapCellPortrait:(RCConversationModel *)model;\n\n/*!\n 长按Cell头像的回调\n \n @param model   会话Cell的数据模型\n */\n- (void)didLongPressCellPortrait:(RCConversationModel *)model;\n\n#pragma mark 删除会话的回调\n\n/*!\n 删除会话的回调\n \n @param model   会话Cell的数据模型\n */\n- (void)didDeleteConversationCell:(RCConversationModel *)model;\n\n#pragma mark - Cell加载显示的回调\n\n/*!\n 即将加载列表数据源的回调\n \n @param dataSource      即将加载的列表数据源（元素为RCConversationModel对象）\n @return                修改后的数据源（元素为RCConversationModel对象）\n \n @discussion 您可以在回调中修改、添加、删除数据源的元素来定制显示的内容，会话列表会根据您返回的修改后的数据源进行显示。\n 数据源中存放的元素为会话Cell的数据模型，即RCConversationModel对象。\n */\n- (NSMutableArray *)willReloadTableData:(NSMutableArray *)dataSource;\n\n/*!\n 即将显示Cell的回调\n \n @param cell        即将显示的Cell\n @param indexPath   该Cell对应的会话Cell数据模型在数据源中的索引值\n \n @discussion 您可以在此回调中修改Cell的一些显示属性。\n */\n- (void)willDisplayConversationTableCell:(RCConversationBaseCell *)cell\n                             atIndexPath:(NSIndexPath *)indexPath;\n\n#pragma mark - 自定义会话列表Cell\n\n/*!\n 自定义会话Cell显示时的回调\n \n @param tableView       当前TabelView\n @param indexPath       该Cell对应的会话Cell数据模型在数据源中的索引值\n @return                自定义会话需要显示的Cell\n */\n- (RCConversationBaseCell *)rcConversationListTableView:(UITableView *)tableView\n                                  cellForRowAtIndexPath:(NSIndexPath *)indexPath;\n\n/*!\n 自定义会话Cell显示时的回调\n \n @param tableView       当前TabelView\n @param indexPath       该Cell对应的会话Cell数据模型在数据源中的索引值\n @return                自定义会话需要显示的Cell的高度\n */\n- (CGFloat)rcConversationListTableView:(UITableView *)tableView\n               heightForRowAtIndexPath:(NSIndexPath *)indexPath;\n\n/*!\n 左滑删除自定义会话时的回调\n \n @param tableView       当前TabelView\n @param editingStyle    当前的Cell操作，默认为UITableViewCellEditingStyleDelete\n @param indexPath       该Cell对应的会话Cell数据模型在数据源中的索引值\n\n @discussion 自定义会话Cell在删除时会回调此方法，您可以在此回调中，定制删除的提示UI、是否删除。\n 如果确定删除该会话，您需要在调用RCIMClient中的接口删除会话或其中的消息，\n 并从conversationListDataSource和conversationListTableView中删除该会话。\n */\n- (void)rcConversationListTableView:(UITableView *)tableView\n                 commitEditingStyle:(UITableViewCellEditingStyle)editingStyle\n                  forRowAtIndexPath:(NSIndexPath *)indexPath;\n\n#pragma mark - 界面刷新操作\n\n/*!\n 从数据库中重新读取会话列表数据，并刷新会话列表\n \n @warning 从数据库中重新读取并刷新，会比较耗时，请谨慎使用。\n */\n- (void)refreshConversationTableViewIfNeeded;\n\n/*!\n 向列表中插入或更新一条会话，并刷新会话列表界面\n \n @param conversationModel   会话Cell的数据模型\n \n @discussion 如果该会话Cell数据模型在数据源中已经存在，则会更新数据源中的数据并更新UI；\n 如果数据源没有该会话Cell的数据模型，则插入数据源再更新UI。\n */\n- (void)refreshConversationTableViewWithConversationModel:(RCConversationModel *)conversationModel;\n\n#pragma mark - 其他\n\n/*!\n 在会话列表中，收到新消息的回调\n \n @param notification    收到新消息的notification\n \n @discussion SDK在此方法中有针对消息接收有默认的处理（如刷新等），如果您重写此方法，请注意调用super。\n \n notification的object为RCMessage消息对象，userInfo为NSDictionary对象，其中key值为@\"left\"，value为还剩余未接收的消息数的NSNumber对象。\n */\n- (void)didReceiveMessageNotification:(NSNotification *)notification;\n\n/*!\n 即将更新未读消息数的回调\n \n @discussion 当收到消息或删除会话时，会调用此回调，您可以在此回调中执行未读消息数相关的操作。\n */\n- (void)notifyUpdateUnreadMessageCount;\n\n\n#pragma mark - 已废弃方法\n\n/*!\n 移除SDK中会话列表为空时显示的默认View（已废弃，请勿使用）\n \n @discussion 此方法已废弃，您可以直接通过emptyConversationView设置列表为空时需要显示的View。.\n \n @warning **已废弃，请勿使用。**\n */\n- (void)resetConversationListBackgroundViewIfNeeded\n__deprecated_msg(\"已废弃，请勿使用。\");\n\n/*!\n 提示网络连接不可用的View（已废弃，请勿使用）\n \n @warning **已废弃，请勿使用。**\n */\n@property(nonatomic, strong) RCNetworkIndicatorView *networkIndicatorView\n__deprecated_msg(\"已废弃，请勿使用。\");\n\n/*!\n 当showConnectingStatusOnNavigatorBar设置为YES时，连接状态变化时更新NavigationBar的回调（已废弃，请勿使用）\n \n @discussion SDK在此方法中有默认的处理，如果您在子类中需要重写此方法，请注意调用super。\n \n @warning **已废弃，请勿使用。**\n */\n- (void)updateConnectionStatusOnNavigatorBar\n__deprecated_msg(\"已废弃，请勿使用。\");\n\n/*!\n 当showConnectingStatusOnNavigatorBar设置为YES时，连接恢复后的回调（已废弃，请勿使用）\n \n @discussion 您需要在此回调中更新NavigationBar的标题显示。\n \n @warning **已废弃，请勿使用。**\n */\n- (void)setNavigationItemTitleView\n__deprecated_msg(\"已废弃，请勿使用。\");\n\n@end\n#endif"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCConversationModel.h",
    "content": "//\n//  RongConversationModel.h\n//  RongIMKit\n//\n//  Created by xugang on 15/1/22.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#ifndef __RongConversationModel\n#define __RongConversationModel\n\n#import <Foundation/Foundation.h>\n#import <RongIMLib/RongIMLib.h>\n\n/*!\n 会话Cell数据模型的显示类型\n */\ntypedef NS_ENUM(NSUInteger, RCConversationModelType) {\n    /*!\n     默认显示\n     */\n    RC_CONVERSATION_MODEL_TYPE_NORMAL = 1,\n    /*!\n     聚合显示\n     */\n    RC_CONVERSATION_MODEL_TYPE_COLLECTION = 2,\n    /*!\n     用户自定义的会话显示\n     */\n    RC_CONVERSATION_MODEL_TYPE_CUSTOMIZATION = 3,\n    /*!\n     公众服务的会话显示\n     */\n    RC_CONVERSATION_MODEL_TYPE_PUBLIC_SERVICE = 4\n};\n\n/*!\n 会话Cell的数据模型类\n */\n@interface RCConversationModel : NSObject\n\n/*!\n 会话Cell数据模型的显示类型\n */\n@property(nonatomic) RCConversationModelType conversationModelType;\n\n/*!\n 用户自定义的扩展数据\n */\n@property(nonatomic, strong) id extend;\n\n/*!\n 会话类型\n */\n@property(nonatomic, assign) RCConversationType conversationType;\n\n/*!\n 目标会话ID\n */\n@property(nonatomic, strong) NSString *targetId;\n\n/*!\n 会话的标题\n */\n@property(nonatomic, strong) NSString *conversationTitle;\n\n/*!\n 会话中的未读消息数\n */\n@property(nonatomic, assign) NSInteger unreadMessageCount;\n\n/*!\n 当前会话是否置顶\n */\n@property(nonatomic, assign) BOOL isTop;\n\n/*!\n 会话中最后一条消息的接收状态\n */\n@property(nonatomic, assign) RCReceivedStatus receivedStatus;\n\n/*!\n 会话中最后一条消息的发送状态\n */\n@property(nonatomic, assign) RCSentStatus sentStatus;\n\n/*!\n 会话中最后一条消息的接收时间（Unix时间戳、毫秒）\n */\n@property(nonatomic, assign) long long receivedTime;\n\n/*!\n 会话中最后一条消息的发送时间（Unix时间戳、毫秒）\n */\n@property(nonatomic, assign) long long sentTime;\n\n/*!\n 会话中存在的草稿\n */\n@property(nonatomic, strong) NSString *draft;\n\n/*!\n 会话中最后一条消息的类型名\n */\n@property(nonatomic, strong) NSString *objectName;\n\n/*!\n 会话中最后一条消息的发送者用户ID\n */\n@property(nonatomic, strong) NSString *senderUserId;\n\n/*!\n 会话中最后一条消息的发送者的用户名（已废弃，请勿使用）\n \n @warning **已废弃，请勿使用。**\n */\n@property(nonatomic, strong) __deprecated_msg(\"已废弃，请勿使用。\") NSString *senderUserName;\n\n/*!\n 会话中最后一条消息的消息ID\n */\n@property(nonatomic, assign) long lastestMessageId;\n\n/*!\n 会话中最后一条消息的内容\n */\n@property(nonatomic, strong) RCMessageContent *lastestMessage;\n\n/*!\n 会话中最后一条消息的json Dictionary\n */\n@property(nonatomic, strong) NSDictionary *jsonDict;\n\n/*!\n 初始化会话Cell的数据模型（已废弃，请勿使用）\n \n @param conversationModelType 会话Cell数据模型的显示类型\n @param extend                用户自定义的扩展数据\n \n @return 会话Cell的数据模型对象\n \n @warning **已废弃，请勿使用。**\n */\n- (id)init:(RCConversationModelType)conversationModelType exntend:(id)extend\n__deprecated_msg(\"已废弃，请勿使用。\");\n\n/*!\n 初始化会话显示数据模型\n \n @param conversationModelType 会话Cell数据模型的显示类型\n @param conversation          会话\n @param extend                用户自定义的扩展数据\n \n @return 会话Cell的数据模型对象\n */\n- (id)init:(RCConversationModelType)conversationModelType conversation:(RCConversation *)conversation extend:(id)extend;\n\n@end\n\n#endif"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCConversationSettingTableViewController.h",
    "content": "//\n//  RCConversationSettingTableViewController.h\n//  RongIMKit\n//\n//  Created by Liv on 15/4/20.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n#import <RongIMLib/RongIMLib.h>\n\n@class RCConversationSettingTableViewHeader;\n\n/*!\n 会话设置的ViewController\n */\n@interface RCConversationSettingTableViewController : UITableViewController\n\n/*!\n内置置顶聊天，新消息通知，清除消息记录三个cell\n*/\n@property(nonatomic, strong, readonly) NSArray *defaultCells;\n\n/*!\n 是否隐藏顶部视图\n */\n@property(nonatomic, assign) BOOL headerHidden;\n\n/*!\n 是否将该会话置顶\n */\n@property(nonatomic, assign) BOOL switch_isTop;\n\n/*!\n 是否接收新通知提醒\n */\n@property(nonatomic, assign) BOOL switch_newMessageNotify;\n\n/*!\n 顶部视图显示的用户的用户信息RCUserInfo列表\n */\n@property(nonatomic, strong) NSArray *users;\n\n/*!\n 禁止删除用户\n \n @param disable 是否禁止删除用户\n */\n- (void)disableDeleteMemberEvent:(BOOL)disable;\n\n/*!\n 设置添加用户\n \n @param disable 是否禁止删除用户\n */\n- (void)disableInviteMemberEvent:(BOOL)disable;\n\n/*!\n 开闭置顶聊天的回调\n \n @param sender 点击的Switch开关\n */\n- (void)onClickIsTopSwitch:(id)sender;\n\n/*!\n 开闭新通知提醒的回调\n \n @param sender 点击的Switch开关\n */\n- (void)onClickNewMessageNotificationSwitch:(id)sender;\n\n/*!\n 点击清除聊天记录的回调\n \n @param sender 清除聊天记录的按钮\n */\n- (void)onClickClearMessageHistory:(id)sender;\n\n/*!\n 添加用户到顶部视图\n \n @param users 用户信息RCUserInfo列表\n */\n- (void)addUsers:(NSArray *)users;\n\n/*!\n 点击Item（用户头像或加减号）的回调\n \n @param settingTableViewHeader  当前会话设置界面\n @param indexPathOfSelectedItem 点击的Item索引值\n @param users                   当前的用户信息RCUserInfo列表\n */\n- (void)settingTableViewHeader:(RCConversationSettingTableViewHeader *)settingTableViewHeader\n       indexPathOfSelectedItem:(NSIndexPath *)indexPathOfSelectedItem\n            allTheSeletedUsers:(NSArray *)users;\n\n/*!\n 点击删除用户的回调\n \n @param indexPath 当前删除的用户的头像索引值\n \n @discussion 点击头像左上角的删除按钮时的回调。\n */\n- (void)deleteTipButtonClicked:(NSIndexPath *)indexPath;\n\n/*!\n 点击头像的回调\n \n @param userId 头像对应的用户ID\n */\n- (void)didTipHeaderClicked:(NSString*)userId;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCConversationSettingTableViewHeader.h",
    "content": "//\n//  RCConversationSettingTableViewHeader.h\n//  RongIMToolkit\n//\n//  Created by Liv on 15/3/25.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@class RCConversationSettingTableViewHeader;\n\n/*!\n 会话设置界面头像区域的点击回调\n */\n@protocol RCConversationSettingTableViewHeaderDelegate <NSObject>\n@optional\n\n/*!\n 点击Item（用户头像或加减号）的回调\n \n @param settingTableViewHeader  当前会话设置界面\n @param indexPathOfSelectedItem 点击的Item索引值\n @param users                   当前的用户信息RCUserInfo列表\n */\n- (void)settingTableViewHeader:(RCConversationSettingTableViewHeader *)settingTableViewHeader\n       indexPathOfSelectedItem:(NSIndexPath *)indexPathOfSelectedItem\n            allTheSeletedUsers:(NSArray *)users;\n\n/*!\n 点击删除的回调\n \n @param indexPath 点击的索引\n */\n- (void)deleteTipButtonClicked:(NSIndexPath *)indexPath;\n\n/*!\n 点击头像的回调\n \n @param userId 头像对应的用户ID\n */\n- (void)didTipHeaderClicked:(NSString *)userId;\n\n@end\n\n/*!\n 会话设置界面的头像区域\n */\n@interface RCConversationSettingTableViewHeader\n    : UICollectionView <UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout>\n\n/*!\n 是否显示删除（减号）\n */\n@property(nonatomic, assign) BOOL showDeleteTip;\n\n/*!\n 是否允许删除用户\n */\n@property(nonatomic, assign) BOOL isAllowedDeleteMember;\n\n/*!\n 是否允许添加用户\n */\n@property(nonatomic, assign) BOOL isAllowedInviteMember;\n\n/*!\n 会话设置界面头像区域的点击回调\n */\n@property(weak, nonatomic) id<RCConversationSettingTableViewHeaderDelegate> settingTableViewHeaderDelegate;\n\n/*!\n 用户信息RCUserInfo的列表\n */\n@property(strong, nonatomic) NSMutableArray *users;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCConversationViewController.h",
    "content": "//\n//  RCConversationViewController.h\n//  RongIMKit\n//\n//  Created by xugang on 15/1/22.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#ifndef __RCConversationViewController\n#define __RCConversationViewController\n#import <UIKit/UIKit.h>\n#import \"RCBaseViewController.h\"\n#import \"RCPluginBoardView.h\"\n#import \"RCChatSessionInputBarControl.h\"\n#import \"RCEmojiBoardView.h\"\n#import \"RCThemeDefine.h\"\n#import \"RCMessageBaseCell.h\"\n#import \"RCMessageModel.h\"\n\n///输入栏扩展输入的唯一标示\n#define PLUGIN_BOARD_ITEM_ALBUM_TAG    1001\n#define PLUGIN_BOARD_ITEM_CAMERA_TAG   1002\n#define PLUGIN_BOARD_ITEM_LOCATION_TAG 1003\n#if RC_VOIP_ENABLE\n#define PLUGIN_BOARD_ITEM_VOIP_TAG     1004\n#endif\n\n/*!\n 聊天界面类\n */\n@interface RCConversationViewController: RCBaseViewController\n<UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UIGestureRecognizerDelegate, UIScrollViewDelegate>\n\n#pragma mark - 初始化\n\n/*!\n 初始化聊天界面\n \n @param conversationType 会话类型\n @param targetId         目标会话ID\n \n @return 聊天界面对象\n */\n- (id)initWithConversationType:(RCConversationType)conversationType\n                      targetId:(NSString *)targetId;\n\n#pragma mark - 会话属性\n\n/*!\n 当前会话的会话类型\n */\n@property(nonatomic) RCConversationType conversationType;\n\n/*!\n 目标会话ID\n */\n@property(nonatomic, strong) NSString *targetId;\n\n/*!\n 当前的用户名称（已废弃，请勿使用）\n \n @warning **已废弃，请勿使用。**\n */\n@property(nonatomic, strong) __deprecated_msg(\"已废弃，请勿使用。\") NSString *userName;\n\n#pragma mark - 聊天界面属性\n\n/*!\n 聊天内容的消息Cell数据模型的数据源\n \n @discussion 数据源中存放的元素为消息Cell的数据模型，即RCMessageModel对象。\n */\n@property(nonatomic, strong) NSMutableArray *conversationDataRepository;\n\n/*!\n 聊天界面的CollectionView\n */\n@property(nonatomic, strong) UICollectionView *conversationMessageCollectionView;\n\n/*!\n 聊天界面的CollectionView Layout\n */\n@property(nonatomic, strong) UICollectionViewFlowLayout *customFlowLayout;\n\n#pragma mark - 未读消息数\n\n#pragma mark 导航栏返回按钮中的未读消息数提示\n/*!\n 需要统计未读数的会话类型数组（在导航栏的返回按钮中显示）\n \n @discussion 此属性表明在导航栏的返回按钮中需要统计显示哪部分的会话类型的未读数。\n (需要将RCConversationType转为NSNumber构建Array)\n */\n@property(nonatomic, strong) NSArray *displayConversationTypeArray;\n\n/*!\n 更新导航栏返回按钮中显示的未读消息数\n \n @discussion 如果您重写此方法，需要注意调用super。\n */\n- (void)notifyUpdateUnreadMessageCount;\n\n#pragma mark 右上角的未读消息数提示\n/*!\n 当收到的消息超过一个屏幕时，进入会话之后，是否在右上角提示上方存在的未读消息数\n \n @discussion 默认值为NO。\n 开启该提示功能之后，当一个会话收到大量消息时（操作一个屏幕能显示的内容），\n 进入该会话后，会在右上角提示用户上方存在的未读消息数，用户点击该提醒按钮，会跳转到最开始的未读消息。\n */\n@property(nonatomic, assign) BOOL enableUnreadMessageIcon;\n\n/*!\n 右上角提示的未读消息数\n \n @discussion 右上角未读消息数支持的最大值是150。\n */\n@property(nonatomic, assign) NSInteger unReadMessage;\n\n/*!\n 右上角未读消息数提示的Label\n */\n@property(nonatomic,strong) UILabel *unReadMessageLabel;\n\n/*!\n 右上角未读消息数提示的按钮\n */\n@property(nonatomic, strong) UIButton *unReadButton;\n\n#pragma mark 右下角的未读消息数提示\n/*!\n 当前阅读区域的下方收到消息时，是否在聊天界面的右下角提示下方存在未读消息\n \n @discussion 默认值为NO。\n 开启该提示功能之后，当聊天界面滑动到最下方时，此会话中收到消息会自动更新；\n 当用户停留在上方某个区域阅读时，此会话收到消息时，会在右下角显示未读消息提示，而不会自动滚动到最下方，\n 用户点击该提醒按钮，会滚动到最下方。\n */\n@property(nonatomic, assign) BOOL enableNewComingMessageIcon;\n\n/*!\n 右下角未读消息数提示的Label\n */\n@property(nonatomic, strong) UILabel *unReadNewMessageLabel;\n\n\n#pragma mark - 输入工具栏\n\n/*!\n 聊天界面下方的输入工具栏\n */\n@property(nonatomic, strong) RCChatSessionInputBarControl *chatSessionInputBarControl;\n\n/*!\n 输入框的默认输入模式\n \n @discussion 默认值为RCChatSessionInputBarInputText，即文本输入模式。\n */\n@property(nonatomic) RCChatSessionInputBarInputType defaultInputType;\n\n/*!\n 输入扩展功能板View\n */\n@property(nonatomic, strong) RCPluginBoardView *pluginBoardView;\n\n/*!\n 表情View\n */\n@property(nonatomic, strong) RCEmojiBoardView *emojiBoardView;\n\n/*!\n 扩展功能板的点击回调\n \n @param pluginBoardView 输入扩展功能板View\n @param tag             输入扩展功能(Item)的唯一标示\n */\n-(void)pluginBoardView:(RCPluginBoardView*)pluginBoardView\n    clickedItemWithTag:(NSInteger)tag;\n\n/*!\n 输入框中内容发生变化的回调\n \n @param inputTextView 文本输入框\n @param range         当前操作的范围\n @param text          插入的文本\n */\n- (void)inputTextView:(UITextView *)inputTextView shouldChangeTextInRange:(NSRange)range\n      replacementText:(NSString *)text;\n\n/*!\n 设置输入框的输入状态\n \n @param inputBarStatus  输入框状态\n @param animated        是否使用动画效果\n */\n-(void)setChatSessionInputBarStatus:(KBottomBarStatus)inputBarStatus animated:(BOOL)animated;\n\n#pragma mark - 显示设置\n\n/*!\n 设置在聊天界面中显示的头像形状，矩形或者圆形（全局有效）\n \n @param avatarStyle 显示的头像形状\n \n @discussion 默认值为矩形，即RC_USER_AVATAR_RECTANGLE。\n 请在viewDidLoad之前设置，此设置在SDK中全局有效。\n */\n- (void)setMessageAvatarStyle:(RCUserAvatarStyle)avatarStyle;\n\n/*!\n 设置聊天界面中显示的头像大小（全局有效），高度必须大于或者等于36\n \n @param size 显示的头像形状\n \n @discussion 默认值为46*46。\n 请在viewDidLoad之前设置，此设置在SDK中全局有效。\n */\n- (void)setMessagePortraitSize:(CGSize)size;\n\n/*!\n 收到的消息是否显示发送者的名字\n \n @discussion 默认值为YES。\n 您可以针对群聊、聊天室、单聊等不同场景，自己定制是否显示发送方的名字。\n */\n@property(nonatomic) BOOL displayUserNameInCell;\n\n/*!\n 设置进入聊天室需要获取的历史消息数量（仅在当前会话为聊天室时生效）\n \n @discussion 此属性需要在viewDidLoad之前进行设置。\n -1表示不获取任何历史消息，0表示不特殊设置而使用SDK默认的设置（默认为获取10条），0<messageCount<=50为具体获取的消息数量,最大值为50。\n */\n@property(nonatomic, assign) int defaultHistoryMessageCountOfChatRoom;\n\n#pragma mark - 界面操作\n\n/*!\n 滚动到列表最下方\n \n @param animated 是否开启动画效果\n */\n- (void)scrollToBottomAnimated:(BOOL)animated;\n\n/*!\n 返回前一个页面的方法\n \n @param sender 事件发起者\n \n @discussion 其中包含了一些聊天界面退出的清理工作，如退出讨论组等。\n 如果您重写此方法，请注意调用super。\n */\n- (void)leftBarButtonItemPressed:(id)sender;\n\n#pragma mark - 消息操作\n\n#pragma mark 发送消息\n/*!\n 发送消息(除图片消息外的所有消息)\n \n @param messageContent 消息的内容\n @param pushContent    接收方离线时需要显示的远程推送内容\n \n @discussion 当接收方离线并允许远程推送时，会收到远程推送。\n 远程推送中包含两部分内容，一是pushContent，用于显示；二是pushData，用于携带不显示的数据。\n \n SDK内置的消息类型，如果您将pushContent置为nil，会使用默认的推送格式进行远程推送。\n 自定义类型的消息，需要您自己设置pushContent来定义推送内容，否则将不会进行远程推送。\n \n 如果您需要设置发送的pushData，可以使用RCIM的发送消息接口。\n */\n- (void)sendMessage:(RCMessageContent *)messageContent\n        pushContent:(NSString *)pushContent;\n\n/*!\n 发送图片消息\n \n @param imageMessage 消息的内容\n @param pushContent  接收方离线时需要显示的远程推送内容\n \n @discussion 当接收方离线并允许远程推送时，会收到远程推送。\n 远程推送中包含两部分内容，一是pushContent，用于显示；二是pushData，用于携带不显示的数据。\n \n SDK内置的消息类型，如果您将pushContent置为nil，会使用默认的推送格式进行远程推送。\n 自定义类型的消息，需要您自己设置pushContent来定义推送内容，否则将不会进行远程推送。\n \n 如果您需要设置发送的pushData，可以使用RCIM的发送图片消息接口。\n */\n- (void)sendImageMessage:(RCImageMessage *)imageMessage\n             pushContent:(NSString *)pushContent;\n\n/*!\n 重新发送消息\n \n @param messageContent 消息的内容\n \n @discussion 发送消息失败，点击小红点时，会将本地存储的原消息实体删除，会回调此接口将消息内容重新发送。\n 如果您需要重写此接口，请注意调用super。\n */\n- (void)resendMessage:(RCMessageContent *)messageContent;\n\n/*!\n 发送图片消息(上传图片到App指定的服务器)\n \n @param imageMessage 消息的内容\n @param pushContent  接收方离线时需要显示的远程推送内容\n @param appUpload    是否上传到App指定的服务器\n \n @discussion 此方法用于上传图片到您自己的服务器，此时需要将appUpload设置为YES，并实现uploadImage:uploadListener:回调。\n 需要您在该回调中上传图片，并通过uploadListener监听通知SDK同步显示上传进度。\n \n 如果appUpload设置为NO，将会和普通图片消息的发送一致，上传到融云默认的服务器并发送。\n */\n- (void)sendImageMessage:(RCImageMessage *)imageMessage\n             pushContent:(NSString *)pushContent\n               appUpload:(BOOL)appUpload;\n\n/*!\n 上传图片到App指定的服务器的回调\n \n @param message        图片消息的实体\n @param uploadListener SDK图片上传进度监听\n \n @discussion 如果您通过sendImageMessage:pushContent:appUpload:接口发送图片消息，则必须实现此回调。\n 您需要在此回调中通过uploadListener将上传图片的进度和结果通知SDK，SDK会根据这些信息，自动更新UI。\n */\n- (void)uploadImage:(RCMessage *)message\n     uploadListener:(RCUploadImageStatusListener *)uploadListener;\n\n#pragma mark 插入消息\n/*!\n 在聊天界面中插入一条消息\n \n @param message 消息实体\n \n @discussion 通过此方法插入一条消息，会将消息实体对应的内容Model插入数据源中，并更新UI。\n */\n- (void)appendAndDisplayMessage:(RCMessage *)message;\n\n#pragma mark 删除消息\n/*!\n 删除消息并更新UI\n \n @param model 消息Cell的数据模型\n */\n- (void)deleteMessage:(RCMessageModel *)model;\n\n#pragma mark - 消息操作的回调\n\n/*!\n 准备发送消息的回调\n \n @param messageCotent 消息内容\n \n @return 修改后的消息内容\n \n @discussion 此回调在消息准备向外发送时会回调，您可以在此回调中对消息内容进行过滤和修改等操作。\n 如果此回调的返回值不为nil，SDK会对外发送返回的消息内容。\n */\n- (RCMessageContent *)willSendMessage:(RCMessageContent *)messageCotent;\n\n/*!\n 发送消息完成的回调\n \n @param stauts          发送状态，0表示成功，非0表示失败\n @param messageCotent   消息内容\n */\n- (void)didSendMessage:(NSInteger)stauts\n               content:(RCMessageContent *)messageCotent;\n\n/*!\n 即将在聊天界面插入消息的回调\n \n @param message 消息实体\n @return        修改后的消息实体\n \n @discussion 此回调在消息准备插入数据源的时候会回调，您可以在此回调中对消息进行过滤和修改操作。\n 如果此回调的返回值不为nil，SDK会将返回消息实体对应的消息Cell数据模型插入数据源，并在聊天界面中显示。\n */\n- (RCMessage *)willAppendAndDisplayMessage:(RCMessage *)message;\n\n/*!\n 即将显示消息Cell的回调\n \n @param cell        消息Cell\n @param indexPath   该Cell对应的消息Cell数据模型在数据源中的索引值\n \n @discussion 您可以在此回调中修改Cell的显示和某些属性。\n */\n- (void)willDisplayMessageCell:(RCMessageBaseCell *)cell\n                   atIndexPath:(NSIndexPath *)indexPath;\n\n/*!\n 即将显示消息Cell的回调（已废弃，请勿使用）\n \n @param cell        消息Cell\n @param indexPath   该Cell对应的消息Cell数据模型在数据源中的索引值\n \n @discussion 您可以在此回调中修改Cell的显示和某些属性。\n 此接口已废弃，您可以无缝使用willDisplayMessageCell:atIndexPath:代替，功能和使用完全一致。\n \n @warning **已废弃，请勿使用。**\n */\n- (void)willDisplayConversationTableCell:(RCMessageBaseCell *)cell\n                             atIndexPath:(NSIndexPath *)indexPath\n__deprecated_msg(\"已废弃，请勿使用。\");\n\n#pragma mark - 自定义消息\n\n/*!\n 注册自定义消息的Cell\n \n @param cellClass   自定义消息的类，该自定义消息需要继承于RCMessageContent\n @param identifier  自定义消息Cell的唯一标示符\n \n @discussion 聊天界面在显示时需要通过identifier唯一标示来进行Cell重用，以提高性能。\n 我们建议您在identifier中添加前缀，请勿使用\"rc\"前缀的字符串，以免与融云内置消息的Cell冲突。\n */\n- (void)registerClass:(Class)cellClass forCellWithReuseIdentifier:(NSString *)identifier;\n\n/*!\n 自定义消息Cell显示的回调\n \n @param collectionView  当前CollectionView\n @param indexPath       该Cell对应的消息Cell数据模型在数据源中的索引值\n @return                自定义消息需要显示的Cell\n \n @discussion 自定义消息如果需要显示，则必须先通过RCIM的registerMessageType:注册该自定义消息类型，\n 并在聊天界面中通过registerClass:forCellWithReuseIdentifier:注册该自定义消息的Cell，否则将此回调将不会被调用。\n */\n- (RCMessageBaseCell *)rcConversationCollectionView:(UICollectionView *)collectionView\n                             cellForItemAtIndexPath:(NSIndexPath *)indexPath;\n\n/*!\n 自定义消息Cell显示的回调\n \n @param collectionView          当前CollectionView\n @param collectionViewLayout    当前CollectionView Layout\n @param indexPath               该Cell对应的消息Cell数据模型在数据源中的索引值\n @return                        自定义消息Cell需要显示的高度\n \n @discussion 自定义消息如果需要显示，则必须先通过RCIM的registerMessageType:注册该自定义消息类型，\n 并在聊天界面中通过registerClass:forCellWithReuseIdentifier:注册该自定义消息的Cell，否则将此回调将不会被调用。\n */\n- (CGSize)rcConversationCollectionView:(UICollectionView *)collectionView\n                                layout:(UICollectionViewLayout *)collectionViewLayout\n                sizeForItemAtIndexPath:(NSIndexPath *)indexPath;\n\n/*!\n 未注册消息Cell显示的回调\n \n @param collectionView  当前CollectionView\n @param indexPath       该Cell对应的消息Cell数据模型在数据源中的索引值\n @return                未注册消息需要显示的Cell\n \n @discussion 未注册消息的显示主要用于App未雨绸缪的新旧版本兼容，在使用此回调之前，需要将RCIM的showUnkownMessage设置为YES。\n 比如，您App在新版本迭代中增加了某种自定义消息，当已经发布的旧版本不能识别，开发者可以在旧版本中预先定义好这些不能识别的消息的显示，\n 如提示当前版本不支持，引导用户升级等。\n */\n- (RCMessageBaseCell *)rcUnkownConversationCollectionView:(UICollectionView *)collectionView\n                                   cellForItemAtIndexPath:(NSIndexPath *)indexPath;\n\n/*!\n 未注册消息Cell显示的回调\n \n @param collectionView          当前CollectionView\n @param collectionViewLayout    当前CollectionView Layout\n @param indexPath               该Cell对应的消息Cell数据模型在数据源中的索引值\n @return                        未注册消息Cell需要显示的高度\n \n @discussion 未注册消息的显示主要用于App未雨绸缪的新旧版本兼容，在使用此回调之前，需要将RCIM的showUnkownMessage设置为YES。\n 比如，您App在新版本迭代中增加了某种自定义消息，当已经发布的旧版本不能识别，开发者可以在旧版本中预先定义好这些不能识别的消息的显示，\n 如提示当前版本不支持，引导用户升级等。\n */\n- (CGSize)rcUnkownConversationCollectionView:(UICollectionView *)collectionView\n                                      layout:(UICollectionViewLayout *)collectionViewLayout\n                      sizeForItemAtIndexPath:(NSIndexPath *)indexPath;\n\n#pragma mark - 点击事件回调\n\n/*!\n 点击Cell中的消息内容的回调\n \n @param model 消息Cell的数据模型\n \n @discussion SDK在此点击事件中，针对SDK中自带的图片、语音、位置等消息有默认的处理，如查看、播放等。\n 您在重写此回调时，如果想保留SDK原有的功能，需要注意调用super。\n */\n- (void)didTapMessageCell:(RCMessageModel *)model;\n\n/*!\n 长按Cell中的消息内容的回调\n \n @param model 消息Cell的数据模型\n @param view  长按区域的View\n \n @discussion SDK在此长按事件中，会默认展示菜单。\n 您在重写此回调时，如果想保留SDK原有的功能，需要注意调用super。\n */\n- (void)didLongTouchMessageCell:(RCMessageModel *)model\n                         inView:(UIView *)view;\n\n/*!\n 点击Cell中URL的回调\n \n @param url   点击的URL\n @param model 消息Cell的数据模型\n*/\n- (void)didTapUrlInMessageCell:(NSString *)url\n                         model:(RCMessageModel *)model;\n\n/*!\n 点击Cell中电话号码的回调\n \n @param phoneNumber 点击的电话号码\n @param model       消息Cell的数据模型\n */\n- (void)didTapPhoneNumberInMessageCell:(NSString *)phoneNumber\n                                 model:(RCMessageModel *)model;\n\n/*!\n 点击Cell中头像的回调\n \n @param userId  点击头像对应的用户ID\n */\n- (void)didTapCellPortrait:(NSString *)userId;\n\n/*!\n 长按Cell中头像的回调\n \n @param userId  头像对应的用户ID\n */\n- (void)didLongPressCellPortrait:(NSString *)userId;\n\n#pragma mark - 语音消息、图片消息、位置消息显示与操作\n\n/*!\n 开始录制语音消息\n */\n- (void)onBeginRecordEvent;\n\n/*!\n 结束录制语音消息\n */\n- (void)onEndRecordEvent;\n\n/*!\n 是否开启语音消息连续播放\n \n @discussion 如果设置为YES，在点击播放语音消息时，会将下面所有未播放过的语音消息依次播放。\n */\n@property(nonatomic, assign) BOOL enableContinuousReadUnreadVoice;\n\n/*!\n 查看图片消息中的图片\n \n @param model   消息Cell的数据模型\n \n @discussion SDK在此方法中会默认调用RCImagePreviewController下载并展示图片。\n */\n- (void)presentImagePreviewController:(RCMessageModel *)model;\n\n/*!\n 发送新拍照的图片完成之后，是否将图片在本地另行存储。\n \n @discussion 如果设置为YES，您需要在saveNewPhotoToLocalSystemAfterSendingSuccess:回调中自行保存。\n */\n@property(nonatomic, assign) BOOL enableSaveNewPhotoToLocalSystem;\n\n/*!\n 发送新拍照的图片完成之后，将图片在本地另行存储的回调\n \n @param newImage    图片\n \n @discussion 您可以在此回调中按照您的需求，将图片另行保存或执行其他操作。\n */\n- (void)saveNewPhotoToLocalSystemAfterSendingSuccess:(UIImage *)newImage;\n\n/*!\n 查看位置信息的位置详情\n \n @param locationMessageContent  点击的位置消息\n \n @discussion SDK在此方法中会默认调用RCLocationViewController在地图中展示位置。\n */\n- (void)presentLocationViewController:(RCLocationMessage *)locationMessageContent;\n\n@end\n#endif"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCEmojiBoardView.h",
    "content": "//\n//  RCEmojiView.h\n//  RCIM\n//\n//  Created by Heq.Shinoda on 14-5-29.\n//  Copyright (c) 2014年 RongCloud. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@class RCEmojiPageControl;\n@class RCEmojiBoardView;\n\n/*!\n 表情输入的回调\n */\n@protocol RCEmojiViewDelegate <NSObject>\n@optional\n\n/*!\n 点击表情的回调\n \n @param emojiView 表情输入的View\n @param string    点击的表情对应的字符串编码\n */\n- (void)didTouchEmojiView:(RCEmojiBoardView *)emojiView touchedEmoji:(NSString *)string;\n\n/*!\n 点击发送按钮的回调\n \n @param emojiView  表情输入的View\n @param sendButton 发送按钮\n */\n- (void)didSendButtonEvent:(RCEmojiBoardView *)emojiView sendButton:(UIButton *)sendButton;\n\n@end\n\n/*!\n 表情输入的View\n */\n@interface RCEmojiBoardView : UIView <UIScrollViewDelegate> {\n    /*!\n     PageControl\n     */\n    RCEmojiPageControl *pageCtrl;\n    \n    /*!\n     当前所在页的索引值\n     */\n    NSInteger currentIndex;\n}\n\n/*!\n 表情背景的View\n */\n@property(nonatomic, strong) UIScrollView *emojiBackgroundView;\n\n/*!\n 表情的Label(已废弃，请勿使用)\n \n @warning **已废弃，请勿使用。**\n */\n@property(nonatomic, strong) __deprecated_msg(\"已废弃，请勿使用。\") UILabel *emojiLabel;\n\n/*!\n 表情输入的回调\n */\n@property(nonatomic, assign) id<RCEmojiViewDelegate> delegate;\n\n/*!\n 加载表情Label\n */\n- (void)loadLabelView;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCIM.h",
    "content": "//\n//  RongUIKit.h\n//  RongIMKit\n//\n//  Created by xugang on 15/1/13.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#ifndef __RongUIKit\n#define __RongUIKit\n#import <Foundation/Foundation.h>\n#import <RongIMLib/RongIMLib.h>\n#import \"RCThemeDefine.h\"\n\n/*!\n @const 收到消息的Notification\n \n @discussion 接收到消息后，SDK会分发此通知。\n \n Notification的object为RCMessage消息对象。\n userInfo为NSDictionary对象，其中key值为@\"left\"，value为还剩余未接收的消息数的NSNumber对象。\n \n 与RCIMReceiveMessageDelegate的区别:\n RCKitDispatchMessageNotification只要注册都可以收到通知；RCIMReceiveMessageDelegate需要设置监听，并同时只能存在一个监听。\n */\nFOUNDATION_EXPORT NSString *const RCKitDispatchMessageNotification;\n\n/*!\n @const 连接状态变化的Notification\n \n @discussion SDK连接状态发生变化时，SDK会分发此通知。\n \n Notification的object为NSNumber对象，对应于RCConnectionStatus的值。\n \n 与RCIMConnectionStatusDelegate的区别:\n RCKitDispatchConnectionStatusChangedNotification只要注册都可以收到通知；RCIMConnectionStatusDelegate需要设置监听，同时只能存在一个监听。\n */\nFOUNDATION_EXPORT NSString *const RCKitDispatchConnectionStatusChangedNotification;\n\n#pragma mark - 用户信息提供者、群组信息提供者、群名片信息提供者\n\n/*!\n 用户信息提供者\n \n @discussion SDK需要通过您实现的用户信息提供者，获取用户信息并显示。\n */\n@protocol RCIMUserInfoDataSource <NSObject>\n\n/*!\n 获取用户信息\n \n @param userId      用户ID\n @param completion  获取用户信息完成之后需要执行的Block [userInfo:该用户ID对应的用户信息]\n \n @discussion SDK通过此方法获取用户信息并显示，请在completion中返回该用户ID对应的用户信息。\n 在您设置了用户信息提供者之后，SDK在需要显示用户信息的时候，会调用此方法，向您请求用户信息用于显示。\n */\n- (void)getUserInfoWithUserId:(NSString *)userId\n                   completion:(void (^)(RCUserInfo *userInfo))completion;\n\n@end\n\n/*!\n 群组信息提供者\n \n @discussion SDK需要通过您实现的群组信息提供者，获取群组信息并显示。\n */\n@protocol RCIMGroupInfoDataSource <NSObject>\n\n/*!\n 获取群组信息\n \n @param groupId     群组ID\n @param completion  获取群组信息完成之后需要执行的Block [groupInfo:该群组ID对应的群组信息]\n \n @discussion SDK通过此方法获取用户信息并显示，请在completion的block中返回该用户ID对应的用户信息。\n 在您设置了用户信息提供者之后，SDK在需要显示用户信息的时候，会调用此方法，向您请求用户信息用于显示。\n */\n- (void)getGroupInfoWithGroupId:(NSString *)groupId\n                     completion:(void (^)(RCGroup *groupInfo))completion;\n\n@end\n\n/*!\n 群名片信息提供者\n \n @discussion 如果您使用了群名片功能，SDK需要通过您实现的群名片信息提供者，获取用户在群组中的名片信息并显示。\n */\n@protocol RCIMGroupUserInfoDataSource <NSObject>\n\n/*!\n 获取用户在群组中的群名片信息\n \n @param userId          用户ID\n @param groupId         群组ID\n @param completion      获取群名片信息完成之后需要执行的Block [userInfo:该用户ID在群组中对应的群名片信息]\n \n @discussion 如果您使用了群名片功能，SDK需要通过您实现的群名片信息提供者，获取用户在群组中的名片信息并显示。\n */\n- (void)getUserInfoWithUserId:(NSString *)userId\n                      inGroup:(NSString *)groupId\n                   completion:(void (^)(RCUserInfo *userInfo))completion;\n\n@end\n\n#pragma mark - 消息接收监听器\n\n/*!\n IMKit消息接收的监听器\n \n @discussion 设置IMKit的消息接收监听器请参考RCIM的receiveMessageDelegate属性。\n \n @warning 如果您使用IMKit，可以设置并实现此Delegate监听消息接收；\n 如果您使用IMLib，请使用RCIMClient中的RCIMClientReceiveMessageDelegate监听消息接收，而不要使用此监听器。\n */\n@protocol RCIMReceiveMessageDelegate <NSObject>\n\n/*!\n 接收消息的回调方法\n \n @param message     当前接收到的消息\n @param left        还剩余的未接收的消息数，left>=0\n \n @discussion 如果您设置了IMKit消息监听之后，SDK在接收到消息时候会执行此方法（无论App处于前台或者后台）。\n 其中，left为还剩余的、还未接收的消息数量。比如刚上线一口气收到多条消息时，通过此方法，您可以获取到每条消息，left会依次递减直到0。\n 您可以根据left数量来优化您的App体验和性能，比如收到大量消息时等待left为0再刷新UI。\n */\n- (void)onRCIMReceiveMessage:(RCMessage *)message\n                        left:(int)left;\n\n@optional\n\n/*!\n 当App处于后台时，接收到消息并弹出本地通知的回调方法\n \n @param message     接收到的消息\n @param senderName  消息发送者的用户名称\n @return            当返回值为NO时，SDK会弹出默认的本地通知提示；当返回值为YES时，SDK针对此消息不再弹本地通知提示\n \n @discussion 如果您设置了IMKit消息监听之后，当App处于后台，收到消息时弹出本地通知之前，会执行此方法。\n 如果App没有实现此方法，SDK会弹出默认的本地通知提示。\n 流程：\n SDK接收到消息 -> App处于后台状态 -> 通过用户/群组/群名片信息提供者获取消息的用户/群组/群名片信息\n -> 用户/群组信息为空 -> 不弹出本地通知\n -> 用户/群组信息存在 -> 回调此方法准备弹出本地通知 -> App实现并返回YES        -> SDK不再弹出此消息的本地通知\n                                             -> App未实现此方法或者返回NO -> SDK弹出默认的本地通知提示\n \n \n 您可以通过RCIM的disableMessageNotificaiton属性，关闭所有的本地通知(此时不再回调此接口)。\n \n @warning 如果App在后台想使用SDK默认的本地通知提醒，需要实现用户/群组/群名片信息提供者，并返回正确的用户信息或群组信息。\n 参考RCIMUserInfoDataSource、RCIMGroupInfoDataSource与RCIMGroupUserInfoDataSource\n */\n-(BOOL)onRCIMCustomLocalNotification:(RCMessage*)message\n                      withSenderName:(NSString *)senderName;\n\n/*!\n 当App处于前台时，接收到消息并播放提示音的回调方法\n \n @param message 接收到的消息\n @return        当返回值为NO时，SDK会播放默认的提示音；当返回值为YES时，SDK针对此消息不再播放提示音\n \n @discussion 到消息时播放提示音之前，会执行此方法。\n 如果App没有实现此方法，SDK会播放默认的提示音。\n 流程：\n SDK接收到消息 -> App处于前台状态 -> 回调此方法准备播放提示音 -> App实现并返回YES        -> SDK针对此消息不再播放提示音\n                                                      -> App未实现此方法或者返回NO -> SDK会播放默认的提示音\n \n 您可以通过RCIM的disableMessageAlertSound属性，关闭所有前台消息的提示音(此时不再回调此接口)。\n */\n-(BOOL)onRCIMCustomAlertSound:(RCMessage*)message;\n\n@end\n\n#pragma mark - 连接状态监听器\n\n/*!\n IMKit连接状态的的监听器\n \n @discussion 设置IMKit的连接状态监听器，请参考RCIM的connectionStatusDelegate属性。\n \n @warning 如果您使用IMKit，可以设置并实现此Delegate监听消息接收；\n 如果您使用IMLib，请使用RCIMClient中的RCIMClientReceiveMessageDelegate监听消息接收，而不要使用此监听器。\n */\n@protocol RCIMConnectionStatusDelegate <NSObject>\n\n/*!\n IMKit连接状态的的监听器\n \n @param status  SDK与融云服务器的连接状态\n \n @discussion 如果您设置了IMKit消息监听之后，当SDK与融云服务器的连接状态发生变化时，会回调此方法。\n */\n- (void)onRCIMConnectionStatusChanged:(RCConnectionStatus)status;\n\n@end\n\n#pragma mark - IMKit核心类\n\n/*!\n 融云IMKit核心类\n \n @discussion 您需要通过sharedRCIM方法，获取单例对象\n */\n@interface RCIM : NSObject\n\n/*!\n 获取融云界面组件IMKit的核心类单例\n \n @return    融云界面组件IMKit的核心类单例\n \n @discussion 您可以通过此方法，获取IMKit的单例，访问对象中的属性和方法。\n */\n+ (instancetype)sharedRCIM;\n\n#pragma mark - SDK初始化\n\n/*!\n 初始化融云SDK\n \n @param appKey  从融云开发者平台创建应用后获取到的App Key\n \n @discussion 您在使用融云SDK所有功能（包括显示SDK中或者继承于SDK的View）之前，您必须先调用此方法初始化SDK。\n 在App整个生命周期中，您只需要执行一次初始化。\n \n @warning 如果您使用IMKit，请使用此方法初始化SDK；\n 如果您使用IMLib，请使用RCIMClient中的同名方法初始化，而不要使用此方法。\n */\n- (void)initWithAppKey:(NSString *)appKey;\n\n#pragma mark - 连接与断开服务器\n\n/*!\n 与融云服务器建立连接\n \n @param token                   从您服务器端获取的token(用户身份令牌)\n @param successBlock            连接建立成功的回调 [userId:当前连接成功所用的用户ID\n @param errorBlock              连接建立失败的回调 [status:连接失败的错误码]\n @param tokenIncorrectBlock     token错误或者过期的回调\n \n @discussion 在App整个生命周期，您只需要调用一次此方法与融云服务器建立连接。\n 之后无论是网络出现异常或者App有前后台的切换等，SDK都会负责自动重连。\n 除非您已经手动将连接断开，否则您不需要自己再手动重连。\n \n tokenIncorrectBlock有两种情况：\n 一是token错误，请您检查客户端初始化使用的AppKey和您服务器获取token使用的AppKey是否一致；\n 二是token过期，是因为您在开发者后台设置了token过期时间，您需要请求您的服务器重新获取token并再次用新的token建立连接。\n \n @warning 如果您使用IMKit，请使用此方法建立与融云服务器的连接；\n 如果您使用IMLib，请使用RCIMClient中的同名方法建立与融云服务器的连接，而不要使用此方法。\n \n 在tokenIncorrectBlock的情况下，您需要请求您的服务器重新获取token并建立连接，但是注意避免无限循环，以免影响App用户体验。\n \n 此方法的回调并非为原调用线程，您如果需要进行UI操作，请注意切换到主线程。\n */\n- (void)connectWithToken:(NSString *)token\n                 success:(void (^)(NSString *userId))successBlock\n                   error:(void (^)(RCConnectErrorCode status))errorBlock\n          tokenIncorrect:(void (^)())tokenIncorrectBlock;\n\n/*!\n 断开与融云服务器的连接\n \n @param isReceivePush   App在断开连接之后，是否还接收远程推送\n \n @discussion 因为SDK在前后台切换或者网络出现异常都会自动重连，会保证连接的可靠性。\n 所以除非您的App逻辑需要登出，否则一般不需要调用此方法进行手动断开。\n \n @warning 如果您使用IMKit，请使用此方法断开与融云服务器的连接；\n 如果您使用IMLib，请使用RCIMClient中的同名方法断开与融云服务器的连接，而不要使用此方法。\n \n isReceivePush指断开与融云服务器的连接之后，是否还接收远程推送。\n [[RCIM sharedRCIM] disconnect:YES]与[[RCIM sharedRCIM] disconnect]完全一致；\n [[RCIM sharedRCIM] disconnect:NO]与[[RCIM sharedRCIM] logout]完全一致。\n 您只需要按照您的需求，使用disconnect:与disconnect以及logout三个接口其中一个即可。\n */\n- (void)disconnect:(BOOL)isReceivePush;\n\n/*!\n 断开与融云服务器的连接，但仍然接收远程推送\n \n @discussion 因为SDK在前后台切换或者网络出现异常都会自动重连，会保证连接的可靠性。\n 所以除非您的App逻辑需要登出，否则一般不需要调用此方法进行手动断开。\n \n @warning 如果您使用IMKit，请使用此方法断开与融云服务器的连接；\n 如果您使用IMLib，请使用RCIMClient中的同名方法断开与融云服务器的连接，而不要使用此方法。\n \n [[RCIM sharedRCIM] disconnect:YES]与[[RCIM sharedRCIM] disconnect]完全一致；\n [[RCIM sharedRCIM] disconnect:NO]与[[RCIM sharedRCIM] logout]完全一致。\n 您只需要按照您的需求，使用disconnect:与disconnect以及logout三个接口其中一个即可。\n */\n- (void)disconnect;\n\n/*!\n 断开与融云服务器的连接，并不再接收远程推送\n \n @discussion 因为SDK在前后台切换或者网络出现异常都会自动重连，会保证连接的可靠性。\n 所以除非您的App逻辑需要登出，否则一般不需要调用此方法进行手动断开。\n \n @warning 如果您使用IMKit，请使用此方法断开与融云服务器的连接；\n 如果您使用IMLib，请使用RCIMClient中的同名方法断开与融云服务器的连接，而不要使用此方法。\n \n [[RCIM sharedRCIM] disconnect:YES]与[[RCIM sharedRCIM] disconnect]完全一致；\n [[RCIM sharedRCIM] disconnect:NO]与[[RCIM sharedRCIM] logout]完全一致。\n 您只需要按照您的需求，使用disconnect:与disconnect以及logout三个接口其中一个即可。\n */\n- (void)logout;\n\n#pragma mark 连接状态监听\n\n/*!\n IMKit连接状态的监听器\n \n @warning 如果您使用IMKit，可以设置并实现此Delegate监听消息接收；\n 如果您使用IMLib，请使用RCIMClient中的RCIMClientReceiveMessageDelegate监听消息接收，而不要使用此方法。\n */\n@property(nonatomic, weak) id<RCIMConnectionStatusDelegate> connectionStatusDelegate;\n\n/*!\n 获取当前SDK的连接状态\n \n @return 当前SDK的连接状态\n */\n- (RCConnectionStatus)getConnectionStatus;\n\n#pragma mark - 消息接收与发送\n\n/*!\n 注册自定义的消息类型\n \n @param messageClass    自定义消息的类，该自定义消息需要继承于RCMessageContent\n \n @discussion 如果您需要自定义消息，必须调用此方法注册该自定义消息的消息类型，否则SDK将无法识别和解析该类型消息。\n \n @warning 如果您使用IMKit，请使用此方法注册自定义的消息类型；\n 如果您使用IMLib，请使用RCIMClient中的同名方法注册自定义的消息类型，而不要使用此方法。\n */\n- (void)registerMessageType:(Class)messageClass;\n\n#pragma mark 消息发送\n/*!\n 发送消息(除图片消息外的所有消息)，会自动更新UI\n \n @param conversationType    发送消息的会话类型\n @param targetId            发送消息的目标会话ID\n @param content             消息的内容\n @param pushContent         接收方离线时需要显示的远程推送内容\n @param pushData            接收方离线时需要在远程推送中携带的非显示数据\n @param successBlock        消息发送成功的回调 [messageId:消息的ID]\n @param errorBlock          消息发送失败的回调 [nErrorCode:发送失败的错误码, messageId:消息的ID]\n @return                    发送的消息实体\n \n @discussion 当接收方离线并允许远程推送时，会收到远程推送。\n 远程推送中包含两部分内容，一是pushContent，用于显示；二是pushData，用于携带不显示的数据。\n \n SDK内置的消息类型，如果您将pushContent和pushData置为nil，会使用默认的推送格式进行远程推送。\n 自定义类型的消息，需要您自己设置pushContent和pushData来定义推送内容，否则将不会进行远程推送。\n \n @warning 如果您使用IMKit，使用此方法发送消息SDK会自动更新UI；\n 如果您使用IMLib，请使用RCIMClient中的同名方法发送消息，不会自动更新UI。\n */\n- (RCMessage *)sendMessage:(RCConversationType)conversationType\n                  targetId:(NSString *)targetId\n                   content:(RCMessageContent *)content\n               pushContent:(NSString *)pushContent\n                  pushData:(NSString *)pushData\n                   success:(void (^)(long messageId))successBlock\n                     error:(void (^)(RCErrorCode nErrorCode, long messageId))errorBlock;\n\n/*!\n 发送图片消息，会自动更新UI\n \n @param conversationType    发送消息的会话类型\n @param targetId            发送消息的目标会话ID\n @param content             消息的内容\n @param pushContent         接收方离线时需要显示的远程推送内容\n @param pushData            接收方离线时需要在远程推送中携带的非显示数据\n @param progressBlock       消息发送进度更新的回调 [progress:当前的发送进度, 0 <= progress <= 100, messageId:消息的ID]\n @param successBlock        消息发送成功的回调 [messageId:消息的ID]\n @param errorBlock          消息发送失败的回调 [errorCode:发送失败的错误码, messageId:消息的ID]\n @return                    发送的消息实体\n \n @discussion 当接收方离线并允许远程推送时，会收到远程推送。\n 远程推送中包含两部分内容，一是pushContent，用于显示；二是pushData，用于携带不显示的数据。\n \n SDK内置的消息类型，如果您将pushContent和pushData置为nil，会使用默认的推送格式进行远程推送。\n 自定义类型的消息，需要您自己设置pushContent和pushData来定义推送内容，否则将不会进行远程推送。\n \n @warning 如果您使用IMKit，使用此方法发送图片消息SDK会自动更新UI；\n 如果您使用IMLib，请使用RCIMClient中的同名方法发送图片消息，不会自动更新UI。\n */\n- (RCMessage *)sendImageMessage:(RCConversationType)conversationType\n                       targetId:(NSString *)targetId\n                        content:(RCMessageContent *)content\n                    pushContent:(NSString *)pushContent\n                       pushData:(NSString *)pushData\n                       progress:(void (^)(int progress, long messageId))progressBlock\n                        success:(void (^)(long messageId))successBlock\n                          error:(void (^)(RCErrorCode errorCode, long messageId))errorBlock;\n\n/*!\n 发起VoIP语音通话\n \n @param targetId    要发起语音通话的对方的用户ID\n \n @discussion 使用此方法，必须要求是带VoIP功能的IMKit SDK\n */\n- (void)startVoIPCallWithTargetId:(NSString *)targetId;\n\n#pragma mark 消息接收监听\n/*!\n IMKit消息接收的监听器\n \n @warning 如果您使用IMKit，可以设置并实现此Delegate监听消息接收；\n 如果您使用IMLib，请使用RCIMClient中的RCIMClientReceiveMessageDelegate监听消息接收，而不要使用此方法。\n */\n@property(nonatomic, weak) id<RCIMReceiveMessageDelegate> receiveMessageDelegate;\n\n#pragma mark 消息通知提醒\n/*!\n 是否关闭所有的本地通知，默认值是NO\n \n @discussion 当App处于后台时，默认会弹出本地通知提示，您可以通过将此属性设置为YES，关闭所有的本地通知。\n */\n@property(nonatomic, assign) BOOL disableMessageNotificaiton;\n\n/*!\n 是否关闭所有的前台消息提示音，默认值是NO\n \n @discussion 当App处于前台时，默认会播放消息提示音，您可以通过将此属性设置为YES，关闭所有的前台消息提示音。\n */\n@property(nonatomic, assign) BOOL disableMessageAlertSound;\n\n/*!\n 是否开启发送输入状态，默认值是NO，开启之后在输入消息的时候对方可以看到正在输入的提示(目前只支持单聊)\n */\n@property(nonatomic, assign) BOOL enableTypingStatus;\n\n/*!\n 是否开启发送已读回执，默认值是NO，开启之后在会话页面展示对方的消息之后会发送回执给对方(目前只支持单聊)\n */\n@property(nonatomic, assign) BOOL enableReadReceipt;\n\n/*!\n 是否在聊天界面和会话列表界面显示未注册的消息类型，默认值是NO\n \n @discussion App不断迭代开发，可能会在以后的新版本中不断增加某些自定义类型的消息，但是已经发布的老版本无法识别此类消息。\n 针对这种情况，可以预先定义好未注册的消息的显示，以提升用户体验（如提示当前版本不支持，引导用户升级版本等）\n \n 未注册的消息，可以通过RCConversationViewController中的rcUnkownConversationCollectionView:cellForItemAtIndexPath:和rcUnkownConversationCollectionView:layout:sizeForItemAtIndexPath:方法定制在聊天界面的显示。\n 未注册的消息，可以通过修改unknown_message_cell_tip字符串资源定制在会话列表界面的显示。\n */\n@property(nonatomic, assign) BOOL showUnkownMessage;\n\n/*!\n 未注册的消息类型是否显示本地通知，默认值是NO\n \n @discussion App不断迭代开发，可能会在以后的新版本中不断增加某些自定义类型的消息，但是已经发布的老版本无法识别此类消息。\n 针对这种情况，可以预先定义好未注册的消息的显示，以提升用户体验（如提示当前版本不支持，引导用户升级版本等）\n \n 未注册的消息，可以通过修改unknown_message_notification_tip字符串资源定制本地通知的显示。\n */\n@property(nonatomic, assign) BOOL showUnkownMessageNotificaiton;\n\n#pragma mark - 用户信息、群组信息相关\n\n/*!\n 当前登录的用户的用户信息\n \n @discussion 与融云服务器建立连接之后，应该设置当前用户的用户信息，用于SDK显示和发送。\n */\n@property(nonatomic, strong) RCUserInfo *currentUserInfo;\n\n/*!\n 用户信息提供者\n \n @discussion SDK需要通过您实现的用户信息提供者，获取用户信息并显示。\n */\n@property(nonatomic, weak) id<RCIMUserInfoDataSource> userInfoDataSource;\n\n/*!\n 群组信息提供者\n \n @discussion SDK需要通过您实现的群组信息提供者，获取群组信息并显示。\n */\n@property(nonatomic, weak) id<RCIMGroupInfoDataSource> groupInfoDataSource;\n\n/*!\n 群名片信息提供者\n \n @discussion 如果您使用了群名片功能，SDK需要通过您实现的群名片信息提供者，获取用户在群组中的名片信息并显示。\n */\n@property(nonatomic, weak) id<RCIMGroupUserInfoDataSource> groupUserInfoDataSource;\n\n/*!\n 是否在发送的所有消息中携带当前登录的用户信息，默认值为NO\n \n @discussion 如果设置为YES，则会在每一条发送的消息中携带当前登录用户的用户信息。从2.4.1 之后附加用户信息之后cell默认会显示附加的用户信息的头像，即用户信息不会取用户信息提供者里提供的用户信息\n 需要先设置当前登录用户的用户信息，参考RCIM的currentUserInfo。\n */\n@property(nonatomic, assign) BOOL enableMessageAttachUserInfo;\n\n/*!\n  语音消息的最大长度\n \n @discussion 默认值是60s，有效值为不小于5秒，不大于60秒\n */\n@property(nonatomic, assign) NSUInteger maxVoiceDuration;\n#pragma mark 用户信息、群组信息缓存\n/*!\n 更新SDK中的用户信息缓存\n \n @param userInfo     需要更新的用户信息\n @param userId       需要更新的用户ID\n \n @discussion 使用此方法，可以更新SDK缓存的用户信息。\n 但是处于性能和使用场景权衡，SDK不会在当前View立即自动刷新（会在切换到其他View的时候再刷新该用户的显示信息）。\n 如果您想立即刷新，您可以在会话列表或者聊天界面reload强制刷新。\n */\n- (void)refreshUserInfoCache:(RCUserInfo *)userInfo\n                  withUserId:(NSString *)userId;\n\n/*!\n 更新SDK中的群组信息缓存\n \n @param groupInfo   需要更新的群组信息\n @param groupId     需要更新的群组ID\n \n @discussion 使用此方法，可以更新SDK缓存的群组信息。\n 但是处于性能和使用场景权衡，SDK不会在当前View立即自动刷新（会在切换到其他View的时候再刷新该群组的显示信息）。\n 如果您想立即刷新，您可以在会话列表或者聊天界面reload强制刷新。\n */\n- (void)refreshGroupInfoCache:(RCGroup *)groupInfo\n                  withGroupId:(NSString *)groupId;\n\n/*!\n 更新SDK中的群名片信息缓存\n \n @param userInfo     需要更新的用户信息\n @param userId       需要更新的用户ID\n @param groupId      需要更新群名片信息的群组ID\n \n @discussion 使用此方法，可以更新SDK缓存的群名片信息。\n 但是处于性能和使用场景权衡，SDK不会在当前View立即自动刷新（会在切换到其他View的时候再刷新该群名片的显示信息）。\n 如果您想立即刷新，您可以在会话列表或者聊天界面reload强制刷新。\n */\n- (void)refreshGroupUserInfoCache:(RCUserInfo *)userInfo\n                       withUserId:(NSString *)userId\n                      withGroupId:(NSString *)groupId;\n\n/*!\n 清空SDK中所有的用户信息缓存\n \n @discussion 使用此方法，会清空SDK中所有的用户信息缓存。\n 但是处于性能和使用场景权衡，SDK不会在当前View立即自动刷新（会在切换到其他View的时候再刷新所显示的用户信息）。\n 如果您想立即刷新，您可以在会话列表或者聊天界面reload强制刷新。\n */\n- (void)clearUserInfoCache;\n\n/*!\n 清空SDK中所有的群组信息缓存\n \n @discussion 使用此方法，会清空SDK中所有的群组信息缓存。\n 但是处于性能和使用场景权衡，SDK不会在当前View立即自动刷新（会在切换到其他View的时候再刷新所显示的群组信息）。\n 如果您想立即刷新，您可以在会话列表或者聊天界面reload强制刷新。\n */\n- (void)clearGroupInfoCache;\n\n#pragma mark 头像显示\n\n/*!\n SDK中全局的导航按钮字体颜色\n \n @discussion 默认值为[UIColor whiteColor]\n */\n@property(nonatomic) UIColor *globalNavigationBarTintColor;\n\n/*!\n SDK会话列表界面中显示的头像形状，矩形或者圆形\n \n @discussion 默认值为矩形，即RC_USER_AVATAR_RECTANGLE\n */\n@property(nonatomic) RCUserAvatarStyle globalConversationAvatarStyle;\n\n/*!\n SDK会话列表界面中显示的头像大小，高度必须大于或者等于36\n \n @discussion 默认值为46*46\n */\n@property(nonatomic) CGSize globalConversationPortraitSize;\n\n/*!\n SDK聊天界面中显示的头像形状，矩形或者圆形\n \n @discussion 默认值为矩形，即RC_USER_AVATAR_RECTANGLE\n */\n@property(nonatomic) RCUserAvatarStyle globalMessageAvatarStyle;\n\n/*!\n SDK聊天界面中显示的头像大小\n \n @discussion 默认值为46*46\n */\n@property(nonatomic) CGSize globalMessagePortraitSize;\n\n/*!\n SDK会话列表界面和聊天界面的头像的圆角曲率半径\n \n @discussion 默认值为4，只有当头像形状设置为矩形时才会生效。\n 参考RCIM的globalConversationAvatarStyle和globalMessageAvatarStyle。\n */\n@property(nonatomic) CGFloat portraitImageViewCornerRadius;\n\n@end\n\n#endif"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCImageMessageCell.h",
    "content": "//\n//  RCImageMessageCell.h\n//  RongIMKit\n//\n//  Created by xugang on 15/2/2.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#import \"RCMessageCell.h\"\n#import \"RCImageMessageProgressView.h\"\n\n/*!\n 图片消息Cell\n */\n@interface RCImageMessageCell : RCMessageCell\n\n/*!\n 消息的背景View\n */\n@property(nonatomic, strong) UIImageView *bubbleBackgroundView;\n/*!\n 显示图片缩略图的View\n */\n@property(nonatomic, strong) UIImageView *pictureView;\n\n/*!\n 显示发送进度的View\n */\n@property(nonatomic, strong) RCImageMessageProgressView *progressView;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCImageMessageProgressView.h",
    "content": "//\n//  RCNumberProgressView.h\n//  RCIM\n//\n//  Created by xugang on 6/5/14.\n//  Copyright (c) 2014 Heq.Shinoda. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n/*!\n 图片消息进度的View\n */\n@interface RCImageMessageProgressView : UIView\n\n/*!\n 显示进度的Label\n */\n@property(nonatomic, assign) UILabel *label;\n\n/*!\n 进度指示的View\n */\n@property(nonatomic, strong) UIActivityIndicatorView *indicatorView;\n\n/*!\n 更新进度\n \n @param progress 进度值，0 <= progress <= 100\n */\n- (void)updateProgress:(NSInteger)progress;\n\n/*!\n 开始播放动画\n */\n- (void)startAnimating;\n\n/*!\n 停止播放动画\n */\n- (void)stopAnimating;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCImagePreviewController.h",
    "content": "//\n//  PreviewViewController.h\n//  RCIM\n//\n//  Created by Heq.Shinoda on 14-5-27.\n//  Copyright (c) 2014年 Heq.Shinoda. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import \"RCBaseViewController.h\"\n#import \"RCImageMessageProgressView.h\"\n\n@class RCMessageModel;\n\n/*!\n 查看图片消息中的原始图片的ViewController\n */\n@interface RCImagePreviewController : RCBaseViewController\n\n/*!\n 原始图片的View\n */\n@property(nonatomic, strong) UIImageView *originalImageView;\n\n/*!\n 消息的数据模型\n */\n@property(nonatomic, strong) RCMessageModel *messageModel;\n\n/*!\n 图片消息进度的View\n */\n@property(nonatomic, strong) RCImageMessageProgressView *rcImageProressView;\n\n/*!\n 取消按钮的点击事件\n \n @param sender 取消按钮\n \n @discussion SDK在此方法中，会针对默认的NavigationBar退出当前界面；\n 如果您使用自定义导航按钮或者自定义按钮，可以重写此方法退出当前界面。\n */\n- (void)leftBarButtonItemPressed:(id)sender;\n\n/*!\n 保存按钮的点击事件\n \n @param sender 保存按钮\n \n @discussion SDK在此方法中，默认会进行图片的保存。\n */\n- (void)rightBarButtonItemPressed:(id)sender;\n\n/*!\n 图片下载完成的回调\n */\n- (void)imageDownloadDone;\n\n@end"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCKitUtility.h",
    "content": "//\n//  RCKitUtility.h\n//  iOS-IMKit\n//\n//  Created by xugang on 7/7/14.\n//  Copyright (c) 2014 Heq.Shinoda. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <UIKit/UIKit.h>\n#import <RongIMLib/RongIMLib.h>\n\n/*!\n IMKit工具类\n */\n@interface RCKitUtility : NSObject\n\n/*!\n 时间转换\n \n @param secs    Unix时间戳（秒）\n @return        可视化的时间字符串\n \n @discussion 如果该时间是今天的，则返回值为\"HH:mm\"格式的字符串；\n 如果该时间是昨天的，则返回字符串资源中Yesterday对应语言的字符串；\n 如果该时间是昨天之前或者今天之后的，则返回\"yyyy-MM-dd\"的字符串。\n */\n+ (NSString *)ConvertMessageTime:(long long)secs;\n\n/*!\n 时间转换\n \n @param secs    Unix时间戳（秒）\n @return        可视化的时间字符串\n \n @discussion 如果该时间是今天的，则返回值为\"HH:mm\"格式的字符串；\n 如果该时间是昨天的，则返回\"Yesterday HH:mm\"的字符串（其中，Yesterday为字符串资源中Yesterday对应语言的字符串）；\n 如果该时间是昨天之前或者今天之后的，则返回\"yyyy-MM-dd HH:mm\"的字符串。\n */\n+ (NSString *)ConvertChatMessageTime:(long long)secs;\n\n/*!\n 获取资源包中的图片\n \n @param name        图片名\n @param bundleName  图片所在的Bundle名\n @return            图片\n */\n+ (UIImage *)imageNamed:(NSString *)name ofBundle:(NSString *)bundleName;\n\n/*!\n 获取指定颜色的图片\n \n @param color   颜色值\n @return        坐标为(0.0f, 0.0f, 1.0f, 1.0f)的纯色图片\n */\n+ (UIImage *)createImageWithColor:(UIColor *)color;\n\n/*!\n 获取消息内容的摘要\n \n @param messageContent  消息内容\n @return                消息内容的摘要\n \n @discussion SDK默认的消息有内置的处理，\n 自定义消息会调用RCMessageContent中RCMessageContentView协议的conversationDigest获取消息摘要。\n */\n+ (NSString *)formatMessage:(RCMessageContent *)messageContent;\n\n/*!\n 以消息的类型名为Key值在字符串资源中查找对应语言的字符串\n \n @param messageContent  消息内容\n @return                对应语言的字符串\n */\n+ (NSString *)localizedDescription:(RCMessageContent *)messageContent;\n\n/*!\n 获取消息对应的本地消息Dictionary\n \n @param message 消息实体\n @return 本地通知的Dictionary\n */\n+ (NSDictionary *)getNotificationUserInfoDictionary:(RCMessage *)message;\n\n/*!\n 获取消息对应的本地消息Dictionary（已废弃，请勿使用）\n \n @param conversationType    会话类型\n @param fromUserId          发送者的用户ID\n @param targetId            消息的目标会话ID\n @param messageContent      消息内容\n @return                    本地通知的Dictionary\n \n @warning **已废弃，请勿使用。**\n */\n+ (NSDictionary *)getNotificationUserInfoDictionary:(RCConversationType)conversationType fromUserId:(NSString *)fromUserId targetId:(NSString *)targetId messageContent:(RCMessageContent *)messageContent\n__deprecated_msg(\"已废弃，请勿使用。\");\n\n/*!\n 获取消息对应的本地消息Dictionary\n \n @param conversationType    会话类型\n @param fromUserId          发送者的用户ID\n @param targetId            消息的目标会话ID\n @param objectName          消息的类型名\n @return                    本地通知的Dictionary\n */\n+ (NSDictionary *)getNotificationUserInfoDictionary:(RCConversationType)conversationType fromUserId:(NSString *)fromUserId targetId:(NSString *)targetId objectName:(NSString *)objectName;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCLocationMessageCell.h",
    "content": "//\n//  RCLocationMessageCell.h\n//  RongIMKit\n//\n//  Created by xugang on 15/2/2.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#import \"RCMessageCell.h\"\n#import \"RCImageMessageProgressView.h\"\n\n/*!\n 位置消息Cell\n */\n@interface RCLocationMessageCell : RCMessageCell\n\n/*!\n 消息的背景View\n */\n@property(nonatomic, strong) UIImageView *bubbleBackgroundView;\n/*!\n 当前位置在地图中的概览图\n */\n@property(nonatomic, strong) UIImageView *pictureView;\n\n/*!\n 显示位置名称的Label\n */\n@property(nonatomic, strong) UILabel *locationNameLabel;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCLocationPickerViewController.h",
    "content": "//\n//  RCLocationPickerViewController.h\n//  iOS-IMKit\n//\n//  Created by YangZigang on 14/10/31.\n//  Copyright (c) 2014年 RongCloud. All rights reserved.\n//\n\n#import \"RCBaseViewController.h\"\n#import <MapKit/MapKit.h>\n#import <CoreLocation/CoreLocation.h>\n#import <UIKit/UIKit.h>\n\n/*!\n POI搜索结束后的回调block\n \n @param pois                需要显示的POI列表\n @param clearPreviousResult 如果地图位置已经发生变化，需要清空之前的POI数据\n @param hasMore             如果POI数据很多，可以进行“更多”显示\n @param error               搜索POI出现错误时，返回错误信息\n */\ntypedef void (^OnPoiSearchResult)(NSArray *pois, BOOL clearPreviousResult, BOOL hasMore, NSError *error);\n\n@protocol RCLocationPickerViewControllerDelegate;\n@protocol RCLocationPickerViewControllerDataSource;\n\n/*!\n 地理位置选取的ViewController\n */\n@interface RCLocationPickerViewController\n: RCBaseViewController <CLLocationManagerDelegate, UITableViewDataSource, UITableViewDelegate>\n\n/*!\n 地理位置选择完成之后的回调\n */\n@property(nonatomic, weak) id<RCLocationPickerViewControllerDelegate> delegate;\n\n/*!\n 位置选择的数据源\n */\n@property(nonatomic, strong) id<RCLocationPickerViewControllerDataSource> dataSource;\n\n/*!\n mapViewContainer\n */\n@property(nonatomic, strong) IBOutlet UIView *mapViewContainer;\n\n/*!\n 初始化地理位置选取的ViewController\n \n @param dataSource  位置选择的数据源\n @return            地理位置选取的ViewController对象\n */\n- (instancetype)initWithDataSource:(id<RCLocationPickerViewControllerDataSource>)dataSource;\n\n/*!\n 退出当前界面\n \n @param sender 返回按钮\n \n @discussion SDK在此方法中，会针对默认的NavigationBar退出当前界面；\n 如果您使用自定义导航按钮或者自定义按钮，可以重写此方法退出当前界面。\n */\n- (void)leftBarButtonItemPressed:(id)sender;\n\n/*!\n 完成位置获取\n \n @param sender 完成按钮\n \n @discussion 点击完成按钮的后会调用本函数。\n */\n- (void)rightBarButtonItemPressed:(id)sender;\n\n@end\n\n/*!\n 位置选择的数据源\n */\n@protocol RCLocationPickerViewControllerDataSource <NSObject>\n@optional\n\n/*!\n 获取显示的地图控件\n \n @return 在界面上显示的地图控件\n */\n- (UIView *)mapView;\n\n/*!\n 获取显示的中心点标记\n \n @return 界面上显示的中心点标记\n \n @discussion 如不想显示中心点标记，可以返回nil。\n */\n- (CALayer *)annotationLayer;\n\n/*!\n 获取位置标注的名称\n \n @param placeMark   位置标注\n @return            位置标注的名称\n */\n- (NSString *)titleOfPlaceMark:(id)placeMark;\n\n/*!\n 获取位置标注的坐标\n \n @param placeMark   位置标注\n @return            位置标注的二维坐标值\n */\n- (CLLocationCoordinate2D)locationCoordinate2DOfPlaceMark:(id)placeMark;\n\n/*!\n 设置地图显示的中心点坐标\n \n @param location 中心点坐标\n @param animated 是否开启动画效果\n */\n- (void)setMapViewCenter:(CLLocationCoordinate2D)location animated:(BOOL)animated;\n\n/*!\n 设置地图显示区域\n \n @param coordinateRegion 地图显示区域\n @param animated         是否开启动画效果\n */\n- (void)setMapViewCoordinateRegion:(MKCoordinateRegion)coordinateRegion animated:(BOOL)animated;\n\n/*!\n 选择位置标示\n \n @param placeMark 选择的位置标注\n \n @discussion 开发者自己实现的RCLocationPickerViewControllerDataSource可以据此进行特定处理。\n 当有新的POI列表时，默认选中第一个。\n */\n- (void)userSelectPlaceMark:(id)placeMark;\n\n/*!\n 获取地图当前中心点的坐标\n \n @return 当前地图中心点\n */\n- (CLLocationCoordinate2D)mapViewCenter;\n\n/*!\n 设置POI搜索完毕后的回调\n \n @param poiSearchResult POI查询结果\n */\n- (void)setOnPoiSearchResult:(OnPoiSearchResult)poiSearchResult;\n\n/*!\n 获取当前视野中POI\n */\n- (void)beginFetchPoisOfCurrentLocation;\n\n/*!\n 获取位置在地图中的缩略图\n \n @return 位置在地图中的缩略图\n */\n- (UIImage *)mapViewScreenShot;\n\n@end\n\n/*!\n 地理位置选择完成之后的回调\n */\n@protocol RCLocationPickerViewControllerDelegate <NSObject>\n\n/*!\n 地理位置选择完成之后的回调\n \n @param locationPicker 地理位置选取的ViewController\n @param location       位置的二维坐标\n @param locationName   位置的名称\n @param mapScreenShot  位置在地图中的缩略图\n \n @discussion 如果您需要重写地理位置选择的界面，当选择地理位置完成后，需要调用此回调通知RCConversationViewController定位已完成，可以进一步生成位置消息并发送。\n */\n- (void)locationPicker:(RCLocationPickerViewController *)locationPicker\n     didSelectLocation:(CLLocationCoordinate2D)location\n          locationName:(NSString *)locationName\n         mapScreenShot:(UIImage *)mapScreenShot;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCLocationViewController.h",
    "content": "//\n//  RCLocationViewController.h\n//  iOS-IMKit\n//\n//  Created by YangZigang on 14/11/4.\n//  Copyright (c) 2014年 RongCloud. All rights reserved.\n//\n\n#import \"RCBaseViewController.h\"\n#import <CoreLocation/CoreLocation.h>\n#import <MapKit/MapKit.h>\n\n/*!\n 在地图中展示位置消息的ViewController\n */\n@interface RCLocationViewController : RCBaseViewController <MKMapViewDelegate>\n\n/*!\n 位置信息中的地理位置的二维坐标\n */\n@property(nonatomic, assign) CLLocationCoordinate2D location;\n\n/*!\n 位置消息中的地理位置的名称\n */\n@property(nonatomic, strong) NSString *locationName;\n\n/*!\n 返回按钮的点击事件\n \n @param sender 返回按钮\n \n @discussion SDK在此方法中，会针对默认的NavigationBa退出当前界面；\n 如果您使用自定义导航按钮或者自定义按钮，可以重写此方法退出当前界面。\n */\n- (void)leftBarButtonItemPressed:(id)sender;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCMessageBaseCell.h",
    "content": "//\n//  RCMessageBaseCell.h\n//  RongIMKit\n//\n//  Created by xugang on 15/1/28.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#ifndef __RCMessageBaseCell\n#define __RCMessageBaseCell\n\n#import <UIKit/UIKit.h>\n#import <RongIMLib/RongIMLib.h>\n#import \"RCMessageModel.h\"\n#import \"RCMessageCellNotificationModel.h\"\n#import \"RCMessageCellDelegate.h\"\n#import \"RCTipLabel.h\"\n\n/*!\n 消息发送状态更新的Notification\n */\nUIKIT_EXTERN NSString *const KNotificationMessageBaseCellUpdateSendingStatus;\n\n#define TIME_LABEL_HEIGHT 20\n\n/*!\n 消息Cell基类\n \n @discussion 消息Cell基类包含了所有消息Cell的必要信息。\n 消息Cell基类针对用户头像是否显示，主要可以分为两类的：\n 一是提醒类的Cell，不显示用户信息，如：RCTipMessageCell和RCUnknownMessageCell；\n 二是展示类的Cell，显示用户信息和内容，如：RCMessageCell以及RCMessageCell的子类。\n */\n@interface RCMessageBaseCell : UICollectionViewCell\n\n/*!\n 消息Cell点击回调\n */\n@property(nonatomic, weak) id<RCMessageCellDelegate> delegate;\n\n/*!\n 显示时间的Label\n */\n@property(strong, nonatomic) RCTipLabel *messageTimeLabel;\n\n/*!\n 消息Cell的数据模型\n */\n@property(strong, nonatomic) RCMessageModel *model;\n\n/*!\n Cell显示的View\n */\n@property(strong, nonatomic) UIView *baseContentView;\n\n/*!\n 消息的方向\n */\n@property(nonatomic) RCMessageDirection messageDirection;\n\n/*!\n 时间Label是否显示\n */\n@property(nonatomic, readonly) BOOL isDisplayMessageTime;\n\n/*!\n 是否显示阅读状态\n */\n@property(nonatomic) BOOL isDisplayReadStatus;\n\n/*!\n 初始化消息Cell\n \n @param frame 显示的Frame\n @return 消息Cell基类对象\n */\n- (instancetype)initWithFrame:(CGRect)frame;\n\n/*!\n 设置当前消息Cell的数据模型\n \n @param model 消息Cell的数据模型\n */\n- (void)setDataModel:(RCMessageModel *)model;\n\n/*!\n 消息发送状态更新的监听回调\n \n @param notification 消息发送状态更新的Notification\n */\n- (void)messageCellUpdateSendingStatusEvent:(NSNotification *)notification;\n\n@end\n#endif"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCMessageBubbleTipView.h",
    "content": "//\n//  RCMessageBubbleTipView.h\n//  RCIM\n//\n//  Created by xugang on 14-6-20.\n//  Copyright (c) 2014年 xugang. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n/*!\n 角标的位置\n */\ntypedef NS_ENUM(NSInteger, RCMessageBubbleTipViewAlignment) {\n    /*!\n     左上\n     */\n    RC_MESSAGE_BUBBLE_TIP_VIEW_ALIGNMENT_TOP_LEFT,\n    /*!\n     右上\n     */\n    RC_MESSAGE_BUBBLE_TIP_VIEW_ALIGNMENT_TOP_RIGHT,\n    /*!\n     中上\n     */\n    RC_MESSAGE_BUBBLE_TIP_VIEW_ALIGNMENT_TOP_CENTER,\n    /*!\n     左中\n     */\n    RC_MESSAGE_BUBBLE_TIP_VIEW_ALIGNMENT_CENTER_LEFT,\n    /*!\n     右中\n     */\n    RC_MESSAGE_BUBBLE_TIP_VIEW_ALIGNMENT_CENTER_RIGHT,\n    /*!\n     左下\n     */\n    RC_MESSAGE_BUBBLE_TIP_VIEW_ALIGNMENT_BOTTOM_LEFT,\n    /*!\n     右下\n     */\n    RC_MESSAGE_BUBBLE_TIP_VIEW_ALIGNMENT_BOTTOM_RIGHT,\n    /*!\n     中下\n     */\n    RC_MESSAGE_BUBBLE_TIP_VIEW_ALIGNMENT_BOTTOM_CENTER,\n    /*!\n     正中\n     */\n    RC_MESSAGE_BUBBLE_TIP_VIEW_ALIGNMENT_CENTER\n};\n\n/*!\n 消息未读提示角标的View\n */\n@interface RCMessageBubbleTipView : UIView\n\n/*!\n 角标显示的文本\n */\n@property(nonatomic, copy) NSString *bubbleTipText;\n\n/*!\n 角标的位置\n \n @discussion 默认值为RC_MESSAGE_BUBBLE_TIP_VIEW_ALIGNMENT_TOP_RIGHT，即右上。\n */\n@property(nonatomic, assign) RCMessageBubbleTipViewAlignment bubbleTipAlignment;\n\n/*!\n 角标文本的颜色\n */\n@property(nonatomic, strong) UIColor *bubbleTipTextColor;\n\n/*!\n 角标文本的阴影值\n */\n@property(nonatomic, assign) CGSize bubbleTipTextShadowOffset;\n\n/*!\n 角标文本的阴影颜色\n */\n@property(nonatomic, strong) UIColor *bubbleTipTextShadowColor;\n\n/*!\n 角标文本的字体\n */\n@property(nonatomic, strong) UIFont *bubbleTipTextFont;\n\n/*!\n 角标的背景颜色\n */\n@property(nonatomic, strong) UIColor *bubbleTipBackgroundColor;\n\n/*!\n 角标的覆盖颜色（已废弃，请勿使用）\n \n @warning **已废弃，请勿使用。**\n */\n@property(nonatomic, strong) __deprecated_msg(\"已废弃，请勿使用。\") UIColor *bubbleTipOverlayColor;\n\n/*!\n 角标View偏移的Rect\n */\n@property(nonatomic, assign) CGPoint bubbleTipPositionAdjustment;\n\n/*!\n 角标依附于的View Rect\n */\n@property(nonatomic, assign) CGRect frameToPositionInRelationWith;\n\n/*!\n 角标是否显示数字\n \n @discussion 如果为NO，会显示红点，不显示具体数字。\n */\n@property(nonatomic) BOOL isShowNotificationNumber;\n\n/*!\n 初始化角标View\n \n @param parentView  角标依附于的View\n @param alignment   角标的位置\n @return            角标View对象\n */\n- (instancetype)initWithParentView:(UIView *)parentView alignment:(RCMessageBubbleTipViewAlignment)alignment;\n\n/*!\n 设置角标的值\n \n @param msgCount 角标值\n */\n- (void)setBubbleTipNumber:(int)msgCount;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCMessageCell.h",
    "content": "//\n//  RCMessageCommonCell.h\n//  RongIMKit\n//\n//  Created by xugang on 15/1/28.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#ifndef __RCMessageCommonCell\n#define __RCMessageCommonCell\n#import \"RCMessageBaseCell.h\"\n#import \"RCThemeDefine.h\"\n#import \"RCMessageCellNotificationModel.h\"\n#import \"RCMessageCellDelegate.h\"\n#import \"RCContentView.h\"\n\n//#define PORTRAIT_WIDTH 45\n//#define PORTRAIT_HEIGHT 45\n\n@class RCloudImageView;\n\n/*!\n 展示的消息Cell类\n \n @discussion 需要展示用户信息和内容的消息Cell可以继承此类，\n 如：RCTextMessageCell、RCImageMessageCell、RCLocationMessageCell、RCVoiceMessageCell、RCRichContentMessageCell等。\n 如果您需要显示自定义消息，可以继承此类。\n */\n@interface RCMessageCell : RCMessageBaseCell\n\n/*!\n消息发送者的用户头像\n*/\n@property(nonatomic, strong) RCloudImageView *portraitImageView;\n\n/*!\n 消息发送者的用户名称\n */\n@property(nonatomic, strong) UILabel *nicknameLabel;\n\n/*!\n 消息内容的View\n */\n@property(nonatomic, strong) RCContentView *messageContentView;\n\n/*!\n 显示发送状态的View\n \n @discussion 其中包含messageFailedStatusView子View。\n */\n@property(nonatomic, strong) UIView *statusContentView;\n\n/*!\n 显示发送失败状态的View\n */\n@property(nonatomic, strong) UIButton *messageFailedStatusView;\n\n/*!\n 消息发送指示View\n */\n@property(nonatomic, strong) UIActivityIndicatorView *messageActivityIndicatorView;\n\n/*!\n 消息内容的View的宽度\n */\n@property(nonatomic, readonly) CGFloat messageContentViewWidth;\n\n/*!\n 显示的用户头像形状\n */\n@property(nonatomic, assign, setter=setPortraitStyle:) RCUserAvatarStyle portraitStyle;\n\n/*!\n 是否显示用户名称\n */\n@property(nonatomic, readonly) BOOL isDisplayNickname;\n\n/*!\n 显示消息已阅读状态的View\n */\n@property(nonatomic, strong) UIView *messageHasReadStatusView;\n\n/*!\n 显示消息发送成功状态的View\n */\n@property(nonatomic, strong) UIView *messageSendSuccessStatusView;\n\n/*!\n 设置当前消息Cell的数据模型\n \n @param model 消息Cell的数据模型\n */\n- (void)setDataModel:(RCMessageModel *)model;\n\n/*!\n 更新消息发送状态\n \n @param model 消息Cell的数据模型\n */\n- (void)updateStatusContentView:(RCMessageModel *)model;\n\n@end\n#endif"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCMessageCellDelegate.h",
    "content": "//\n//  RCMessageCellDelegate.h\n//  RongIMKit\n//\n//  Created by xugang on 3/14/15.\n//  Copyright (c) 2015 RongCloud. All rights reserved.\n//\n\n#ifndef RongIMKit_RCMessageCellDelegate_h\n#define RongIMKit_RCMessageCellDelegate_h\n#import \"RCMessageModel.h\"\n\n/*!\n 消息Cell点击的回调\n */\n@protocol RCMessageCellDelegate <NSObject>\n@optional\n\n/*!\n 点击Cell内容的回调\n \n @param model 消息Cell的数据模型\n */\n- (void)didTapMessageCell:(RCMessageModel *)model;\n\n/*!\n 点击Cell中URL的回调\n \n @param url   点击的URL\n @param model 消息Cell的数据模型\n \n @discussion 点击Cell中的URL，会调用此回调，不会再触发didTapMessageCell:。\n */\n- (void)didTapUrlInMessageCell:(NSString *)url model:(RCMessageModel *)model;\n\n/*!\n 点击Cell中电话号码的回调\n \n @param phoneNumber 点击的电话号码\n @param model       消息Cell的数据模型\n \n @discussion 点击Cell中的电话号码，会调用此回调，不会再触发didTapMessageCell:。\n */\n- (void)didTapPhoneNumberInMessageCell:(NSString *) phoneNumber model:(RCMessageModel *)model;\n\n/*!\n 点击Cell中用户头像的回调\n \n @param userId 头像对应的用户ID\n */\n- (void)didTapCellPortrait:(NSString *)userId;\n\n/*!\n 长按Cell中用户头像的回调\n \n @param userId 头像对应的用户ID\n */\n- (void)didLongPressCellPortrait:(NSString *)userId;\n\n/*!\n 长按Cell内容的回调\n \n @param model 消息Cell的数据模型\n @param view  长按区域的View\n */\n- (void)didLongTouchMessageCell:(RCMessageModel *)model inView:(UIView *)view;\n\n/*!\n 点击消息发送失败红点的回调\n \n @param model 消息Cell的数据模型\n */\n- (void)didTapmessageFailedStatusViewForResend:(RCMessageModel *)model;\n\n@end\n\n/*!\n 公众服务会话中消息Cell点击的回调\n */\n@protocol RCPublicServiceMessageCellDelegate <NSObject>\n@optional\n\n/*!\n 公众服务会话中，点击Cell内容的回调\n \n @param model 消息Cell的数据模型\n */\n- (void)didTapPublicServiceMessageCell:(RCMessageModel *)model;\n\n/*!\n 公众服务会话中，点击Cell中URL的回调\n \n @param url   点击的URL\n @param model 消息Cell的数据模型\n \n @discussion 点击Cell中的URL，会调用此回调，不会再触发didTapMessageCell:。\n */\n- (void)didTapUrlInPublicServiceMessageCell:(NSString *)url model:(RCMessageModel *)model;\n\n/*!\n 公众服务会话中，点击Cell中电话号码的回调\n \n @param phoneNumber 点击的电话号码\n @param model       消息Cell的数据模型\n \n @discussion 点击Cell中的电话号码，会调用此回调，不会再触发didTapMessageCell:。\n */\n- (void)didTapPhoneNumberInPublicServiceMessageCell:(NSString *) phoneNumber model:(RCMessageModel *)model;\n\n/*!\n 公众服务会话中，长按Cell内容的回调\n \n @param model 消息Cell的数据模型\n @param view  长按区域的View\n */\n- (void)didLongTouchPublicServiceMessageCell:(RCMessageModel *)model inView:(UIView *)view;\n\n/*!\n 公众服务会话中，点击消息发送失败红点的回调\n \n @param model 消息Cell的数据模型\n */\n- (void)didTapPublicServiceMessageFailedStatusViewForResend:(RCMessageModel *)model;\n\n@end\n#endif\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCMessageCellNotificationModel.h",
    "content": "//\n//  RCMessageCellNotificationModel.h\n//  RongIMKit\n//\n//  Created by xugang on 15/1/29.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#ifndef __RCMessageCellNotificationModel\n#define __RCMessageCellNotificationModel\n#import <UIKit/UIKit.h>\n\n// 消息Cell需要更新的状态名\nUIKIT_EXTERN NSString *const CONVERSATION_CELL_STATUS_SEND_BEGIN;\nUIKIT_EXTERN NSString *const CONVERSATION_CELL_STATUS_SEND_FAILED;\nUIKIT_EXTERN NSString *const CONVERSATION_CELL_STATUS_SEND_SUCCESS;\nUIKIT_EXTERN NSString *const CONVERSATION_CELL_STATUS_SEND_PROGRESS;\nUIKIT_EXTERN NSString *const CONVERSATION_CELL_DATA_IMAGE_KEY_UPDATE;\nUIKIT_EXTERN NSString *const CONVERSATION_CELL_STATUS_SEND_HASREAD;\n\n#import <Foundation/Foundation.h>\n\n/*!\n 消息Cell状态更新通知的数据模型\n */\n@interface RCMessageCellNotificationModel : NSObject\n\n/*!\n 消息ID\n */\n@property(nonatomic) long messageId;\n\n/*!\n 更新的状态名\n */\n@property(strong, nonatomic) NSString *actionName;\n\n/*!\n 进度\n */\n@property(nonatomic) NSInteger progress;\n\n@end\n#endif"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCMessageModel.h",
    "content": "//\n//  RongMessageModel.h\n//  RongIMKit\n//\n//  Created by xugang on 15/1/22.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <RongIMLib/RongIMLib.h>\n\n/*!\n 消息Cell的数据模型类\n */\n@interface RCMessageModel : NSObject\n\n/*!\n 是否显示时间\n */\n@property(nonatomic, assign) BOOL isDisplayMessageTime;\n\n/*!\n 是否显示用户名\n */\n@property(nonatomic, assign) BOOL isDisplayNickname;\n\n/*!\n 用户信息\n */\n@property(nonatomic, strong) RCUserInfo *userInfo;\n\n/*!\n 会话类型\n */\n@property(nonatomic, assign) RCConversationType conversationType;\n\n/*!\n 目标会话ID\n */\n@property(nonatomic, strong) NSString *targetId;\n\n/*!\n 消息ID\n */\n@property(nonatomic, assign) long messageId;\n\n/*!\n 消息方向\n */\n@property(nonatomic, assign) RCMessageDirection messageDirection;\n\n/*!\n 发送者的用户ID\n */\n@property(nonatomic, strong) NSString *senderUserId;\n\n/*!\n 消息的接收状态\n */\n@property(nonatomic, assign) RCReceivedStatus receivedStatus;\n\n/*!\n 消息的发送状态\n */\n@property(nonatomic, assign) RCSentStatus sentStatus;\n\n/*!\n 消息的接收时间（Unix时间戳、毫秒）\n */\n@property(nonatomic, assign) long long receivedTime;\n\n/*!\n 消息的发送时间（Unix时间戳、毫秒）\n */\n@property(nonatomic, assign) long long sentTime;\n\n/*!\n 消息的类型名\n */\n@property(nonatomic, strong) NSString *objectName;\n\n/*!\n 消息的内容\n */\n@property(nonatomic, strong) RCMessageContent *content;\n\n/*!\n 消息的附加字段\n */\n@property(nonatomic, strong) NSString *extra;\n\n/*!\n 消息展示时的Cell高度\n \n @discussion 用于大量消息的显示优化\n */\n@property(nonatomic) CGSize cellSize;\n\n/*!\n 初始化消息Cell的数据模型\n \n @param rcMessage   消息实体\n @return            消息Cell的数据模型对象\n */\n- (instancetype)initWithMessage:(RCMessage *)rcMessage;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCPluginBoardView.h",
    "content": "//\n//  RCPluginBoard.h\n//  CollectionViewTest\n//\n//  Created by Liv on 15/3/15.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@protocol RCPluginBoardViewDelegate;\n\n/*!\n 输入扩展功能板的View\n */\n@interface RCPluginBoardView : UICollectionView\n\n/*!\n 当前所有的扩展项\n */\n@property(nonatomic, strong) NSMutableArray *allItems;\n\n/*!\n 扩展功能板的点击回调\n */\n@property(nonatomic, weak) id<RCPluginBoardViewDelegate> pluginBoardDelegate;\n\n/*!\n 向扩展功能板中插入扩展项\n \n @param image 扩展项的展示图片\n @param title 扩展项的展示标题\n @param index 需要添加到的索引值\n @param tag   扩展项的唯一标示符\n \n @discussion 您以在RCConversationViewController的viewdidload后，添加自定义的扩展项。\n SDK默认的扩展项的唯一标示符为1XXX，我们建议您在自定义扩展功能时不要选用1XXX，以免与SDK预留的扩展项唯一标示符重复。\n */\n- (void)insertItemWithImage:(UIImage*)image title:(NSString*)title atIndex:(NSInteger)index tag:(NSInteger)tag;\n\n/*!\n 添加扩展项到扩展功能板，并在显示为最后一项\n \n @param image 扩展项的展示图片\n @param title 扩展项的展示标题\n @param tag   扩展项的唯一标示符\n \n @discussion 您以在RCConversationViewController的viewdidload后，添加自定义的扩展项。\n SDK默认的扩展项的唯一标示符为1XXX，我们建议您在自定义扩展功能时不要选用1XXX，以免与SDK预留的扩展项唯一标示符重复。\n */\n-(void)insertItemWithImage:(UIImage*)image title:(NSString*)title tag:(NSInteger)tag;\n\n/*!\n 更新指定扩展项\n \n @param index 扩展项的索引值\n @param image 扩展项的展示图片\n @param title 扩展项的展示标题\n */\n-(void)updateItemAtIndex:(NSInteger)index image:(UIImage*)image title:(NSString*)title;\n\n/*!\n 更新指定扩展项\n \n @param tag   扩展项的唯一标示符\n @param image 扩展项的展示图片\n @param title 扩展项的展示标题\n */\n-(void)updateItemWithTag:(NSInteger)tag image:(UIImage*)image title:(NSString*)title;\n\n/*!\n 删除扩展功能板中的指定扩展项\n \n @param index 指定扩展项的索引值\n */\n- (void)removeItemAtIndex:(NSInteger)index;\n\n/*!\n 删除扩展功能板中的指定扩展项\n \n @param tag 指定扩展项的唯一标示符\n */\n- (void)removeItemWithTag:(NSInteger)tag;\n\n/*!\n 删除扩展功能板中的所有扩展项\n */\n- (void)removeAllItems;\n@end\n\n/*!\n 扩展功能板的点击回调\n */\n@protocol RCPluginBoardViewDelegate <NSObject>\n\n/*!\n 点击扩展功能板中的扩展项的回调\n \n @param pluginBoardView 当前扩展功能板\n @param tag             点击的扩展项的唯一标示符\n */\n-(void)pluginBoardView:(RCPluginBoardView*)pluginBoardView clickedItemWithTag:(NSInteger)tag;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCPublicServiceChatViewController.h",
    "content": "//\n//  RCPublicServiceChatViewController.h\n//  RongIMKit\n//\n//  Created by litao on 15/6/12.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import \"RCConversationViewController.h\"\n\n/*!\n 公众服务聊天界面的ViewController\n */\n@interface RCPublicServiceChatViewController : RCConversationViewController\n\n/*!\n 点击富文本（图文）消息中URL的回调\n \n @param tapedUrl            点击的URL\n @param rcWebViewController 已包含融云JS鉴权的WebViewController\n \n @discussion SDK在回调中默认会使用WebView打开URL，您可以重写此回调。\n 此回调中的rcWebViewController，已经包含了融云公众账号的JS鉴权，您在重写时可以直接使用此WebView来显示URL。\n */\n- (void)didTapImageTxtMsgCell:(NSString *)tapedUrl webViewController:(UIViewController *)rcWebViewController;\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCPublicServiceListViewController.h",
    "content": "//\n//  RCPublicServiceListViewController.h\n//  RongIMKit\n//\n//  Created by litao on 15/4/20.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n/*!\n 已关注公众服务账号列表的展示ViewController\n */\n@interface RCPublicServiceListViewController : UITableViewController\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCPublicServiceProfileViewController.h",
    "content": "//\n//  RCPublicServiceProfileViewController.h\n//  HelloIos\n//\n//  Created by litao on 15/4/10.\n//  Copyright (c) 2015年 litao. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import <RongIMLib/RongIMLib.h>\n#import \"RCThemeDefine.h\"\n\n/*!\n 公众服务账号信息中的URL点击回调\n */\n@protocol RCPublicServiceProfileViewUrlDelegate\n\n/*!\n 点击公众服务账号信息的URL回调\n \n @param url 点击的URL\n */\n- (void)gotoUrl:(NSString *)url;\n\n@end\n\n/*!\n 公众服务账号信息的ViewController\n */\n@interface RCPublicServiceProfileViewController : UITableViewController\n\n/*!\n 公众服务账号信息\n */\n@property(nonatomic, strong) RCPublicServiceProfile *serviceProfile;\n\n/*!\n 头像显示的形状\n */\n@property(nonatomic) RCUserAvatarStyle portraitStyle;\n\n/*!\n 当前界面的是否源于聊天会话界面\n */\n@property(nonatomic) BOOL fromConversation;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCPublicServiceSearchViewController.h",
    "content": "//\n//  RCPublicServiceSearchViewController.h\n//  RongIMKit\n//\n//  Created by litao on 15/4/21.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n/*!\n 查找公众服务账号的ViewController\n */\n@interface RCPublicServiceSearchViewController : UITableViewController\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCRichContentMessageCell.h",
    "content": "//\n//  RCRichContentMessageCell.h\n//  RongIMKit\n//\n//  Created by xugang on 15/2/2.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#import \"RCMessageCell.h\"\n#import \"RCAttributedLabel.h\"\n\n#define RichContent_Title_Font_Size 16\n#define RichContent_Message_Font_Size 12\n#define RICH_CONTENT_THUMBNAIL_WIDTH 60\n#define RICH_CONTENT_THUMBNAIL_HIGHT 60\n\n/*!\n 富文本（图文）消息Cell\n */\n@interface RCRichContentMessageCell : RCMessageCell\n\n/*!\n 消息的背景View\n */\n@property(nonatomic, strong) UIImageView *bubbleBackgroundView;\n\n/*!\n 图片内容显示的View\n */\n@property(nonatomic, strong) RCloudImageView *richContentImageView;\n\n/*!\n 文本内容显示的Label\n */\n@property(nonatomic, strong) RCAttributedLabel *digestLabel;\n\n/*!\n 标题显示的Label\n */\n@property(nonatomic, strong) RCAttributedLabel *titleLabel;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCSettingViewController.h",
    "content": "//\n//  RCSettingController.h\n//  RongIMKit\n//\n//  Created by Liv on 15/4/20.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import \"RCConversationSettingTableViewController.h\"\n\n/*!\n 清空会话中所有消息的回调\n \n @param isSuccess 是否删除会话中的所有消息\n */\ntypedef void (^clearHistory)(BOOL isSuccess);\n\n/*!\n 会话设置的ViewController\n */\n@interface RCSettingViewController : RCConversationSettingTableViewController\n\n/*!\n当前会话的目标会话ID\n*/\n@property(nonatomic, copy) NSString *targetId;\n\n/*!\n 当前会话的会话类型\n */\n@property(nonatomic, assign) RCConversationType conversationType;\n\n/*!\n 清空会话中所有消息的回调\n \n @discussion 在清空消息的的回调中,您需要调用聊天界面的reloadData进行刷新。\n */\n@property(nonatomic, copy) clearHistory clearHistoryCompletion;\n\n/*!\n 默认的Cell\n \n @discussion 内置置顶聊天、新消息通、清除消息记录三个cell\n */\n@property(nonatomic, readonly, strong) NSArray *defaultCells;\n\n/*!\n 清空会话中所有消息的ActionSheet\n */\n@property(nonatomic, readonly, strong) UIActionSheet *clearMsgHistoryActionSheet;\n\n/*!\n 清空会话中所有消息\n */\n- (void)clearHistoryMessage;\n\n/*!\n 点击Item（用户头像或加减号）的回调\n \n @param settingTableViewHeader  当前会话设置界面\n @param indexPathOfSelectedItem 点击的Item索引值\n @param users                   当前的用户信息RCUserInfo列表\n */\n- (void)settingTableViewHeader:(RCConversationSettingTableViewHeader *)settingTableViewHeader\n       indexPathOfSelectedItem:(NSIndexPath *)indexPathOfSelectedItem\n            allTheSeletedUsers:(NSArray *)users;\n\n/*!\n 点击删除用户的回调\n \n @param indexPath 当前删除的用户的头像索引值\n \n @discussion 点击头像左上角的删除按钮时的回调。\n */\n- (void)deleteTipButtonClicked:(NSIndexPath *)indexPath;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCTextMessageCell.h",
    "content": "//\n//  RCTextMessageCell.h\n//  RongIMKit\n//\n//  Created by xugang on 15/2/2.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#import \"RCMessageCell.h\"\n#import \"RCAttributedLabel.h\"\n\n#define Text_Message_Font_Size 16\n\n/*!\n 文本消息Cell\n */\n@interface RCTextMessageCell : RCMessageCell<RCAttributedLabelDelegate>\n\n/*!\n 显示消息内容的Label\n */\n@property(strong, nonatomic) RCAttributedLabel *textLabel;\n\n/*!\n 消息的背景View\n */\n@property(nonatomic, strong) UIImageView *bubbleBackgroundView;\n\n/*!\n 设置当前消息Cell的数据模型\n \n @param model 消息Cell的数据模型\n */\n- (void)setDataModel:(RCMessageModel *)model;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCTextView.h",
    "content": "//\n//  RCTextView.h\n//  iOS-IMKit\n//\n//  Created by Liv on 14/10/30.\n//  Copyright (c) 2014年 RongCloud. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n/*!\n 文本输入框的View\n */\n@interface RCTextView : UITextView\n\n/*!\n 是否关闭菜单\n \n @discussion 默认值为NO。\n */\n@property(nonatomic, assign) BOOL disableActionMenu;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCThemeDefine.h",
    "content": "//\n//  RCThemeDefine.h\n//  iOS-IMKit\n//\n//  Created by xugang on 14-9-19.\n//  Copyright (c) 2014年 Heq.Shinoda. All rights reserved.\n//\n\n#ifndef iOS_IMKit_RCThemeDefine_h\n#define iOS_IMKit_RCThemeDefine_h\n\n/*!\n 头像显示的形状\n */\ntypedef NS_ENUM(NSInteger, RCUserAvatarStyle) {\n    /*!\n     矩形\n     */\n    RC_USER_AVATAR_RECTANGLE = 0,\n    /*!\n     圆形\n     */\n    RC_USER_AVATAR_CYCLE\n};\n\n#endif\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCTipLabel.h",
    "content": "//\n//  RCMessageTipLabel.h\n//  iOS-IMKit\n//\n//  Created by Gang Li on 10/27/14.\n//  Copyright (c) 2014 RongCloud. All rights reserved.\n//\n\n#ifndef __RCTipLabel\n#define __RCTipLabel\n#import <UIKit/UIKit.h>\n#import \"RCAttributedLabel.h\"\n\n/*!\n 灰条提示Label\n */\n@interface RCTipLabel : RCAttributedLabel\n\n/*!\n 边缘间隙\n */\n@property(nonatomic, assign) UIEdgeInsets marginInsets;\n\n/*!\n 初始化灰条提示Label对象\n \n @return 灰条提示Label对象\n */\n+ (instancetype)greyTipLabel;\n\n@end\n#endif"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCTipMessageCell.h",
    "content": "//\n//  RCTipMessageCell.h\n//  RongIMKit\n//\n//  Created by xugang on 15/1/29.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#import \"RCMessageBaseCell.h\"\n\n/*!\n 提示消息Cell\n */\n@interface RCTipMessageCell : RCMessageBaseCell\n\n/*!\n 提示的Label\n */\n@property(strong, nonatomic) RCTipLabel *tipMessageLabel;\n\n/*!\n 设置当前消息Cell的数据模型\n \n @param model 消息Cell的数据模型\n */\n- (void)setDataModel:(RCMessageModel *)model;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCUnknownMessageCell.h",
    "content": "//\n//  RCUnknownMessageCell.h\n//  RongIMKit\n//\n//  Created by xugang on 3/31/15.\n//  Copyright (c) 2015 RongCloud. All rights reserved.\n//\n\n#ifndef __RCUnknownMessageCell\n#define __RCUnknownMessageCell\n\n#import <RongIMKit/RongIMKit.h>\n\n/*!\n 未知消息Cell\n */\n@interface RCUnknownMessageCell : RCMessageBaseCell\n\n/*!\n 提示的Label\n */\n@property(strong, nonatomic) RCTipLabel *messageLabel;\n\n/*!\n 设置当前消息Cell的数据模型\n \n @param model 消息Cell的数据模型\n */\n- (void)setDataModel:(RCMessageModel *)model;\n\n@end\n#endif"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RCVoiceMessageCell.h",
    "content": "//\n//  RCVoiceMessageCell.h\n//  RongIMKit\n//\n//  Created by xugang on 15/2/2.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#import \"RCMessageCell.h\"\n\n#define kAudioBubbleMinWidth 70\n#define kAudioBubbleMaxWidth 180\n#define kBubbleBackgroundViewHeight 36\n\n/*!\n 语音消息播放停止的Notification\n */\nUIKIT_EXTERN NSString *const kNotificationStopVoicePlayer;\n\n/*!\n 语音消息Cell\n */\n@interface RCVoiceMessageCell : RCMessageCell\n\n/*!\n 消息的背景View\n */\n@property(nonatomic, strong) UIImageView *bubbleBackgroundView;\n\n/*!\n 语音播放的View\n */\n@property(nonatomic, strong) UIImageView *playVoiceView;\n\n/*!\n 显示是否已播放的View\n */\n@property(nonatomic, strong) UIImageView *voiceUnreadTagView;\n\n/*!\n 显示语音时长的Label\n */\n@property(nonatomic, strong) UILabel *voiceDurationLabel;\n\n/*!\n 播放语音\n */\n- (void)playVoice;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMKit.framework/Headers/RongIMKit.h",
    "content": "//\n//  RongIMKit.h\n//  RongIMKit\n//\n//  Created by xugang on 15/1/13.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n//! Project version number for RongIMKit.\nFOUNDATION_EXPORT double RongIMKitVersionNumber;\n\n//! Project version string for RongIMKit.\nFOUNDATION_EXPORT const unsigned char RongIMKitVersionString[];\n\n/// IMKit核心类\n#import <RongIMKit/RCIM.h>\n/// 会话列表相关类\n#import <RongIMKit/RCConversationListViewController.h>\n#import <RongIMKit/RCPublicServiceListViewController.h>\n/// 聊天界面相关类\n#import <RongIMKit/RCConversationViewController.h>\n#import <RongIMKit/RCPublicServiceSearchViewController.h>\n#import <RongIMKit/RCPublicServiceChatViewController.h>\n#import <RongIMKit/RCImagePreviewController.h>\n#import <RongIMKit/RCLocationPickerViewController.h>\n/// 会话列表Cell相关类\n#import <RongIMKit/RCConversationBaseCell.h>\n#import <RongIMKit/RCConversationCell.h>\n#import <RongIMKit/RCConversationModel.h>\n/// 消息Cell相关类\n#import <RongIMKit/RCMessageBaseCell.h>\n#import <RongIMKit/RCMessageCell.h>\n#import <RongIMKit/RCTipMessageCell.h>\n#import <RongIMKit/RCUnknownMessageCell.h>\n#import <RongIMKit/RCVoiceMessageCell.h>\n#import <RongIMKit/RCRichContentMessageCell.h>\n#import <RongIMKit/RCImageMessageCell.h>\n#import <RongIMKit/RCLocationMessageCell.h>\n#import <RongIMKit/RCTextMessageCell.h>\n#import <RongIMKit/RCMessageCellDelegate.h>\n#import <RongIMKit/RCMessageModel.h>\n#import <RongIMKit/RCMessageCellNotificationModel.h>\n#import <RongIMKit/RCImageMessageProgressView.h>\n/// 工具类\n#import <RongIMKit/RCKitUtility.h>\n#import <RongIMKit/RCThemeDefine.h>\n/// 其他\n#import <RongIMKit/RCBaseViewController.h>\n#import <RongIMKit/RCTextView.h>\n#import <RongIMKit/RCContentView.h>\n#import <RongIMKit/RCAttributedLabel.h>\n#import <RongIMKit/RCTipLabel.h>\n#import <RongIMKit/RCMessageBubbleTipView.h>\n#import <RongIMKit/RCSettingViewController.h>\n#import <RongIMKit/RCConversationSettingTableViewHeader.h>\n#import <RongIMKit/RCPublicServiceProfileViewController.h>\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCAMRDataConverter.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCAmrDataConverter.h\n//  Created by Heq.Shinoda on 14-6-17.\n\n#ifndef __RCAmrDataConverter\n#define __RCAmrDataConverter\n\n#import <Foundation/Foundation.h>\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include \"interf_dec.h\"\n#include \"interf_enc.h\"\n\n/*!\n AMR格式与WAV格式音频转换工具类\n */\n@interface RCAMRDataConverter : NSObject\n\n/*!\n 获取AMR格式与WAV格式音频转换工具类单例\n \n @return AMR格式与WAV格式音频转换工具类单例\n */\n+ (RCAMRDataConverter *)sharedAMRDataConverter;\n\n/*!\n 将AMR格式的音频数据转化为WAV格式的音频数据\n \n @param data    AMR格式的音频数据，必须是AMR-NB的格式\n @return        WAV格式的音频数据\n */\n- (NSData *)decodeAMRToWAVE:(NSData *)data;\n\n/*!\n 将WAV格式的音频数据转化为AMR格式的音频数据（8KHz采样）\n \n @param data            WAV格式的音频数据\n @param nChannels       声道数\n @param nBitsPerSample  采样位数（精度）\n @return                AMR-NB格式的音频数据\n \n @discussion 此方法为工具类方法，您可以使用此方法将任意WAV音频转换为AMR-NB格式的音频。\n \n @warning 如果您想和SDK自带的语音消息保持一致和互通，考虑到跨平台和传输的原因，SDK对于WAV音频有所限制.\n 具体可以参考RCVoiceMessage中的音频参数说明(nChannels为1，nBitsPerSample为16)。\n */\n- (NSData *)encodeWAVEToAMR:(NSData *)data\n                   channel:(int)nChannels\n            nBitsPerSample:(int)nBitsPerSample;\n@end\n\n#endif"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCChatRoomInfo.h",
    "content": "//\n//  RCChatRoomInfo.h\n//  RongIMLib\n//\n//  Created by 岑裕 on 16/1/11.\n//  Copyright © 2016年 RongCloud. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import \"RCStatusDefine.h\"\n\n/*!\n 聊天室信息类\n */\n@interface RCChatRoomInfo : NSObject\n\n/*!\n 聊天室ID\n */\n@property(nonatomic, strong) NSString *targetId;\n\n/*!\n 包含的成员信息类型\n */\n@property(nonatomic, assign) RCChatRoomMemberOrder memberOrder;\n\n/*!\n 聊天室中的部分成员信息RCChatRoomMemberInfo列表\n \n @discussion 如果成员类型为RC_ChatRoom_Member_Asc，则为最早加入的成员列表，按成员加入时间升序排列；\n 如果成员类型为RC_ChatRoom_Member_Desc，则为最晚加入的成员列表，按成员加入时间升序排列。\n */\n@property(nonatomic, strong) NSArray *memberInfoArray;\n\n/*!\n 当前聊天室的成员总数\n */\n@property(nonatomic, assign) int totalMemberCount;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCChatRoomMemberInfo.h",
    "content": "//\n//  RCChatRoomMemberInfo.h\n//  RongIMLib\n//\n//  Created by 岑裕 on 16/1/10.\n//  Copyright © 2016年 RongCloud. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n/*!\n 聊天室成员信息类\n */\n@interface RCChatRoomMemberInfo : NSObject\n\n/*!\n 用户ID\n */\n@property(nonatomic, strong) NSString *userId;\n\n/*!\n 加入时间（Unix时间戳，毫秒）\n */\n@property(nonatomic,assign) long long joinTime;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCCommandMessage.h",
    "content": "//\n//  RCCommandMessage.h\n//  RongIMLib\n//\n//  Created by 张改红 on 15/12/2.\n//  Copyright © 2015年 RongCloud. All rights reserved.\n//\n#import \"RCMessageContent.h\"\n\n/*!\n 命令消息的类型名\n */\n#define RCCommandMessageIdentifier @\"RC:CmdMsg\"\n\n/*!\n 命令消息类\n \n @discussion 命令消息类，此消息不存储不计入未读消息数。\n 与RCCommandNotificationMessage的区别是，此消息不存储，也不会在界面上显示。\n */\n@interface RCCommandMessage : RCMessageContent\n\n/*!\n命令的名称\n*/\n@property(nonatomic, strong) NSString *name;\n\n/*!\n 命令的扩展数据\n \n @discussion 命令的扩展数据，可以为任意字符串，如存放您定义的json数据。\n */\n@property(nonatomic, strong) NSString *data;\n\n/*!\n 初始化命令消息\n \n @param name    命令的名称\n @param data    命令的扩展数据\n @return        命令消息对象\n */\n+ (instancetype)messageWithName:(NSString *)name\n                           data:(NSString *)data;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCCommandNotificationMessage.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCCommandNotificationMessage.h\n//  Created by xugang on 14/11/28.\n\n#import \"RCMessageContent.h\"\n\n/*!\n 命令提醒消息的类型名\n */\n#define RCCommandNotificationMessageIdentifier @\"RC:CmdNtf\"\n\n/*!\n 命令提醒消息类\n \n @discussion 命令消息类，此消息会进行存储，但不计入未读消息数。\n 与RCCommandMessage的区别是，此消息会进行存储并在界面上显示。\n */\n@interface RCCommandNotificationMessage : RCMessageContent\n\n/*!\n 命令提醒的名称\n */\n@property(nonatomic, strong) NSString *name;\n\n/*!\n 命令提醒消息的扩展数据\n \n @discussion 命令提醒消息的扩展数据，可以为任意字符串，如存放您定义的json数据。\n */\n@property(nonatomic, strong) NSString *data;\n\n/*!\n 初始化命令提醒消息\n \n @param name    命令的名称\n @param data    命令的扩展数据\n @return        命令提醒消息对象\n */\n+ (instancetype)notificationWithName:(NSString *)name\n                                data:(NSString *)data;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCContactNotificationMessage.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCContactNotificationMessage.h\n//  Created by xugang on 14/11/28.\n\n#import \"RCMessageContent.h\"\n\n/*!\n 好友请求消息的类型名\n */\n#define RCContactNotificationMessageIdentifier @\"RC:ContactNtf\"\n\n/*!\n 请求添加好友\n */\n#define ContactNotificationMessage_ContactOperationRequest @\"Request\"\n/*!\n 同意添加好友的请求\n */\n#define ContactNotificationMessage_ContactOperationAcceptResponse @\"AcceptResponse\"\n/*!\n 拒绝添加好友的请求\n */\n#define ContactNotificationMessage_ContactOperationRejectResponse @\"RejectResponse\"\n\n/*!\n 好友请求消息类\n \n @discussion 好友请求消息类，此消息会进行存储，但不计入未读消息数。\n */\n@interface RCContactNotificationMessage : RCMessageContent <NSCoding>\n\n/*!\n 好友请求的当前操作名\n \n @discussion 好友请求当前的操作名称，您可以使用预定义好的操作名，也可以是您自己定义的任何操作名。\n 预定义的操作名：ContactNotificationMessage_ContactOperationRequest、ContactNotificationMessage_ContactOperationAcceptResponse、ContactNotificationMessage_ContactOperationRejectResponse。\n */\n@property(nonatomic, strong) NSString *operation;\n\n/*!\n 当前操作发起用户的用户ID\n */\n@property(nonatomic, strong) NSString *sourceUserId;\n\n/*!\n 当前操作目标用户的用户ID\n */\n@property(nonatomic, strong) NSString *targetUserId;\n\n/*!\n 当前操作的消息内容\n \n @discussion 当前操作的消息内容，如同意、拒绝的理由等。\n */\n@property(nonatomic, strong) NSString *message;\n\n/*!\n 当前操作的附加信息\n */\n@property(nonatomic, strong) NSString *extra;\n\n/*!\n 初始化好友请求消息\n \n @param operation       好友请求当前的操作名\n @param sourceUserId    当前操作发起用户的用户ID\n @param targetUserId    当前操作目标用户的用户ID\n @param message         当前操作的消息内容\n @param extra           当前操作的附加信息\n @return                好友请求消息对象\n \n @discussion 融云不介入您的好友关系，所有的好友关系都由您的服务器自己维护。\n 所以好友请求的操作名和消息内容、扩展信息您均可以自己定制，只要您发送方和接收方针对具体字段内容做好UI显示即可。\n */\n+ (instancetype)notificationWithOperation:(NSString *)operation\n                             sourceUserId:(NSString *)sourceUserId\n                             targetUserId:(NSString *)targetUserId\n                                  message:(NSString *)message\n                                    extra:(NSString *)extra;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCConversation.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCConversation.h\n//  Created by Heq.Shinoda on 14-6-13.\n\n#import <Foundation/Foundation.h>\n#import \"RCMessageContent.h\"\n\n/*!\n 会话类\n \n @discussion 会话类，包含会话的所有属性。\n */\n@interface RCConversation : NSObject <NSCoding>\n\n/*!\n 会话类型\n */\n@property(nonatomic, assign) RCConversationType conversationType;\n\n/*!\n 目标会话ID\n */\n@property(nonatomic, strong) NSString *targetId;\n\n/*!\n 会话的标题\n */\n@property(nonatomic, strong) NSString *conversationTitle;\n\n/*!\n 会话中的未读消息数量\n */\n@property(nonatomic, assign) int unreadMessageCount;\n\n/*!\n 是否置顶，默认值为NO\n \n @discussion 如果设置了置顶，在IMKit的RCConversationListViewController中会将此会话置顶显示。\n */\n@property(nonatomic, assign) BOOL isTop;\n\n/*!\n 会话中最后一条消息的接收状态\n */\n@property(nonatomic, assign) RCReceivedStatus receivedStatus;\n\n/*!\n 会话中最后一条消息的发送状态\n */\n@property(nonatomic, assign) RCSentStatus sentStatus;\n\n/*!\n 会话中最后一条消息的接收时间（Unix时间戳、毫秒）\n */\n@property(nonatomic, assign) long long receivedTime;\n\n/*!\n 会话中最后一条消息的发送时间（Unix时间戳、毫秒）\n */\n@property(nonatomic, assign) long long sentTime;\n\n/*!\n 会话中存在的草稿\n */\n@property(nonatomic, strong) NSString *draft;\n\n/*!\n 会话中最后一条消息的类型名\n */\n@property(nonatomic, strong) NSString *objectName;\n\n/*!\n 会话中最后一条消息的发送者用户ID\n */\n@property(nonatomic, strong) NSString *senderUserId;\n\n/*!\n 会话中最后一条消息的发送者的用户名（已废弃，请勿使用）\n \n @warning **已废弃，请勿使用。**\n */\n@property(nonatomic, strong) __deprecated_msg(\"已废弃，请勿使用。\") NSString *senderUserName;\n\n/*!\n 会话中最后一条消息的消息ID\n */\n@property(nonatomic, assign) long lastestMessageId;\n\n/*!\n 会话中最后一条消息的内容\n */\n@property(nonatomic, strong) RCMessageContent *lastestMessage;\n\n/*!\n 会话中最后一条消息的json Dictionary\n */\n@property(nonatomic, strong) NSDictionary *jsonDict;\n\n/*!\n 最后一条消息的全局唯一ID\n \n @discussion 服务器消息唯一ID（在同一个Appkey下全局唯一）\n */\n@property(nonatomic, strong) NSString *lastestMessageUId;\n\n/*!\n RCConversation初始化方法（已废弃，请勿使用）\n \n @param json    会话的json Dictionary\n @return        会话对象\n \n @warning **已废弃，请勿使用。**\n */\n+ (instancetype)conversationWithProperties:(NSDictionary *)json\n__deprecated_msg(\"已废弃，请勿使用。\");\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCDiscussion.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCDiscussion.h\n//  Created by Heq.Shinoda on 14-6-23.\n\n#ifndef __RCDiscussion\n#define __RCDiscussion\n\n#import <Foundation/Foundation.h>\n\n/*!\n 讨论组类\n */\n@interface RCDiscussion : NSObject\n\n/*!\n 讨论组ID\n */\n@property(nonatomic, strong) NSString *discussionId;\n\n/*!\n 讨论组名称\n */\n@property(nonatomic, strong) NSString *discussionName;\n\n/*!\n 讨论组的创建者的用户ID\n */\n@property(nonatomic, strong) NSString *creatorId;\n\n/*!\n 讨论组成员的用户ID列表\n */\n@property(nonatomic, strong) NSArray *memberIdList;\n\n/*!\n 讨论组是否开放加人权限\n \n @discussion 是否允许非创建者添加用户，0表示允许，1表示不允许，默认值为0。\n */\n@property(nonatomic, assign) int inviteStatus;\n\n/*!\n 讨论组的会话类型（已废弃，请勿使用）\n \n @warning **已废弃，请勿使用。**\n */\n@property(nonatomic, assign) __deprecated_msg(\"已废弃，请勿使用。\") int conversationType;\n\n/*!\n 讨论组是否允许消息提醒（已废弃，请勿使用）\n \n @warning **已废弃，请勿使用。**\n */\n@property(nonatomic, assign) __deprecated_msg(\"已废弃，请勿使用。\") int pushMessageNotificationStatus;\n\n/*!\n 讨论组初始化方法\n \n @param discussionId                    讨论组ID\n @param discussionName                  讨论组名称\n @param creatorId                       创建者的用户ID\n @param conversationType                会话类型\n @param memberIdList                    讨论组成员的用户ID列表\n @param inviteStatus                    是否开放加人权限\n @param pushMessageNotificationStatus   是否允许消息提醒\n @return                                讨论组对象\n */\n- (instancetype)initWithDiscussionId:(NSString *)discussionId\n                      discussionName:(NSString *)discussionName\n                           creatorId:(NSString *)creatorId\n                    conversationType:(int)conversationType\n                        memberIdList:(NSArray *)memberIdList\n                        inviteStatus:(int)inviteStatus\n               msgNotificationStatus:(int)pushMessageNotificationStatus;\n\n@end\n#endif\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCDiscussionNotificationMessage.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCDiscussionNotification.h\n//  Created by Heq.Shinoda on 14-6-26.\n\n#import \"RCMessageContent.h\"\n\n/*!\n 讨论组通知消息的类型名\n */\n#define RCDiscussionNotificationTypeIdentifier @\"RC:DizNtf\"\n\n/*!\n 讨论组通知的类型\n */\ntypedef NS_ENUM(NSInteger, RCDiscussionNotificationType) {\n    /*!\n     有成员加入讨论组的通知\n     */\n    RCInviteDiscussionNotification = 1,\n    /*!\n     有成员退出讨论组的通知\n     */\n    RCQuitDiscussionNotification,\n    /*!\n     讨论组名称发生变更的通知\n     */\n    RCRenameDiscussionTitleNotification,\n    /*!\n     有成员被踢出讨论组的通知\n     */\n    RCRemoveDiscussionMemberNotification,\n    /*!\n     讨论组加入权限的变更\n     */\n    RCSwichInvitationAccessNotification\n};\n\n/*!\n 讨论组通知消息类\n \n @discussion 讨论组通知消息类，此消息会进行存储，但不计入未读消息数。\n */\n@interface RCDiscussionNotificationMessage : RCMessageContent <NSCoding>\n\n/*!\n 讨论组通知的类型\n */\n@property(nonatomic, assign) RCDiscussionNotificationType type;\n\n/*!\n 操作者的用户ID\n */\n@property(nonatomic, strong) NSString *operatorId;\n\n/*!\n 讨论组通知的扩展信息\n */\n@property(nonatomic, strong) NSString *extension;\n\n/*!\n 初始化讨论组通知消息\n \n @param type        讨论组通知的扩展信息\n @param operatorId  操作者的用户ID\n @param extension   讨论组通知的扩展信息\n @return            讨论组通知对象\n */\n+ (instancetype)notificationWithType:(RCDiscussionNotificationType)type\n                            operator:(NSString *)operatorId\n                           extension:(NSString *)extension;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCGroup.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCGroup.h\n//  Created by Heq.Shinoda on 14-9-6.\n\n#import <Foundation/Foundation.h>\n\n/*!\n 群组信息类\n */\n@interface RCGroup : NSObject <NSCoding>\n\n/*!\n 群组ID\n */\n@property(nonatomic, strong) NSString *groupId;\n\n/*!\n 群组名称\n */\n@property(nonatomic, strong) NSString *groupName;\n\n/*!\n 群组头像的URL\n */\n@property(nonatomic, strong) NSString *portraitUri;\n\n/*!\n 群组信息的初始化方法\n \n @param groupId         群组ID\n @param groupName       群组名称\n @param portraitUri     群组头像的URL\n @return                群组信息对象\n */\n- (instancetype)initWithGroupId:(NSString *)groupId\n                      groupName:(NSString *)groupName\n                    portraitUri:(NSString *)portraitUri;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCGroupNotificationMessage.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCGroupNotification.h\n//  Created by xugang on 14/11/24.\n\n#import \"RCMessageContent.h\"\n\n/*!\n 群组通知消息的类型名\n */\n#define RCGroupNotificationMessageIdentifier @\"RC:GrpNtf\"\n\n/*!\n 有成员加入群组的通知\n */\n#define GroupNotificationMessage_GroupOperationAdd @\"Add\"\n/*!\n 有成员退出群组的通知\n */\n#define GroupNotificationMessage_GroupOperationQuit @\"Quit\"\n/*!\n 有成员被踢出群组的通知\n */\n#define GroupNotificationMessage_GroupOperationKicked @\"Kicked\"\n/*!\n 群组名称发生变更的通知\n */\n#define GroupNotificationMessage_GroupOperationRename @\"Rename\"\n/*!\n 群组公告发生变更的通知\n */\n#define GroupNotificationMessage_GroupOperationBulletin @\"Bulletin\"\n\n/*!\n 群组通知消息类\n \n @discussion 群组通知消息类，此消息会进行存储，但不计入未读消息数。\n */\n@interface RCGroupNotificationMessage : RCMessageContent\n\n/*!\n 群组通知的当前操作名\n \n @discussion 群组通知的当前操作名称，您可以使用预定义好的操作名，也可以是您自己定义的任何操作名。\n 预定义的操作名：GroupNotificationMessage_GroupOperationAdd、GroupNotificationMessage_GroupOperationQuit、GroupNotificationMessage_GroupOperationKicked、GroupNotificationMessage_GroupOperationRename、GroupNotificationMessage_GroupOperationBulletin。\n */\n@property(nonatomic, strong) NSString *operation;\n\n/*!\n 当前操作发起用户的用户ID\n */\n@property(nonatomic, strong) NSString *operatorUserId;\n\n/*!\n 当前操作的目标对象\n \n @discussion 当前操作的目标对象，如被当前操作目标用户的用户ID或变更后的群主名称等。\n */\n@property(nonatomic, strong) NSString *data;\n\n/*!\n 当前操作的消息内容\n */\n@property(nonatomic, strong) NSString *message;\n\n/*!\n 当前操作的附加信息\n */\n@property(nonatomic, strong) NSString *extra;\n\n/*!\n 初始化群组通知消息\n \n @param operation       群组通知的当前操作名\n @param operatorUserId  当前操作发起用户的用户ID\n @param data            当前操作的目标对象\n @param message         当前操作的消息内容\n @param extra           当前操作的附加信息\n @return                群组通知消息对象\n \n @discussion 群组关系有开发者文虎，所有的群组操作都由您的服务器自己管理和维护。\n 所以群组通知的操作名和目标对象、消息内容、扩展信息您均可以自己定制，只要您发送方和接收方针对具体字段内容做好UI显示即可。\n */\n+ (instancetype)notificationWithOperation:(NSString *)operation\n                           operatorUserId:(NSString *)operatorUserId\n                                     data:(NSString *)data\n                                  message:(NSString *)message\n                                    extra:(NSString *)extra;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCHandShakeMessage.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCHandShakeMessage.h\n//  Created by Heq.Shinoda on 14-6-30.\n\n#import \"RCMessageContent.h\"\n\n/*!\n 客服握手消息的类型名\n */\n#define RCHandShakeMessageTypeIdentifier @\"RC:HsMsg\"\n\n/*!\n 客服握手消息类\n \n @discussion 客服握手消息类，此消息不存储不计入未读消息数。\n 给客服发送消息之前，可以向客服发送一条此消息，客服服务器即可获取当前的用户ID或用户信息。\n */\n@interface RCHandShakeMessage : RCMessageContent <RCMessageCoding, RCMessagePersistentCompatible>\n\n/*!\n 初始化客服握手消息\n \n @return 客服握手消息的对象\n */\n- (instancetype)init;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCIMClient.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RongIMClient.h\n//  Created by xugang on 14/12/23.\n\n#ifndef __RongIMClient\n#define __RongIMClient\n#import <UIKit/UIKit.h>\n#import <Foundation/Foundation.h>\n\n#import \"RCStatusDefine.h\"\n#import \"RCMessage.h\"\n#import \"RCUserInfo.h\"\n#import \"RCPublicServiceProfile.h\"\n#import \"RCWatchKitStatusDelegate.h\"\n#import \"RCUploadImageStatusListener.h\"\n#import \"RCConversation.h\"\n#import \"RCDiscussion.h\"\n#import \"RCChatRoomInfo.h\"\n\n\n#pragma mark - 消息接收监听器\n\n/*!\n IMlib消息接收的监听器\n \n @discussion 设置IMLib的消息接收监听器请参考RCIMClient的setReceiveMessageDelegate:object:方法。\n \n @warning 如果您使用IMlib，可以设置并实现此Delegate监听消息接收；\n 如果您使用IMKit，请使用RCIM中的RCIMReceiveMessageDelegate监听消息接收，而不要使用此监听器，否则会导致IMKit中无法自动更新UI！\n */\n@protocol RCIMClientReceiveMessageDelegate <NSObject>\n\n/*!\n 接收消息的回调方法\n \n @param message     当前接收到的消息\n @param nLeft       还剩余的未接收的消息数，left>=0\n @param object      消息监听设置的key值\n \n @discussion 如果您设置了IMlib消息监听之后，SDK在接收到消息时候会执行此方法。\n 其中，left为还剩余的、还未接收的消息数量。比如刚上线一口气收到多条消息时，通过此方法，您可以获取到每条消息，left会依次递减直到0。\n 您可以根据left数量来优化您的App体验和性能，比如收到大量消息时等待left为0再刷新UI。\n object为您在设置消息接收监听时的key值。\n */\n- (void)onReceived:(RCMessage *)message\n              left:(int)nLeft\n            object:(id)object;\n\n@end\n\n#pragma mark - 连接状态监听器\n\n/*!\n IMLib连接状态的的监听器\n \n @discussion 设置IMLib的连接状态监听器，请参考RCIMClient的setRCConnectionStatusChangeDelegate:方法。\n \n @warning 如果您使用IMLib，可以设置并实现此Delegate监听消息接收；\n 如果您使用IMKit，请使用RCIM中的RCIMConnectionStatusDelegate监听消息接收，而不要使用此监听器，否则会导致IMKit中无法自动更新UI！\n */\n@protocol RCConnectionStatusChangeDelegate <NSObject>\n\n/*!\n IMLib连接状态的的监听器\n \n @param status  SDK与融云服务器的连接状态\n \n @discussion 如果您设置了IMLib消息监听之后，当SDK与融云服务器的连接状态发生变化时，会回调此方法。\n */\n- (void)onConnectionStatusChanged:(RCConnectionStatus)status;\n\n@end\n\n#pragma mark - 输入状态监听器\n\n/*!\n IMLib输入状态的的监听器\n \n @discussion 设置IMLib的输入状态监听器，请参考RCIMClient的setRCTypingStatusDelegate:方法。\n \n @warning 如果您使用IMLib，可以设置并实现此Delegate监听消息接收；\n 如果您使用IMKit，请直接设置RCIM中的enableSendComposingStatus，而不要使用此监听器，否则会导致IMKit中无法自动更新UI！\n */\n@protocol RCTypingStatusDelegate <NSObject>\n\n/*!\n 用户输入状态变化的回调\n \n @param conversationType        会话类型\n @param targetId                会话目标ID\n @param userTypingStatusList    正在输入的RCUserTypingStatus列表（nil标示当前没有用户正在输入）\n \n @discussion 当客户端收到用户输入状态的变化时，会回调此接口，通知发生变化的会话以及当前正在输入的RCUserTypingStatus列表。\n \n @warning 目前仅支持单聊。\n */\n- (void)onTypingStatusChanged:(RCConversationType)conversationType\n                     targetId:(NSString *)targetId\n                       status:(NSArray *)userTypingStatusList;\n\n@end\n\n#pragma mark - IMLib核心类\n\n/*!\n 融云IMLib核心类\n \n @discussion 您需要通过sharedRCIMClient方法，获取单例对象。\n */\n@interface RCIMClient : NSObject\n\n/*!\n 获取融云通讯能力库IMLib的核心类单例\n \n @return 融云通讯能力库IMLib的核心类单例\n \n @discussion 您可以通过此方法，获取IMLib的单例，访问对象中的属性和方法.\n */\n+ (instancetype)sharedRCIMClient;\n\n#pragma mark - SDK初始化\n\n/*!\n 初始化融云SDK\n \n @param appKey  从融云开发者平台创建应用后获取到的App Key\n \n @discussion 您在使用融云SDK所有功能(包括显示SDK中或者继承于SDK的View)之前，您必须先调用此方法初始化SDK。\n 在App整个生命周期中，您只需要执行一次初始化。\n \n @warning 如果您使用IMLib，请使用此方法初始化SDK；\n 如果您使用IMKit，请使用RCIM中的initWithAppKey:方法初始化，而不要使用此方法。\n \n **升级说明:**\n **从2.4.1版本开始，为了兼容Swift的风格与便于使用，将此方法升级为initWithAppKey:方法，方法的功能和使用均不变。**\n */\n- (void)init:(NSString *)appKey;\n\n/*!\n 初始化融云SDK\n \n @param appKey  从融云开发者平台创建应用后获取到的App Key\n \n @discussion 您在使用融云SDK所有功能（包括显示SDK中或者继承于SDK的View）之前，您必须先调用此方法初始化SDK。\n 在App整个生命周期中，您只需要执行一次初始化。\n \n **升级说明:**\n **从2.4.1版本开始，为了兼容Swift的风格与便于使用，将原有的init:方法升级为此方法，方法的功能和使用均不变。**\n \n @warning 如果您使用IMLib，请使用此方法初始化SDK；\n 如果您使用IMKit，请使用RCIM中的同名方法初始化，而不要使用此方法。\n */\n- (void)initWithAppKey:(NSString *)appKey;\n\n/*!\n 设置deviceToken，用于远程推送\n \n @param deviceToken     从系统获取到的设备号deviceToken(需要去掉空格和尖括号)\n \n @discussion deviceToken是系统提供的，从苹果服务器获取的，用于APNs远程推送必须使用的设备唯一值。\n 您需要将-application:didRegisterForRemoteNotificationsWithDeviceToken:获取到的deviceToken，转为NSString类型，并去掉其中的空格和尖括号，作为参数传入此方法。\n \n 如:\n\n    - (void)application:(UIApplication *)application\n    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {\n        NSString *token = [deviceToken description];\n        token = [token stringByReplacingOccurrencesOfString:@\"<\" withString:@\"\"];\n        token = [token stringByReplacingOccurrencesOfString:@\">\" withString:@\"\"];\n        token = [token stringByReplacingOccurrencesOfString:@\" \" withString:@\"\"];\n        [[RCIMClient sharedRCIMClient] setDeviceToken:token];\n    }\n \n */\n- (void)setDeviceToken:(NSString *)deviceToken;\n\n#pragma mark - 连接与断开服务器\n\n/*!\n 与融云服务器建立连接\n \n @param token                   从您服务器端获取的token(用户身份令牌)\n @param successBlock            连接建立成功的回调 [userId:当前连接成功所用的用户ID]\n @param errorBlock              连接建立失败的回调 [status:连接失败的错误码]\n @param tokenIncorrectBlock     token错误或者过期的回调\n \n @discussion 在App整个生命周期，您只需要调用一次此方法与融云服务器建立连接。\n 之后无论是网络出现异常或者App有前后台的切换等，SDK都会负责自动重连。\n 除非您已经手动将连接断开，否则您不需要自己再手动重连。\n \n tokenIncorrectBlock有两种情况：\n 一是token错误，请您检查客户端初始化使用的AppKey和您服务器获取token使用的AppKey是否一致；\n 二是token过期，是因为您在开发者后台设置了token过期时间，您需要请求您的服务器重新获取token并再次用新的token建立连接。\n \n @warning 如果您使用IMLib，请使用此方法建立与融云服务器的连接；\n 如果您使用IMKit，请使用RCIM中的同名方法建立与融云服务器的连接，而不要使用此方法。\n \n 在tokenIncorrectBlock的情况下，您需要请求您的服务器重新获取token并建立连接，但是注意避免无限循环，以免影响App用户体验。\n \n 此方法的回调并非为原调用线程，您如果需要进行UI操作，请注意切换到主线程。\n */\n- (void)connectWithToken:(NSString *)token\n                 success:(void (^)(NSString *userId))successBlock\n                   error:(void (^)(RCConnectErrorCode status))errorBlock\n          tokenIncorrect:(void (^)())tokenIncorrectBlock;\n\n///*!\n// 重新建立与服务器的连接\n//\n// @param successBlock 重新连接成功的回调\n// @param errorBlock   重新连接失败的回调\n//\n// @warning 升级说明：从2.2.3版本开始，删除此方法。\n// SDK在前后台切换或者网络出现异常都会自动重连，会保证连接的可靠性，不需要App手动进行重连操作。\n// */\n//- (void)reconnect:(void (^)(NSString *userId))successBlock\n//            error:(void (^)(RCConnectErrorCode status))errorBlock;\n\n/*!\n 断开与融云服务器的连接\n \n @param isReceivePush   App在断开连接之后，是否还接收远程推送\n \n @discussion 因为SDK在前后台切换或者网络出现异常都会自动重连，会保证连接的可靠性。\n 所以除非您的App逻辑需要登出，否则一般不需要调用此方法进行手动断开。\n \n @warning 如果您使用IMLib，请使用此方法断开与融云服务器的连接；\n 如果您使用IMKit，请使用RCIM中的同名方法断开与融云服务器的连接，而不要使用此方法。\n \n isReceivePush指断开与融云服务器的连接之后，是否还接收远程推送。\n [[RCIMClient sharedRCIMClient] disconnect:YES]与[[RCIMClient sharedRCIMClient] disconnect]完全一致；\n [[RCIMClient sharedRCIMClient] disconnect:NO]与[[RCIMClient sharedRCIMClient] logout]完全一致。\n 您只需要按照您的需求，使用disconnect:与disconnect以及logout三个接口其中一个即可。\n */\n- (void)disconnect:(BOOL)isReceivePush;\n\n/*!\n 断开与融云服务器的连接，但仍然接收远程推送\n \n @discussion 因为SDK在前后台切换或者网络出现异常都会自动重连，会保证连接的可靠性。\n 所以除非您的App逻辑需要登出，否则一般不需要调用此方法进行手动断开。\n \n @warning 如果您使用IMLib，请使用此方法断开与融云服务器的连接；\n 如果您使用IMKit，请使用RCIM中的同名方法断开与融云服务器的连接，而不要使用此方法。\n \n [[RCIMClient sharedRCIMClient] disconnect:YES]与[[RCIMClient sharedRCIMClient] disconnect]完全一致；\n [[RCIMClient sharedRCIMClient] disconnect:NO]与[[RCIMClient sharedRCIMClient] logout]完全一致。\n 您只需要按照您的需求，使用disconnect:与disconnect以及logout三个接口其中一个即可。\n */\n- (void)disconnect;\n\n/*!\n 断开与融云服务器的连接，并不再接收远程推送\n \n @discussion 因为SDK在前后台切换或者网络出现异常都会自动重连，会保证连接的可靠性。\n 所以除非您的App逻辑需要登出，否则一般不需要调用此方法进行手动断开。\n \n @warning 如果您使用IMKit，请使用此方法断开与融云服务器的连接；\n 如果您使用IMLib，请使用RCIMClient中的同名方法断开与融云服务器的连接，而不要使用此方法。\n \n [[RCIMClient sharedRCIMClient] disconnect:YES]与[[RCIMClient sharedRCIMClient] disconnect]完全一致；\n [[RCIMClient sharedRCIMClient] disconnect:NO]与[[RCIMClient sharedRCIMClient] logout]完全一致。\n 您只需要按照您的需求，使用disconnect:与disconnect以及logout三个接口其中一个即可。\n */\n- (void)logout;\n\n#pragma mark - 连接状态监听\n\n/*!\n 设置IMLib的连接状态监听器\n \n @param delegate    IMLib连接状态监听器\n \n @warning 如果您使用IMLib，可以设置并实现此Delegate监听消息接收；\n 如果您使用IMKit，请使用RCIM中的connectionStatusDelegate监听连接状态变化，而不要使用此方法，否则会导致IMKit中无法自动更新UI！\n */\n- (void)setRCConnectionStatusChangeDelegate: (id<RCConnectionStatusChangeDelegate>)delegate;\n\n/*!\n 获取当前SDK的连接状态\n \n @return 当前SDK的连接状态\n */\n- (RCConnectionStatus)getConnectionStatus;\n\n/*!\n 获取当前的网络状态\n \n @return 当前的网路状态\n */\n- (RCNetworkStatus)getCurrentNetworkStatus;\n\n/*!\n SDK当前所处的运行状态\n */\n@property(nonatomic, assign, readonly) RCSDKRunningMode sdkRunningMode;\n\n#pragma mark - Apple Watch状态监听\n\n/*!\n 用于Apple Watch的IMLib事务监听器\n */\n@property(nonatomic, strong) id<RCWatchKitStatusDelegate> watchKitStatusDelegate;\n\n#pragma mark - 用户信息\n\n/*!\n 当前登录用户的用户信息\n \n @discussion 与融云服务器建立连接之后，应该设置当前用户的用户信息。\n \n @warning 如果您使用IMLib，请使用此字段设置当前登录用户的用户信息；\n 如果您使用IMKit，请使用RCIM中的currentUserInfo设置当前登录用户的用户信息，而不要使用此字段。\n */\n@property(nonatomic, strong) RCUserInfo *currentUserInfo;\n\n/*!\n 从融云服务器获取用户信息（已废弃，请勿使用）\n \n @param userId                      用户ID\n @param successBlock                获取用户信息成功的回调 [userInfo:获取到的用户信息]\n @param errorBlock                  获取用户信息失败的回调 [status:失败的错误码]\n \n @warning **已废弃，请勿使用。**\n */\n- (void)getUserInfo:(NSString *)userId\n            success:(void (^)(RCUserInfo *userInfo))successBlock\n              error:(void (^)(RCErrorCode status))errorBlock\n__deprecated_msg(\"已废弃，请勿使用。\");\n\n#pragma mark - 消息接收与发送\n\n/*!\n 注册自定义的消息类型\n \n @param messageClass    自定义消息的类，该自定义消息需要继承于RCMessageContent\n \n @discussion 如果您需要自定义消息，必须调用此方法注册该自定义消息的消息类型，否则SDK将无法识别和解析该类型消息。\n \n @warning 如果您使用IMLib，请使用此方法注册自定义的消息类型；\n 如果您使用IMKit，请使用RCIM中的同名方法注册自定义的消息类型，而不要使用此方法。\n */\n- (void)registerMessageType:(Class)messageClass;\n\n#pragma mark 消息发送\n\n/*!\n 发送消息\n \n @param conversationType    发送消息的会话类型\n @param targetId            发送消息的目标会话ID\n @param content             消息的内容\n @param pushContent         接收方离线时需要显示的远程推送内容\n @param successBlock        消息发送成功的回调 [messageId:消息的ID]\n @param errorBlock          息发送失败的回调 [nErrorCode:发送失败的错误码, messageId:消息的ID]\n @return                    发送的消息实体\n \n @discussion 当接收方离线并允许远程推送时，会收到远程推送。\n 远程推送中包含两部分内容，一是pushContent，用于显示；二是pushData，用于携带不显示的数据。\n \n SDK内置的消息类型，如果您将pushContent和pushData置为nil，会使用默认的推送格式进行远程推送。\n 自定义类型的消息，需要您自己设置pushContent和pushData来定义推送内容，否则将不会进行远程推送。\n \n 使此方法会将pushData设置为nil，如果需要设置pushData可以使用RCIMClient的\n sendMessage:targetId:content:pushContent:pushData:success:error:方法。\n \n 如果您使用此方法发送图片消息，需要您自己实现图片的上传，然后构建一个RCImageMessage对象，\n 并将RCImageMessage中的imageUrl字段设置为最终上传的地址，使用此方法发送。\n \n @warning 如果您使用IMLib，可以使用此方法发送消息；\n 如果您使用IMKit，请使用RCIM中的同名方法发送消息，否则不会自动更新UI。\n */\n- (RCMessage *)sendMessage:(RCConversationType)conversationType\n                  targetId:(NSString *)targetId\n                   content:(RCMessageContent *)content\n               pushContent:(NSString *)pushContent\n                   success:(void (^)(long messageId))successBlock\n                     error:(void (^)(RCErrorCode nErrorCode, long messageId))errorBlock;\n\n/*!\n 发送消息\n \n @param conversationType    发送消息的会话类型\n @param targetId            发送消息的目标会话ID\n @param content             消息的内容\n @param pushContent         接收方离线时需要显示的远程推送内容\n @param pushData            接收方离线时需要在远程推送中携带的非显示数据\n @param successBlock        消息发送成功的回调 [messageId:消息的ID]\n @param errorBlock          消息发送失败的回调 [nErrorCode:发送失败的错误码, messageId:消息的ID]\n @return                    发送的消息实体\n \n @discussion 当接收方离线并允许远程推送时，会收到远程推送。\n 远程推送中包含两部分内容，一是pushContent，用于显示；二是pushData，用于携带不显示的数据。\n \n SDK内置的消息类型，如果您将pushContent和pushData置为nil，会使用默认的推送格式进行远程推送。\n 自定义类型的消息，需要您自己设置pushContent和pushData来定义推送内容，否则将不会进行远程推送。\n \n 如果您使用此方法发送图片消息，需要您自己实现图片的上传，构建一个RCImageMessage对象，\n 并将RCImageMessage中的imageUrl字段设置为上传成功的URL地址，然后使用此方法发送。\n \n @warning 如果您使用IMLib，可以使用此方法发送消息；\n 如果您使用IMKit，请使用RCIM中的同名方法发送消息，否则不会自动更新UI。\n */\n- (RCMessage *)sendMessage:(RCConversationType)conversationType\n                  targetId:(NSString *)targetId\n                   content:(RCMessageContent *)content\n               pushContent:(NSString *)pushContent\n                  pushData:(NSString *)pushData\n                   success:(void (^)(long messageId))successBlock\n                     error:(void (^)(RCErrorCode nErrorCode, long messageId))errorBlock;\n\n/*!\n 发送图片消息\n \n @param conversationType    发送消息的会话类型\n @param targetId            发送消息的目标会话ID\n @param content             消息的内容\n @param pushContent         接收方离线时需要显示的远程推送内容\n @param progressBlock       消息发送进度更新的回调 [progress:当前的发送进度, 0 <= progress <= 100, messageId:消息的ID]\n @param successBlock        消息发送成功的回调 [messageId:消息的ID]\n @param errorBlock          消息发送失败的回调 [errorCode:发送失败的错误码, messageId:消息的ID]\n @return                    发送的消息实体\n \n @discussion 当接收方离线并允许远程推送时，会收到远程推送。\n 远程推送中包含两部分内容，一是pushContent，用于显示；二是pushData，用于携带不显示的数据。\n \n SDK内置的消息类型，如果您将pushContent和pushData置为nil，会使用默认的推送格式进行远程推送。\n 自定义类型的消息，需要您自己设置pushContent和pushData来定义推送内容，否则将不会进行远程推送。\n \n 使此方法会将pushData设置为nil，如果需要设置pushData可以使用RCIMClient的\n sendImageMessage:targetId:content:pushContent:pushData:progress:success:error:方法。\n \n 如果您需要上传图片到自己的服务器并使用IMLib，构建一个RCImageMessage对象，\n 并将RCImageMessage中的imageUrl字段设置为上传成功的URL地址，然后使用RCIMClient的\n sendMessage:targetId:content:pushContent:pushData:success:error:方法\n 或sendMessage:targetId:content:pushContent:success:error:方法进行发送，不要使用此方法。\n \n @warning 如果您使用IMKit，使用此方法发送图片消息SDK会自动更新UI；\n 如果您使用IMLib，请使用RCIMClient中的同名方法发送图片消息，不会自动更新UI。\n */\n- (RCMessage *)sendImageMessage:(RCConversationType)conversationType\n                       targetId:(NSString *)targetId\n                        content:(RCMessageContent *)content\n                    pushContent:(NSString *)pushContent\n                       progress:(void (^)(int progress, long messageId))progressBlock\n                        success:(void (^)(long messageId))successBlock\n                          error:(void (^)(RCErrorCode errorCode, long messageId))errorBlock;\n\n/*!\n 发送图片消息\n \n @param conversationType    发送消息的会话类型\n @param targetId            发送消息的目标会话ID\n @param content             消息的内容\n @param pushContent         接收方离线时需要显示的远程推送内容\n @param pushData            接收方离线时需要在远程推送中携带的非显示数据\n @param progressBlock       消息发送进度更新的回调 [progress:当前的发送进度, 0 <= progress <= 100, messageId:消息的ID]\n @param successBlock        消息发送成功的回调 [messageId:消息的ID]\n @param errorBlock          消息发送失败的回调 [errorCode:发送失败的错误码, messageId:消息的ID]\n @return                    发送的消息实体\n \n @discussion 当接收方离线并允许远程推送时，会收到远程推送。\n 远程推送中包含两部分内容，一是pushContent，用于显示；二是pushData，用于携带不显示的数据。\n \n SDK内置的消息类型，如果您将pushContent和pushData置为nil，会使用默认的推送格式进行远程推送。\n 自定义类型的消息，需要您自己设置pushContent和pushData来定义推送内容，否则将不会进行远程推送。\n \n 如果您需要上传图片到自己的服务器，构建一个RCImageMessage对象，\n 并将RCImageMessage中的imageUrl字段设置为上传成功的URL地址，然后使用RCIMClient的\n sendMessage:targetId:content:pushContent:pushData:success:error:方法\n 或sendMessage:targetId:content:pushContent:success:error:方法进行发送，不要使用此方法。\n \n @warning 如果您使用IMKit，使用此方法发送图片消息SDK会自动更新UI；\n 如果您使用IMLib，请使用RCIMClient中的同名方法发送图片消息，不会自动更新UI。\n */\n- (RCMessage *)sendImageMessage:(RCConversationType)conversationType\n                       targetId:(NSString *)targetId\n                        content:(RCMessageContent *)content\n                    pushContent:(NSString *)pushContent\n                       pushData:(NSString *)pushData\n                       progress:(void (^)(int progress, long messageId))progressBlock\n                        success:(void (^)(long messageId))successBlock\n                          error:(void (^)(RCErrorCode errorCode, long messageId))errorBlock;\n\n/*!\n 发送图片消息(上传图片到指定的服务器)\n \n @param conversationType    发送消息的会话类型\n @param targetId            发送消息的目标会话ID\n @param content             消息的内容\n @param pushContent         接收方离线时需要显示的远程推送内容\n @param pushData            接收方离线时需要在远程推送中携带的非显示数据\n @param uploadPrepareBlock  图片上传进度更新的IMKit监听 [uploadListener:当前的发送进度监听，SDK通过此监听更新IMKit UI]\n @param progressBlock       消息发送进度更新的回调 [progress:当前的发送进度, 0 <= progress <= 100, messageId:消息的ID]\n @param successBlock        消息发送成功的回调 [messageId:消息的ID]\n @param errorBlock          消息发送失败的回调 [errorCode:发送失败的错误码, messageId:消息的ID]\n @return                    发送的消息实体\n \n @discussion 此方法仅用于IMKit。\n 如果您需要上传图片到自己的服务器并使用IMLib，构建一个RCImageMessage对象，\n 并将RCImageMessage中的imageUrl字段设置为上传成功的URL地址，然后使用RCIMClient的\n sendMessage:targetId:content:pushContent:pushData:success:error:方法\n 或sendMessage:targetId:content:pushContent:success:error:方法进行发送，不要使用此方法。\n */\n- (RCMessage *)sendImageMessage:(RCConversationType)conversationType\n                       targetId:(NSString *)targetId\n                        content:(RCMessageContent *)content\n                    pushContent:(NSString *)pushContent\n                       pushData:(NSString *)pushData\n                  uploadPrepare:(void (^)(RCUploadImageStatusListener *uploadListener))uploadPrepareBlock\n                       progress:(void (^)(int progress, long messageId))progressBlock\n                        success:(void (^)(long messageId))successBlock\n                          error:(void (^)(RCErrorCode errorCode, long messageId))errorBlock;\n\n/*!\n 发送状态消息\n \n @param conversationType    会话类型\n @param targetId            目标会话ID\n @param content             消息内容\n @param successBlock        发送消息成功的回调 [messageId:消息的ID]\n @param errorBlock          发送消息失败的回调 [nErrorCode:发送失败的错误码, messageId:消息的ID]\n \n @discussion 通过此方法发送的消息，根据接收方的状态进行投递。\n 如果接收方不在线，则不会收到远程推送，再上线也不会收到此消息。\n */\n- (RCMessage *)sendStatusMessage:(RCConversationType)conversationType\n                        targetId:(NSString *)targetId\n                         content:(RCMessageContent *)content\n                         success:(void (^)(long messageId))successBlock\n                           error:(void (^)(RCErrorCode nErrorCode, long messageId))errorBlock;\n\n/*!\n 插入消息\n \n @param conversationType    会话类型\n @param targetId            目标会话ID\n @param senderUserId        消息发送者的用户ID\n @param sendStatus          发送状态\n @param content             消息的内容\n @return                    插入的消息实体\n \n @discussion 此方法不支持聊天室的会话类型。\n \n @warning 目前仅支持插入向外发送的消息，不支持插入接收的消息。\n */\n- (RCMessage *)insertMessage:(RCConversationType)conversationType\n                    targetId:(NSString *)targetId\n                senderUserId:(NSString *)senderUserId\n                  sendStatus:(RCSentStatus)sendStatus\n                     content:(RCMessageContent *)content;\n\n/*!\n 下载消息内容中的媒体信息\n \n @param conversationType    消息的会话类型\n @param targetId            消息的目标会话ID\n @param mediaType           消息内容中的多媒体文件类型，目前仅支持图片\n @param mediaUrl            多媒体文件的网络URL\n @param progressBlock       消息下载进度更新的回调 [progress:当前的下载进度, 0 <= progress <= 100]\n @param successBlock        下载成功的回调 [mediaPath:下载成功后本地存放的文件路径]\n @param errorBlock          下载失败的回调[errorCode:下载失败的错误码]\n */\n- (void)downloadMediaFile:(RCConversationType)conversationType\n                 targetId:(NSString *)targetId\n                mediaType:(RCMediaType)mediaType\n                 mediaUrl:(NSString *)mediaUrl\n                 progress:(void (^)(int progress))progressBlock\n                  success:(void (^)(NSString *mediaPath))successBlock\n                    error:(void (^)(RCErrorCode errorCode))errorBlock;\n\n#pragma mark 消息接收监听\n/*!\n 设置IMlib的消息接收监听器\n \n @param delegate    IMLib消息接收监听器\n @param userData    用户自定义的监听器Key值，可以为nil\n \n @discussion 设置IMLib的消息接收监听器请参考RCIMClient的setReceiveMessageDelegate:object:方法。\n \n userData为您自定义的任意数据，SDK会在回调的onReceived:left:object:方法中传入作为object参数。\n 您如果有设置多个监听，会只有最终的一个监听器起作用，您可以通过该userData值区分您设置的监听器。如果不需要直接设置为nil就可以。\n \n @warning 如果您使用IMlib，可以设置并实现此Delegate监听消息接收；\n 如果您使用IMKit，请使用RCIM中的receiveMessageDelegate监听消息接收，而不要使用此方法，否则会导致IMKit中无法自动更新UI！\n */\n- (void)setReceiveMessageDelegate:(id<RCIMClientReceiveMessageDelegate>)delegate\n                           object:(id)userData;\n\n#pragma mark 消息阅读回执\n/*!\n @const 收到已读回执的Notification\n \n @discussion 收到消息已读回执之后，IMLib会分发此通知。\n \n Notification的object为nil，userInfo为NSDictionary对象，\n 其中key值分别为@\"cType\"、@\"tId\"、@\"messageTime\",\n 对应的value为会话类型的NSNumber对象、会话的targetId、已阅读的最后一条消息的sendTime。\n 如：\n NSNumber *ctype = [notification.userInfo objectForKey:@\"cType\"];\n NSNumber *time = [notification.userInfo objectForKey:@\"messageTime\"];\n NSString *targetId = [notification.userInfo objectForKey:@\"tId\"];\n \n 收到这个消息之后可以更新这个会话中messageTime以前的消息UI为已读（底层数据库消息状态已经改为已读）。\n \n @warning 目前仅支持单聊。\n */\nFOUNDATION_EXPORT NSString *const RCLibDispatchReadReceiptNotification;\n\n/*!\n 发送某个会话中消息阅读的回执\n \n @param conversationType    会话类型\n @param targetId            目标会话ID\n @param timestamp           该会话中已阅读的最后一条消息的发送时间戳\n \n @discussion 消息回执功能目前只支持单聊, 如果使用Lib 可以注册监听 RCLibDispatchReadReceiptNotification 通知,使用kit 直接开启RCIM.h 中enableReadReceipt。\n \n @warning 目前仅支持单聊。\n */\n-(void)sendReadReceiptMessage:(RCConversationType)conversationType\n                     targetId:(NSString *)targetId\n                         time:(long long)timestamp;\n#pragma mark - 消息操作\n\n/*!\n 获取某个会话中指定数量的最新消息实体\n \n @param conversationType    会话类型\n @param targetId            目标会话ID\n @param count               需要获取的消息数量\n @return                    消息实体RCMessage对象列表\n \n @discussion 此方法会获取该会话中指定数量的最新消息实体，返回的消息实体按照时间从新到旧排列。\n 如果会话中的消息数量小于参数count的值，会将该会话中的所有消息返回。\n */\n- (NSArray *)getLatestMessages:(RCConversationType)conversationType\n                      targetId:(NSString *)targetId\n                         count:(int)count;\n\n/*!\n 获取会话中，从指定消息之前、指定数量的最新消息实体\n \n @param conversationType    会话类型\n @param targetId            目标会话ID\n @param oldestMessageId     截止的消息ID\n @param count               需要获取的消息数量\n @return                    消息实体RCMessage对象列表\n \n @discussion 此方法会获取该会话中，oldestMessageId之前的、指定数量的最新消息实体，返回的消息实体按照时间从新到旧排列。\n 返回的消息中不包含oldestMessageId对应那条消息，如果会话中的消息数量小于参数count的值，会将该会话中的所有消息返回。\n 如：\n oldestMessageId为10，count为2，会返回messageId为9和8的RCMessage对象列表。\n */\n- (NSArray *)getHistoryMessages:(RCConversationType)conversationType\n                       targetId:(NSString *)targetId\n                oldestMessageId:(long)oldestMessageId\n                          count:(int)count;\n\n/*!\n 获取会话中，从指定消息之前、指定数量的、指定消息类型的最新消息实体\n \n @param conversationType    会话类型\n @param targetId            目标会话ID\n @param objectName          消息内容的类型名\n @param oldestMessageId     截止的消息ID\n @param count               需要获取的消息数量\n @return                    消息实体RCMessage对象列表\n \n @discussion 此方法会获取该会话中，oldestMessageId之前的、指定数量和消息类型的最新消息实体，返回的消息实体按照时间从新到旧排列。\n 返回的消息中不包含oldestMessageId对应的那条消息，如果会话中的消息数量小于参数count的值，会将该会话中的所有消息返回。\n 如：\n oldestMessageId为10，count为2，会返回messageId为9和8的RCMessage对象列表。\n */\n-(NSArray*)getHistoryMessages:(RCConversationType)conversationType\n                     targetId:(NSString*)targetId\n                   objectName:(NSString *)objectName\n              oldestMessageId:(long)oldestMessageId\n                        count:(int)count;\n\n/*!\n 从服务器端获取之前的历史消息\n \n @param conversationType    会话类型\n @param targetId            目标会话ID\n @param recordTime          最早的发送时间，第一次可以传0\n @param count               需要获取的消息数量， 0< count <= 20\n @param successBlock        获取成功的回调 [messages:获取到的历史消息数组]\n @param errorBlock          获取失败的回调 [status:获取失败的错误码]\n \n @discussion 此方法从服务器端获取之前的历史消息，但是必须先开通历史消息云存储功能。\n */\n- (void)getRemoteHistoryMessages:(RCConversationType)conversationType\n                        targetId:(NSString *)targetId\n                      recordTime:(long)recordTime\n                           count:(int)count\n                         success:(void (^)(NSArray *messages))successBlock\n                           error:(void (^)(RCErrorCode status))errorBlock;\n\n/*!\n 获取消息的发送时间（Unix时间戳、毫秒）\n \n @param messageId   消息ID\n @return            消息的发送时间（Unix时间戳、毫秒）\n */\n-(long long)getMessageSendTime:(long)messageId;\n\n/*!\n 通过messageId获取消息实体\n \n @param messageId   消息ID（数据库索引唯一值）\n @return            通过消息ID获取到的消息实体，当获取失败的时候，会返回nil。\n */\n-(RCMessage *)getMessage:(long)messageId;\n\n/*!\n 通过全局唯一ID获取消息实体\n \n @param messageUId   全局唯一ID（服务器消息唯一ID）\n @return             通过全局唯一ID获取到的消息实体，当获取失败的时候，会返回nil。\n */\n-(RCMessage *)getMessageByUId:(NSString *)messageUId;\n\n/*!\n 删除消息\n \n @param messageIds  消息ID的列表\n @return            是否删除成功\n */\n- (BOOL)deleteMessages:(NSArray *)messageIds;\n\n/*!\n 删除某个会话中的所有消息\n \n @param conversationType    会话类型，不支持聊天室\n @param targetId            目标会话ID\n @return                    是否删除成功\n */\n- (BOOL)clearMessages:(RCConversationType)conversationType\n             targetId:(NSString *)targetId;\n\n/*!\n 设置消息的附加信息\n \n @param messageId   消息ID\n @param value       附加信息\n @return            是否设置成功\n */\n- (BOOL)setMessageExtra:(long)messageId\n                  value:(NSString *)value;\n\n/*!\n 设置消息的接收状态\n \n @param messageId       消息ID\n @param receivedStatus  消息的接收状态\n @return                是否设置成功\n */\n- (BOOL)setMessageReceivedStatus:(long)messageId\n                  receivedStatus:(RCReceivedStatus)receivedStatus;\n\n/*!\n 设置消息的发送状态\n \n @param messageId       消息ID\n @param sentStatus      消息的发送状态\n @return                是否设置成功\n */\n- (BOOL)setMessageSentStatus:(long)messageId\n                  sentStatus:(RCSentStatus)sentStatus;\n\n\n#pragma mark - 会话列表操作\n/*!\n 获取会话列表\n \n @param conversationTypeList    会话类型的数组(需要将RCConversationType转为NSNumber构建Array)\n @return                        会话RCConversation的列表\n \n @discussion 此方法会从本地数据库中，读取会话列表。\n 返回的会话列表按照时间从前往后排列，如果有置顶的会话，则置顶的会话会排列在前面。\n */\n- (NSArray *)getConversationList:(NSArray *)conversationTypeList;\n\n/*!\n 获取单个会话数据\n \n @param conversationType    会话类型\n @param targetId            目标会话ID\n @return                    会话的对象\n */\n- (RCConversation *)getConversation:(RCConversationType)conversationType\n                           targetId:(NSString *)targetId;\n\n/*!\n 获取会话中的消息数量\n \n @param conversationType    会话类型\n @param targetId            目标会话ID\n @return                    会话中的消息数量\n \n @discussion -1表示获取消息数量出错。\n */\n- (int)getMessageCount:(RCConversationType)conversationType\n              targetId:(NSString *)targetId;\n\n/*!\n 删除指定类型的会话\n \n @param conversationTypeList    会话类型的数组(需要将RCConversationType转为NSNumber构建Array)\n @return                        是否删除成功\n */\n- (BOOL)clearConversations:(NSArray *)conversationTypeList;\n\n/*!\n 从本地存储中删除会话\n \n @param conversationType    会话类型\n @param targetId            目标会话ID\n @return                    是否删除成功\n \n @discussion 此方法会从本地存储中删除该会话，但是不会删除会话中的消息。\n */\n- (BOOL)removeConversation:(RCConversationType)conversationType\n                  targetId:(NSString *)targetId;\n\n/*!\n 设置会话的置顶状态\n \n @param conversationType    会话类型\n @param targetId            目标会话ID\n @param isTop               是否置顶\n @return                    设置是否成功\n */\n- (BOOL)setConversationToTop:(RCConversationType)conversationType\n                    targetId:(NSString *)targetId\n                       isTop:(BOOL)isTop;\n\n#pragma mark 会话中的草稿操作\n/*!\n 获取会话中的草稿信息\n \n @param conversationType    会话类型\n @param targetId            会话目标ID\n @return                    该会话中的草稿\n */\n- (NSString *)getTextMessageDraft:(RCConversationType)conversationType\n                         targetId:(NSString *)targetId;\n\n/*!\n 保存草稿信息\n \n @param conversationType    会话类型\n @param targetId            会话目标ID\n @param content             草稿信息\n @return                    是否保存成功\n */\n- (BOOL)saveTextMessageDraft:(RCConversationType)conversationType\n                    targetId:(NSString *)targetId\n                     content:(NSString *)content;\n\n/*!\n 删除会话中的草稿信息\n \n @param conversationType    会话类型\n @param targetId            会话目标ID\n @return                    是否删除成功\n */\n- (BOOL)clearTextMessageDraft:(RCConversationType)conversationType\n                     targetId:(NSString *)targetId;\n\n#pragma mark 未读消息数\n\n/*!\n 获取所有的未读消息数\n \n @return    所有的未读消息数\n */\n- (int)getTotalUnreadCount;\n\n/*!\n 获取某个会话内的未读消息数\n \n @param conversationType    会话类型\n @param targetId            会话目标ID\n @return                    该会话内的未读消息数\n */\n- (int)getUnreadCount:(RCConversationType)conversationType\n             targetId:(NSString *)targetId;\n\n/*!\n 获取某个类型的会话中所有的未读消息数\n \n @param conversationTypes   会话类型的数组\n @return                    该类型的会话中所有的未读消息数\n */\n- (int)getUnreadCount:(NSArray *)conversationTypes;\n\n/*!\n 清除某个会话中的未读消息数\n \n @param conversationType    会话类型，不支持聊天室\n @param targetId            目标会话ID\n @return                    是否清除成功\n */\n- (BOOL)clearMessagesUnreadStatus:(RCConversationType)conversationType\n                         targetId:(NSString *)targetId;\n\n#pragma mark 会话的消息提醒\n\n/*!\n 设置会话的消息提醒状态\n \n @param conversationType            会话类型\n @param targetId                    目标会话ID\n @param isBlocked                   是否屏蔽消息提醒\n @param successBlock                设置成功的回调 [nStatus:会话设置的消息提醒状态]\n @param errorBlock                  设置失败的回调 [status:设置失败的错误码]\n \n @discussion 如果您使用IMLib，此方法会屏蔽该会话的远程推送；如果您使用IMKit，此方法会屏蔽该会话的所有提醒（远程推送、本地通知、前台提示音）。\n */\n- (void)setConversationNotificationStatus:(RCConversationType)conversationType\n                                 targetId:(NSString *)targetId\n                                isBlocked:(BOOL)isBlocked\n                                  success:(void (^)(RCConversationNotificationStatus nStatus))successBlock\n                                    error:(void (^)(RCErrorCode status))errorBlock;\n\n/*!\n 查询会话的消息提醒状态\n \n @param conversationType    会话类型\n @param targetId            目标会话ID\n @param successBlock        查询成功的回调 [nStatus:会话设置的消息提醒状态]\n @param errorBlock          查询失败的回调 [status:设置失败的错误码]\n */\n- (void)getConversationNotificationStatus:(RCConversationType)conversationType\n                                 targetId:(NSString *)targetId\n                                  success:(void (^)(RCConversationNotificationStatus nStatus))successBlock\n                                    error:(void (^)(RCErrorCode status))errorBlock;\n\n#pragma mark 全局消息提醒\n\n/*!\n 全局屏蔽某个时间段的消息提醒\n \n @param startTime       开始屏蔽消息提醒的时间，格式为HH:MM:SS\n @param spanMins        需要屏蔽消息提醒的分钟数，0 < spanMins < 1440\n @param successBlock    屏蔽成功的回调\n @param errorBlock      屏蔽失败的回调 [status:屏蔽失败的错误码]\n \n @discussion 此方法设置的屏蔽时间会在每天该时间段时生效。\n 如果您使用IMLib，此方法会屏蔽该会话在该时间段的远程推送；如果您使用IMKit，此方法会屏蔽该会话在该时间段的所有提醒（远程推送、本地通知、前台提示音）。\n */\n- (void)setNotificationQuietHours:(NSString *)startTime\n                         spanMins:(int)spanMins\n                          success:(void (^)())successBlock\n                            error:(void (^)(RCErrorCode status))errorBlock;\n\n/*!\n 删除已设置的全局时间段消息提醒屏蔽\n \n @param successBlock    删除屏蔽成功的回调\n @param errorBlock      删除屏蔽失败的回调 [status:失败的错误码]\n */\n- (void)removeNotificationQuietHours:(void (^)())successBlock\n                               error:(void (^)(RCErrorCode status))errorBlock;\n\n/*!\n 查询已设置的全局时间段消息提醒屏蔽\n \n @param successBlock    屏蔽成功的回调 [startTime:已设置的屏蔽开始时间, spansMin:已设置的屏蔽时间分钟数，0 < spansMin < 1440]\n @param errorBlock      查询失败的回调 [status:查询失败的错误码]\n */\n- (void)getNotificationQuietHours:(void (^)(NSString *startTime, int spansMin))successBlock\n                            error:(void (^)(RCErrorCode status))errorBlock;\n\n/*!\n 全局屏蔽某个时间段的消息提醒\n \n @param startTime       开始屏蔽消息提醒的时间，格式为HH:MM:SS\n @param spanMins        需要屏蔽消息提醒的分钟数，0 < spanMins < 1440\n @param successBlock    屏蔽成功的回调\n @param errorBlock      屏蔽失败的回调 [status:屏蔽失败的错误码]\n \n @discussion 此方法设置的屏蔽时间会在每天该时间段时生效。\n 如果您使用IMLib，此方法会屏蔽该会话在该时间段的远程推送；如果您使用IMKit，此方法会屏蔽该会话在该时间段的所有提醒（远程推送、本地通知、前台提示音）。\n \n @warning **已废弃，请勿使用。**\n 升级说明：如果您之前使用了此接口，可以直接替换为setNotificationQuietHours:spanMins:success:error:接口，行为和实现完全一致。\n */\n- (void)setConversationNotificationQuietHours:(NSString *)startTime\n                                     spanMins:(int)spanMins\n                                      success:(void (^)())successBlock\n                                        error:(void (^)(RCErrorCode status))errorBlock\n__deprecated_msg(\"已废弃，请勿使用。\");\n\n/*!\n 删除已设置的全局时间段消息提醒屏蔽\n \n @param successBlock    删除屏蔽成功的回调\n @param errorBlock      删除屏蔽失败的回调 [status:失败的错误码]\n \n @warning **已废弃，请勿使用。**\n 升级说明：如果您之前使用了此接口，可以直接替换为removeNotificationQuietHours:error:接口，行为和实现完全一致。\n */\n- (void)removeConversationNotificationQuietHours:(void (^)())successBlock\n                                           error:(void (^)(RCErrorCode status))errorBlock\n__deprecated_msg(\"已废弃，请勿使用。\");\n\n#pragma mark - 输入状态提醒\n\n/*!\n 设置输入状态的监听器\n \n @param delegate IMLib输入状态的的监听器\n \n @warning 目前仅支持单聊。\n */\n- (void)setRCTypingStatusDelegate:(id<RCTypingStatusDelegate>)delegate;\n\n/*!\n 向会话中发送正在输入的状态\n \n @param conversationType    会话类型\n @param targetId            会话目标ID\n @param objectName         正在输入的消息的类型名\n \n @discussion contentType为用户当前正在编辑的消息类型名，即RCMessageContent中getObjectName的返回值。\n 如文本消息，应该传类型名\"RC:TxtMsg\"。\n \n @warning 目前仅支持单聊。\n */\n- (void)sendTypingStatus:(RCConversationType)conversationType\n                targetId:(NSString *)targetId\n             contentType:(NSString *)objectName;\n\n#pragma mark - 黑名单\n\n/*!\n 将某个用户加入黑名单\n \n @param userId          需要加入黑名单的用户ID\n @param successBlock    加入黑名单成功的回调\n @param errorBlock      加入黑名单失败的回调 [status:失败的错误码]\n */\n- (void)addToBlacklist:(NSString *)userId\n               success:(void (^)())successBlock\n                 error:(void (^)(RCErrorCode status))errorBlock;\n\n/*!\n 将某个用户移出黑名单\n \n @param userId          需要移出黑名单的用户ID\n @param successBlock    移出黑名单成功的回调\n @param errorBlock      移出黑名单失败的回调[status:失败的错误码]\n */\n- (void)removeFromBlacklist:(NSString *)userId\n                    success:(void (^)())successBlock\n                      error:(void (^)(RCErrorCode status))errorBlock;\n\n/*!\n 查询某个用户是否已经在黑名单中\n \n @param userId          需要查询的用户ID\n @param successBlock    查询成功的回调 [bizStatus:该用户是否在黑名单中。0表示已经在黑名单中，101表示不在黑名单中]\n @param errorBlock      查询失败的回调 [status:失败的错误码]\n */\n- (void)getBlacklistStatus:(NSString *)userId\n                   success:(void (^)(int bizStatus))successBlock\n                     error:(void (^)(RCErrorCode status))errorBlock;\n\n/*!\n 查询已经设置的黑名单列表\n \n @param successBlock    查询成功的回调 [blockUserIds:已经设置的黑名单中的用户ID列表]\n @param errorBlock      查询失败的回调 [status:失败的错误码]\n */\n- (void)getBlacklist:(void (^)(NSArray *blockUserIds))successBlock\n               error:(void (^)(RCErrorCode status))errorBlock;\n\n#pragma mark - 讨论组操作\n\n/*!\n 创建讨论组\n \n @param name            讨论组名称\n @param userIdList      用户ID的列表\n @param successBlock    创建讨论组成功的回调 [discussion:创建成功返回的讨论组对象]\n @param errorBlock      创建讨论组失败的回调 [status:创建失败的错误码]\n */\n- (void)createDiscussion:(NSString *)name\n              userIdList:(NSArray *)userIdList\n                 success:(void (^)(RCDiscussion *discussion))successBlock\n                   error:(void (^)(RCErrorCode status))errorBlock;\n\n/*!\n 讨论组加人，将用户加入讨论组\n \n @param discussionId    讨论组ID\n @param userIdList      需要加入的用户ID列表\n @param successBlock    讨论组加人成功的回调 [discussion:讨论组加人成功返回的讨论组对象]\n @param errorBlock      讨论组加人失败的回调 [status:讨论组加人失败的错误码]\n \n @discussion 设置的讨论组名称长度不能超过40个字符，否则将会截断为前40个字符。\n */\n- (void)addMemberToDiscussion:(NSString *)discussionId\n                   userIdList:(NSArray *)userIdList\n                      success:(void (^)(RCDiscussion *discussion))successBlock\n                        error:(void (^)(RCErrorCode status))errorBlock;\n\n/*!\n 讨论组踢人，将用户移出讨论组\n \n @param discussionId    讨论组ID\n @param userId          需要移出的用户ID\n @param successBlock    讨论组踢人成功的回调 [discussion:讨论组踢人成功返回的讨论组对象]\n @param errorBlock      讨论组踢人失败的回调 [status:讨论组踢人失败的错误码]\n \n @discussion 如果当前登陆用户不是此讨论组的创建者并且此讨论组没有开放加人权限，则会返回错误。\n \n @warning 不能使用此接口将自己移除，否则会返回错误。\n 如果您需要退出该讨论组，可以使用-quitDiscussion:success:error:方法。\n */\n- (void)removeMemberFromDiscussion:(NSString *)discussionId\n                            userId:(NSString *)userId\n                           success:(void (^)(RCDiscussion *discussion))successBlock\n                             error:(void (^)(RCErrorCode status))errorBlock;\n\n/*!\n 退出当前讨论组\n \n @param discussionId    讨论组ID\n @param successBlock    退出成功的回调 [discussion:退出成功返回的讨论组对象]\n @param errorBlock      退出失败的回调 [status:退出失败的错误码]\n */\n- (void)quitDiscussion:(NSString *)discussionId\n               success:(void (^)(RCDiscussion *discussion))successBlock\n                 error:(void (^)(RCErrorCode status))errorBlock;\n\n/*!\n 获取讨论组的信息\n \n @param discussionId    需要获取信息的讨论组ID\n @param successBlock    获取讨论组信息成功的回调 [discussion:获取的讨论组信息]\n @param errorBlock      获取讨论组信息失败的回调 [status:获取讨论组信息失败的错误码]\n */\n- (void)getDiscussion:(NSString *)discussionId\n              success:(void (^)(RCDiscussion *discussion))successBlock\n                error:(void (^)(RCErrorCode status))errorBlock;\n\n/*!\n 设置讨论组名称\n \n @param targetId                需要设置的讨论组ID\n @param discussionName          需要设置的讨论组名称，discussionName长度<=40\n @param successBlock            设置成功的回调\n @param errorBlock              设置失败的回调 [status:设置失败的错误码]\n \n @discussion 设置的讨论组名称长度不能超过40个字符，否则将会截断为前40个字符。\n */\n- (void)setDiscussionName:(NSString *)targetId\n                     name:(NSString *)discussionName\n                  success:(void (^)())successBlock\n                    error:(void (^)(RCErrorCode status))errorBlock;\n\n/*!\n 设置讨论组是否开放加人权限\n \n @param targetId        讨论组ID\n @param isOpen          是否开放加人权限\n @param successBlock    设置成功的回调\n @param errorBlock      设置失败的回调[status:设置失败的错误码]\n \n @discussion 讨论组默认开放加人权限，即所有成员都可以加人。\n 如果关闭加人权限之后，只有讨论组的创建者有加人权限。\n */\n- (void)setDiscussionInviteStatus:(NSString *)targetId\n                           isOpen:(BOOL)isOpen\n                          success:(void (^)())successBlock\n                            error:(void (^)(RCErrorCode status))errorBlock;\n\n#pragma mark - 群组操作（已废弃，请勿使用）\n\n/*!\n 同步当前用户所在的群组列表信息(已废弃，建议您通过您的App Server进行群组操作)\n \n @param groupList               群组信息RCGroup的列表\n @param successBlock            同步成功的回调\n @param errorBlock              同步失败的回调 [status:同步失败的错误码]\n \n @discussion 此方法已废弃，建议您通过您的App Server进行群组操作。\n 群组操作的流程，可以参考：http://support.rongcloud.cn/kb/MzY5\n \n @warning **已废弃，请勿使用。**\n */\n- (void)syncGroups:(NSArray *)groupList\n           success:(void (^)())successBlock\n             error:(void (^)(RCErrorCode status))errorBlock\n__deprecated_msg(\"已废弃，请勿使用。\");\n\n/*!\n 加入群组(已废弃，建议您通过您的App Server进行群组操作)\n \n @param groupId                 要加入的群组ID\n @param groupName               群组的名称\n @param successBlock            加入成功的回调\n @param errorBlock              加入失败的回调 [status:加入失败的错误码]\n \n @discussion 此方法已废弃，建议您通过您的App Server进行群组操作。\n 群组操作的流程，可以参考：http://support.rongcloud.cn/kb/MzY5\n \n @warning **已废弃，请勿使用。**\n */\n- (void)joinGroup:(NSString *)groupId\n        groupName:(NSString *)groupName\n          success:(void (^)())successBlock\n            error:(void (^)(RCErrorCode status))errorBlock\n__deprecated_msg(\"已废弃，请勿使用。\");\n\n/*!\n 退出群组(已废弃，建议您通过您的App Server进行群组操作)\n \n @param groupId                 要退出的群组ID\n @param successBlock            退出成功的回调\n @param errorBlock              退出失败的回调 [status:退出失败的错误码]\n \n @discussion 此方法已废弃，建议您通过您的App Server进行群组操作。\n 群组操作的流程，可以参考：http://support.rongcloud.cn/kb/MzY5\n \n @warning **已废弃，请勿使用。**\n */\n- (void)quitGroup:(NSString *)groupId\n          success:(void (^)())successBlock\n            error:(void (^)(RCErrorCode status))errorBlock\n__deprecated_msg(\"已废弃，请勿使用。\");\n\n#pragma mark - 聊天室操作\n\n/*!\n 加入聊天室（如果聊天室不存在则会创建）\n \n @param targetId                聊天室ID\n @param messageCount            进入聊天室时获取历史消息的数量，-1<=messageCount<=50\n @param successBlock            加入聊天室成功的回调\n @param errorBlock              加入聊天室失败的回调 [status:加入聊天室失败的错误码]\n \n @discussion 可以通过传入的messageCount设置加入聊天室成功之后，需要获取的历史消息数量。\n -1表示不获取任何历史消息，0表示不特殊设置而使用SDK默认的设置（默认为获取10条），0<messageCount<=50为具体获取的消息数量,最大值为50。\n */\n- (void)joinChatRoom:(NSString *)targetId\n        messageCount:(int)messageCount\n             success:(void (^)())successBlock\n               error:(void (^)(RCErrorCode status))errorBlock;\n\n\n/*!\n 加入已经存在的聊天室（如果不存在或超限会返回聊天室不存在错误23410 或 人数超限 23411）\n \n @param targetId                聊天室ID\n @param messageCount            进入聊天室时获取历史消息的数量，-1<=messageCount<=50\n @param successBlock            加入聊天室成功的回调\n @param errorBlock              加入聊天室失败的回调 [status:加入聊天室失败的错误码]\n \n @warning 注意：使用Kit库的会话页面viewDidLoad会自动调用joinChatRoom加入聊天室（聊天室不存在会自动创建），\n 如果您只想加入已存在的聊天室，需要在push到会话页面之前调用这个方法并且messageCount 传-1，成功之后push到会话页面，失败需要您做相应提示处理\n \n @discussion 可以通过传入的messageCount设置加入聊天室成功之后，需要获取的历史消息数量。\n -1表示不获取任何历史消息，0表示不特殊设置而使用SDK默认的设置（默认为获取10条），0<messageCount<=50为具体获取的消息数量,最大值为50。\n */\n- (void)joinExistChatRoom:(NSString *)targetId\n             messageCount:(int)messageCount\n                  success:(void (^)())successBlock\n                    error:(void (^)(RCErrorCode status))errorBlock;\n\n/*!\n 退出聊天室\n \n @param targetId                聊天室ID\n @param successBlock            退出聊天室成功的回调\n @param errorBlock              退出聊天室失败的回调 [status:退出聊天室失败的错误码]\n */\n- (void)quitChatRoom:(NSString *)targetId\n             success:(void (^)())successBlock\n               error:(void (^)(RCErrorCode status))errorBlock;\n\n/*!\n 获取聊天室的信息（包含部分成员信息和当前聊天室中的成员总数）\n \n @param targetId     聊天室ID\n @param count        需要获取的成员信息的数量（目前获取到的聊天室信息中仅包含不多于20人的成员信息，即0 <= count <= 20，传入0获取到的聊天室信息将或仅包含成员总数，不包含具体的成员列表）\n @param order        需要获取的成员列表的顺序（最早加入或是最晚加入的部分成员）\n @param successBlock 获取成功的回调 [chatRoomInfo:聊天室信息]\n @param errorBlock   获取失败的回调 [status:获取失败的错误码]\n \n @discussion 因为聊天室一般成员数量巨大，权衡效率和用户体验，目前返回的聊天室信息仅包含不多于20人的成员信息和当前成员总数。\n 如果您使用RC_ChatRoom_Member_Asc升序方式查询，将返回最早加入的成员信息列表，按加入时间从旧到新排列；\n 如果您使用RC_ChatRoom_Member_Desc降序方式查询，将返回最晚加入的成员信息列表，按加入时间从新到旧排列。\n */\n- (void)getChatRoomInfo:(NSString *)targetId\n                  count:(int)count\n                  order:(RCChatRoomMemberOrder)order\n                success:(void (^)(RCChatRoomInfo *chatRoomInfo))successBlock\n                  error:(void (^)(RCErrorCode status))errorBlock;\n\n#pragma mark 客服\n\n/*!\n 发起客服聊天\n \n @param customerServiceId       客服ID\n @param successBlock            发起客服会话成功的回调\n @param errorBlock              发起客服会话失败的回调 [status:失败的错误码]\n \n @discussion 此方法默认会发送一条RCHandShakeMessage消息，通知客服服务器用户即将开始聊天。\n \n @warning 仅支持客服1.0，客服2.0不需要进行任何操作。\n 如果你使用IMKit，请不要使用此方法。RCConversationViewController在viewDidLoad的时候默认已经做了处理。\n */\n- (void)joinCustomerServiceChat:(NSString *)customerServiceId\n                        success:(void (^)())successBlock\n                          error:(void (^)(RCErrorCode status))errorBlock;\n\n/*!\n 结束客服聊天\n \n @param customerServiceId       客服ID\n @param successBlock            结束客服会话成功的回调\n @param errorBlock              结束客服会话失败的回调 [status:失败的错误码]\n \n @discussion 此方法默认会发送一条RCSuspendMessage消息，通知客服服务器用户即将结束聊天。\n \n @warning 仅支持客服1.0，客服2.0不需要进行任何操作。\n 如果你使用IMKit，请不要使用此方法。RCConversationViewController在退出的时候默认已经做了处理。\n */\n- (void)quitCustomerServiceChat:(NSString *)customerServiceId\n                        success:(void (^)())successBlock\n                          error:(void (^)(RCErrorCode status))errorBlock;\n\n#pragma mark - 公众服务\n\n/*!\n 查找公众服务账号\n \n @param searchType                  查找匹配方式\n @param searchKey                   查找关键字\n @param successBlock                查找成功的回调 [accounts:查找到的公众服务账号信息RCPublicServiceProfile的数组]\n @param errorBlock                  查找失败的回调 [status:失败的错误码]\n */\n- (void)searchPublicService:(RCSearchType)searchType\n                  searchKey:(NSString *)searchKey\n                    success:(void (^)(NSArray *accounts))successBlock\n                      error:(void (^)(RCErrorCode status))errorBlock;\n\n/*!\n 按类型查找公众服务账号\n \n @param publicServiceType           公众服务账号的类型\n @param searchType                  查找匹配方式\n @param searchKey                   查找关键字\n @param successBlock                查找成功的回调 [accounts:查找到的公众服务账号信息RCPublicServiceProfile的数组]\n @param errorBlock                  查找失败的回调 [status:失败的错误码]\n */\n- (void)searchPublicServiceByType:(RCPublicServiceType)publicServiceType\n                       searchType:(RCSearchType)searchType\n                        searchKey:(NSString *)searchKey\n                          success:(void (^)(NSArray *accounts))successBlock\n                            error:(void (^)(RCErrorCode status))errorBlock;\n\n/*!\n 关注公众服务账号\n \n @param publicServiceType       公众服务账号的类型\n @param publicServiceId         公众服务的账号ID\n @param successBlock            关注成功的回调\n @param errorBlock              关注失败的回调 [status:失败的错误码]\n */\n- (void)subscribePublicService:(RCPublicServiceType)publicServiceType\n               publicServiceId:(NSString *)publicServiceId\n                       success:(void (^)())successBlock\n                         error:(void (^)(RCErrorCode status))errorBlock;\n\n/*!\n 取消关注公众服务账号\n \n @param publicServiceType       公众服务账号的类型\n @param publicServiceId         公众服务的账号ID\n @param successBlock            取消关注成功的回调\n @param errorBlock              取消关注失败的回调 [status:失败的错误码]\n */\n- (void)unsubscribePublicService:(RCPublicServiceType)publicServiceType\n                 publicServiceId:(NSString *)publicServiceId\n                         success:(void (^)())successBlock\n                           error:(void (^)(RCErrorCode status))errorBlock;\n\n/*!\n 查询已关注的公众服务账号\n \n @return 公众服务信息RCPublicServiceProfile列表\n */\n- (NSArray *)getPublicServiceList;\n\n/*!\n 获取公众服务账号信息\n \n @param publicServiceType       公众服务账号的类型\n @param publicServiceId         公众服务的账号ID\n @return                        公众服务账号的信息\n \n @discussion 此方法会从本地缓存中获取公众服务账号信息\n */\n- (RCPublicServiceProfile *)getPublicServiceProfile:(RCPublicServiceType)publicServiceType\n                                    publicServiceId:(NSString *)publicServiceId;\n\n/*!\n 获取公众服务账号信息\n \n @param targetId                        公众服务的账号ID\n @param type                            公众服务账号的类型\n @param onSuccess                       获取成功的回调 [serviceProfile:获取到的公众账号信息]\n @param onError                         获取失败的回调 [error:失败的错误码]\n @return                                公众服务账号的信息\n \n @discussion 此方法会从服务器获取公众服务账号信息\n */\n- (void)getPublicServiceProfile:(NSString *)targetId\n               conversationType:(RCConversationType)type\n                      onSuccess:(void (^)(RCPublicServiceProfile *serviceProfile))onSuccess\n                        onError:(void (^)(NSError *error))onError;\n\n/*!\n 获取公众服务使用的WebView Controller\n \n @param URLString   准备打开的URL\n @return            公众服务使用的WebView Controller\n */\n- (UIViewController *)getPublicServiceWebViewController:(NSString *)URLString;\n\n#pragma mark - 推送业务数据统计\n\n/*!\n 统计App启动的事件\n \n @param launchOptions   App的启动附加信息\n \n @discussion 此方法用于统计融云推送服务的点击率。\n 如果您需要统计推送服务的点击率，只需要在AppDelegate的-application:didFinishLaunchingWithOptions:中，\n 调用此方法并将launchOptions传入即可。\n */\n- (void)recordLaunchOptionsEvent:(NSDictionary *)launchOptions;\n\n/*!\n 统计本地通知的事件\n \n @param notification   本体通知的内容\n \n @discussion 此方法用于统计融云推送服务的点击率。\n 如果您需要统计推送服务的点击率，只需要在AppDelegate的-application:didReceiveLocalNotification:中，\n 调用此方法并将launchOptions传入即可。\n */\n- (void)recordLocalNotificationEvent:(UILocalNotification *)notification;\n\n/*!\n 统计远程推送的事件\n \n @param userInfo    远程推送的内容\n \n @discussion 此方法用于统计融云推送服务的点击率。\n 如果您需要统计推送服务的点击率，只需要在AppDelegate的-application:didReceiveRemoteNotification:中，\n 调用此方法并将launchOptions传入即可。\n */\n- (void)recordRemoteNotificationEvent:(NSDictionary *)userInfo;\n\n/*!\n 获取点击的启动事件中，融云推送服务的扩展字段\n \n @param launchOptions   App的启动附加信息\n @return                收到的融云推送服务的扩展字段，nil表示该启动事件不包含来自融云的推送服务\n \n @discussion 此方法仅用于获取融云推送服务的扩展字段。\n */\n- (NSDictionary *)getPushExtraFromLaunchOptions:(NSDictionary *)launchOptions;\n\n/*!\n 获取点击的远程推送中，融云推送服务的扩展字段\n \n @param userInfo    远程推送的内容\n @return            收到的融云推送服务的扩展字段，nil表示该远程推送不包含来自融云的推送服务\n \n @discussion 此方法仅用于获取融云推送服务的扩展字段。\n */\n- (NSDictionary *)getPushExtraFromRemoteNotification:(NSDictionary *)userInfo;\n\n#pragma mark - 工具类方法\n\n/*!\n 获取当前IMLib SDK的版本号\n \n @return 当前IMLib SDK的版本号，如: @\"2.0.0\"\n */\n- (NSString *)getSDKVersion;\n\n/*!\n 将AMR格式的音频数据转化为WAV格式的音频数据\n \n @param data    AMR格式的音频数据，必须是AMR-NB的格式\n @return        WAV格式的音频数据\n */\n- (NSData *)decodeAMRToWAVE:(NSData *)data;\n\n/*!\n 将WAV格式的音频数据转化为AMR格式的音频数据（8KHz采样）\n \n @param data            WAV格式的音频数据\n @param nChannels       声道数\n @param nBitsPerSample  采样位数（精度）\n @return                AMR-NB格式的音频数据\n \n @discussion 此方法为工具类方法，您可以使用此方法将任意WAV音频转换为AMR-NB格式的音频。\n \n @warning 如果您想和SDK自带的语音消息保持一致和互通，考虑到跨平台和传输的原因，SDK对于WAV音频有所限制.\n 具体可以参考RCVoiceMessage中的音频参数说明(nChannels为1，nBitsPerSample为16)。\n */\n- (NSData *)encodeWAVEToAMR:(NSData *)data\n                   channel:(int)nChannels\n            nBitsPerSample:(int)nBitsPerSample;\n\n@end\n#endif\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCImageMessage.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCImageMessage.h\n//  Created by Heq.Shinoda on 14-6-13.\n\n#import \"RCMessageContent.h\"\n#import <UIKit/UIKit.h>\n\n/*!\n 图片消息的类型名\n */\n#define RCImageMessageTypeIdentifier @\"RC:ImgMsg\"\n\n/*!\n 图片消息类\n \n @discussion 图片消息类，此消息会进行存储并计入未读消息数。\n */\n@interface RCImageMessage : RCMessageContent <NSCoding>\n\n/*!\n 图片消息的URL地址\n \n @discussion 发送方此字段为图片的本地路径，接收方此字段为网络URL地址。\n */\n@property(nonatomic, strong) NSString *imageUrl;\n\n/*!\n 图片消息的缩略图\n */\n@property(nonatomic, strong) UIImage *thumbnailImage;\n\n/*!\n 是否发送原图\n \n @discussion 在发送图片的时候，是否发送原图，默认值为NO。\n */\n@property(nonatomic, getter=isFull) BOOL full;\n\n/*!\n 图片消息的附加信息\n */\n@property(nonatomic, strong) NSString *extra;\n\n/*!\n 图片消息的原始图片信息\n */\n@property(nonatomic, strong) UIImage *originalImage;\n\n/*!\n 初始化图片消息\n \n @param image   原始图片\n @return        图片消息对象\n */\n+ (instancetype)messageWithImage:(UIImage *)image;\n\n/*!\n 初始化图片消息\n \n @param imageURI    图片的本地路径\n @return            图片消息对象\n */\n+ (instancetype)messageWithImageURI:(NSString *)imageURI;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCInformationNotificationMessage.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCInformationNotificationMessage.h\n//  Created by xugang on 14/12/4.\n\n#import \"RCMessageContent.h\"\n\n/*!\n 通知消息的类型名\n */\n#define RCInformationNotificationMessageIdentifier @\"RC:InfoNtf\"\n\n/*!\n 通知消息类\n \n @discussion 通知消息类，此消息会进行存储，但不计入未读消息数。\n */\n@interface RCInformationNotificationMessage : RCMessageContent\n\n/*!\n 通知的内容\n */\n@property(nonatomic, strong) NSString *message;\n\n/*!\n 通知的附加信息\n */\n@property(nonatomic, strong) NSString *extra;\n\n/*!\n 初始化通知消息\n \n @param message 通知的内容\n @param extra   通知的附加信息\n @return        通知消息对象\n */\n+ (instancetype)notificationWithMessage:(NSString *)message\n                                  extra:(NSString *)extra;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCLocationMessage.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCLocationMessage.h\n//  Created by Heq.Shinoda on 14-6-13.\n\n#import <UIKit/UIKit.h>\n#import <CoreLocation/CoreLocation.h>\n#import \"RCMessageContent.h\"\n\n/*!\n 地理位置消息的类型名\n */\n#define RCLocationMessageTypeIdentifier @\"RC:LBSMsg\"\n\n/*!\n 地理位置消息类\n \n @discussion 地理位置消息类，此消息会进行存储并计入未读消息数。\n */\n@interface RCLocationMessage : RCMessageContent <NSCoding>\n\n/*!\n 地理位置的二维坐标\n */\n@property(nonatomic, assign) CLLocationCoordinate2D location;\n\n/*!\n 地理位置的名称\n */\n@property(nonatomic, strong) NSString *locationName;\n\n/*!\n 地理位置的缩略图\n */\n@property(nonatomic, strong) UIImage *thumbnailImage;\n\n/*!\n 地理位置的附加信息\n */\n@property(nonatomic, strong) NSString *extra;\n\n/*!\n 初始化地理位置消息\n \n @param image 地理位置的缩略图\n @param location 地理位置的二维坐标\n @param locationName 地理位置的名称\n @return 地理位置消息的对象\n */\n+ (instancetype)messageWithLocationImage:(UIImage *)image\n                                location:(CLLocationCoordinate2D)location\n                            locationName:(NSString *)locationName;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCMessage.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCMessage.h\n//  Created by Heq.Shinoda on 14-6-13.\n\n#ifndef __RCMessage\n#define __RCMessage\n#import <Foundation/Foundation.h>\n#import \"RCStatusDefine.h\"\n#import \"RCMessageContent.h\"\n\n/*!\n 消息实体类\n \n @discussion 消息实体类，包含消息的所有属性。\n */\n@interface RCMessage : NSObject <NSCopying, NSCoding>\n\n/*!\n 会话类型\n */\n@property(nonatomic, assign) RCConversationType conversationType;\n\n/*!\n 目标会话ID\n */\n@property(nonatomic, strong) NSString *targetId;\n\n/*!\n 消息的ID\n \n @discussion 本地存储的消息的唯一值（数据库索引唯一值）\n */\n@property(nonatomic, assign) long messageId;\n\n/*!\n 消息的方向\n */\n@property(nonatomic, assign) RCMessageDirection messageDirection;\n\n/*!\n 消息的发送者ID\n */\n@property(nonatomic, strong) NSString *senderUserId;\n\n/*!\n 消息的接收状态\n */\n@property(nonatomic, assign) RCReceivedStatus receivedStatus;\n\n/*!\n 消息的发送状态\n */\n@property(nonatomic, assign) RCSentStatus sentStatus;\n\n/*!\n 消息的接收时间（Unix时间戳、毫秒）\n */\n@property(nonatomic, assign) long long receivedTime;\n\n/*!\n 消息的发送时间（Unix时间戳、毫秒）\n */\n@property(nonatomic, assign) long long sentTime;\n\n/*!\n 消息的类型名\n */\n@property(nonatomic, strong) NSString *objectName;\n\n/*!\n 消息的内容\n */\n@property(nonatomic, strong) RCMessageContent *content;\n\n/*!\n 消息的附加字段\n */\n@property(nonatomic, strong) NSString *extra;\n\n/*!\n 全局唯一ID\n \n @discussion 服务器消息唯一ID（在同一个Appkey下全局唯一）\n */\n@property(nonatomic, strong) NSString *messageUId;\n\n/*!\n RCMessage初始化方法\n \n @param  conversationType    会话类型\n @param  targetId            目标会话ID\n @param  messageDirection    消息的方向\n @param  messageId           消息的ID\n @param  content             消息的内容\n */\n- (instancetype)initWithType:(RCConversationType)conversationType\n                    targetId:(NSString *)targetId\n                   direction:(RCMessageDirection)messageDirection\n                   messageId:(long)messageId\n                     content:(RCMessageContent *)content;\n\n/*!\n RCMessage初始化方法（已废弃，请勿使用）\n \n @param jsonData    消息的JSON Dictionary\n @return            消息实体对象\n \n @warning **已废弃，请勿使用。**\n */\n+ (instancetype)messageWithJSON:(NSDictionary *)jsonData\n__deprecated_msg(\"已废弃，请勿使用。\");\n\n@end\n#endif\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCMessageContent.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCMessageContent.h\n//  Created by Heq.Shinoda on 14-6-13.\n\n#ifndef __RCMessageContent\n#define __RCMessageContent\n\n#import <Foundation/Foundation.h>\n#import \"RCStatusDefine.h\"\n#import \"RCUserInfo.h\"\n\n/*!\n 消息内容的编解码协议\n \n @discussion 用于标示消息内容的类型，进行消息的编码和解码。\n 所有自定义消息必须实现此协议，否则将无法正常传输和使用。\n */\n@protocol RCMessageCoding <NSObject>\n@required\n\n/*!\n 将消息内容序列化，编码成为可传输的json数据\n \n @discussion 消息内容通过此方法，将消息中的所有数据，编码成为json数据，返回的json数据将用于网络传输。\n */\n- (NSData *)encode;\n\n/*!\n 将json数据的内容反序列化，解码生成可用的消息内容\n \n @param data    消息中的原始json数据\n \n @discussion 网络传输的json数据，会通过此方法解码，获取消息内容中的所有数据，生成有效的消息内容。\n */\n- (void)decodeWithData:(NSData *)data;\n\n/*!\n 返回消息的类型名\n \n @return 消息的类型名\n \n @discussion 您定义的消息类型名，需要在各个平台上保持一致，以保证消息互通。\n \n @warning 请勿使用@\"RC:\"开头的类型名，以免和SDK默认的消息名称冲突\n */\n+ (NSString *)getObjectName;\n\n@end\n\n/*!\n 消息内容的存储协议\n \n @discussion 用于确定消息内容的存储策略。\n 所有自定义消息必须实现此协议，否则将无法正常存储和使用。\n */\n@protocol RCMessagePersistentCompatible <NSObject>\n@required\n\n/*!\n 返回消息的存储策略\n \n @return 消息的存储策略\n \n @discussion 指明此消息类型在本地是否存储、是否计入未读消息数。\n */\n+ (RCMessagePersistent)persistentFlag;\n@end\n\n/*!\n 消息内容摘要的协议\n \n @discussion 用于在会话列表和本地通知中显示消息的摘要。\n */\n@protocol RCMessageContentView\n@optional\n\n/*!\n 返回在会话列表和本地通知中显示的消息内容摘要\n \n @return 会话列表和本地通知中显示的消息内容摘要\n \n @discussion 如果您使用IMKit，当会话的最后一条消息为自定义消息时，需要通过此方法获取在会话列表展现的内容摘要；\n 当App在后台收到消息时，需要通过此方法获取在本地通知中展现的内容摘要。\n */\n- (NSString *)conversationDigest;\n\n@end\n\n/*!\n 消息内容的基类\n \n @discussion 此类为消息实体类RCMessage中的消息内容content的基类。\n 所有的消息内容均为此类的子类，包括SDK自带的消息（如RCTextMessage、RCImageMessage等）和用户自定义的消息。\n 所有的自定义消息必须继承此类，并实现RCMessageCoding和RCMessagePersistentCompatible、RCMessageContentView协议。\n */\n@interface RCMessageContent : NSObject <RCMessageCoding, RCMessagePersistentCompatible, RCMessageContentView>\n\n/*!\n 消息内容中携带的发送者的用户信息\n \n @discussion 如果您使用IMKit，可以通过RCIM的enableMessageAttachUserInfo属性设置在每次发送消息中携带发送者的用户信息。\n */\n@property(nonatomic, strong) RCUserInfo *senderUserInfo;\n\n/*!\n 将消息内容中携带的用户信息解码\n \n @param dictionary 用户信息的Dictionary\n */\n-(void)decodeUserInfo:(NSDictionary *)dictionary;\n\n/*!\n 消息内容的原始json数据\n \n @discussion 此字段存放消息内容中未编码的json数据。\n SDK内置的消息，如果消息解码失败，默认会将消息的内容存放到此字段；如果编码和解码正常，此字段会置为nil。\n */\n@property(nonatomic, strong, setter=setRawJSONData:) NSData *rawJSONData;\n\n@end\n#endif"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCMessageContentView.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCMessageContentView.h\n//  Created by litao on 15/4/27.\n\n#ifndef RongIMLib_RCMessageContentView_h\n#define RongIMLib_RCMessageContentView_h\n\n///此协议已经移到RCMessageContent中\n\n///*!\n// 消息内容摘要的协议\n// \n// @discussion 用于在会话列表中显示消息的摘要。\n// \n// @warning 此协议已经移到RCMessageContent中\n// */\n//@protocol RCMessageContentView\n//@optional\n//\n///*!\n// 返回在会话列表中显示的消息内容摘要\n// \n// @return 会话列表中显示的消息内容摘要\n// \n// @discussion 当会话的最后一条消息为自定义消息时，需要在会话列表展现消息内容的摘要。\n// 如果您使用IMKit，实现了此接口，RCConversationListViewController会在会话列表中显示该内容摘要。\n// */\n//- (NSString *)conversationDigest;\n//\n//@end\n\n#endif\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCProfileNotificationMessage.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCProfileNotificationMessage.h\n//  Created by xugang on 14/11/28.\n\n#import \"RCMessageContent.h\"\n\n/*!\n 公众服务账号信息变更消息的类型名\n */\n#define RCProfileNotificationMessageIdentifier @\"RC:ProfileNtf\"\n\n/*!\n 公众服务账号信息变更消息类\n \n @discussion 公众服务账号信息变更消息类，此消息会进行存储，但不计入未读消息数。\n */\n@interface RCProfileNotificationMessage : RCMessageContent\n\n/*!\n公众服务账号信息变更的操作名\n*/\n@property(nonatomic, strong) NSString *operation;\n\n/*!\n 信息变更的数据，可以为任意格式，如json数据。\n */\n@property(nonatomic, strong) NSString *data;\n\n/*!\n 信息变更的附加信息\n */\n@property(nonatomic, strong) NSString *extra;\n\n/*!\n 初始化公众服务账号信息变更消息\n \n @param operation   信息变更的操作名\n @param data        信息变更的数据\n @param extra       信息变更的附加信息\n @return            公众服务账号信息变更消息的对象\n */\n+ (instancetype)notificationWithOperation:(NSString *)operation\n                                     data:(NSString *)data\n                                    extra:(NSString *)extra;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCPublicServiceCommandMessage.h",
    "content": "//\n//  RCPublicServiceCommandMessage.h\n//  RongIMLib\n//\n//  Created by litao on 15/6/23.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#import \"RCMessageContent.h\"\n#import \"RCPublicServiceMenuItem.h\"\n\n/*!\n 公众服务请求消息的类型名\n */\n#define RCPublicServiceCommandMessageTypeIdentifier @\"RC:PSCmd\"\n\n/*!\n 公众服务请求消息类\n \n @discussion 公众服务请求消息类，此消息不存储，也不计入未读消息数。\n 此消息仅用于客户端公共服务账号中的菜单，向服务器发送请求。\n */\n@interface RCPublicServiceCommandMessage : RCMessageContent\n\n/*!\n 请求的名称\n */\n@property(nonatomic, strong) NSString *command;\n\n/*!\n 请求的内容\n */\n@property(nonatomic, strong) NSString *data;\n\n/*!\n 请求的扩展数据\n */\n@property(nonatomic, strong) NSString *extra;\n\n/*!\n 初始化公众服务请求消息\n \n @param item    公众服务菜单项\n @return        公众服务请求消息对象\n */\n+ (instancetype)messageFromMenuItem:(RCPublicServiceMenuItem *)item;\n\n/*!\n 初始化公众服务请求消息\n \n @param command     请求的名称\n @param data        请求的内容\n @return            公众服务请求消息对象\n */\n+ (instancetype)messageWithCommand:(NSString *)command\n                              data:(NSString *)data;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCPublicServiceMenu.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCPublicServiceMenu.h\n//  Created by litao on 15/4/14.\n\n#import <Foundation/Foundation.h>\n#import \"RCPublicServiceMenuItem.h\"\n\n/*!\n 公众服务账号菜单类\n \n @discussion 公众服务菜单类，其中包含若干数量的菜单项，每个菜单项可能还包含子菜单项。\n 公众服务菜单的树状结构如下所示：\n Menu -> MenuItem1\n         MenuItem2  -> MenuItem2.1\n                       MenuItem2.2\n         MenuItem3  -> MenuItem3.1\n                       MenuItem3.2\n                       MenuItem3.3\n */\n@interface RCPublicServiceMenu : NSObject\n\n/*!\n 菜单中包含的所有菜单项RCPublicServiceMenuItem数组\n */\n@property(nonatomic, strong) NSArray *menuItems;\n\n/*!\n 将公众服务菜单下的所有菜单项解码（已废弃，请勿使用）\n \n @param jsonDictionary  公众服务菜单项Json组成的数组\n \n @warning **已废弃，请勿使用。**\n */\n- (void)decodeWithJsonDictionaryArray:(NSArray *)jsonDictionary\n__deprecated_msg(\"已废弃，请勿使用。\");\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCPublicServiceMenuItem.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCPublicServiceMenuItem.h\n//  Created by litao on 15/4/14.\n\n#import <Foundation/Foundation.h>\n#import \"RCStatusDefine.h\"\n\n/*!\n 公众服务的菜单项\n */\n@interface RCPublicServiceMenuItem : NSObject\n\n/*!\n 菜单的ID\n */\n@property(nonatomic, strong) NSString *id;\n\n/*!\n 菜单的标题\n */\n@property(nonatomic, strong) NSString *name;\n\n/*!\n 菜单的URL链接\n */\n@property(nonatomic, strong) NSString *url;\n\n/*!\n 菜单的类型\n */\n@property(nonatomic) RCPublicServiceMenuItemType type;\n\n/*!\n 菜单中的子菜单\n \n @discussion 子菜单为RCPublicServiceMenuItem的数组\n */\n@property(nonatomic, strong) NSArray *subMenuItems;\n\n/*!\n 将菜单项的json数组解码（已废弃，请勿使用）\n \n @param jsonArray   由菜单项原始Json数据组成的数组\n @return            公众服务菜单项RCPublicServiceMenuItem的数组\n \n @warning **已废弃，请勿使用。**\n */\n+ (NSArray *)menuItemsFromJsonArray:(NSArray *)jsonArray\n__deprecated_msg(\"已废弃，请勿使用。\");\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCPublicServiceMultiRichContentMessage.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCPublicServiceMultiRichContentMessage.h\n//  Created by litao on 15/4/13.\n\n#import \"RCMessageContent.h\"\n\n/*!\n 公众服务的多图文消息的类型名\n */\n#define RCPublicServiceRichContentTypeIdentifier @\"RC:PSMultiImgTxtMsg\"\n\n/*!\n 公众服务的多图文消息类\n \n @discussion 公众服务的多图文消息类，此消息会进行存储并计入未读消息数。\n */\n@interface RCPublicServiceMultiRichContentMessage : RCMessageContent\n\n/*!\n 多图文消息的内容RCRichContentItem数组\n */\n@property(nonatomic, strong) NSArray *richConents;\n\n/*!\n 多图文消息的附加信息\n */\n@property(nonatomic, strong) NSString *extra;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCPublicServiceProfile.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCPublicServiceProfile.h\n//  Created by litao on 15/4/9.\n\n#import <Foundation/Foundation.h>\n#import <CoreLocation/CoreLocation.h>\n#import \"RCStatusDefine.h\"\n#import \"RCPublicServiceMenu.h\"\n\n/*!\n 公众服务账号信息\n */\n@interface RCPublicServiceProfile : NSObject\n\n/*!\n 公众服务账号的名称\n */\n@property(nonatomic, strong) NSString *name;\n\n/*!\n 公众服务账号的描述\n */\n@property(nonatomic, strong) NSString *introduction;\n\n/*!\n 公众服务账号的ID\n */\n@property(nonatomic, strong) NSString *publicServiceId;\n\n/*!\n 公众服务账号头像URL\n */\n@property(nonatomic, strong) NSString *portraitUrl;\n\n/*!\n 公众服务账号的所有者\n \n @discussion 当前版本暂不支持。\n */\n@property(nonatomic, strong) NSString *owner;\n\n/*!\n 公众服务账号所有者的URL\n \n @discussion 当前版本暂不支持。\n */\n@property(nonatomic, strong) NSString *ownerUrl;\n\n/*!\n 公众服务账号的联系电话\n \n @discussion 当前版本暂不支持。\n */\n@property(nonatomic, strong) NSString *publicServiceTel;\n\n/*!\n 公众服务账号历史消息\n \n @discussion 当前版本暂不支持。\n */\n@property(nonatomic, strong) NSString *histroyMsgUrl;\n\n/*!\n 公众服务账号地理位置\n \n @discussion 当前版本暂不支持。\n */\n@property(nonatomic, strong) CLLocation *location;\n\n/*!\n 公众服务账号经营范围\n \n @discussion 当前版本暂不支持。\n */\n@property(nonatomic, strong) NSString *scope;\n\n/*!\n 公众服务账号类型\n */\n@property(nonatomic) RCPublicServiceType publicServiceType;\n\n/*!\n 是否关注该公众服务账号\n */\n@property(nonatomic, getter=isFollowed) BOOL followed;\n\n/*!\n 公众服务账号菜单\n */\n@property(nonatomic, strong) RCPublicServiceMenu *menu;\n\n/*!\n 公众服务账号的全局属性\n \n @discussion 此公众服务账号是否设置为所有用户均关注。\n */\n@property(nonatomic, getter=isGlobal) BOOL global;\n\n/*!\n 公众服务账号信息的json数据\n */\n@property(nonatomic, strong) NSDictionary *jsonDict;\n\n/*!\n 初始化公众服务账号信息\n \n @param jsonContent    公众藏獒信息的json数据\n */\n- (void)initContent:(NSString *)jsonContent;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCPublicServiceRichContentMessage.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCPublicServiceMultiRichContentMessage.h\n//  Created by litao on 15/4/15.\n\n#import \"RCMessageContent.h\"\n#import \"RCRichContentItem.h\"\n\n/*!\n 公众服务图文消息的类型名\n */\n#define RCSingleNewsMessageTypeIdentifier @\"RC:PSImgTxtMsg\"\n\n/*!\n 公众服务图文消息类\n \n @discussion 公众服务图文消息类，此消息会进行存储并计入未读消息数。\n */\n@interface RCPublicServiceRichContentMessage : RCMessageContent\n\n/*!\n 公众服务图文信息条目RCRichContentItem内容\n */\n@property(nonatomic, strong) RCRichContentItem *richConent;\n\n/*!\n 图文消息的附加信息\n */\n@property(nonatomic, strong) NSString *extra;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCRealTimeLocationEndMessage.h",
    "content": "//\n//  RCRealTimeLocationEndMessage.h\n//  RongIMLib\n//\n//  Created by 杜立召 on 15/8/13.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#import \"RCMessageContent.h\"\n\n/*!\n 实时位置共享的结束消息的类型名\n */\n#define RCRealTimeLocationEndMessageTypeIdentifier @\"RC:RLEnd\"\n\n/*!\n 实时位置共享的结束消息类\n \n @discussion 实时位置共享的结束消息类，此消息会进行存储并计入未读消息数。\n */\n@interface RCRealTimeLocationEndMessage : RCMessageContent\n\n/*!\n 结束消息的附加信息\n */\n@property(nonatomic, strong) NSString *extra;\n\n/*!\n 初始化实时位置共享的结束消息\n \n @param extra   附加信息\n @return        初始化实时位置共享的结束消息对象\n */\n+ (instancetype)messageWithExtra:(NSString *)extra;\n\n@end"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCRealTimeLocationManager.h",
    "content": "//\n//  RCRealTimeLocationManager.h\n//  RongIMLib\n//\n//  Created by litao on 15/7/14.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <CoreLocation/CoreLocation.h>\n#import \"RCIMClient.h\"\n\n/*!\n 实时位置共享状态\n */\ntypedef NS_ENUM(NSInteger, RCRealTimeLocationStatus) {\n    /*!\n     实时位置共享，初始状态\n     */\n    RC_REAL_TIME_LOCATION_STATUS_IDLE,\n    /*!\n     实时位置共享，接收状态\n     */\n    RC_REAL_TIME_LOCATION_STATUS_INCOMING,\n    /*!\n     实时位置共享，发起状态\n     */\n    RC_REAL_TIME_LOCATION_STATUS_OUTGOING,\n    /*!\n     实时位置共享，共享状态\n     */\n    RC_REAL_TIME_LOCATION_STATUS_CONNECTED\n};\n\n/*!\n 实时位置共享错误码\n */\ntypedef NS_ENUM(NSInteger, RCRealTimeLocationErrorCode) {\n    /*!\n     当前设备不支持实时位置共享\n     */\n    RC_REAL_TIME_LOCATION_NOT_SUPPORT,\n    /*!\n     当前会话不支持实时位置共享\n     */\n    RC_REAL_TIME_LOCATION_CONVERSATION_NOT_SUPPORT,\n    /*!\n     当前会话超出了参与者人数限制\n     */\n    RC_REAL_TIME_LOCATION_EXCEED_MAX_PARTICIPANT,\n    /*!\n     获取当前会话信息失败\n     */\n    RC_REAL_TIME_LOCATION_GET_CONVERSATION_FAILURE\n};\n\n/*!\n 实时位置共享监听器\n */\n@protocol RCRealTimeLocationObserver <NSObject>\n@optional\n\n/*!\n 实时位置共享状态改变的回调\n \n @param status  当前实时位置共享的状态\n */\n- (void)onRealTimeLocationStatusChange:(RCRealTimeLocationStatus)status;\n\n/*!\n 参与者位置发生变化的回调\n \n @param location    参与者的当前位置\n @param userId      位置发生变化的参与者的用户ID\n */\n- (void)onReceiveLocation:(CLLocation *)location\n               fromUserId:(NSString *)userId;\n\n/*!\n 有参与者加入实时位置共享的回调\n \n @param userId      加入实时位置共享的参与者的用户ID\n */\n- (void)onParticipantsJoin:(NSString *)userId;\n\n/*!\n 有参与者退出实时位置共享的回调\n \n @param userId      退出实时位置共享的参与者的用户ID\n */\n- (void)onParticipantsQuit:(NSString *)userId;\n\n/*!\n 更新位置信息失败的回调\n \n @param description     失败信息\n */\n- (void)onUpdateLocationFailed:(NSString *)description;\n\n/*!\n 发起实时位置共享失败后执行\n \n @param messageId   发起失败的消息ID\n */\n- (void)onStartRealTimeLocationFailed:(long)messageId;\n\n@end\n\n/*!\n 实时位置共享代理\n */\n@protocol RCRealTimeLocationProxy <NSObject>\n\n/*!\n 发起实时位置共享\n */\n- (void)startRealTimeLocation;\n\n/*!\n 加入实时位置共享\n */\n- (void)joinRealTimeLocation;\n\n/*!\n 退出实时位置共享\n */\n- (void)quitRealTimeLocation;\n\n/*!\n 注册实时位置共享监听\n \n @param delegate    实时位置共享监听\n */\n- (void)addRealTimeLocationObserver:(id<RCRealTimeLocationObserver>)delegate;\n\n/*!\n 移除实时位置共享监听\n \n @param delegate    实时位置共享监听\n */\n- (void)removeRealTimeLocationObserver:(id<RCRealTimeLocationObserver>)delegate;\n\n/*!\n 获取当前实时位置共享的参与者列表\n \n @return    当前参与者列表\n */\n- (NSArray *)getParticipants;\n\n/*!\n 获取当前实时位置共享状态\n \n @return    当前实时位置共享状态\n */\n- (RCRealTimeLocationStatus)getStatus;\n\n/*!\n 获取参与者的当前位置\n \n @param userId  需要获取参与者的用户ID\n \n @return        该参与者的位置信息\n */\n- (CLLocation *)getLocation:(NSString *)userId;\n\n@end\n\n/*!\n 实时位置共享管理类\n */\n@interface RCRealTimeLocationManager : NSObject\n\n/*!\n 获取实时位置共享的核心类单例\n \n @return    实时位置共享的核心类单例\n */\n+ (instancetype)sharedManager;\n\n/*!\n 获取实时位置共享的代理\n \n @param conversationType    会话类型\n @param targetId            目标会话ID\n @param successBlock        获取代理成功的处理\n @param errorBlock          获取代理失败的处理\n */\n- (void)getRealTimeLocationProxy:(RCConversationType)conversationType\n                        targetId:(NSString *)targetId\n                         success:(void (^)(id<RCRealTimeLocationProxy> locationShare))successBlock\n                           error:(void (^)(RCRealTimeLocationErrorCode status))errorBlock;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCRealTimeLocationStartMessage.h",
    "content": "//\n//  RCRealTimeLocationStartMessage.h\n//  RongIMLib\n//\n//  Created by litao on 15/7/14.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#import \"RCMessageContent.h\"\n\n/*!\n 实时位置共享的发起消息的类型名\n */\n#define RCRealTimeLocationStartMessageTypeIdentifier @\"RC:RLStart\"\n\n/*!\n 实时位置共享的发起消息类\n \n @discussion 实时位置共享的发起消息类，此消息会进行存储并计入未读消息数。\n */\n@interface RCRealTimeLocationStartMessage : RCMessageContent\n\n/*!\n 发起消息的附加信息\n */\n@property(nonatomic, strong) NSString *extra;\n\n/*!\n 初始化实时位置共享的发起消息\n \n @param extra   附加信息\n @return        初始化实时位置共享的发起消息对象\n */\n+ (instancetype)messageWithExtra:(NSString *)extra;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCRichContentItem.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCRichContentItem.h\n//  Created by Dulizhao on 15/4/21.\n\n#import <Foundation/Foundation.h>\n\n/*!\n 公众服务图文信息条目类\n \n @discussion 图文消息类，此消息会进行存储并计入未读消息数。\n */\n@interface RCRichContentItem : NSObject\n\n/*!\n 图文信息条目的标题\n */\n@property(nonatomic, strong) NSString *title;\n\n/*!\n 图文信息条目的内容摘要\n */\n@property(nonatomic, strong) NSString *digest;\n\n/*!\n 图文信息条目的图片URL\n */\n@property(nonatomic, strong) NSString *imageURL;\n\n/*!\n 图文信息条目中包含的需要跳转到的URL\n */\n@property(nonatomic, strong) NSString *url;\n\n/*!\n 图文信息条目的扩展信息\n */\n@property(nonatomic, strong) NSString *extra;\n\n/*!\n 初始化公众服务图文信息条目\n \n @param title       图文信息条目的标题\n @param digest      图文信息条目的内容摘要\n @param imageURL    图文信息条目的图片URL\n @param extra       图文信息条目的扩展信息\n @return            图文信息条目对象\n */\n+ (instancetype)messageWithTitle:(NSString *)title\n                          digest:(NSString *)digest\n                        imageURL:(NSString *)imageURL\n                           extra:(NSString *)extra;\n\n/*!\n 初始化公众服务图文信息条目\n \n @param title       图文信息条目的标题\n @param digest      图文信息条目的内容摘要\n @param imageURL    图文信息条目的图片URL\n @param url         图文信息条目中包含的需要跳转到的URL\n @param extra       图文信息条目的扩展信息\n @return            图文信息条目对象\n */\n+ (instancetype)messageWithTitle:(NSString *)title\n                          digest:(NSString *)digest\n                        imageURL:(NSString *)imageURL\n                             url:(NSString *)url\n                           extra:(NSString *)extra;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCRichContentMessage.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCRichContentMessage.h\n//  Created by Gang Li on 10/17/14.\n\n#import \"RCMessageContent.h\"\n#import <UIKit/UIKit.h>\n\n/*!\n 图文消息的类型名\n */\n#define RCRichContentMessageTypeIdentifier @\"RC:ImgTextMsg\"\n\n/*!\n 图文消息类\n \n @discussion 图文消息类，此消息会进行存储并计入未读消息数。\n */\n@interface RCRichContentMessage : RCMessageContent\n\n/*!\n 图文消息的标题\n */\n@property(nonatomic, strong) NSString *title;\n\n/*!\n 图文消息的内容摘要\n */\n@property(nonatomic, strong) NSString *digest;\n\n/*!\n 图文消息图片URL\n */\n@property(nonatomic, strong) NSString *imageURL;\n\n/*!\n 图文消息中包含的需要跳转到的URL\n */\n@property(nonatomic, strong) NSString *url;\n\n/*!\n 图文消息的扩展信息\n */\n@property(nonatomic, strong) NSString *extra;\n\n/*!\n 初始化图文消息\n \n @param title       图文消息的标题\n @param digest      图文消息的内容摘要\n @param imageURL    图文消息的图片URL\n @param extra       图文消息的扩展信息\n @return            图文消息对象\n */\n+ (instancetype)messageWithTitle:(NSString *)title\n                          digest:(NSString *)digest\n                        imageURL:(NSString *)imageURL\n                           extra:(NSString *)extra;\n\n/*!\n 初始化图文消息\n \n @param title       图文消息的标题\n @param digest      图文消息的内容摘要\n @param imageURL    图文消息的图片URL\n @param url         图文消息中包含的需要跳转到的URL\n @param extra       图文消息的扩展信息\n @return            图文消息对象\n */\n+ (instancetype)messageWithTitle:(NSString *)title\n                          digest:(NSString *)digest\n                        imageURL:(NSString *)imageURL\n                             url:(NSString *)url\n                           extra:(NSString *)extra;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCStatusDefine.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCCommonDefine.h\n//  Created by Heq.Shinoda on 14-4-21.\n\n#import <Foundation/Foundation.h>\n\n#ifndef __RCStatusDefine\n#define __RCStatusDefine\n\n#pragma mark - 错误码相关\n\n#pragma mark RCConnectErrorCode - 建立连接返回的错误码\n/*!\n 建立连接返回的错误码\n \n @discussion 开发者仅需要关注以下几种连接错误码，其余错误码SDK均会进行自动重连，开发者无须处理。\n RC_CONN_ID_REJECT, RC_CONN_TOKEN_INCORRECT, RC_CONN_NOT_AUTHRORIZED, \n RC_CONN_PACKAGE_NAME_INVALID, RC_CONN_APP_BLOCKED_OR_DELETED, RC_CONN_USER_BLOCKED, \n RC_DISCONN_KICK, RC_CLIENT_NOT_INIT, RC_INVALID_PARAMETER, RC_INVALID_ARGUMENT\n */\ntypedef NS_ENUM(NSInteger, RCConnectErrorCode) {\n    /*!\n     导航路由失败\n     \n     @discussion 建立连接的临时错误码，SDK会做好自动重连，开发者无须处理。\n     */\n    RC_NET_NAVI_ERROR = 30000,\n    \n    /*!\n     连接已被释放\n     \n     @discussion 建立连接的临时错误码，SDK会做好自动重连，开发者无须处理。\n     */\n    RC_NET_CHANNEL_INVALID = 30001,\n    \n    /*!\n     连接不可用\n     \n     @discussion 建立连接的临时错误码，SDK会做好自动重连，开发者无须处理。\n     */\n    RC_NET_UNAVAILABLE = 30002,\n    \n    /*!\n     请求响应超时\n     \n     @discussion 建立连接的临时错误码，SDK会做好自动重连，开发者无须处理。\n     */\n    RC_MSG_RESP_TIMEOUT = 30003,\n    \n    /*!\n     导航HTTP发送失败\n     \n     @discussion 建立连接的临时错误码，SDK会做好自动重连，开发者无须处理。\n     */\n    RC_HTTP_SEND_FAIL = 30004,\n    \n    /*!\n     导航HTTP请求超时\n     \n     @discussion 建立连接的临时错误码，SDK会做好自动重连，开发者无须处理。\n     */\n    RC_HTTP_REQ_TIMEOUT = 30005,\n    \n    /*!\n     导航HTTP接收失败\n     \n     @discussion 建立连接的临时错误码，SDK会做好自动重连，开发者无须处理。\n     */\n    RC_HTTP_RECV_FAIL = 30006,\n    \n    /*!\n     导航HTTP请求失败\n     \n     @discussion 建立连接的临时错误码，SDK会做好自动重连，开发者无须处理。\n     */\n    RC_NAVI_RESOURCE_ERROR = 30007,\n    \n    /*!\n     导航HTTP返回数据格式错误\n     \n     @discussion 建立连接的临时错误码，SDK会做好自动重连，开发者无须处理。\n     */\n    RC_NODE_NOT_FOUND = 30008,\n    \n    /*!\n     导航HTTP返回数据不可用\n     \n     @discussion 建立连接的临时错误码，SDK会做好自动重连，开发者无须处理。\n     */\n    RC_DOMAIN_NOT_RESOLVE = 30009,\n    \n    /*!\n     创建Socket连接失败\n     \n     @discussion 建立连接的临时错误码，SDK会做好自动重连，开发者无须处理。\n     */\n    RC_SOCKET_NOT_CREATED = 30010,\n    \n    /*!\n     Socket断开\n     \n     @discussion 建立连接的临时错误码，SDK会做好自动重连，开发者无须处理。\n     */\n    RC_SOCKET_DISCONNECTED = 30011,\n    \n    /*!\n     PING失败\n     \n     @discussion 建立连接的临时错误码，SDK会做好自动重连，开发者无须处理。\n     */\n    RC_PING_SEND_FAIL = 30012,\n    \n    /*!\n     PING超时\n     \n     @discussion 建立连接的临时错误码，SDK会做好自动重连，开发者无须处理。\n     */\n    RC_PONG_RECV_FAIL = 30013,\n    \n    /*!\n     信令发送失败\n     \n     @discussion 建立连接的临时错误码，SDK会做好自动重连，开发者无须处理。\n     */\n    RC_MSG_SEND_FAIL = 30014,\n    \n    /*!\n     连接ACK超时\n     \n     @discussion 建立连接的临时错误码，SDK会做好自动重连，开发者无须处理。\n     */\n    RC_CONN_ACK_TIMEOUT = 31000,\n    \n    /*!\n     信令版本错误\n     \n     @discussion 建立连接的临时错误码，SDK会做好自动重连，开发者无须处理。\n     */\n    RC_CONN_PROTO_VERSION_ERROR = 31001,\n    \n    /*!\n     AppKey错误\n     \n     @discussion 请检查您使用的AppKey是否正确。\n     */\n    RC_CONN_ID_REJECT = 31002,\n    \n    /*!\n     服务器当前不可用（预留）\n     \n     @discussion 建立连接的临时错误码，SDK会做好自动重连，开发者无须处理。\n     */\n    RC_CONN_SERVER_UNAVAILABLE = 31003,\n    \n    /*!\n     Token无效\n     \n     @discussion Token无效一般有以下两种原因。\n     一是token错误，请您检查客户端初始化使用的AppKey和您服务器获取token使用的AppKey是否一致；\n     二是token过期，是因为您在开发者后台设置了token过期时间，您需要请求您的服务器重新获取token并再次用新的token建立连接。\n     */\n    RC_CONN_TOKEN_INCORRECT = 31004,\n    \n    /*!\n     AppKey与Token不匹配\n     \n     @discussion 请检查您使用的AppKey与Token是否正确，是否匹配。一般有以下两种原因。\n     一是token错误，请您检查客户端初始化使用的AppKey和您服务器获取token使用的AppKey是否一致；\n     二是token过期，是因为您在开发者后台设置了token过期时间，您需要请求您的服务器重新获取token并再次用新的token建立连接。\n     */\n    RC_CONN_NOT_AUTHRORIZED = 31005,\n    \n    /*!\n     连接重定向\n     \n     @discussion 建立连接的临时错误码，SDK会做好自动重连，开发者无须处理。\n     */\n    RC_CONN_REDIRECTED = 31006,\n    \n    /*!\n     BundleID不正确\n     \n     @discussion 请检查您App的BundleID是否正确。\n     */\n    RC_CONN_PACKAGE_NAME_INVALID = 31007,\n    \n    /*!\n     AppKey被封禁或已删除\n     \n     @discussion 请检查您使用的AppKey是否正确。\n     */\n    RC_CONN_APP_BLOCKED_OR_DELETED = 31008,\n    \n    /*!\n     用户被封禁\n     \n     @discussion 请检查您使用的Token是否正确，以及对应的UserId是否被封禁。\n     */\n    RC_CONN_USER_BLOCKED = 31009,\n    \n    /*!\n     当前用户在其他设备上登陆，此设备被踢下线\n     */\n    RC_DISCONN_KICK = 31010,\n    \n    /*!\n     信令数据无效\n     \n     @discussion 建立连接的临时状态，SDK会做好自动重连，开发者无须处理。\n     */\n    RC_QUERY_ACK_NO_DATA = 32001,\n    \n    /*!\n     信令数据错误\n     \n     @discussion 建立连接的临时状态，SDK会做好自动重连，开发者无须处理。\n     */\n    RC_MSG_DATA_INCOMPLETE = 32002,\n    \n    /*!\n     SDK没有初始化\n     \n     @discussion 在使用SDK任何功能之前，必须先Init。\n     */\n    RC_CLIENT_NOT_INIT = 33001,\n    \n    /*!\n     开发者接口调用时传入的参数错误\n     \n     @discussion 请检查接口调用时传入的参数类型和值。\n     */\n    RC_INVALID_PARAMETER = 33003,\n    \n    /*!\n     开发者接口调用时传入的参数错误\n     \n     @discussion 请检查接口调用时传入的参数类型和值。\n     */\n    RC_INVALID_ARGUMENT = -1000\n};\n\n#pragma mark RCErrorCode - 具体业务错误码\n/*!\n 具体业务错误码\n */\ntypedef NS_ENUM(NSInteger, RCErrorCode) {\n    /*!\n     未知错误（预留）\n     */\n    ERRORCODE_UNKNOWN = -1,\n    \n    /*!\n     已被对方加入黑名单\n     */\n    REJECTED_BY_BLACKLIST = 405,\n    \n    /*!\n     超时\n     */\n    ERRORCODE_TIMEOUT = 5004,\n    \n    /*!\n     发送消息频率过高，1秒钟最多只允许发送5条消息\n     */\n    SEND_MSG_FREQUENCY_OVERRUN = 20604,\n    \n    /*!\n     不在该讨论组中\n     */\n    NOT_IN_DISCUSSION = 21406,\n    \n    /*!\n     不在该群组中\n     */\n    NOT_IN_GROUP = 22406,\n    \n    /*!\n     在群组中已被禁言\n     */\n    FORBIDDEN_IN_GROUP = 22408,\n    \n    /*!\n     不在该聊天室中\n     */\n    NOT_IN_CHATROOM = 23406,\n    \n    /*!\n     在该聊天室中已被禁言\n     */\n    FORBIDDEN_IN_CHATROOM = 23408,\n    \n    /*!\n     已被踢出聊天室\n     */\n    KICKED_FROM_CHATROOM = 23409,\n    \n    /*!\n     聊天室不存在\n     */\n    RC_CHATROOM_NOT_EXIST = 23410,\n    \n    /*!\n     聊天室成员超限\n     */\n    RC_CHATROOM_IS_FULL = 23411,\n    \n    /*!\n     当前连接不可用（连接已经被释放）\n     */\n    RC_CHANNEL_INVALID = 30001,\n    \n    /*!\n     当前连接不可用\n     */\n    RC_NETWORK_UNAVAILABLE = 30002,\n    \n    /*!\n     SDK没有初始化\n     \n     @discussion 在使用SDK任何功能之前，必须先Init。\n     */\n    CLIENT_NOT_INIT = 33001,\n    \n    /*!\n     数据库错误\n     \n     @discussion 请检查您使用的Token和userId是否正确。\n     */\n    DATABASE_ERROR = 33002,\n    \n    /*!\n     开发者接口调用时传入的参数错误\n     \n     @discussion 请检查接口调用时传入的参数类型和值。\n     */\n    INVALID_PARAMETER = 33003,\n    \n    /*!\n     历史消息云存储业务未开通\n     */\n    MSG_ROAMING_SERVICE_UNAVAILABLE = 33007,\n};\n\n#pragma mark - 连接状态\n\n#pragma mark RCConnectionStatus - 网络连接状态码\n/*!\n 网络连接状态码\n \n @discussion 开发者仅需要关注以下几种连接状态，其余状态SDK均会进行自动重连。\n ConnectionStatus_Connected, ConnectionStatus_Connecting, ConnectionStatus_Unconnected, \n ConnectionStatus_SignUp, ConnectionStatus_KICKED_OFFLINE_BY_OTHER_CLIENT, \n ConnectionStatus_TOKEN_INCORRECT\n */\ntypedef NS_ENUM(NSInteger, RCConnectionStatus) {\n    /*!\n     未知状态\n     */\n    ConnectionStatus_UNKNOWN = -1,\n    \n    /*!\n     连接成功\n     */\n    ConnectionStatus_Connected = 0,\n    \n    /*!\n     当前设备网络不可用\n     \n     @discussion 建立连接的临时状态，SDK会做好自动重连，开发者无须处理。\n     */\n    ConnectionStatus_NETWORK_UNAVAILABLE = 1,\n    \n    /*!\n     当前设备切换到飞行模式\n     \n     @discussion 建立连接的临时状态，SDK会做好自动重连，开发者无须处理。\n     */\n    ConnectionStatus_AIRPLANE_MODE = 2,\n    \n    /*!\n     当前设备切换到 2G（GPRS、EDGE）低速网络\n     \n     @discussion 建立连接的临时状态，SDK会做好自动重连，开发者无须处理。\n     */\n    ConnectionStatus_Cellular_2G = 3,\n    \n    /*!\n     当前设备切换到 3G 或 4G 高速网络\n     \n     @discussion 建立连接的临时状态，SDK会做好自动重连，开发者无须处理。\n     */\n    ConnectionStatus_Cellular_3G_4G = 4,\n    \n    /*!\n     当前设备切换到 WIFI 网络\n     \n     @discussion 建立连接的临时状态，SDK会做好自动重连，开发者无须处理。\n     */\n    ConnectionStatus_WIFI = 5,\n    \n    /*!\n     当前用户在其他设备上登陆，此设备被踢下线\n     */\n    ConnectionStatus_KICKED_OFFLINE_BY_OTHER_CLIENT = 6,\n    \n    /*!\n     当前用户在 Web 端登陆\n     \n     @discussion 建立连接的临时状态，SDK会做好自动重连，开发者无须处理。\n     */\n    ConnectionStatus_LOGIN_ON_WEB = 7,\n    \n    /*!\n     服务器异常\n     \n     @discussion 建立连接的临时状态，SDK会做好自动重连，开发者无须处理。\n     */\n    ConnectionStatus_SERVER_INVALID = 8,\n    \n    /*!\n     连接验证异常\n     \n     @discussion 建立连接的临时状态，SDK会做好自动重连，开发者无须处理。\n     */\n    ConnectionStatus_VALIDATE_INVALID = 9,\n    \n    /*!\n     连接中\n     */\n    ConnectionStatus_Connecting = 10,\n    \n    /*!\n     连接失败或未连接\n     */\n    ConnectionStatus_Unconnected = 11,\n    \n    /*!\n     已注销\n     */\n    ConnectionStatus_SignUp = 12,\n    \n    /*!\n     Token无效\n     \n     @discussion Token无效一般有两种原因。一是token错误，请您检查客户端初始化使用的AppKey和您服务器获取token使用的AppKey是否一致；二是token过期，是因为您在开发者后台设置了token过期时间，您需要请求您的服务器重新获取token并再次用新的token建立连接。\n     */\n    ConnectionStatus_TOKEN_INCORRECT = 31004,\n    \n    /*!\n     与服务器的连接已断开\n     \n     @discussion 建立连接的临时状态，SDK会做好自动重连，开发者无须处理。\n     */\n    ConnectionStatus_DISCONN_EXCEPTION = 31011\n};\n\n#pragma mark RCNetworkStatus - 当前所处的网络\n/*!\n 当前所处的网络\n */\ntypedef NS_ENUM(NSUInteger, RCNetworkStatus) {\n    /*!\n     当前网络不可用\n     */\n    RC_NotReachable = 0,\n    \n    /*!\n     当前处于WiFi网络\n     */\n    RC_ReachableViaWiFi = 1,\n    \n    /*!\n     当前处于LTE网络\n     */\n    RC_ReachableViaLTE = 2,\n    \n    /*!\n     当前处于3G网络\n     */\n    RC_ReachableVia3G = 3,\n    \n    /*!\n     当前处于2G网络\n     */\n    RC_ReachableVia2G = 4\n};\n\n#pragma mark RCSDKRunningMode - SDK当前所处的状态\n/*!\n SDK当前所处的状态\n */\ntypedef NS_ENUM(NSUInteger, RCSDKRunningMode) {\n    /*!\n     前台运行状态\n     */\n    RCSDKRunningMode_Backgroud = 0,\n    \n    /*!\n     后台运行状态\n     */\n    RCSDKRunningMode_Foregroud = 1\n};\n\n#pragma mark - 会话相关\n\n#pragma mark RCConversationType - 会话类型\n/*!\n 会话类型\n */\ntypedef NS_ENUM(NSUInteger, RCConversationType) {\n    /*!\n     单聊\n     */\n    ConversationType_PRIVATE = 1,\n    \n    /*!\n     讨论组\n     */\n    ConversationType_DISCUSSION = 2,\n    \n    /*!\n     群组\n     */\n    ConversationType_GROUP = 3,\n    \n    /*!\n     聊天室\n     */\n    ConversationType_CHATROOM = 4,\n    \n    /*!\n     客服1.0会话\n     \n     @discussion 客服2.0使用应用内公众服务会话（ConversationType_APPSERVICE）的方式实现。\n     即客服2.0会话是其中一个应用内公众服务会话，我们推荐您使用和迁移到客服2.0服务。\n     */\n    ConversationType_CUSTOMERSERVICE = 5,\n    \n    /*!\n     系统会话\n     */\n    ConversationType_SYSTEM = 6,\n    \n    /*!\n     应用内公众服务会话\n     */\n    ConversationType_APPSERVICE = 7,\n    \n    /*!\n     跨应用公众服务会话\n     */\n    ConversationType_PUBLICSERVICE = 8,\n    \n    /*!\n     推送服务会话\n     */\n    ConversationType_PUSHSERVICE = 9\n};\n\n#pragma mark RCConversationNotificationStatus - 会话提醒状态\n/*!\n 会话提醒状态\n */\ntypedef NS_ENUM(NSUInteger, RCConversationNotificationStatus) {\n    /*!\n     免打扰\n     */\n    DO_NOT_DISTURB = 0,\n    \n    /*!\n     新消息提醒\n     */\n    NOTIFY = 1,\n};\n\n#pragma mark RCReadReceiptMessageType - 消息回执\n/*!\n 已读状态消息类型\n */\ntypedef NS_ENUM(NSUInteger, RCReadReceiptMessageType) {\n    /*!\n     根据会话来更新未读消息状态\n     */\n    RC_ReadReceipt_Conversation = 1,\n};\n\n#pragma mark RCChatRoomMemberOrder - 聊天室成员排列顺序\n/*!\n 聊天室成员的排列顺序\n */\ntypedef NS_ENUM(NSUInteger, RCChatRoomMemberOrder) {\n    /*!\n     升序，返回最早加入的成员列表\n     */\n    RC_ChatRoom_Member_Asc = 1,\n    \n    /*!\n     降序，返回最晚加入的成员列表\n     */\n    RC_ChatRoom_Member_Desc = 2,\n};\n\n#pragma mark - 消息相关\n\n#pragma mark RCMessagePersistent - 消息的存储策略\n/*!\n 消息的存储策略\n */\ntypedef NS_ENUM(NSUInteger, RCMessagePersistent) {\n    /*!\n     在本地不存储，不计入未读数\n     */\n    MessagePersistent_NONE = 0,\n    \n    /*!\n     在本地只存储，但不计入未读数\n     */\n    MessagePersistent_ISPERSISTED = 1,\n    \n    /*!\n     在本地进行存储并计入未读数\n     */\n    MessagePersistent_ISCOUNTED = 3,\n    \n    /*!\n     在本地不存储，不计入未读数，并且如果对方不在线，服务器会直接丢弃该消息，对方如果之后再上线也不会再收到此消息。\n     \n     @discussion 一般用于发送输入状态之类的消息，该类型消息的messageUId为nil。\n     */\n    MessagePersistent_STATUS = 16\n};\n\n#pragma mark RCMessageDirection - 消息的方向\n/*!\n 消息的方向\n */\ntypedef NS_ENUM(NSUInteger, RCMessageDirection) {\n    /*!\n     发送\n     */\n    MessageDirection_SEND = 1,\n    \n    /*!\n     接收\n     */\n    MessageDirection_RECEIVE = 2\n};\n\n#pragma mark RCSentStatus - 消息的发送状态\n/*!\n 消息的发送状态\n */\ntypedef NS_ENUM(NSUInteger, RCSentStatus) {\n    /*!\n     发送中\n     */\n    SentStatus_SENDING = 10,\n    \n    /*!\n     发送失败\n     */\n    SentStatus_FAILED = 20,\n    \n    /*!\n     已发送成功\n     */\n    SentStatus_SENT = 30,\n    \n    /*!\n     对方已接收\n     */\n    SentStatus_RECEIVED = 40,\n    \n    /*!\n     对方已阅读\n     */\n    SentStatus_READ = 50,\n    \n    /*!\n     对方已销毁\n     */\n    SentStatus_DESTROYED = 60\n};\n\n#pragma mark RCReceivedStatus - 消息的接收状态\n/*!\n 消息的接收状态\n */\ntypedef NS_ENUM(NSUInteger, RCReceivedStatus) {\n    /*!\n     未读\n     */\n    ReceivedStatus_UNREAD = 0,\n    \n    /*!\n     已读\n     */\n    ReceivedStatus_READ = 1,\n    \n    /*!\n     已听\n     \n     @discussion 仅用于语音消息\n     */\n    ReceivedStatus_LISTENED = 2,\n    \n    /*!\n     已下载\n     */\n    ReceivedStatus_DOWNLOADED = 4,\n};\n\n#pragma mark RCMediaType - 消息内容中多媒体文件的类型\n/*!\n 消息内容中多媒体文件的类型\n */\ntypedef NS_ENUM(NSUInteger, RCMediaType) {\n    /*!\n     图片\n     */\n    MediaType_IMAGE = 1,\n    \n    /*!\n     语音\n     */\n    MediaType_AUDIO = 2,\n    \n    /*!\n     视频\n     */\n    MediaType_VIDEO = 3,\n    \n    /*!\n     其他文件\n     */\n    MediaType_FILE = 100\n};\n\n#pragma mark - 公众服务相关\n\n#pragma mark RCPublicServiceType - 公众服务账号类型\n/*!\n 公众服务账号类型\n */\ntypedef NS_ENUM(NSUInteger, RCPublicServiceType) {\n    /*!\n     应用内公众服务账号\n     */\n    RC_APP_PUBLIC_SERVICE = 7,\n    \n    /*!\n     跨应用公众服务账号\n     */\n    RC_PUBLIC_SERVICE = 8,\n};\n\n#pragma mark RCPublicServiceMenuItemType - 公众服务菜单类型\n/*!\n 公众服务菜单类型\n */\ntypedef NS_ENUM(NSUInteger, RCPublicServiceMenuItemType) {\n    /*!\n     包含子菜单的一组菜单\n     */\n    RC_PUBLIC_SERVICE_MENU_ITEM_GROUP = 0,\n    \n    /*!\n     包含查看事件的菜单\n     */\n    RC_PUBLIC_SERVICE_MENU_ITEM_VIEW = 1,\n    \n    /*!\n     包含点击事件的菜单\n     */\n    RC_PUBLIC_SERVICE_MENU_ITEM_CLICK = 2,\n};\n\n#pragma mark RCSearchType - 公众服务查找匹配方式\n/*!\n 公众服务查找匹配方式\n */\ntypedef NS_ENUM(NSUInteger, RCSearchType) {\n    /*!\n     精确匹配\n     */\n    RC_SEARCH_TYPE_EXACT = 0,\n    \n    /*!\n     模糊匹配\n     */\n    RC_SEARCH_TYPE_FUZZY = 1,\n};\n\n#endif"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCStatusMessage.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCStatusMessage.h\n//  Created by Heq.Shinoda on 14-6-13.\n\n#import \"RCMessageContent.h\"\n\n@interface RCStatusMessage : RCMessageContent\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCSuspendMessage.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCInterruptMessage.h\n//  Created by xugang on 15/1/12.\n\n#import <Foundation/Foundation.h>\n#import \"RCMessageContent.h\"\n\n/*!\n 客服挂断消息的类型名\n */\n#define RCInterruptMessageTypeIdentifier @\"RC:SpMsg\"\n\n/*!\n 客服挂断消息类\n \n @discussion 客服挂断消息类，此消息不存储不计入未读消息数。\n 结束与客服的会话之前，可以向客服发送一条此消息，客服服务器即可知道用户即将离开客服会话。\n */\n@interface RCSuspendMessage : RCMessageContent <RCMessageCoding, RCMessagePersistentCompatible>\n\n/*!\n 初始化客服挂断消息\n \n @return 客服挂断消息的对象\n */\n- (instancetype)init;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCTextMessage.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCTextMessage.h\n//  Created by Heq.Shinoda on 14-6-13.\n\n#import \"RCMessageContent.h\"\n\n/*!\n 文本消息的类型名\n */\n#define RCTextMessageTypeIdentifier @\"RC:TxtMsg\"\n\n/*!\n 文本消息类\n \n @discussion 文本消息类，此消息会进行存储并计入未读消息数。\n */\n@interface RCTextMessage : RCMessageContent <NSCoding>\n\n/*!\n 文本消息的内容\n */\n@property(nonatomic, strong) NSString *content;\n\n/*!\n 文本消息的附加信息\n */\n@property(nonatomic, strong) NSString *extra;\n\n/*!\n 初始化文本消息\n \n @param content 文本消息的内容\n @return        文本消息对象\n */\n+ (instancetype)messageWithContent:(NSString *)content;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCUnknownMessage.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCUnknownMessage.h\n//  Created by xugang on 15/1/24.\n\n#import \"RCMessageContent.h\"\n\n/*!\n 未知消息的类型名\n */\n#define RCUnknownMessageTypeIdentifier @\"RC:UnknownMsg\"\n\n/*!\n 未知消息类\n \n @discussion 所有未注册的消息类型，在IMKit中都会作为此类消息处理和显示。\n */\n@interface RCUnknownMessage : RCMessageContent\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCUploadImageStatusListener.h",
    "content": "//\n//  RCUploadImageStatusListener.h\n//  RongIMLib\n//\n//  Created by litao on 15/8/28.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import \"RCMessage.h\"\n\n/*!\n 图片上传进度更新的IMKit监听\n \n @discussion 此监听用于IMKit发送图片消息（上传到指定服务器）。\n App在上传图片时，需要在监听中调用updateBlock、successBlock与errorBlock，通知IMKit SDK当前上传图片的进度和状态，SDK会更新UI。\n */\n@interface RCUploadImageStatusListener : NSObject\n\n/*!\n 上传的图片消息的消息实体\n */\n@property (nonatomic, strong)RCMessage *currentMessage;\n\n/*!\n 更新上传进度需要调用的block [progress:当前上传的进度，0 <= progress < 100]\n */\n@property (nonatomic, strong)void (^updateBlock)(int progress);\n\n/*!\n 上传成功需要调用的block [imageUrl:图片的网络URL]\n */\n@property (nonatomic, strong)void (^successBlock)(NSString *imageUrl);\n\n/*!\n 上传成功需要调用的block [errorCode:上传失败的错误码，非0整数]\n */\n@property (nonatomic, strong)void (^errorBlock)(RCErrorCode errorCode);\n\n/*!\n 初始化图片上传进度更新的IMKit监听\n \n @param message             图片消息的消息实体\n @param progressBlock       更新上传进度需要调用的block\n @param successBlock        上传成功需要调用的block\n @param errorBlock          上传失败需要调用的block\n \n @return                    图片上传进度更新的IMKit监听对象\n */\n- (instancetype)initWithMessage:(RCMessage *)message\n                 uploadProgress:(void (^)(int progress))progressBlock\n                  uploadSuccess:(void (^)(NSString *imageUrl))successBlock\n                    uploadError:(void (^)(RCErrorCode errorCode))errorBlock;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCUserInfo.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCUserInfo.h\n//  Created by Heq.Shinoda on 14-6-16.\n\n#import <Foundation/Foundation.h>\n\n/*!\n 用户信息类 \n */\n@interface RCUserInfo : NSObject <NSCoding>\n\n/*!\n 用户ID\n */\n@property(nonatomic, strong) NSString *userId;\n\n/*!\n 用户名称\n */\n@property(nonatomic, strong) NSString *name;\n\n/*!\n 用户头像的URL\n */\n@property(nonatomic, strong) NSString *portraitUri;\n\n/*!\n 用户信息的初始化方法\n \n @param userId      用户ID\n @param username    用户名称\n @param portrait    用户头像的URL\n @return            用户信息对象\n */\n- (instancetype)initWithUserId:(NSString *)userId\n                          name:(NSString *)username\n                      portrait:(NSString *)portrait;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCUserTypingStatus.h",
    "content": "//\n//  RCUserTypingStatus.h\n//  RongIMLib\n//\n//  Created by 岑裕 on 16/1/8.\n//  Copyright © 2016年 RongCloud. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n/*!\n 用户输入状态类\n */\n@interface RCUserTypingStatus : NSObject\n\n/*!\n 当前正在输入的用户ID\n */\n@property(nonatomic, strong) NSString *userId;\n\n/*!\n 当前正在输入的消息类型名\n \n @discussion contentType为用户当前正在编辑的消息类型名，即RCMessageContent中getObjectName的返回值。\n 如文本消息，应该传类型名\"RC:TxtMsg\"。\n */\n@property(nonatomic, strong) NSString *contentType;\n\n/*!\n 初始化用户输入状态对象\n \n @param userId     当前正在输入的用户ID\n @param objectName 当前正在输入的消息类型名\n \n @return 用户输入状态对象\n */\n-(instancetype)initWithUserId:(NSString *)userId\n                  contentType:(NSString *)objectName;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCUtilities.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCUtilities.h\n//  Created by Heq.Shinoda on 14-5-15.\n\n#ifndef __RCUtilities\n#define __RCUtilities\n\n#import <UIKit/UIKit.h>\n\n/*!\n 工具类\n */\n@interface RCUtilities : NSObject\n\n/*!\n 将base64编码的字符串解码并转换为NSData数据\n \n @param string      base64编码的字符串\n @return            解码后的NSData数据\n \n @discussion 此方法主要用于iOS6解码base64。\n */\n+ (NSData *)dataWithBase64EncodedString:(NSString *)string;\n\n/*!\n 将NSData数据转化并编码为base64的字符串\n \n @param data    未编码的NSData数据\n @return        编码后的base64字符串\n \n @discussion 此方法主要用于iOS6编码base64。\n */\n+ (NSString *)base64EncodedStringFrom:(NSData *)data;\n\n/*!\n scaleImage\n \n @param image           image\n @param scaleSize       scaleSize\n \n @return                scaled image\n */\n+ (UIImage *)scaleImage:(UIImage *)image\n                toScale:(float)scaleSize;\n\n/*!\n imageByScalingAndCropSize\n \n @param image           image\n @param targetSize      targetSize\n \n @return                image\n */\n+ (UIImage *)imageByScalingAndCropSize:(UIImage *)image\n                            targetSize:(CGSize)targetSize;\n\n/*!\n compressedImageWithMaxDataLength\n \n @param image               image\n @param maxDataLength       maxDataLength\n \n @return                    nsdate\n */\n+ (NSData *)compressedImageWithMaxDataLength:(UIImage *)image\n                               maxDataLength:(CGFloat)maxDataLength;\n\n/*!\n compressedImageAndScalingSize\n \n @param image           image\n @param targetSize      targetSize\n @param maxDataLen      maxDataLen\n \n @return                image nsdata\n */\n+ (NSData *)compressedImageAndScalingSize:(UIImage *)image\n                               targetSize:(CGSize)targetSize\n                               maxDataLen:(CGFloat)maxDataLen;\n\n/*!\n compressedImageAndScalingSize\n \n @param image           image\n @param targetSize      targetSize\n @param percent         percent\n \n @return                image nsdata\n */\n+ (NSData *)compressedImageAndScalingSize:(UIImage *)image\n                               targetSize:(CGSize)targetSize\n                                  percent:(CGFloat)percent;\n/*!\n compressedImage\n \n @param image           image\n @param percent         percent\n \n @return                image nsdata\n */\n+ (NSData *)compressedImage:(UIImage *)image\n                    percent:(CGFloat)percent;\n\n/*!\n excludeBackupKeyForURL\n \n @param storageURL      storageURL\n \n @return                BOOL\n */\n+ (BOOL)excludeBackupKeyForURL:(NSURL *)storageURL;\n\n/*!\n 获取App的文件存放路径\n \n @return    App的文件存放路径\n */\n+ (NSString *)applicationDocumentsDirectory;\n\n/*!\n 获取融云SDK的文件存放路径\n \n @return    融云SDK的文件存放路径\n */\n+ (NSString *)rongDocumentsDirectory;\n\n/*!\n 获取融云SDK的缓存路径\n \n @return    融云SDK的缓存路径\n */\n+ (NSString *)rongImageCacheDirectory;\n\n/*!\n 获取当前系统时间\n \n @return    当前系统时间\n */\n+ (NSString *)currentSystemTime;\n\n/*!\n 获取当前运营商名称\n \n @return    当前运营商名称\n */\n+ (NSString *)currentCarrier;\n\n/*!\n 获取当前网络类型\n \n @return    当前网络类型\n */\n+ (NSString *)currentNetWork;\n\n/*!\n 获取系统版本\n \n @return    系统版本\n */\n+ (NSString *)currentSystemVersion;\n\n/*!\n 获取设备型号\n \n @return    设备型号\n */\n+ (NSString *)currentDeviceModel;\n\n@end\n#endif"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCVoiceMessage.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RCVoiceMessage.h\n//  Created by Heq.Shinoda on 14-6-13.\n\n#import \"RCMessageContent.h\"\n\n/*!\n 语音消息的类型名\n */\n#define RCVoiceMessageTypeIdentifier @\"RC:VcMsg\"\n\n/*!\n 语音消息类\n \n @discussion 语音消息类，此消息会进行存储并计入未读消息数。\n */\n@interface RCVoiceMessage : RCMessageContent <NSCoding>\n\n/*!\n wav格式的音频数据\n */\n@property(nonatomic, strong) NSData *wavAudioData;\n\n/*!\n 语音消息的时长\n */\n@property(nonatomic, assign) long duration;\n\n/*!\n 语音消息的附加信息\n */\n@property(nonatomic, strong) NSString *extra;\n\n/*!\n 初始化语音消息\n \n @param audioData   wav格式的音频数据\n @param duration    语音消息的时长（单位：秒）\n @return            语音消息对象\n \n @discussion 如果您不是使用IMKit中的录音功能，则在初始化语音消息的时候，需要确保以下几点。\n 1. audioData必须是单声道的wav格式音频数据；\n 2. audioData的采样率必须是8000Hz，采样位数（精度）必须为16位。\n \n 您可以参考IMKit中的录音参数：\n NSDictionary *settings = @{AVFormatIDKey: @(kAudioFormatLinearPCM),\n                            AVSampleRateKey: @8000.00f,\n                            AVNumberOfChannelsKey: @1,\n                            AVLinearPCMBitDepthKey: @16,\n                            AVLinearPCMIsNonInterleaved: @NO,\n                            AVLinearPCMIsFloatKey: @NO,\n                            AVLinearPC'MIsBigEndianKey: @NO};\n */\n+ (instancetype)messageWithAudio:(NSData *)audioData\n                        duration:(long)duration;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RCWatchKitStatusDelegate.h",
    "content": "//\n//  RCWatchKitStatusDelegate.h\n//  RongIMLib\n//\n//  Created by litao on 15/6/4.\n//  Copyright (c) 2015年 RongCloud. All rights reserved.\n//\n\n#ifndef RongIMLib_RCwatchKitStatusDelegate_h\n#define RongIMLib_RCwatchKitStatusDelegate_h\n\n/*!\n 用于Apple Watch的IMLib事务监听器\n \n @discussion 此协议定义了IMLib在状态变化和各种活动时的回调，主要用于Apple Watch。\n */\n@protocol RCWatchKitStatusDelegate <NSObject>\n\n@optional\n\n#pragma mark 连接状态\n/*!\n 连接状态发生变化的回调\n \n @param status      SDK与融云服务器的连接状态\n */\n- (void)notifyWatchKitConnectionStatusChanged:(RCConnectionStatus) status;\n\n#pragma mark 消息接收与发送\n\n/*!\n 收到消息的回调\n \n @param receivedMsg     收到的消息实体\n */\n- (void)notifyWatchKitReceivedMessage:(RCMessage *)receivedMsg;\n\n/*!\n 向外发送消息的回调\n \n @param message     待发送消息\n */\n- (void)notifyWatchKitSendMessage:(RCMessage *)message;\n\n/*!\n 发送消息完成的回调\n \n @param messageId    消息ID\n @param status       完成的状态吗。0表示成功，非0表示失败\n */\n- (void)notifyWatchKitSendMessageCompletion:(long)messageId\n                                     status:(RCErrorCode)status;\n\n/*!\n 上传图片进度更新的回调\n \n @param progress    进度\n @param messageId   消息ID\n */\n- (void)notifyWatchKitUploadFileProgress:(int)progress\n                               messageId:(long)messageId;\n\n#pragma mark 消息与会话操作\n/*!\n 删除会话的回调\n \n @param conversationTypeList    会话类型的数组\n */\n- (void)notifyWatchKitClearConversations:(NSArray *)conversationTypeList;\n\n/*!\n 删除消息的回调\n \n @param conversationType    会话类型\n @param targetId            目标会话ID\n */\n- (void)notifyWatchKitClearMessages:(RCConversationType)conversationType\n                           targetId:(NSString *)targetId;\n\n/*!\n 删除消息的回调\n \n @param messageIds    消息ID的数组\n */\n- (void)notifyWatchKitDeleteMessages:(NSArray *)messageIds;\n\n/*!\n 清除未读消息数的回调\n \n @param conversationType    会话类型\n @param targetId            目标会话ID\n */\n- (void)notifyWatchKitClearUnReadStatus:(RCConversationType)conversationType\n                               targetId:(NSString *)targetId;\n\n#pragma mark 讨论组\n\n/*!\n 创建讨论组的回调\n \n @param name         讨论组名称\n @param userIdList   成员的用户ID列表\n */\n- (void)notifyWatchKitCreateDiscussion:(NSString *)name\n                            userIdList:(NSArray *)userIdList;\n\n/*!\n 创建讨论组成功的回调\n \n @param discussionId    讨论组的ID\n */\n- (void)notifyWatchKitCreateDiscussionSuccess:(NSString *)discussionId;\n\n/*!\n 创建讨论组失败\n \n @param errorCode   创建失败的错误码\n */\n- (void)notifyWatchKitCreateDiscussionError:(RCErrorCode)errorCode;\n\n/*!\n 讨论组加人的回调\n \n @param discussionId    讨论组的ID\n @param userIdList      添加成员的用户ID列表\n \n @discussion 加人的结果可以通过notifyWatchKitDiscussionOperationCompletion获得。\n */\n- (void)notifyWatchKitAddMemberToDiscussion:(NSString *)discussionId\n                                 userIdList:(NSArray *)userIdList;\n\n/*!\n 讨论组踢人的回调\n \n @param discussionId    讨论组ID\n @param userId          用户ID\n \n @discussion 踢人的结果可以通过notifyWatchKitDiscussionOperationCompletion获得。\n */\n- (void)notifyWatchKitRemoveMemberFromDiscussion:(NSString *)discussionId\n                                          userId:(NSString *)userId;\n\n/*!\n 退出讨论组的回调\n \n @param discussionId    讨论组ID\n \n @discussion 创建的结果可以通过notifyWatchKitDiscussionOperationCompletion获得。\n */\n- (void)notifyWatchKitQuitDiscussion:(NSString *)discussionId;\n\n/*!\n 讨论组操作的回调。tag：100-邀请；101-踢人；102-退出。status：0成功，非0失败\n \n @param tag       讨论组的操作类型。100为加人，101为踢人，102为退出\n @param status    操作的结果。0表示成功，非0表示失败\n */\n- (void)notifyWatchKitDiscussionOperationCompletion:(int)tag\n                                             status:(RCErrorCode)status;\n\n@end\n#endif\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/RongIMLib.h",
    "content": "/**\n * Copyright (c) 2014-2015, RongCloud.\n * All rights reserved.\n *\n * All the contents are the copyright of RongCloud Network Technology Co.Ltd.\n * Unless otherwise credited. http://rongcloud.cn\n *\n */\n\n//  RongIMLib.h\n//  Created by xugang on 14/12/11.\n\n#import <UIKit/UIKit.h>\n\n//! Project version number for RongIMLib.\nFOUNDATION_EXPORT double RongIMLibVersionNumber;\n\n//! Project version string for RongIMLib.\nFOUNDATION_EXPORT const unsigned char RongIMLibVersionString[];\n\n/// IMLib核心类\n#import <RongIMLib/RCIMClient.h>\n#import <RongIMLib/RCStatusDefine.h>\n/// 会话相关类\n#import <RongIMLib/RCConversation.h>\n#import <RongIMLib/RCDiscussion.h>\n#import <RongIMLib/RCGroup.h>\n#import <RongIMLib/RCUserTypingStatus.h>\n#import <RongIMLib/RCChatRoomInfo.h>\n/// 消息相关类\n#import <RongIMLib/RCMessage.h>\n#import <RongIMLib/RCMessageContent.h>\n#import <RongIMLib/RCMessageContentView.h>\n#import <RongIMLib/RCTextMessage.h>\n#import <RongIMLib/RCImageMessage.h>\n#import <RongIMLib/RCVoiceMessage.h>\n#import <RongIMLib/RCLocationMessage.h>\n#import <RongIMLib/RCRichContentMessage.h>\n#import <RongIMLib/RCHandShakeMessage.h>\n#import <RongIMLib/RCSuspendMessage.h>\n#import <RongIMLib/RCRealTimeLocationStartMessage.h>\n#import <RongIMLib/RCRealTimeLocationEndMessage.h>\n#import <RongIMLib/RCCommandMessage.h>\n#import <RongIMLib/RCCommandNotificationMessage.h>\n#import <RongIMLib/RCInformationNotificationMessage.h>\n#import <RongIMLib/RCUnknownMessage.h>\n#import <RongIMLib/RCProfileNotificationMessage.h>\n#import <RongIMLib/RCPublicServiceCommandMessage.h>\n#import <RongIMLib/RCPublicServiceMultiRichContentMessage.h>\n#import <RongIMLib/RCPublicServiceRichContentMessage.h>\n#import <RongIMLib/RCDiscussionNotificationMessage.h>\n#import <RongIMLib/RCGroupNotificationMessage.h>\n#import <RongIMLib/RCContactNotificationMessage.h>\n/// 工具类\n#import <RongIMLib/RCUtilities.h>\n#import <RongIMLib/RCAmrDataConverter.h>\n#import <RongIMLib/interf_enc.h>\n#import <RongIMLib/interf_dec.h>\n/// 其他\n#import <RongIMLib/RCUserInfo.h>\n#import <RongIMLib/RCChatRoomMemberInfo.h>\n#import <RongIMLib/RCPublicServiceMenu.h>\n#import <RongIMLib/RCPublicServiceProfile.h>\n#import <RongIMLib/RCRealTimeLocationManager.h>\n#import <RongIMLib/RCUploadImageStatusListener.h>\n#import <RongIMLib/RCWatchKitStatusDelegate.h>\n#import <RongIMLib/RCStatusMessage.h>\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/interf_dec.h",
    "content": "/* ------------------------------------------------------------------\n * Copyright (C) 2009 Martin Storsjo\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either\n * express or implied.\n * See the License for the specific language governing permissions\n * and limitations under the License.\n * -------------------------------------------------------------------\n */\n\n#ifndef OPENCORE_AMRNB_INTERF_DEC_H\n#define OPENCORE_AMRNB_INTERF_DEC_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid* Decoder_Interface_init(void);\nvoid Decoder_Interface_exit(void* state);\nvoid Decoder_Interface_Decode(void* state, const unsigned char* in, short* out, int bfi);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongIMLib.framework/Headers/interf_enc.h",
    "content": "/* ------------------------------------------------------------------\n * Copyright (C) 2009 Martin Storsjo\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either\n * express or implied.\n * See the License for the specific language governing permissions\n * and limitations under the License.\n * -------------------------------------------------------------------\n */\n\n#ifndef OPENCORE_AMRNB_INTERF_ENC_H\n#define OPENCORE_AMRNB_INTERF_ENC_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef AMRNB_WRAPPER_INTERNAL\n/* Copied from enc/src/gsmamr_enc.h */\nenum Mode {\n\tMR475 = 0,/* 4.75 kbps */\n\tMR515,    /* 5.15 kbps */\n\tMR59,     /* 5.90 kbps */\n\tMR67,     /* 6.70 kbps */\n\tMR74,     /* 7.40 kbps */\n\tMR795,    /* 7.95 kbps */\n\tMR102,    /* 10.2 kbps */\n\tMR122,    /* 12.2 kbps */\n\tMRDTX,    /* DTX       */\n\tN_MODES   /* Not Used  */\n};\n#endif\n\nvoid* Encoder_Interface_init(int dtx);\nvoid Encoder_Interface_exit(void* state);\nint Encoder_Interface_Encode(void* state, enum Mode mode, const short* speech, unsigned char* out, int forceSpeech);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/en.lproj/RongCloudKit.strings",
    "content": "/* \n  RongCloudKit.strings\n  RongIMKit\n\n  Created by xugang on 1/15/15.\n  Copyright (c) 2015 RongCloud. All rights reserved.\n*/\n\"RC:ImgMsg\" = \"[Image]\";\n\"RC:LBSMsg\" = \"[Location]\";\n\"RC:VcMsg\" = \"[Voice]\";\n\"RC:ImgTextMsg\" = \"[RichContent]\";\n\"RC:VoipCallMsg\" = \"[VoIP Start]\";\n\"RC:VoipFinishMsg\" = \"[VoIP End]\";\n\"RC:PSMultiImgTxtMsg\" = \"[RichContent]\";\n\"RC:PSImgTxtMsg\" = \"[RichContent]\";\n\"Draft\"=\"[Draft]\";\n\"conversation_private_collection_title\" = \"Private Groups\";\n\"conversation_customer_collection_title\" = \"Customer Groups\";\n\"conversation_group_collection_title\" = \"My Groups\";\n\"conversation_discussion_collection_title\" = \"Discussion Groups\";\n\"conversation_systemMessage_collection_title\" = \"System Messages\";\n\"hold_to_talk_title\"=\"Hold to talk\";\n\"release_to_send_title\"=\"Release to send\";\n\"message_too_short\"=\"Message too short\";\n\"slide_up_to_cancel_title\"=\"Slide up to cancel\";\n\"release_to_cancel_title\"=\"Release to cancel \";\n\"whiteSpaceMessage\"=\"Can't send white space message\";\n\"OK\"=\"Ok\";\n\"Cancel\"=\"Cancel\";\n\"speakerAccessRight\"=\"You don't have the access right of speaker, please set it in Settings\";\n\"VoIP_Mute\"=\"Mute\";\n\"VoIP_Speaker\"=\"Speaker\";\n\"VoIP_End\"=\"End\";\n\"VoIP_Answer\"=\"Answer\";\n\"VoIP_Reject\"=\"Reject\";\n\"VoIP_Drop\"=\"Drop\";\n\"Request_Friends_extra\"=\"You have received a message for requesting add friends\";\n\"Setting\"=\"Setting\";\n\"Back\"=\"Back\";\n\"IsDeleteHistoryMsg\"=\"Do you want to delete history message?\";\n\"ConnectionIsNotReachable\"=\"Network connection is not reachable, please check it\";\n\"Album\"=\"Album\";\n\"Photo\"=\"Photo\";\n\"Location\"=\"Location\";\n\"Audio\"=\"Audio\";\n\"Albums\"=\"Albums\";\n\"unknown_message_cell_tip\"=\"The current version is not available for viewing this message\";\n\"unknown_message_notification_tip\"=\"Receive an unkown message\";\n\"Copy\"=\"Copy\";\n\"Delete\"=\"Delete\";\n\"Save\"=\"Save\";\n\"SavePhotoFailed\"=\"Failed to save this photo\";\n\"SavePhotoSuccess\"=\"Saved\";\n\"PickLocation\"=\"Pick Location\";\n\"More\"=\"More\";\n\"Done\"=\"Done\";\n\"Longitude\"=\"Longitude\";\n\"Latitude\"=\"Latitude\";\n\"LocationInformation\"=\"Location information\";\n\"LocalNotificationShow\"=\"Show\";\n\"PhotoAccessRight\"=\"You have no access right\";\n\"MaxNumSelectPhoto\"=\"Max number is 9 for selection\";\n\"AllPhoto\"=\"All Photo\";\n\"NoPhotoTitle\"=\"No Photos or Videos\";\n\"NoPhotoDesc\"=\"You can sync photos and videos onto your iPhone using iTunes.\";\n\"Send\"=\"Send\";\n\"SetToTop\"=\"Sticky to Top\";\n\"NewMsgNotification\"=\"New Message Notification\";\n\"ClearRecord\"=\"Clear Chat History\";\n\"CanNotRemoveSelf\"=\"Can't remove youself\";\n\"MemberNumber\"=\"members\";\n\"Invite\"=\"invite\";\n\"JoinDiscussion\"=\"joined discussion\";\n\"QuitDiscussion\"=\"quite discussion\";\n\"By\"=\"by\";\n\"RemoveDiscussion\"=\"removed from discussion\";\n\"ModifyDiscussion\"=\"modify discussion\";\n\"InviteStatus\"=\"invitation\";\n\"Open\"=\"Open\";\n\"Close\"=\"Close\";\n\"VoIP_Calling\"=\"Calling...\";\n\"VoIP_Talking\"=\"Calling number is talking\";\n\"VoIP_Offline\"=\"Calling number is offline\";\n\"VoIP_Net_busy\"=\"Network is busy\";\n\"VoIP_Not_Accept\"=\"Call has no answer\";\n\"VoIP_Rejected_By_Blacklist\"=\"Your call has sent out, but been rejected by the receiver\";\n\"WaitingForAcceptInvitation\"=\"Waiting for accept calling invitation...\";\n\"VoIP_CallingFailed\"=\"Calling is failed, please try again\";\n\"VoIP_invite\"=\"Invite you for talking\";\n\"VoIP_Incoming_Notification\"=\"Invite you for a call\";\n\"VoIP_Accepted_Notification\"=\"Call accepted\";\n\"VoIP_SessionIDWrong\"=\"Session ID is wrong\";\n\"Yesterday\"=\"Yesterday\";\n\"SearchPublicService\"=\"Search Public Service\";\n\"PublicService\"=\"Public Service\";\n\"NOT_IN_DISCUSSION\"=\"You are not in current discussion\";\n\"NOT_IN_GROUP\"=\"You are not in current group\";\n\"FORBIDDEN_IN_GROUP\"=\"You were forbidden to send message in current group.\";\n\"NOT_IN_CHATROOM\"=\"You are not in current chat room\";\n\"Message rejected\"=\"Your message have sent out, but rejected by the receiver\";\n\"AccessRightTitle\"=\"no access right\";\n\"ForbiddenInChatRoom\"=\"You were forbidden to send message in current chatroom.\";\n\"KickedFromChatRoom\"=\"You were kicked from current chatroom.\";\n\"JoinChatRoomRejected\"=\"You were forbidden to join current chatroom, please contact customer service.\";\n\"JoinChatRoomFailed\"=\"Join chat room failed\";\n\"Connecting...\"=\"Connecting...\";\n\"FromFriendInvitation\"=\"From %@ friend invitation\";\n\"AddFriendInvitation\"=\"Add Friend Invitation\";\n\"ReadAll\"=\"Read all\";\n\"OfficialAccounts\"=\"Official Accounts\";\n\"Share\"=\"Share Name Card\";\n\"Report\"=\"Report\";\n\"OpenURLInBrowser\"=\"Open in Safari\";\n\"CopyURL\"=\"Copy URL\";\n\"ClearHistory\"=\"Clear History\";\n\"Unfollow\"=\"Unfollow\";\n\"Introduced\"=\"Intro\";\n\"AccountType\"=\"Account Type\";\n\"ServicePhone\"=\"Customer service hotline\";\n\"BusinessScope\"=\"Business Scope\";\n\"NewMessageNotification\"=\"New message notification\";\n\"ViewHistory\"=\"View History\";\n\"EnterOfficialAccount\"=\"Enter Official Account\";\n\"Attention\"=\"Follow\";\n\"PublicNum\"=\"Public service : %@\";\n\"Wait\"=\"Please wait a moment...\";\n\"Searching\"=\"Searching...\";\n\"Search\"=\"Search:\";\n\"Right_unReadMessage\"=\"%ld new message\";\n\"HistoryMessageTip\"=\"Above is the historical messages\";\n\"DISCUSSION\"=\"discussion\";\n\"DateFormat\"=\"MM-dd\";\n\"MessageHasRead\"=\"Read\";\n\"MessageHasSend\"=\"Sent\";\n\"Full_Image\"=\"Full Image\";\n\"typing\"=\"typing...\";\n\"Speaking\"=\"Speaking...\";\n"
  },
  {
    "path": "Sublime/Pods/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/zh-Hans.lproj/RongCloudKit.strings",
    "content": "/* \n  RongCloudKit.strings\n  RongIMKit\n\n  Created by xugang on 1/15/15.\n  Copyright (c) 2015 RongCloud. All rights reserved.\n*/\n\"RC:ImgMsg\" = \"[图片]\";\n\"RC:LBSMsg\" = \"[位置]\";\n\"RC:VcMsg\" = \"[语音]\";\n\"RC:ImgTextMsg\" = \"[图文]\";\n\"RC:VoipCallMsg\" = \"[语音通话]\";\n\"RC:VoipFinishMsg\" = \"[语音结束]\";\n\"RC:PSMultiImgTxtMsg\" = \"[图文]\";\n\"RC:PSImgTxtMsg\" = \"[图文]\";\n\"Draft\"=\"[草稿]\";\n\"conversation_private_collection_title\" = \"聊天助手\";\n\"conversation_customer_collection_title\" = \"客服助手\";\n\"conversation_group_collection_title\" = \"群助手\";\n\"conversation_discussion_collection_title\" = \"讨论组助手\";\n\"conversation_systemMessage_collection_title\" = \"系统消息助手\";\n\"hold_to_talk_title\"=\"按住说话\";\n\"release_to_send_title\"=\"松开发送\";\n\"slide_up_to_cancel_title\"=\"手指上滑 取消发送\";\n\"release_to_cancel_title\"=\"手指松开 取消发送\";\n\"message_too_short\"=\"录音时间短\";\n\"whiteSpaceMessage\"=\"不能发送空白消息\";\n\"OK\"=\"确定\";\n\"Cancel\"=\"取消\";\n\"speakerAccessRight\"=\"您没有麦克风访问权限，请前往“设置-隐私-麦克风”选项中，允许访问您的手机麦克风!\";\n\"VoIP_Mute\"=\"静音\";\n\"VoIP_Speaker\"=\"免提\";\n\"VoIP_End\"=\"结束\";\n\"VoIP_Answer\"=\"应答\";\n\"VoIP_Reject\"=\"拒接\";\n\"VoIP_Drop\"=\"挂断\";\n\"Request_Friends_extra\"=\"请求添加好友消息\";\n\"Setting\"=\"设置\";\n\"Back\"=\"返回\";\n\"IsDeleteHistoryMsg\"=\"是否删除历史消息？\";\n\"ConnectionIsNotReachable\"=\"网络连接不可用，请检查\";\n\"Album\"=\"相册\";\n\"Photo\"=\"照相\";\n\"Location\"=\"位置\";\n\"Audio\"=\"语音通话\";\n\"Albums\"=\"相册列表\";\n\"unknown_message_cell_tip\"=\"当前版本暂不支持查看此消息\";\n\"unknown_message_notification_tip\"=\"收到一条不支持的消息\";\n\"Copy\"=\"复制\";\n\"Delete\"=\"删除\";\n\"Save\"=\"保存\";\n\"SavePhotoFailed\"=\"图片保存失败\";\n\"SavePhotoSuccess\"=\"图片保存成功\";\n\"PickLocation\"=\"选取位置\";\n\"More\"=\"更多\";\n\"Done\"=\"完成\";\n\"Longitude\"=\"经度\";\n\"Latitude\"=\"纬度\";\n\"LocationInformation\"=\"位置信息\";\n\"LocalNotificationShow\"=\"显示\";\n\"PhotoAccessRight\"=\"没有访问权限，请前往“设置-隐私-照片”选项中，允许访问您的照片\";\n\"MaxNumSelectPhoto\"=\"最多选择9张\";\n\"AllPhoto\"=\"全部照片\";\n\"NoPhotoTitle\"=\"无照片或视频\";\n\"NoPhotoDesc\"=\"您可以使用相机拍摄照片和视频，或使用iTunes将照片和视频同步到iPhone.\";\n\"Send\"=\"发送\";\n\"SetToTop\"=\"置顶聊天\";\n\"NewMsgNotification\"=\"新消息通知\";\n\"ClearRecord\"=\"清除聊天记录\";\n\"CanNotRemoveSelf\"=\"不能移除自己\";\n\"MemberNumber\"=\"位成员\";\n\"Invite\"=\"邀请\";\n\"JoinDiscussion\"=\"加入了讨论组\";\n\"QuitDiscussion\"=\"退出了讨论组\";\n\"By\"=\"被\";\n\"RemoveDiscussion\"=\"移除了讨论组\";\n\"ModifyDiscussion\"=\"修改讨论组为\";\n\"InviteStatus\"=\"了成员邀请\";\n\"Open\"=\"开启\";\n\"Close\"=\"关闭\";\n\"VoIP_Calling\"=\"正在拨号...\";\n\"VoIP_Talking\"=\"对方正在通话!\";\n\"VoIP_Offline\"=\"对方不在线!\";\n\"VoIP_Net_busy\"=\"网络繁忙，稍后再试！\";\n\"VoIP_Not_Accept\"=\"对方未接听\";\n\"VoIP_Rejected_By_Blacklist\"=\"您的通话请求已发出，但被对方拒绝\";\n\"WaitingForAcceptInvitation\"=\"正在等待对方接受邀请...\";\n\"VoIP_CallingFailed\"=\"呼叫建立失败，请重新再拨\";\n\"VoIP_invite\"=\"邀请您接受聊天\";\n\"VoIP_Incoming_Notification\"=\"发起了语音通话\";\n\"VoIP_Accepted_Notification\"=\"接受了语音通话\";\n\"VoIP_SessionIDWrong\"=\"呼叫Session ID 错误\";\n\"Yesterday\"=\"昨天\";\n\"SearchPublicService\"=\"查找服务号\";\n\"PublicService\"=\"服务号\";\n\"NOT_IN_DISCUSSION\"=\"您当前不在此讨论组\";\n\"NOT_IN_GROUP\"=\"您当前不在此群组\";\n\"FORBIDDEN_IN_GROUP\"=\"您在当前群组中被禁言。\";\n\"NOT_IN_CHATROOM\"=\"您当前不在此聊天室\";\n\"Message rejected\"=\"您的消息已发出，但被对方拒绝\";\n\"AccessRightTitle\"=\"无法访问\";\n\"ForbiddenInChatRoom\"=\"你已被禁言，不能发送消息。\";\n\"KickedFromChatRoom\"=\"你已被踢出聊天室。\";\n\"JoinChatRoomRejected\"=\"你被禁止加入聊天室，请联系客服。\";\n\"JoinChatRoomFailed\"=\"加入聊天室失败\";\n\"Connecting...\"=\"连接中...\";\n\"FromFriendInvitation\"=\"来自%@的好友请求\";\n\"AddFriendInvitation\"=\"添加好友请求\";\n\"ReadAll\"=\"阅读全文\";\n\"OfficialAccounts\"=\"公共账号\";\n\"Share\"=\"推荐给朋友\";\n\"Report\"=\"举报\";\n\"OpenURLInBrowser\"=\"在Safari中打开\";\n\"CopyURL\"=\"复制链接\";\n\"ClearHistory\"=\"清空内容\";\n\"Unfollow\"=\"不再关注\";\n\"Introduced\"=\"功能介绍\";\n\"AccountType\"=\"账号主体\";\n\"ServicePhone\"=\"服务电话\";\n\"BusinessScope\"=\"经营范围\";\n\"NewMessageNotification\"=\"新消息通知\";\n\"ViewHistory\"=\"查看历史消息\";\n\"EnterOfficialAccount\"=\"进入公众账号\";\n\"Attention\"=\"关注\";\n\"PublicNum\"=\"公众号：%@\";\n\"Wait\"=\"请稍等...\";\n\"Searching\"=\"搜索中...\";\n\"Search\"=\"搜索:\";\n\"Right_unReadMessage\"=\"%ld 条新消息\";\n\"HistoryMessageTip\"=\"以上是历史消息\";\n\"DISCUSSION\"=\"讨论组\";\n\"DateFormat\"=\"MM月dd日\";\n\"MessageHasRead\"=\"已读\";\n\"MessageHasSend\"=\"已发\";\n\"Full_Image\"=\"原图\";\n\"typing\"=\"对方正在输入...\";\n\"Speaking\"=\"对方正在讲话...\";\n"
  },
  {
    "path": "Sublime/Pods/SJCSimplePDFView/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Stuart Crook\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "Sublime/Pods/SJCSimplePDFView/README.md",
    "content": "# SJCSimplePDFView\nA simple UIView subclass for displaying PDFs on iOS. I created this for a project when displaying a PDF in a UIWebView didn't provide either the styling options or feedback required.\n\nThe PDFView:\n\n* Provides 3 different display modes\n* Allows customisation of page backgrounds, borders and insets\n* Allows display to be limited to a subset of pages within a PDF document\n* Allows observation of visible page number (or numbers)\n* Integrates with Interface Builder (mostly IBInspectable)\n\nThis repository contains an example app which you can use to play around with the PDFView's settings to see what it can do.\n\nInstallation\n------------\n\nCopy the `SJCSimplePDFView.h` and `SJCSimplePDFView.m` files into your project.\n\n(Cocopods integration coming soon.)\n\nUse\n---\n\nThe PDFView can be created and configured via Interface Builder, or in code (using `-initWithFrame:`).\n\nA PDF document can be loaded into the PDFView in one of 3 ways:\n\n* Set the `.PDFData` property to an NSData object containing a PDF file.\n* Set the `.PDFFileURL` to the URL of a PDF document. Note that this should be a local file URL (file://...). An exception will be thrown if you attempt to set this value with any other URL.\n* Set the `.PDFBundleFileName` property to the filename of a PDF document included in your app bundle. This property can also be set in Interface Builder (although the content of the PDF is not currently shown in Interface Builder).\n\n`.viewMode` can be specified in Interface Builder. (Due to current limitations with working with enums this is an integer field which can take any value. Only the values noted in brackets below are valid, other values will be interpreted as 0.) It has 3 possible display modes:\n* `kSJCPDFViewModeContinuous` [0] -- pages are displayed end-to-end, with width set to the widht of the PDFView, and scroll vertically\n* `kSJCPDFViewModePageVertical` [1] -- pages are displayed individually, scaled to fit the PDFView, and scroll vertically\n* `kSJCPDFViewModePageHorizontal` [2] -- pages are displayed individually, scaled to fit the PDFView, and scroll horizontally\n\nOnce a document is set, the number of pages it contain can be found in `.documentPageCount`. By default, all pages from the document are shown. To display only a subset of pages, set `.displayPages` to a NSIndexSet containing the page numbers to display. `.displayedPageCount` contains the number of pages from the document which will actually be displayed.\n\n`.currentPage` is the number of the page currently displayed. If more than one page can be visible at once (if `.viewMode` is `kSJCPDFViewModeContinuous`) `.currentPages` returns as NSIndexSet containing the page numbers of all the visible pages (in other modes it returns an NSIndexSet containing only `.currentPage`). Page numbers start at 1 and are based on the `.displayedPages`, not a page's position in the PDF document, so if you are only showing pages 21-25 of a document `.currentPage` will report these as pages 1-5. Setting `.currentPage` changes the displayed page, as long as the new value is between 1 and `.displayedPageCount` inclusive.\n\nIf you would like to track user interaction with the PDFView, `.currentPage` is KVO compliant (see the example app).\n\nThe inset of a page from the edges of the PDFView can be set via `.pageInsets`. The background of this inset area can be set with `.pageBackgroundColour`. (Note that most PDFs with white backgrounds are effectively transparent.) The width and colour of the border drawn around this inset area can be specified with `.borderColour` and `.borderWidth`. All of these properties can be set in Interface Builder.\n"
  },
  {
    "path": "Sublime/Pods/SJCSimplePDFView/SJCSimplePDFView/SJCSimplePDFView.h",
    "content": "/*\n The MIT License (MIT)\n \n Copyright (c) 2015 Stuart Crook\n \n Permission is hereby granted, free of charge, to any person obtaining a copy of\n this software and associated documentation files (the \"Software\"), to deal in\n the Software without restriction, including without limitation the rights to\n use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n the Software, and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n \n The above copyright notice and this permission notice shall be included in all\n 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, FITNESS\n FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#import <UIKit/UIKit.h>\n\ntypedef NS_ENUM(NSUInteger, SJCPDFViewMode) {\n    kSJCPDFViewModeContinuous,\n    kSJCPDFViewModePageVertical,\n    kSJCPDFViewModePageHorizontal,\n};\n\nIB_DESIGNABLE\n\n@interface SJCSimplePDFView : UIScrollView\n\n// name of a file in the app's bundle to display\n@property (nonatomic,strong) IBInspectable NSString *PDFBundleFileName;\n\n// URL pointing to the file to display\n@property (nonatomic,strong) NSURL *PDFFileURL;\n\n// the raw PDF data\n@property (nonatomic,copy) NSData *PDFData;\n\n#if !TARGET_INTERFACE_BUILDER\n// defaults to kSJCPDFViewModeContinuous\n@property (nonatomic)  SJCPDFViewMode viewMode;\n#else\n@property (nonatomic) IBInspectable NSUInteger viewMode;\n#endif\n\n// current visible page (topmost page for kSJCPDFViewModeContinuous)\n// KVO-able, in case you want to track user interaction with the view\n@property (nonatomic) NSUInteger currentPage;\n\n// a set containing details of the pages currently visible\n@property (nonatomic,readonly) NSIndexSet *currentPages;\n\n// number of pages in the PDF document\n@property (nonatomic,readonly) NSUInteger documentPageCount;\n\n// a set containing the pages which can be displayed. nil means display all\n@property (nonatomic,copy) NSIndexSet *displayPages;\n\n// number of pages from the PDF document which are available for display\n@property (nonatomic,readonly) NSUInteger displayedPageCount;\n\n// margin around each page\n@property (nonatomic) UIEdgeInsets pageInsets;\n// because IBDesignable needs a little more work\n@property (nonatomic) IBInspectable CGFloat topPageInset;\n@property (nonatomic) IBInspectable CGFloat bottomPageInset;\n@property (nonatomic) IBInspectable CGFloat leftPageInset;\n@property (nonatomic) IBInspectable CGFloat rightPageInset;\n\n@property (nonatomic,strong) IBInspectable UIColor *pageBackgroundColour;\n\n// these are only visible if edge insets are non-zero\n@property (nonatomic,strong) IBInspectable UIColor *borderColour;\n@property (nonatomic) IBInspectable CGFloat borderWidth;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/SJCSimplePDFView/SJCSimplePDFView/SJCSimplePDFView.m",
    "content": "/*\n The MIT License (MIT)\n \n Copyright (c) 2015 Stuart Crook\n \n Permission is hereby granted, free of charge, to any person obtaining a copy of\n this software and associated documentation files (the \"Software\"), to deal in\n the Software without restriction, including without limitation the rights to\n use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n the Software, and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n \n The above copyright notice and this permission notice shall be included in all\n 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, FITNESS\n FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#import \"SJCSimplePDFView.h\"\n\n// distance outside content view to add extra page views\nstatic CGFloat const PageCachingMargin = 100.f;\nstatic CGFloat const DoublePageCachingMargin = PageCachingMargin * 2.f;\n\n@interface SJCSimplePDFView () <UIScrollViewDelegate>\n\n@property (nonatomic,assign) CGPDFDocumentRef document;\n\n@property (nonatomic) NSUInteger documentPageCount;\n@property (nonatomic) NSUInteger displayedPageCount;\n\n@property (nonatomic,strong) UIView *pagesContainer;\n@property (nonatomic,strong) NSArray *pages;\n@property (nonatomic,strong) NSArray *pageFrames;\n@property (nonatomic,strong) NSMutableDictionary *pageViews;\n\n@property (nonatomic) CGSize lastLaidOutSize;\n\n@property (nonatomic,assign) CGColorSpaceRef cs;\n\n@property (nonatomic,weak) NSObject <UIScrollViewDelegate> *externalDelegate;\n\n@end\n\n@implementation SJCSimplePDFView\n\n#pragma mark - lifecycle\n\n- (instancetype)initWithFrame:(CGRect)frame {\n    if((self = [super initWithFrame:frame])) {\n        [self _setup];\n    }\n    return self;\n}\n\n- (instancetype)initWithCoder:(NSCoder *)aDecoder {\n    if((self = [super initWithCoder:aDecoder])) {\n        [self _setup];\n    }\n    return self;\n}\n\n- (void)_setup {\n    _pagesContainer = [[UIView alloc] initWithFrame:self.bounds];\n    [self addSubview:_pagesContainer];\n    \n    super.delegate = self;\n    \n    _cs = CGColorSpaceCreateDeviceRGB();\n}\n\n- (void)dealloc {\n    if(_document) {\n        CGPDFDocumentRelease(_document);\n        _document = NULL;\n    }\n    if(_cs) {\n        CGColorSpaceRelease(_cs);\n        _cs = NULL;\n    }\n}\n\n#pragma mark - setting the document\n\n- (void)setPDFBundleFileName:(NSString *)PDFBundleFileName {\n    NSParameterAssert(PDFBundleFileName.length);\n    \n#if TARGET_INTERFACE_BUILDER\n    NSURL *fileURL = [[NSBundle bundleForClass:[self class]] URLForResource:[PDFBundleFileName stringByDeletingPathExtension] withExtension:[PDFBundleFileName pathExtension]];\n#else\n    NSURL *fileURL = [[NSBundle mainBundle] URLForResource:[PDFBundleFileName stringByDeletingPathExtension] withExtension:[PDFBundleFileName pathExtension]];\n#endif\n    if(!fileURL) {\n        NSLog(@\"error: unable to find '%@' in the main app bundle\", PDFBundleFileName);\n        return;\n    }\n    \n    self.PDFFileURL = fileURL;\n    _PDFBundleFileName = PDFBundleFileName;\n}\n\n- (void)setPDFFileURL:(NSURL *)PDFFileURL {\n    NSParameterAssert(PDFFileURL.isFileURL);\n\n    NSError *error = nil;\n    NSData *data = [NSData dataWithContentsOfURL:PDFFileURL options:NSDataReadingMappedIfSafe error:&error];\n    if(!data) {\n        NSLog(@\"error loading data from URL %@: %@\", PDFFileURL, error);\n        return;\n    }\n    if(!data.length) {\n        NSLog(@\"error: loading %@ resulted in 0-length data\", PDFFileURL);\n        return;\n    }\n    \n    self.PDFData = data;\n    _PDFBundleFileName = nil;\n    _PDFFileURL = PDFFileURL;\n}\n\n- (void)setPDFData:(NSData *)PDFData {\n    NSParameterAssert(PDFData.length);\n    \n    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)PDFData);\n    CGPDFDocumentRef document = CGPDFDocumentCreateWithProvider(provider);\n    CGDataProviderRelease(provider);\n    if(!document) {\n        NSLog(@\"error creating PDF document from data\");\n        return;\n    }\n    \n    _PDFFileURL = nil;\n    _PDFData = PDFData;\n    _document = document;\n\n    [self _configureForDocument];\n}\n\n// setup values which are derived from the current PDF document\n- (void)_configureForDocument {\n\n    _documentPageCount = CGPDFDocumentGetNumberOfPages(_document);\n    if(!_documentPageCount) {\n        NSLog(@\"warning: document has no pages!\");\n        return; // not much else we can do...\n    }\n    _currentPage = 1;\n    \n    NSMutableArray *pages = [NSMutableArray new];\n    if(_displayPages) {\n        [_displayPages enumerateIndexesInRange:NSMakeRange(1, _documentPageCount)\n                                       options:kNilOptions\n                                    usingBlock:^(NSUInteger page, BOOL *stop) {\n            [pages addObject:(__bridge id)CGPDFDocumentGetPage(_document, page)];\n        }];\n        \n    } else {\n        NSUInteger page = 1;\n        while(page <= _documentPageCount) {\n            [pages addObject:(__bridge id)CGPDFDocumentGetPage(_document, page++)];\n        }\n    }\n    _pages = [pages copy];\n    _displayedPageCount = _pages.count;\n\n    [self _resetPageViews];\n\n    self.contentOffset = CGPointZero;\n}\n\n- (void)_resetPageViews {\n    [_pageViews.allValues enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop) {\n        [view removeFromSuperview];\n    }];\n    _pageViews = [NSMutableDictionary new];\n    _pageFrames = nil;\n}\n\n#pragma mark - IB_DESIGNABLE\n\n#if TARGET_INTERFACE_BUILDER\n- (void)prepareForInterfaceBuilder {\n    if(!_PDFData.length) {\n        // create a blank A4 PDF page to display as example content\n        self.PDFData = ({\n            NSMutableData *data = [NSMutableData new];\n            CGDataConsumerRef consumer = CGDataConsumerCreateWithCFData((__bridge CFMutableDataRef)data);\n            CGRect box = (CGRect){ CGPointZero, CGSizeMake(210.f * 72.0f * 0.393700787f, 297.f * 72.0f * 0.393700787f) };\n            CGContextRef context = CGPDFContextCreate(consumer, &box, NULL);\n            CGPDFContextBeginPage(context, NULL);\n            CGPDFContextEndPage(context);\n            CGPDFContextClose(context);\n            CGContextRelease(context);\n            CGDataConsumerRelease(consumer);\n            data;\n        });\n    }\n}\n#endif\n\n#pragma mark - \n\n- (void)setDisplayPages:(NSIndexSet *)displayPages {\n    _displayPages = [displayPages copy];\n    [self _resetPageViews];\n    [self setNeedsLayout];\n}\n\n- (void)setViewMode:(SJCPDFViewMode)viewMode {\n\n    // sanity check because of the hoops we're jumping through to make this IBInspectable\n    if(viewMode < kSJCPDFViewModeContinuous || viewMode > kSJCPDFViewModePageHorizontal) {\n        return;\n    }\n    \n    if(_viewMode != viewMode) {\n        // do basic configuration for the new mode\n        switch((_viewMode = viewMode)) {\n            case kSJCPDFViewModeContinuous:\n                self.pagingEnabled = NO;\n                break;\n                \n            case kSJCPDFViewModePageHorizontal:\n            case kSJCPDFViewModePageVertical:\n                self.pagingEnabled = YES;\n                break;\n        }\n        \n        // most other view configuration happens in -didLayoutSubviews\n        [self _resetPageViews];\n        [self setNeedsLayout];\n    }\n}\n\n\n- (void)setCurrentPage:(NSUInteger)currentPage {\n    if(_currentPage != currentPage && (_displayPages == nil || [_displayPages containsIndex:currentPage])) {\n        _currentPage = currentPage;\n        self.contentOffset = ({\n            CGSize size = UIEdgeInsetsInsetRect(self.bounds, self.contentInset).size;\n            CGPoint offset;\n            switch(_viewMode) {\n                case kSJCPDFViewModeContinuous:\n                    offset = [_pageFrames[currentPage - 1] CGRectValue].origin;\n                    offset.x = 0.f;\n                    offset.y = offset.y - _pageInsets.right - self.contentInset.top;\n                    break;\n                    \n                case kSJCPDFViewModePageVertical:\n                    offset = CGPointMake(0.f, size.height * currentPage);\n                    break;\n                    \n                case kSJCPDFViewModePageHorizontal:\n                    offset = CGPointMake(size.width * currentPage, 0.f);\n                    break;\n            }\n            offset;\n        });\n        [self _configureVisiblePages];\n    }\n}\n\n// the pages which are (should be) visible\n- (NSIndexSet *)currentPages {\n    NSMutableIndexSet *indexSet = [NSMutableIndexSet new];\n    CGRect visibleRect = UIEdgeInsetsInsetRect((CGRect){ self.contentOffset, self.bounds.size }, self.contentInset);\n    [_pageViews enumerateKeysAndObjectsUsingBlock:^(NSNumber *index, UIView *view, BOOL *stop) {\n        if(CGRectIntersectsRect(visibleRect, view.frame)) {\n            [indexSet addIndex:view.tag];\n        }\n    }];\n    return [indexSet copy];\n}\n\n#pragma mark - view layout\n\n- (void)setNeedsLayout {\n    _lastLaidOutSize = CGSizeZero;\n    [super setNeedsLayout];\n}\n\n- (void)layoutSubviews {\n    [super layoutSubviews];\n    \n    CGRect bounds = UIEdgeInsetsInsetRect((CGRect){ CGPointZero, self.bounds.size }, self.contentInset);\n    \n    if(CGSizeEqualToSize(_lastLaidOutSize, bounds.size)) {\n        return; // we've already laid out for this view size\n    }\n    \n    _lastLaidOutSize = bounds.size;\n    \n    CGSize __block contentSize;\n    CGPoint __block contentOffset;\n    \n    NSMutableArray *pageFrames = [NSMutableArray new];\n\n    switch(_viewMode) {\n        case kSJCPDFViewModeContinuous: {\n            \n            // scrollable content will be as wide as the view\n            contentSize = CGSizeMake(bounds.size.width, 0.f);\n            \n            // calculate what we can about the size of the first page: its width and x position\n            CGRect __block pageFrame = CGRectMake(_pageInsets.left, 0.f, contentSize.width - _pageInsets.left - _pageInsets.right, 0.f);\n            \n            [_pages enumerateObjectsUsingBlock:^(id page, NSUInteger index, BOOL *stop) {\n\n                CGSize pageSize = CGPDFPageGetBoxRect((__bridge CGPDFPageRef)page, kCGPDFMediaBox).size;\n\n                int rotation = CGPDFPageGetRotationAngle((__bridge CGPDFPageRef)page);\n                if(rotation == 90 || rotation == 270) {\n                    pageSize = CGSizeMake(pageSize.height, pageSize.width);\n                }\n                \n                pageFrame.origin.y += _pageInsets.top;\n                pageFrame.size.height = roundf(pageFrame.size.width * (pageSize.height / pageSize.width));\n                [pageFrames addObject:[NSValue valueWithCGRect:pageFrame]];\n                \n                UIView *view = _pageViews[@(index)];\n                if(view) { view.frame = pageFrame; }\n                \n                if(_currentPage - 1 == index) {\n                    contentOffset = CGPointMake(0.f, pageFrame.origin.y - _pageInsets.top);\n                }\n                \n                // advance to the next page frame position\n                pageFrame.origin.y += pageFrame.size.height + _pageInsets.bottom;\n            }];\n            \n            contentSize.height = pageFrame.origin.y;\n            \n        } break;\n            \n        case kSJCPDFViewModePageVertical:\n        case kSJCPDFViewModePageHorizontal: {\n            \n            CGFloat xd = 0.f;\n            CGFloat yd = 0.f;\n            \n            // code paths for these modes are mostly the same, except for this bit\n            if(_viewMode == kSJCPDFViewModePageHorizontal) {\n                xd = bounds.size.width;\n                contentSize = CGSizeMake(bounds.size.width * _displayedPageCount, bounds.size.height);\n                contentOffset = CGPointMake(bounds.size.width * (_currentPage - 1), 0.f);\n            } else {\n                yd = bounds.size.height;\n                contentSize = CGSizeMake(bounds.size.width, bounds.size.height * _displayedPageCount);\n                contentOffset = CGPointMake(0.f, bounds.size.height * (_currentPage - 1));\n            }\n\n            CGRect __block pageFrame = UIEdgeInsetsInsetRect(bounds, _pageInsets);\n            \n            [_pages enumerateObjectsUsingBlock:^(id page, NSUInteger index, BOOL *stop) {\n                \n                CGSize pageSize = CGPDFPageGetBoxRect((__bridge CGPDFPageRef)page, kCGPDFMediaBox).size;\n\n                // calculate the page frame which fits -- attempt to fit full height first\n                CGRect frame;\n                CGFloat width = roundf(pageFrame.size.height * (pageSize.width / pageSize.height));\n                if(width <= pageFrame.size.width) {\n                    // fits, so adjust x offsets\n                    frame = CGRectMake(pageFrame.origin.x + roundf((pageFrame.size.width - width) / 2.f), pageFrame.origin.y, width, pageFrame.size.height);\n                } else {\n                    // doesn't fit, so assume we're fitting across full width\n                    CGFloat height = roundf(pageFrame.size.width * (pageSize.height / pageSize.width));\n                    frame = CGRectMake(pageFrame.origin.x, pageFrame.origin.y + roundf((pageFrame.size.height - height) / 2.f), pageFrame.size.width, height);\n                }\n                [pageFrames addObject:[NSValue valueWithCGRect:frame]];\n                \n                UIView *view = _pageViews[@(index)];\n                if(view) { view.frame = frame; }\n                \n                // advance to the next page frame position\n                pageFrame.origin.x += xd;\n                pageFrame.origin.y += yd;\n            }];\n\n        } break;\n            \n        default:\n            return;\n            break;\n    }\n\n    _pageFrames = [pageFrames copy];\n\n    _pagesContainer.frame = (CGRect){ CGPointZero, contentSize };\n\n    self.contentSize = contentSize;\n    //self.contentOffset = contentOffset;\n    \n    [self _configureVisiblePages];\n}\n\n- (void)_configureVisiblePages {\n    \n    // calculate the visible part of the scrollview, plus an overlap which will cache the neighbouring views\n    CGFloat zoom = self.zoomScale;\n    CGPoint offset = ({\n        CGPoint offset = self.contentOffset;\n        UIEdgeInsets insets = self.contentInset;\n        offset.x += insets.left;\n        offset.y += insets.top;\n        offset;\n    });\n    CGSize visible = UIEdgeInsetsInsetRect(self.bounds, self.contentInset).size;\n    CGRect visibleRect = CGRectMake(offset.x / zoom, offset.y / zoom, visible.width / zoom, visible.height / zoom);\n    if(_viewMode == kSJCPDFViewModePageHorizontal) {\n        visibleRect.origin.x -= PageCachingMargin;\n        visibleRect.size.width += DoublePageCachingMargin;\n    } else {\n        visibleRect.origin.y -= PageCachingMargin;\n        visibleRect.size.height += DoublePageCachingMargin;\n    }\n    \n    // calculate which views should be visible and add them to the scrollview\n    NSMutableIndexSet *visibleViewIdexes = [NSMutableIndexSet new];\n    [_pageFrames enumerateObjectsUsingBlock:^(NSValue *value, NSUInteger index, BOOL *stop) {\n        if(CGRectIntersectsRect(visibleRect, value.CGRectValue)) {\n            [visibleViewIdexes addIndex:index];\n            [self _displayPageAtIndex:index];\n        }\n    }];\n\n    // remove the views which should no longer be visible\n    NSMutableIndexSet *removableViewIndexes = [NSMutableIndexSet new];\n    [_pageViews enumerateKeysAndObjectsUsingBlock:^(NSNumber *index, UIView *view, BOOL *stop) {\n        NSUInteger i = index.integerValue;\n        if(![visibleViewIdexes containsIndex:i]) {\n            [removableViewIndexes addIndex:i];\n            [view removeFromSuperview];\n        }\n    }];\n    [removableViewIndexes enumerateIndexesUsingBlock:^(NSUInteger index, BOOL *stop) {\n        [_pageViews removeObjectForKey:@(index)];\n    }];\n    \n    // work out what the current visible page is\n    NSUInteger currentPage = self.currentPages.firstIndex;\n    if(currentPage != _currentPage) {\n        [self willChangeValueForKey:@\"currentPage\"];\n        _currentPage = currentPage;\n        [self didChangeValueForKey:@\"currentPage\"];\n    }\n}\n\n// index is 0-based and describes the page's position within the scrollview. it\n// is not necessarily directly related to the PDF page number\n- (void)_displayPageAtIndex:(NSUInteger)index {\n    \n    if(index >= _pages.count) {\n        return; // no such page\n    }\n    \n    // the .pageViews dictionary stores using the index, to make this easier\n    if(_pageViews[@(index)]) {\n        return; // view already exists\n    }\n    \n    // get details about the page we'll be displaying\n    CGPDFPageRef page = (__bridge CGPDFPageRef)_pages[index];\n    CGRect pageFrame = [_pageFrames[index] CGRectValue];\n    \n    UIImageView *imageView = [[UIImageView alloc] initWithFrame:pageFrame];\n    imageView.backgroundColor = _pageBackgroundColour;\n    imageView.contentMode = UIViewContentModeScaleToFill;\n    imageView.tag = CGPDFPageGetPageNumber(page);; // makes -visiblePages a bit easier\n    [self configureLayerBorderForView:imageView];\n    [_pagesContainer addSubview:imageView];\n    \n    _pageViews[@(index)] = imageView;\n    \n    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{\n        \n        // calculate pixel size, taking into account how far in we could zoom\n        CGFloat scale = [UIScreen mainScreen].scale * self.maximumZoomScale;\n        CGSize size = CGSizeMake(pageFrame.size.width * scale, pageFrame.size.height * scale);\n\n        CGContextRef context = CGBitmapContextCreate(NULL, size.width, size.height, 8, size.width * 4, _cs, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrder32Big);\n\n        CGSize mediaSize = CGPDFPageGetBoxRect(page, kCGPDFMediaBox).size;\n        int rotation = CGPDFPageGetRotationAngle(page);\n        if(rotation == 90 || rotation == 270) {\n            mediaSize = CGSizeMake(mediaSize.height, mediaSize.width);\n        }\n\n        CGContextScaleCTM(context, size.width / mediaSize.width, size.height / mediaSize.height );\n        CGContextTranslateCTM(context, (mediaSize.width - size.width) / 2.f, (mediaSize.height - size.height) / 2.f);\n        CGContextConcatCTM(context, CGPDFPageGetDrawingTransform(page, kCGPDFMediaBox, (CGRect){ CGPointZero, size }, 0, true));\n        \n        CGContextDrawPDFPage(context, page);\n        \n        CGImageRef cgImage = CGBitmapContextCreateImage(context);\n        UIImage *image = [UIImage imageWithCGImage:cgImage];\n\n        CGImageRelease(cgImage);\n        CGContextRelease(context);\n        \n        dispatch_async(dispatch_get_main_queue(), ^{\n            imageView.image = image;\n        });\n    });\n}\n\n#pragma mark - page view attributes\n\n- (void)setPageInsets:(UIEdgeInsets)pageInsets {\n    if(!UIEdgeInsetsEqualToEdgeInsets(_pageInsets, pageInsets)) {\n        _pageInsets = pageInsets;\n        [self setNeedsLayout];\n    }\n}\n\n// because UIEdgeInsets cannot be IBInspectable\n// TODO: radar this\n\n- (void)setTopPageInset:(CGFloat)topPageInset {\n    if(_pageInsets.top != topPageInset) {\n        _pageInsets.top = topPageInset;\n        [self setNeedsLayout];\n    }\n}\n\n- (CGFloat)topPageInset {\n    return _pageInsets.top;\n}\n\n- (void)setBottomPageInset:(CGFloat)bottomPageInset {\n    if(_pageInsets.bottom != bottomPageInset) {\n        _pageInsets.bottom = bottomPageInset;\n        [self setNeedsLayout];\n    }\n}\n\n- (CGFloat)bottomPageInset {\n    return _pageInsets.bottom;\n}\n\n- (void)setLeftPageInset:(CGFloat)leftPageInset {\n    if(_pageInsets.left != leftPageInset) {\n        _pageInsets.left = leftPageInset;\n        [self setNeedsLayout];\n    }\n}\n\n- (CGFloat)leftPageInset {\n    return _pageInsets.left;\n}\n\n- (void)setRightPageInset:(CGFloat)rightPageInset {\n    if(_pageInsets.right != rightPageInset) {\n        _pageInsets.right = rightPageInset;\n        [self setNeedsLayout];\n    }\n}\n\n- (CGFloat)rightPageInset {\n    return _pageInsets.right;\n}\n\n- (void)setPageBackgroundColour:(UIColor *)pageBackgroundColour {\n    _pageBackgroundColour = pageBackgroundColour;\n    [_pageViews enumerateKeysAndObjectsUsingBlock:^(UIView *view, id obj, BOOL *stop) {\n        view.backgroundColor = pageBackgroundColour;\n    }];\n}\n\n- (void)setBorderColour:(UIColor *)borderColour {\n    _borderColour = borderColour;\n    [_pageViews enumerateKeysAndObjectsUsingBlock:^(UIView *view, id obj, BOOL *stop) {\n        [self configureLayerBorderForView:view];\n    }];\n}\n\n- (void)setBorderWidth:(CGFloat)borderWidth {\n    _borderWidth = borderWidth;\n    [_pageViews enumerateKeysAndObjectsUsingBlock:^(UIView *view, id obj, BOOL *stop) {\n        [self configureLayerBorderForView:view];\n    }];\n}\n\n// apply the current border setting to the given view\n- (void)configureLayerBorderForView:(UIView *)view {\n    CALayer *layer = view.layer;\n    layer.borderColor = _borderColour.CGColor;\n    layer.borderWidth = _borderWidth;\n}\n\n#pragma mark - UIScrollViewDelegate\n\n// allow another object to act as delegate to our scrollview\n- (void)setDelegate:(id<UIScrollViewDelegate>)delegate {\n    self.externalDelegate = delegate;\n}\n\n- (void)scrollViewDidScroll:(UIScrollView *)scrollView {\n\n    if(_viewMode == kSJCPDFViewModeContinuous) {\n        [self _configureVisiblePages];\n    }\n    \n    if([_externalDelegate respondsToSelector:@selector(scrollViewDidScroll:)]) {\n        [_externalDelegate scrollViewDidScroll:scrollView];\n    }\n}\n\n- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {\n    \n    if(_viewMode != kSJCPDFViewModeContinuous) {\n        [self _configureVisiblePages];\n    }\n    \n    if([_externalDelegate respondsToSelector:@selector(scrollViewDidEndScrollingAnimation:)]) {\n        [_externalDelegate scrollViewDidEndScrollingAnimation:scrollView];\n    }\n}\n\n- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {\n    // don't allow an external delegate to over-ride this\n    return _pagesContainer;\n}\n\n// TODO: there must be a better way than all this... ;)\n\n- (void)scrollViewDidZoom:(UIScrollView *)scrollView {\n    if([_externalDelegate respondsToSelector:@selector(scrollViewDidZoom:)]) {\n        [_externalDelegate scrollViewDidZoom:self];\n    }\n}\n\n- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {\n    if([_externalDelegate respondsToSelector:@selector(scrollViewWillBeginDragging:)]) {\n        [_externalDelegate scrollViewWillBeginDragging:self];\n    }\n}\n\n- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {\n    if([_externalDelegate respondsToSelector:@selector(scrollViewWillEndDragging:withVelocity:targetContentOffset:)]) {\n        [_externalDelegate scrollViewWillEndDragging:self withVelocity:velocity targetContentOffset:targetContentOffset];\n    }\n}\n\n- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {\n    if([_externalDelegate respondsToSelector:@selector(scrollViewDidEndDragging:willDecelerate:)]) {\n        [_externalDelegate scrollViewDidEndDragging:self willDecelerate:decelerate];\n    }\n}\n\n- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {\n    if([_externalDelegate respondsToSelector:@selector(scrollViewWillBeginDecelerating:)]) {\n        [_externalDelegate scrollViewWillBeginDecelerating:self];\n    }\n}\n\n- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {\n    if([_externalDelegate respondsToSelector:@selector(scrollViewDidEndScrollingAnimation:)]) {\n        [_externalDelegate scrollViewDidEndScrollingAnimation:self];\n    }\n}\n\n- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view {\n    if([_externalDelegate respondsToSelector:@selector(scrollViewWillBeginZooming:withView:)]) {\n        [_externalDelegate scrollViewWillBeginZooming:self withView:view];\n    }\n}\n\n- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale {\n    if([_externalDelegate respondsToSelector:@selector(scrollViewDidEndZooming:withView:atScale:)]) {\n        [_externalDelegate scrollViewDidEndZooming:self withView:view atScale:scale];\n    }\n}\n\n- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView {\n    if([_externalDelegate respondsToSelector:@selector(scrollViewShouldScrollToTop:)]) {\n        return [_externalDelegate scrollViewShouldScrollToTop:self];\n    }\n    return YES;\n}\n\n- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView {\n    if([_externalDelegate respondsToSelector:@selector(scrollViewDidScrollToTop:)]) {\n        [_externalDelegate scrollViewDidScrollToTop:self];\n    }\n}\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/LICENSE.txt",
    "content": "Copyright (c) 2010-2015, Sam Soffes, http://soff.es\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/README.md",
    "content": "\n# SSZipArchive\n\nZipArchive is a simple utility class for zipping and unzipping files on iOS and Mac.\n\n- Unzip zip files;\n- Unzip password protected zip files;\n- Create new zip files;\n- Append to existing zip files;\n- Zip files;\n- Zip-up NSData instances. (with a filename)\n\n## Installation and Setup\n\n### CocoaPods\n\n`pod install SSZipArchive`\n\n### Carthage\n`github \"ZipArchive/ZipArchive\"`\n\n### Manual\n\n1. Add the `SSZipArchive` and `minizip` folders to your project.\n2. Add the `libz` library to your target\n\nSSZipArchive requires ARC.\n\n## Usage\n\n### Objective-C\n\n```objective-c\n// Create\n[SSZipArchive createZipFileAtPath: zipPath withContentsOfDirectory: sampleDataPath];\n\n// Unzip\n[SSZipArchive unzipFileAtPath:zipPath toDestination: unzipPath];\n```\n\n### Swift\n\n```swift\n// Create\nSSZipArchive.createZipFileAtPath(zipPath, withContentsOfDirectory: sampleDataPath)\n\n// Unzip\nSSZipArchive.unzipFileAtPath(zipPath, toDestination: unzipPath)\n```\n\n## License\n\nSSZipArchive is protected under the [MIT license](https://github.com/samsoffes/ssziparchive/raw/master/LICENSE) and our slightly modified version of [Minizip](http://www.winimage.com/zLibDll/minizip.html) 1.1 is licensed under the [Zlib license](http://www.zlib.net/zlib_license.html).\n\n## Acknowledgments\n\nBig thanks to [aish](http://code.google.com/p/ziparchive) for creating [ZipArchive](http://code.google.com/p/ziparchive). The project that inspired SSZipArchive. Thank you [@randomsequence](https://github.com/randomsequence) for implementing the creation support tech and to [@johnezang](https://github.com/johnezang) for all his amazing help along the way.\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/Common.h",
    "content": "#ifndef SSZipCommon\n#define SSZipCommon\n\n/* tm_unz contain date/time info */\ntypedef struct tm_unz_s\n{\n    unsigned int tm_sec;            /* seconds after the minute - [0,59] */\n    unsigned int tm_min;            /* minutes after the hour - [0,59] */\n    unsigned int tm_hour;           /* hours since midnight - [0,23] */\n    unsigned int tm_mday;           /* day of the month - [1,31] */\n    unsigned int tm_mon;            /* months since January - [0,11] */\n    unsigned int tm_year;           /* years - [1980..2044] */\n} tm_unz;\n\ntypedef struct unz_file_info_s\n{\n    unsigned long version;              /* version made by                 2 bytes */\n    unsigned long version_needed;       /* version needed to extract       2 bytes */\n    unsigned long flag;                 /* general purpose bit flag        2 bytes */\n    unsigned long compression_method;   /* compression method              2 bytes */\n    unsigned long dosDate;              /* last mod file date in Dos fmt   4 bytes */\n    unsigned long crc;                  /* crc-32                          4 bytes */\n    unsigned long compressed_size;      /* compressed size                 4 bytes */\n    unsigned long uncompressed_size;    /* uncompressed size               4 bytes */\n    unsigned long size_filename;        /* filename length                 2 bytes */\n    unsigned long size_file_extra;      /* extra field length              2 bytes */\n    unsigned long size_file_comment;    /* file comment length             2 bytes */\n\n    unsigned long disk_num_start;       /* disk number start               2 bytes */\n    unsigned long internal_fa;          /* internal file attributes        2 bytes */\n    unsigned long external_fa;          /* external file attributes        4 bytes */\n\n    tm_unz tmu_date;\n} unz_file_info;\n\n/* unz_file_info contain information about a file in the zipfile */\ntypedef struct unz_file_info64_s\n{\n    unsigned long version;              /* version made by                 2 bytes */\n    unsigned long version_needed;       /* version needed to extract       2 bytes */\n    unsigned long flag;                 /* general purpose bit flag        2 bytes */\n    unsigned long compression_method;   /* compression method              2 bytes */\n    unsigned long dosDate;              /* last mod file date in Dos fmt   4 bytes */\n    unsigned long crc;                  /* crc-32                          4 bytes */\n    unsigned long long compressed_size;   /* compressed size                 8 bytes */\n    unsigned long long uncompressed_size; /* uncompressed size               8 bytes */\n    unsigned long size_filename;        /* filename length                 2 bytes */\n    unsigned long size_file_extra;      /* extra field length              2 bytes */\n    unsigned long size_file_comment;    /* file comment length             2 bytes */\n    \n    unsigned long disk_num_start;       /* disk number start               2 bytes */\n    unsigned long internal_fa;          /* internal file attributes        2 bytes */\n    unsigned long external_fa;          /* external file attributes        4 bytes */\n    \n    tm_unz tmu_date;\n    unsigned long long disk_offset;\n    unsigned long size_file_extra_internal;\n} unz_file_info64;\n\ntypedef struct unz_global_info_s\n{\n    unsigned long number_entry;         /* total number of entries in\n                                         the central dir on this disk */\n    \n    unsigned long number_disk_with_CD;  /* number the the disk with central dir, used for spanning ZIP*/\n\n    \n    unsigned long size_comment;         /* size of the global comment of the zipfile */\n} unz_global_info;\n\ntypedef struct unz_global_info64\n{\n    unsigned long long number_entry;         /* total number of entries in\n                                 the central dir on this disk */\n    \n     unsigned long number_disk_with_CD;  /* number the the disk with central dir, used for spanning ZIP*/\n    \n    unsigned long size_comment;         /* size of the global comment of the zipfile */\n} unz_global_info64;\n\n#endif"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/SSZipArchive.h",
    "content": "//\n//  SSZipArchive.h\n//  SSZipArchive\n//\n//  Created by Sam Soffes on 7/21/10.\n//  Copyright (c) Sam Soffes 2010-2015. All rights reserved.\n//\n\n#ifndef _SSZIPARCHIVE_H\n#define _SSZIPARCHIVE_H\n\n#import <Foundation/Foundation.h>\n#include \"Common.h\"\n\n@protocol SSZipArchiveDelegate;\n\n@interface SSZipArchive : NSObject\n\n// Unzip\n+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination;\n+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination delegate:(id<SSZipArchiveDelegate>)delegate;\n\n+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination overwrite:(BOOL)overwrite password:(NSString *)password error:(NSError * *)error;\n+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination overwrite:(BOOL)overwrite password:(NSString *)password error:(NSError * *)error delegate:(id<SSZipArchiveDelegate>)delegate;\n\n+ (BOOL)unzipFileAtPath:(NSString *)path\n    toDestination:(NSString *)destination\n    progressHandler:(void (^)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler\n    completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler;\n\n+ (BOOL)unzipFileAtPath:(NSString *)path\n    toDestination:(NSString *)destination\n    overwrite:(BOOL)overwrite\n    password:(NSString *)password\n    progressHandler:(void (^)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler\n    completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler;\n\n// Zip\n\n// without password\n+ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)paths;\n+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath;\n+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath keepParentDirectory:(BOOL)keepParentDirector;\n\n// with password, password could be nil\n+ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)paths withPassword:(NSString *)password;\n+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath withPassword:(NSString *)password;\n+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath keepParentDirectory:(BOOL)keepParentDirectory withPassword:(NSString *)password;\n\n- (instancetype)initWithPath:(NSString *)path;\n@property (NS_NONATOMIC_IOSONLY, readonly, getter = isOpen) BOOL open;\n- (BOOL)writeFile:(NSString *)path withPassword:(NSString *)password;\n- (BOOL)writeFolderAtPath:(NSString *)path withFolderName:(NSString *)folderName withPassword:(NSString *)password;\n- (BOOL)writeFileAtPath:(NSString *)path withFileName:(NSString *)fileName withPassword:(NSString *)password;\n- (BOOL)writeData:(NSData *)data filename:(NSString *)filename withPassword:(NSString *)password;\n@property (NS_NONATOMIC_IOSONLY, readonly, getter = isClosed) BOOL close;\n\n@end\n\n@protocol SSZipArchiveDelegate <NSObject>\n\n@optional\n\n- (void)zipArchiveWillUnzipArchiveAtPath:(NSString *)path zipInfo:(unz_global_info)zipInfo;\n- (void)zipArchiveDidUnzipArchiveAtPath:(NSString *)path zipInfo:(unz_global_info)zipInfo unzippedPath:(NSString *)unzippedPath;\n\n- (BOOL)zipArchiveShouldUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath fileInfo:(unz_file_info)fileInfo;\n- (void)zipArchiveWillUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath fileInfo:(unz_file_info)fileInfo;\n- (void)zipArchiveDidUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath fileInfo:(unz_file_info)fileInfo;\n- (void)zipArchiveDidUnzipFileAtIndex:(NSInteger)fileIndex totalFiles:(NSInteger)totalFiles archivePath:(NSString *)archivePath unzippedFilePath:(NSString *)unzippedFilePath;\n\n- (void)zipArchiveProgressEvent:(unsigned long long)loaded total:(unsigned long long)total;\n- (void)zipArchiveDidUnzipArchiveFile:(NSString *)zipFile entryPath:(NSString *)entryPath destPath:(NSString *)destPath;\n\n@end\n\n#endif /* _SSZIPARCHIVE_H */\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/SSZipArchive.m",
    "content": "//\n//  SSZipArchive.m\n//  SSZipArchive\n//\n//  Created by Sam Soffes on 7/21/10.\n//  Copyright (c) Sam Soffes 2010-2015. All rights reserved.\n//\n#import \"SSZipArchive.h\"\n#include \"unzip.h\"\n#include \"zip.h\"\n#import \"zlib.h\"\n#import \"zconf.h\"\n\n#include <sys/stat.h>\n\n#define CHUNK 16384\n\n@interface SSZipArchive ()\n+ (NSDate *)_dateWithMSDOSFormat:(UInt32)msdosDateTime;\n@end\n\n@implementation SSZipArchive\n{\n    NSString *_path;\n    NSString *_filename;\n    zipFile _zip;\n}\n\n#pragma mark - Unzipping\n\n+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination\n{\n    return [self unzipFileAtPath:path toDestination:destination delegate:nil];\n}\n\n+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination overwrite:(BOOL)overwrite password:(NSString *)password error:(NSError **)error\n{\n    return [self unzipFileAtPath:path toDestination:destination overwrite:overwrite password:password error:error delegate:nil progressHandler:nil completionHandler:nil];\n}\n\n+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination delegate:(id<SSZipArchiveDelegate>)delegate\n{\n    return [self unzipFileAtPath:path toDestination:destination overwrite:YES password:nil error:nil delegate:delegate progressHandler:nil completionHandler:nil];\n}\n\n+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination overwrite:(BOOL)overwrite password:(NSString *)password error:(NSError **)error delegate:(id<SSZipArchiveDelegate>)delegate\n{\n    return [self unzipFileAtPath:path toDestination:destination overwrite:overwrite password:password error:error delegate:delegate progressHandler:nil completionHandler:nil];\n}\n\n+ (BOOL)unzipFileAtPath:(NSString *)path\n          toDestination:(NSString *)destination\n              overwrite:(BOOL)overwrite\n               password:(NSString *)password\n        progressHandler:(void (^)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler\n      completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler\n{\n    return [self unzipFileAtPath:path toDestination:destination overwrite:overwrite password:password error:nil delegate:nil progressHandler:progressHandler completionHandler:completionHandler];\n}\n\n+ (BOOL)unzipFileAtPath:(NSString *)path\n          toDestination:(NSString *)destination\n        progressHandler:(void (^)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler\n      completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler\n{\n    return [self unzipFileAtPath:path toDestination:destination overwrite:YES password:nil error:nil delegate:nil progressHandler:progressHandler completionHandler:completionHandler];\n}\n\n+ (BOOL)unzipFileAtPath:(NSString *)path\n          toDestination:(NSString *)destination\n              overwrite:(BOOL)overwrite\n               password:(NSString *)password\n                  error:(NSError **)error\n               delegate:(id<SSZipArchiveDelegate>)delegate\n        progressHandler:(void (^)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler\n      completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler\n{\n    // Begin opening\n    zipFile zip = unzOpen((const char*)[path UTF8String]);\n    if (zip == NULL)\n    {\n        NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @\"failed to open zip file\"};\n        NSError *err = [NSError errorWithDomain:@\"SSZipArchiveErrorDomain\" code:-1 userInfo:userInfo];\n        if (error)\n        {\n            *error = err;\n        }\n        if (completionHandler)\n        {\n            completionHandler(nil, NO, err);\n        }\n        return NO;\n    }\n    \n    NSDictionary * fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil];\n    unsigned long long fileSize = [fileAttributes[NSFileSize] unsignedLongLongValue];\n    unsigned long long currentPosition = 0;\n    \n    unz_global_info  globalInfo = {0ul, 0ul};\n    unzGetGlobalInfo(zip, &globalInfo);\n    \n    // Begin unzipping\n    if (unzGoToFirstFile(zip) != UNZ_OK)\n    {\n        NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @\"failed to open first file in zip file\"};\n        NSError *err = [NSError errorWithDomain:@\"SSZipArchiveErrorDomain\" code:-2 userInfo:userInfo];\n        if (error)\n        {\n            *error = err;\n        }\n        if (completionHandler)\n        {\n            completionHandler(nil, NO, err);\n        }\n        return NO;\n    }\n    \n    BOOL success = YES;\n    BOOL canceled = NO;\n    int ret = 0;\n    int crc_ret =0;\n    unsigned char buffer[4096] = {0};\n    NSFileManager *fileManager = [NSFileManager defaultManager];\n    NSMutableSet *directoriesModificationDates = [[NSMutableSet alloc] init];\n    \n    // Message delegate\n    if ([delegate respondsToSelector:@selector(zipArchiveWillUnzipArchiveAtPath:zipInfo:)]) {\n        [delegate zipArchiveWillUnzipArchiveAtPath:path zipInfo:globalInfo];\n    }\n    if ([delegate respondsToSelector:@selector(zipArchiveProgressEvent:total:)]) {\n        [delegate zipArchiveProgressEvent:currentPosition total:fileSize];\n    }\n    \n    NSInteger currentFileNumber = 0;\n    do {\n        @autoreleasepool {\n            if ([password length] == 0) {\n                ret = unzOpenCurrentFile(zip);\n            } else {\n                ret = unzOpenCurrentFilePassword(zip, [password cStringUsingEncoding:NSASCIIStringEncoding]);\n            }\n            \n            if (ret != UNZ_OK) {\n                success = NO;\n                break;\n            }\n            \n            // Reading data and write to file\n            unz_file_info fileInfo;\n            memset(&fileInfo, 0, sizeof(unz_file_info));\n            \n            ret = unzGetCurrentFileInfo(zip, &fileInfo, NULL, 0, NULL, 0, NULL, 0);\n            if (ret != UNZ_OK) {\n                success = NO;\n                unzCloseCurrentFile(zip);\n                break;\n            }\n            \n            currentPosition += fileInfo.compressed_size;\n            \n            // Message delegate\n            if ([delegate respondsToSelector:@selector(zipArchiveShouldUnzipFileAtIndex:totalFiles:archivePath:fileInfo:)]) {\n                if (![delegate zipArchiveShouldUnzipFileAtIndex:currentFileNumber\n                                                     totalFiles:(NSInteger)globalInfo.number_entry\n                                                    archivePath:path fileInfo:fileInfo]) {\n                    success = NO;\n                    canceled = YES;\n                    break;\n                }\n            }\n            if ([delegate respondsToSelector:@selector(zipArchiveWillUnzipFileAtIndex:totalFiles:archivePath:fileInfo:)]) {\n                [delegate zipArchiveWillUnzipFileAtIndex:currentFileNumber totalFiles:(NSInteger)globalInfo.number_entry\n                                             archivePath:path fileInfo:fileInfo];\n            }\n            if ([delegate respondsToSelector:@selector(zipArchiveProgressEvent:total:)]) {\n                [delegate zipArchiveProgressEvent:(NSInteger)currentPosition total:(NSInteger)fileSize];\n            }\n            \n            char *filename = (char *)malloc(fileInfo.size_filename + 1);\n            if (filename == NULL)\n            {\n                return NO;\n            }\n            \n            unzGetCurrentFileInfo(zip, &fileInfo, filename, fileInfo.size_filename + 1, NULL, 0, NULL, 0);\n            filename[fileInfo.size_filename] = '\\0';\n            \n            //\n            // Determine whether this is a symbolic link:\n            // - File is stored with 'version made by' value of UNIX (3),\n            //   as per http://www.pkware.com/documents/casestudies/APPNOTE.TXT\n            //   in the upper byte of the version field.\n            // - BSD4.4 st_mode constants are stored in the high 16 bits of the\n            //   external file attributes (defacto standard, verified against libarchive)\n            //\n            // The original constants can be found here:\n            //    http://minnie.tuhs.org/cgi-bin/utree.pl?file=4.4BSD/usr/include/sys/stat.h\n            //\n            const uLong ZipUNIXVersion = 3;\n            const uLong BSD_SFMT = 0170000;\n            const uLong BSD_IFLNK = 0120000;\n            \n            BOOL fileIsSymbolicLink = NO;\n            if (((fileInfo.version >> 8) == ZipUNIXVersion) && BSD_IFLNK == (BSD_SFMT & (fileInfo.external_fa >> 16))) {\n                fileIsSymbolicLink = NO;\n            }\n            \n            // Check if it contains directory\n            NSString *strPath = @(filename);\n            BOOL isDirectory = NO;\n            if (filename[fileInfo.size_filename-1] == '/' || filename[fileInfo.size_filename-1] == '\\\\') {\n                isDirectory = YES;\n            }\n            free(filename);\n            \n            // Contains a path\n            if ([strPath rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@\"/\\\\\"]].location != NSNotFound) {\n                strPath = [strPath stringByReplacingOccurrencesOfString:@\"\\\\\" withString:@\"/\"];\n            }\n            \n            NSString *fullPath = [destination stringByAppendingPathComponent:strPath];\n            NSError *err = nil;\n            NSDate *modDate = [[self class] _dateWithMSDOSFormat:(UInt32)fileInfo.dosDate];\n            NSDictionary *directoryAttr = @{NSFileCreationDate: modDate, NSFileModificationDate: modDate};\n            \n            if (isDirectory) {\n                [fileManager createDirectoryAtPath:fullPath withIntermediateDirectories:YES attributes:directoryAttr  error:&err];\n            } else {\n                [fileManager createDirectoryAtPath:[fullPath stringByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:directoryAttr error:&err];\n            }\n            if (nil != err) {\n                NSLog(@\"[SSZipArchive] Error: %@\", err.localizedDescription);\n            }\n            \n            if(!fileIsSymbolicLink)\n                [directoriesModificationDates addObject: @{@\"path\": fullPath, @\"modDate\": modDate}];\n            \n            if ([fileManager fileExistsAtPath:fullPath] && !isDirectory && !overwrite) {\n                //FIXME: couldBe CRC Check?\n                unzCloseCurrentFile(zip);\n                ret = unzGoToNextFile(zip);\n                continue;\n            }\n            \n            if (!fileIsSymbolicLink) {\n                FILE *fp = fopen((const char*)[fullPath UTF8String], \"wb\");\n                while (fp) {\n                    int readBytes = unzReadCurrentFile(zip, buffer, 4096);\n                    \n                    if (readBytes > 0) {\n                        fwrite(buffer, readBytes, 1, fp );\n                    } else {\n                        break;\n                    }\n                }\n                \n                if (fp) {\n                    if ([[[fullPath pathExtension] lowercaseString] isEqualToString:@\"zip\"]) {\n                        NSLog(@\"Unzipping nested .zip file:  %@\", [fullPath lastPathComponent]);\n                        if ([self unzipFileAtPath:fullPath toDestination:[fullPath stringByDeletingLastPathComponent] overwrite:overwrite password:password error:nil delegate:nil]) {\n                            [[NSFileManager defaultManager] removeItemAtPath:fullPath error:nil];\n                        }\n                    }\n                    \n                    fclose(fp);\n                    \n                    // Set the original datetime property\n                    if (fileInfo.dosDate != 0) {\n                        NSDate *orgDate = [[self class] _dateWithMSDOSFormat:(UInt32)fileInfo.dosDate];\n                        NSDictionary *attr = @{NSFileModificationDate: orgDate};\n                        \n                        if (attr) {\n                            if ([fileManager setAttributes:attr ofItemAtPath:fullPath error:nil] == NO) {\n                                // Can't set attributes\n                                NSLog(@\"[SSZipArchive] Failed to set attributes - whilst setting modification date\");\n                            }\n                        }\n                    }\n                    \n                    // Set the original permissions on the file\n                    uLong permissions = fileInfo.external_fa >> 16;\n                    if (permissions != 0) {\n                        // Store it into a NSNumber\n                        NSNumber *permissionsValue = @(permissions);\n                        \n                        // Retrieve any existing attributes\n                        NSMutableDictionary *attrs = [[NSMutableDictionary alloc] initWithDictionary:[fileManager attributesOfItemAtPath:fullPath error:nil]];\n                        \n                        // Set the value in the attributes dict\n                        attrs[NSFilePosixPermissions] = permissionsValue;\n                        \n                        // Update attributes\n                        if ([fileManager setAttributes:attrs ofItemAtPath:fullPath error:nil] == NO) {\n                            // Unable to set the permissions attribute\n                            NSLog(@\"[SSZipArchive] Failed to set attributes - whilst setting permissions\");\n                        }\n                        \n#if !__has_feature(objc_arc)\n                        [attrs release];\n#endif\n                    }\n                }\n            }\n            else\n            {\n                // Assemble the path for the symbolic link\n                NSMutableString* destinationPath = [NSMutableString string];\n                int bytesRead = 0;\n                while((bytesRead = unzReadCurrentFile(zip, buffer, 4096)) > 0)\n                {\n                    buffer[bytesRead] = (int)0;\n                    [destinationPath appendString:@((const char*)buffer)];\n                }\n                \n                // Create the symbolic link (making sure it stays relative if it was relative before)\n                int symlinkError = symlink([destinationPath cStringUsingEncoding:NSUTF8StringEncoding],\n                                           [fullPath cStringUsingEncoding:NSUTF8StringEncoding]);\n                \n                if(symlinkError != 0)\n                {\n                    NSLog(@\"Failed to create symbolic link at \\\"%@\\\" to \\\"%@\\\". symlink() error code: %d\", fullPath, destinationPath, errno);\n                }\n            }\n            \n            crc_ret = unzCloseCurrentFile( zip );\n            if (crc_ret == UNZ_CRCERROR) {\n                //CRC ERROR\n                success = NO;\n                break;\n            }\n            ret = unzGoToNextFile( zip );\n            \n            // Message delegate\n            if ([delegate respondsToSelector:@selector(zipArchiveDidUnzipFileAtIndex:totalFiles:archivePath:fileInfo:)]) {\n                [delegate zipArchiveDidUnzipFileAtIndex:currentFileNumber totalFiles:(NSInteger)globalInfo.number_entry\n                                            archivePath:path fileInfo:fileInfo];\n            } else if ([delegate respondsToSelector: @selector(zipArchiveDidUnzipFileAtIndex:totalFiles:archivePath:unzippedFilePath:)]) {\n                [delegate zipArchiveDidUnzipFileAtIndex: currentFileNumber totalFiles: (NSInteger)globalInfo.number_entry\n                                            archivePath:path unzippedFilePath: fullPath];\n            }\n            \n            currentFileNumber++;\n            if (progressHandler)\n            {\n                progressHandler(strPath, fileInfo, currentFileNumber, globalInfo.number_entry);\n            }\n        }\n    } while(ret == UNZ_OK && ret != UNZ_END_OF_LIST_OF_FILE);\n    \n    // Close\n    unzClose(zip);\n    \n    // The process of decompressing the .zip archive causes the modification times on the folders\n    // to be set to the present time. So, when we are done, they need to be explicitly set.\n    // set the modification date on all of the directories.\n    NSError * err = nil;\n    for (NSDictionary * d in directoriesModificationDates) {\n        if (![[NSFileManager defaultManager] setAttributes:@{NSFileModificationDate: d[@\"modDate\"]} ofItemAtPath:d[@\"path\"] error:&err]) {\n            NSLog(@\"[SSZipArchive] Set attributes failed for directory: %@.\", d[@\"path\"]);\n        }\n        if (err) {\n            NSLog(@\"[SSZipArchive] Error setting directory file modification date attribute: %@\",err.localizedDescription);\n        }\n    }\n    \n#if !__has_feature(objc_arc)\n    [directoriesModificationDates release];\n#endif\n    \n    // Message delegate\n    if (success && [delegate respondsToSelector:@selector(zipArchiveDidUnzipArchiveAtPath:zipInfo:unzippedPath:)]) {\n        [delegate zipArchiveDidUnzipArchiveAtPath:path zipInfo:globalInfo unzippedPath:destination];\n    }\n    // final progress event = 100%\n    if (!canceled && [delegate respondsToSelector:@selector(zipArchiveProgressEvent:total:)]) {\n        [delegate zipArchiveProgressEvent:fileSize total:fileSize];\n    }\n    \n    NSError *retErr = nil;\n    if (crc_ret == UNZ_CRCERROR)\n    {\n        NSDictionary *userInfo = @{NSLocalizedDescriptionKey: @\"crc check failed for file\"};\n        retErr = [NSError errorWithDomain:@\"SSZipArchiveErrorDomain\" code:-3 userInfo:userInfo];\n    }\n    if (error)\n    {\n        *error = retErr;\n    }\n    if (completionHandler)\n    {\n        completionHandler(path, success, retErr);\n    }\n    return success;\n}\n\n#pragma mark - Zipping\n+ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)paths\n{\n    return [SSZipArchive createZipFileAtPath:path withFilesAtPaths:paths withPassword:nil];\n}\n+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath{\n    return [SSZipArchive createZipFileAtPath:path withContentsOfDirectory:directoryPath withPassword:nil];\n}\n\n+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath keepParentDirectory:(BOOL)keepParentDirector{\n    return [SSZipArchive createZipFileAtPath:path withContentsOfDirectory:directoryPath keepParentDirectory:keepParentDirector withPassword:nil];\n}\n\n+ (BOOL)createZipFileAtPath:(NSString *)path withFilesAtPaths:(NSArray *)paths withPassword:(NSString *)password\n{\n    BOOL success = NO;\n    SSZipArchive *zipArchive = [[SSZipArchive alloc] initWithPath:path];\n    if ([zipArchive open]) {\n        for (NSString *filePath in paths) {\n            [zipArchive writeFile:filePath withPassword:password];\n        }\n        success = [zipArchive close];\n    }\n    \n#if !__has_feature(objc_arc)\n    [zipArchive release];\n#endif\n    \n    return success;\n}\n\n+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath  withPassword:(NSString *)password{\n    return [self createZipFileAtPath:path withContentsOfDirectory:directoryPath keepParentDirectory:NO withPassword:password];\n}\n\n\n+ (BOOL)createZipFileAtPath:(NSString *)path withContentsOfDirectory:(NSString *)directoryPath keepParentDirectory:(BOOL)keepParentDirectory withPassword:(NSString *)password{\n    BOOL success = NO;\n    \n    NSFileManager *fileManager = nil;\n    SSZipArchive *zipArchive = [[SSZipArchive alloc] initWithPath:path];\n    \n    if ([zipArchive open]) {\n        // use a local filemanager (queue/thread compatibility)\n        fileManager = [[NSFileManager alloc] init];\n        NSDirectoryEnumerator *dirEnumerator = [fileManager enumeratorAtPath:directoryPath];\n        NSString *fileName;\n        while ((fileName = [dirEnumerator nextObject])) {\n            BOOL isDir;\n            NSString *fullFilePath = [directoryPath stringByAppendingPathComponent:fileName];\n            [fileManager fileExistsAtPath:fullFilePath isDirectory:&isDir];\n            if (!isDir) {\n                if (keepParentDirectory)\n                {\n                    fileName = [[directoryPath lastPathComponent] stringByAppendingPathComponent:fileName];\n                }\n                [zipArchive writeFileAtPath:fullFilePath withFileName:fileName withPassword:password];\n            }\n            else\n            {\n                if([[NSFileManager defaultManager] subpathsOfDirectoryAtPath:fullFilePath error:nil].count == 0)\n                {\n                    NSString *tempName = [fullFilePath stringByAppendingPathComponent:@\".DS_Store\"];\n                    [@\"\" writeToFile:tempName atomically:YES encoding:NSUTF8StringEncoding error:nil];\n                    [zipArchive writeFileAtPath:tempName withFileName:[fileName stringByAppendingPathComponent:@\".DS_Store\"] withPassword:password];\n                    [[NSFileManager defaultManager] removeItemAtPath:tempName error:nil];\n                }\n            }\n        }\n        success = [zipArchive close];\n    }\n    \n#if !__has_feature(objc_arc)\n    [fileManager release];\n    [zipArchive release];\n#endif\n    \n    return success;\n}\n\n\n- (instancetype)initWithPath:(NSString *)path\n{\n    if ((self = [super init])) {\n        _path = [path copy];\n    }\n    return self;\n}\n\n\n#if !__has_feature(objc_arc)\n- (void)dealloc\n{\n    [_path release];\n    [super dealloc];\n}\n#endif\n\n\n- (BOOL)open\n{\n    NSAssert((_zip == NULL), @\"Attempting open an archive which is already open\");\n    _zip = zipOpen([_path UTF8String], APPEND_STATUS_CREATE);\n    return (NULL != _zip);\n}\n\n\n- (void)zipInfo:(zip_fileinfo*)zipInfo setDate:(NSDate*)date\n{\n    NSCalendar *currentCalendar = [NSCalendar currentCalendar];\n#if defined(__IPHONE_8_0) || defined(__MAC_10_10)\n    uint flags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;\n#else\n    uint flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;\n#endif\n    NSDateComponents *components = [currentCalendar components:flags fromDate:date];\n    zipInfo->tmz_date.tm_sec = (unsigned int)components.second;\n    zipInfo->tmz_date.tm_min = (unsigned int)components.minute;\n    zipInfo->tmz_date.tm_hour = (unsigned int)components.hour;\n    zipInfo->tmz_date.tm_mday = (unsigned int)components.day;\n    zipInfo->tmz_date.tm_mon = (unsigned int)components.month - 1;\n    zipInfo->tmz_date.tm_year = (unsigned int)components.year;\n}\n\n- (BOOL)writeFolderAtPath:(NSString *)path withFolderName:(NSString *)folderName withPassword:(NSString *)password\n{\n    NSAssert((_zip != NULL), @\"Attempting to write to an archive which was never opened\");\n    \n    zip_fileinfo zipInfo = {{0}};\n    \n    NSDictionary *attr = [[NSFileManager defaultManager] attributesOfItemAtPath:path error: nil];\n    if( attr )\n    {\n        NSDate *fileDate = (NSDate *)attr[NSFileModificationDate];\n        if( fileDate )\n        {\n            [self zipInfo:&zipInfo setDate: fileDate ];\n        }\n        \n        // Write permissions into the external attributes, for details on this see here: http://unix.stackexchange.com/a/14727\n        // Get the permissions value from the files attributes\n        NSNumber *permissionsValue = (NSNumber *)attr[NSFilePosixPermissions];\n        if (permissionsValue) {\n            // Get the short value for the permissions\n            short permissionsShort = permissionsValue.shortValue;\n            \n            // Convert this into an octal by adding 010000, 010000 being the flag for a regular file\n            NSInteger permissionsOctal = 0100000 + permissionsShort;\n            \n            // Convert this into a long value\n            uLong permissionsLong = @(permissionsOctal).unsignedLongValue;\n            \n            // Store this into the external file attributes once it has been shifted 16 places left to form part of the second from last byte\n            zipInfo.external_fa = permissionsLong << 16L;\n        }\n    }\n    \n    unsigned int len = 0;\n    zipOpenNewFileInZip3(_zip, [[folderName stringByAppendingString:@\"/\"] UTF8String], &zipInfo, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_NO_COMPRESSION, 0, -MAX_WBITS, DEF_MEM_LEVEL,\n                         Z_DEFAULT_STRATEGY, [password UTF8String], 0);\n    zipWriteInFileInZip(_zip, &len, 0);\n    zipCloseFileInZip(_zip);\n    return YES;\n}\n\n- (BOOL)writeFile:(NSString *)path withPassword:(NSString *)password;\n{\n    return [self writeFileAtPath:path withFileName:nil withPassword:password];\n}\n\n// supports writing files with logical folder/directory structure\n// *path* is the absolute path of the file that will be compressed\n// *fileName* is the relative name of the file how it is stored within the zip e.g. /folder/subfolder/text1.txt\n- (BOOL)writeFileAtPath:(NSString *)path withFileName:(NSString *)fileName withPassword:(NSString *)password\n{\n    NSAssert((_zip != NULL), @\"Attempting to write to an archive which was never opened\");\n    \n    FILE *input = fopen([path UTF8String], \"r\");\n    if (NULL == input) {\n        return NO;\n    }\n    \n    const char *afileName;\n    if (!fileName) {\n        afileName = [path.lastPathComponent UTF8String];\n    }\n    else {\n        afileName = [fileName UTF8String];\n    }\n    \n    zip_fileinfo zipInfo = {{0}};\n    \n    NSDictionary *attr = [[NSFileManager defaultManager] attributesOfItemAtPath:path error: nil];\n    if( attr )\n    {\n        NSDate *fileDate = (NSDate *)attr[NSFileModificationDate];\n        if( fileDate )\n        {\n            [self zipInfo:&zipInfo setDate: fileDate ];\n        }\n        \n        // Write permissions into the external attributes, for details on this see here: http://unix.stackexchange.com/a/14727\n        // Get the permissions value from the files attributes\n        NSNumber *permissionsValue = (NSNumber *)attr[NSFilePosixPermissions];\n        if (permissionsValue) {\n            // Get the short value for the permissions\n            short permissionsShort = permissionsValue.shortValue;\n            \n            // Convert this into an octal by adding 010000, 010000 being the flag for a regular file\n            NSInteger permissionsOctal = 0100000 + permissionsShort;\n            \n            // Convert this into a long value\n            uLong permissionsLong = @(permissionsOctal).unsignedLongValue;\n            \n            // Store this into the external file attributes once it has been shifted 16 places left to form part of the second from last byte\n            zipInfo.external_fa = permissionsLong << 16L;\n        }\n    }\n    \n    void *buffer = malloc(CHUNK);\n    if (buffer == NULL)\n    {\n        return NO;\n    }\n\n    zipOpenNewFileInZip3(_zip, afileName, &zipInfo, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION, 0, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, [password UTF8String], 0);\n    unsigned int len = 0;\n    \n    while (!feof(input))\n    {\n        len = (unsigned int) fread(buffer, 1, CHUNK, input);\n        zipWriteInFileInZip(_zip, buffer, len);\n    }\n    \n    zipCloseFileInZip(_zip);\n    free(buffer);\n    fclose(input);\n    return YES;\n}\n\n- (BOOL)writeData:(NSData *)data filename:(NSString *)filename withPassword:(NSString *)password;\n{\n    if (!_zip) {\n        return NO;\n    }\n    if (!data) {\n        return NO;\n    }\n    zip_fileinfo zipInfo = {{0,0,0,0,0,0},0,0,0};\n    [self zipInfo:&zipInfo setDate:[NSDate date]];\n    \n    zipOpenNewFileInZip3(_zip, [filename UTF8String], &zipInfo, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION, 0, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, [password UTF8String], 0);\n    \n    zipWriteInFileInZip(_zip, data.bytes, (unsigned int)data.length);\n    \n    zipCloseFileInZip(_zip);\n    return YES;\n}\n\n\n- (BOOL)close\n{\n    NSAssert((_zip != NULL), @\"[SSZipArchive] Attempting to close an archive which was never opened\");\n    zipClose(_zip, NULL);\n    return YES;\n}\n\n#pragma mark - Private\n\n// Format from http://newsgroups.derkeiler.com/Archive/Comp/comp.os.msdos.programmer/2009-04/msg00060.html\n// Two consecutive words, or a longword, YYYYYYYMMMMDDDDD hhhhhmmmmmmsssss\n// YYYYYYY is years from 1980 = 0\n// sssss is (seconds/2).\n//\n// 3658 = 0011 0110 0101 1000 = 0011011 0010 11000 = 27 2 24 = 2007-02-24\n// 7423 = 0111 0100 0010 0011 - 01110 100001 00011 = 14 33 3 = 14:33:06\n+ (NSDate *)_dateWithMSDOSFormat:(UInt32)msdosDateTime\n{\n    static const UInt32 kYearMask = 0xFE000000;\n    static const UInt32 kMonthMask = 0x1E00000;\n    static const UInt32 kDayMask = 0x1F0000;\n    static const UInt32 kHourMask = 0xF800;\n    static const UInt32 kMinuteMask = 0x7E0;\n    static const UInt32 kSecondMask = 0x1F;\n    \n    static NSCalendar *gregorian;\n    static dispatch_once_t onceToken;\n    dispatch_once(&onceToken, ^{\n#if defined(__IPHONE_8_0) || defined(__MAC_10_10)\n        gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];\n#else\n        gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];\n#endif\n    });\n    \n    NSDateComponents *components = [[NSDateComponents alloc] init];\n    \n    NSAssert(0xFFFFFFFF == (kYearMask | kMonthMask | kDayMask | kHourMask | kMinuteMask | kSecondMask), @\"[SSZipArchive] MSDOS date masks don't add up\");\n    \n    [components setYear:1980 + ((msdosDateTime & kYearMask) >> 25)];\n    [components setMonth:(msdosDateTime & kMonthMask) >> 21];\n    [components setDay:(msdosDateTime & kDayMask) >> 16];\n    [components setHour:(msdosDateTime & kHourMask) >> 11];\n    [components setMinute:(msdosDateTime & kMinuteMask) >> 5];\n    [components setSecond:(msdosDateTime & kSecondMask) * 2];\n    \n    NSDate *date = [NSDate dateWithTimeInterval:0 sinceDate:[gregorian dateFromComponents:components]];\n    \n#if !__has_feature(objc_arc)\n    [components release];\n#endif\n    \n    return date;\n}\n\n@end"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/ZipArchive.h",
    "content": "//\n//  ZipArchive.h\n//  ZipArchive\n//\n//  Created by Serhii Mumriak on 12/1/15.\n//  Copyright © 2015 smumryak. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n//! Project version number for ZipArchive.\nFOUNDATION_EXPORT double ZipArchiveVersionNumber;\n\n//! Project version string for ZipArchive.\nFOUNDATION_EXPORT const unsigned char ZipArchiveVersionString[];\n\n// In this header, you should import all the public headers of your framework using statements like #import <ZipArchive/PublicHeader.h>\n\n#import \"SSZipArchive.h\"\n\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/aes/aes.h",
    "content": "/*\r\n---------------------------------------------------------------------------\r\nCopyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.\r\n\r\nThe redistribution and use of this software (with or without changes)\r\nis allowed without the payment of fees or royalties provided that:\r\n\r\n  source code distributions include the above copyright notice, this\r\n  list of conditions and the following disclaimer;\r\n\r\n  binary distributions include the above copyright notice, this list\r\n  of conditions and the following disclaimer in their documentation.\r\n\r\nThis software is provided 'as is' with no explicit or implied warranties\r\nin respect of its operation, including, but not limited to, correctness\r\nand fitness for purpose.\r\n---------------------------------------------------------------------------\r\nIssue Date: 20/12/2007\r\n\r\n This file contains the definitions required to use AES in C. See aesopt.h\r\n for optimisation details.\r\n*/\r\n\r\n#ifndef _AES_H\r\n#define _AES_H\r\n\r\n#include <stdlib.h>\r\n\r\n/*  This include is used to find 8 & 32 bit unsigned integer types  */\r\n#include \"brg_types.h\"\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\"\r\n{\r\n#endif\r\n\r\n#define AES_128     /* if a fast 128 bit key scheduler is needed    */\r\n#define AES_192     /* if a fast 192 bit key scheduler is needed    */\r\n#define AES_256     /* if a fast 256 bit key scheduler is needed    */\r\n#define AES_VAR     /* if variable key size scheduler is needed     */\r\n#define AES_MODES   /* if support is needed for modes               */\r\n\r\n/* The following must also be set in assembler files if being used  */\r\n\r\n#define AES_ENCRYPT /* if support for encryption is needed          */\r\n#define AES_DECRYPT /* if support for decryption is needed          */\r\n#define AES_REV_DKS /* define to reverse decryption key schedule    */\r\n\r\n#define AES_BLOCK_SIZE  16  /* the AES block size in bytes          */\r\n#define N_COLS           4  /* the number of columns in the state   */\r\n\r\n/* The key schedule length is 11, 13 or 15 16-byte blocks for 128,  */\r\n/* 192 or 256-bit keys respectively. That is 176, 208 or 240 bytes  */\r\n/* or 44, 52 or 60 32-bit words.                                    */\r\n\r\n#if defined( AES_VAR ) || defined( AES_256 )\r\n#define KS_LENGTH       60\r\n#elif defined( AES_192 )\r\n#define KS_LENGTH       52\r\n#else\r\n#define KS_LENGTH       44\r\n#endif\r\n\r\n#define AES_RETURN INT_RETURN\r\n\r\n/* the character array 'inf' in the following structures is used    */\r\n/* to hold AES context information. This AES code uses cx->inf.b[0] */\r\n/* to hold the number of rounds multiplied by 16. The other three   */\r\n/* elements can be used by code that implements additional modes    */\r\n\r\ntypedef union\r\n{   uint_32t l;\r\n    uint_8t b[4];\r\n} aes_inf;\r\n\r\ntypedef struct\r\n{   uint_32t ks[KS_LENGTH];\r\n    aes_inf inf;\r\n} aes_encrypt_ctx;\r\n\r\ntypedef struct\r\n{   uint_32t ks[KS_LENGTH];\r\n    aes_inf inf;\r\n} aes_decrypt_ctx;\r\n\r\n/* This routine must be called before first use if non-static       */\r\n/* tables are being used                                            */\r\n\r\nAES_RETURN aes_init(void);\r\n\r\n/* Key lengths in the range 16 <= key_len <= 32 are given in bytes, */\r\n/* those in the range 128 <= key_len <= 256 are given in bits       */\r\n\r\n#if defined( AES_ENCRYPT )\r\n\r\n#if defined( AES_128 ) || defined( AES_VAR)\r\nAES_RETURN aes_encrypt_key128(const unsigned char *key, aes_encrypt_ctx cx[1]);\r\n#endif\r\n\r\n#if defined( AES_192 ) || defined( AES_VAR)\r\nAES_RETURN aes_encrypt_key192(const unsigned char *key, aes_encrypt_ctx cx[1]);\r\n#endif\r\n\r\n#if defined( AES_256 ) || defined( AES_VAR)\r\nAES_RETURN aes_encrypt_key256(const unsigned char *key, aes_encrypt_ctx cx[1]);\r\n#endif\r\n\r\n#if defined( AES_VAR )\r\nAES_RETURN aes_encrypt_key(const unsigned char *key, int key_len, aes_encrypt_ctx cx[1]);\r\n#endif\r\n\r\nAES_RETURN aes_encrypt(const unsigned char *in, unsigned char *out, const aes_encrypt_ctx cx[1]);\r\n\r\n#endif\r\n\r\n#if defined( AES_DECRYPT )\r\n\r\n#if defined( AES_128 ) || defined( AES_VAR)\r\nAES_RETURN aes_decrypt_key128(const unsigned char *key, aes_decrypt_ctx cx[1]);\r\n#endif\r\n\r\n#if defined( AES_192 ) || defined( AES_VAR)\r\nAES_RETURN aes_decrypt_key192(const unsigned char *key, aes_decrypt_ctx cx[1]);\r\n#endif\r\n\r\n#if defined( AES_256 ) || defined( AES_VAR)\r\nAES_RETURN aes_decrypt_key256(const unsigned char *key, aes_decrypt_ctx cx[1]);\r\n#endif\r\n\r\n#if defined( AES_VAR )\r\nAES_RETURN aes_decrypt_key(const unsigned char *key, int key_len, aes_decrypt_ctx cx[1]);\r\n#endif\r\n\r\nAES_RETURN aes_decrypt(const unsigned char *in, unsigned char *out, const aes_decrypt_ctx cx[1]);\r\n\r\n#endif\r\n\r\n#if defined( AES_MODES )\r\n\r\n/* Multiple calls to the following subroutines for multiple block   */\r\n/* ECB, CBC, CFB, OFB and CTR mode encryption can be used to handle */\r\n/* long messages incremantally provided that the context AND the iv */\r\n/* are preserved between all such calls.  For the ECB and CBC modes */\r\n/* each individual call within a series of incremental calls must   */\r\n/* process only full blocks (i.e. len must be a multiple of 16) but */\r\n/* the CFB, OFB and CTR mode calls can handle multiple incremental  */\r\n/* calls of any length. Each mode is reset when a new AES key is    */\r\n/* set but ECB and CBC operations can be reset without setting a    */\r\n/* new key by setting a new IV value.  To reset CFB, OFB and CTR    */\r\n/* without setting the key, aes_mode_reset() must be called and the */\r\n/* IV must be set.  NOTE: All these calls update the IV on exit so  */\r\n/* this has to be reset if a new operation with the same IV as the  */\r\n/* previous one is required (or decryption follows encryption with  */\r\n/* the same IV array).                                              */\r\n\r\nAES_RETURN aes_test_alignment_detection(unsigned int n);\r\n\r\nAES_RETURN aes_ecb_encrypt(const unsigned char *ibuf, unsigned char *obuf,\r\n                    int len, const aes_encrypt_ctx cx[1]);\r\n\r\nAES_RETURN aes_ecb_decrypt(const unsigned char *ibuf, unsigned char *obuf,\r\n                    int len, const aes_decrypt_ctx cx[1]);\r\n\r\nAES_RETURN aes_cbc_encrypt(const unsigned char *ibuf, unsigned char *obuf,\r\n                    int len, unsigned char *iv, const aes_encrypt_ctx cx[1]);\r\n\r\nAES_RETURN aes_cbc_decrypt(const unsigned char *ibuf, unsigned char *obuf,\r\n                    int len, unsigned char *iv, const aes_decrypt_ctx cx[1]);\r\n\r\nAES_RETURN aes_mode_reset(aes_encrypt_ctx cx[1]);\r\n\r\nAES_RETURN aes_cfb_encrypt(const unsigned char *ibuf, unsigned char *obuf,\r\n                    int len, unsigned char *iv, aes_encrypt_ctx cx[1]);\r\n\r\nAES_RETURN aes_cfb_decrypt(const unsigned char *ibuf, unsigned char *obuf,\r\n                    int len, unsigned char *iv, aes_encrypt_ctx cx[1]);\r\n\r\n#define aes_ofb_encrypt aes_ofb_crypt\r\n#define aes_ofb_decrypt aes_ofb_crypt\r\n\r\nAES_RETURN aes_ofb_crypt(const unsigned char *ibuf, unsigned char *obuf,\r\n                    int len, unsigned char *iv, aes_encrypt_ctx cx[1]);\r\n\r\ntypedef void cbuf_inc(unsigned char *cbuf);\r\n\r\n#define aes_ctr_encrypt aes_ctr_crypt\r\n#define aes_ctr_decrypt aes_ctr_crypt\r\n\r\nAES_RETURN aes_ctr_crypt(const unsigned char *ibuf, unsigned char *obuf,\r\n            int len, unsigned char *cbuf, cbuf_inc ctr_inc, aes_encrypt_ctx cx[1]);\r\n\r\n#endif\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/aes/aes_via_ace.h",
    "content": "/*\r\nCopyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.\r\n\r\nThe redistribution and use of this software (with or without changes)\r\nis allowed without the payment of fees or royalties provided that:\r\n\r\n  source code distributions include the above copyright notice, this\r\n  list of conditions and the following disclaimer;\r\n\r\n  binary distributions include the above copyright notice, this list\r\n  of conditions and the following disclaimer in their documentation.\r\n\r\nThis software is provided 'as is' with no explicit or implied warranties\r\nin respect of its operation, including, but not limited to, correctness\r\nand fitness for purpose.\r\n---------------------------------------------------------------------------\r\nIssue Date: 20/12/2007\r\n*/\r\n\r\n#ifndef AES_VIA_ACE_H\r\n#define AES_VIA_ACE_H\r\n\r\n#if defined( _MSC_VER )\r\n#  define INLINE  __inline\r\n#elif defined( __GNUC__ )\r\n#  define INLINE  static inline\r\n#else\r\n#  error VIA ACE requires Microsoft or GNU C\r\n#endif\r\n\r\n#define NEH_GENERATE    1\r\n#define NEH_LOAD        2\r\n#define NEH_HYBRID      3\r\n\r\n#define MAX_READ_ATTEMPTS   1000\r\n\r\n/* VIA Nehemiah RNG and ACE Feature Mask Values */\r\n\r\n#define NEH_CPU_IS_VIA      0x00000001\r\n#define NEH_CPU_READ        0x00000010\r\n#define NEH_CPU_MASK        0x00000011\r\n\r\n#define NEH_RNG_PRESENT     0x00000004\r\n#define NEH_RNG_ENABLED     0x00000008\r\n#define NEH_ACE_PRESENT     0x00000040\r\n#define NEH_ACE_ENABLED     0x00000080\r\n#define NEH_RNG_FLAGS       (NEH_RNG_PRESENT | NEH_RNG_ENABLED)\r\n#define NEH_ACE_FLAGS       (NEH_ACE_PRESENT | NEH_ACE_ENABLED)\r\n#define NEH_FLAGS_MASK      (NEH_RNG_FLAGS | NEH_ACE_FLAGS)\r\n\r\n/* VIA Nehemiah Advanced Cryptography Engine (ACE) Control Word Values  */\r\n\r\n#define NEH_GEN_KEY     0x00000000      /* generate key schedule        */\r\n#define NEH_LOAD_KEY    0x00000080      /* load schedule from memory    */\r\n#define NEH_ENCRYPT     0x00000000      /* encryption                   */\r\n#define NEH_DECRYPT     0x00000200      /* decryption                   */\r\n#define NEH_KEY128      0x00000000+0x0a /* 128 bit key                  */\r\n#define NEH_KEY192      0x00000400+0x0c /* 192 bit key                  */\r\n#define NEH_KEY256      0x00000800+0x0e /* 256 bit key                  */\r\n\r\n#define NEH_ENC_GEN     (NEH_ENCRYPT | NEH_GEN_KEY)\r\n#define NEH_DEC_GEN     (NEH_DECRYPT | NEH_GEN_KEY)\r\n#define NEH_ENC_LOAD    (NEH_ENCRYPT | NEH_LOAD_KEY)\r\n#define NEH_DEC_LOAD    (NEH_DECRYPT | NEH_LOAD_KEY)\r\n\r\n#define NEH_ENC_GEN_DATA {\\\r\n    NEH_ENC_GEN | NEH_KEY128, 0, 0, 0,\\\r\n    NEH_ENC_GEN | NEH_KEY192, 0, 0, 0,\\\r\n    NEH_ENC_GEN | NEH_KEY256, 0, 0, 0 }\r\n\r\n#define NEH_ENC_LOAD_DATA {\\\r\n    NEH_ENC_LOAD | NEH_KEY128, 0, 0, 0,\\\r\n    NEH_ENC_LOAD | NEH_KEY192, 0, 0, 0,\\\r\n    NEH_ENC_LOAD | NEH_KEY256, 0, 0, 0 }\r\n\r\n#define NEH_ENC_HYBRID_DATA {\\\r\n    NEH_ENC_GEN  | NEH_KEY128, 0, 0, 0,\\\r\n    NEH_ENC_LOAD | NEH_KEY192, 0, 0, 0,\\\r\n    NEH_ENC_LOAD | NEH_KEY256, 0, 0, 0 }\r\n\r\n#define NEH_DEC_GEN_DATA {\\\r\n    NEH_DEC_GEN | NEH_KEY128, 0, 0, 0,\\\r\n    NEH_DEC_GEN | NEH_KEY192, 0, 0, 0,\\\r\n    NEH_DEC_GEN | NEH_KEY256, 0, 0, 0 }\r\n\r\n#define NEH_DEC_LOAD_DATA {\\\r\n    NEH_DEC_LOAD | NEH_KEY128, 0, 0, 0,\\\r\n    NEH_DEC_LOAD | NEH_KEY192, 0, 0, 0,\\\r\n    NEH_DEC_LOAD | NEH_KEY256, 0, 0, 0 }\r\n\r\n#define NEH_DEC_HYBRID_DATA {\\\r\n    NEH_DEC_GEN  | NEH_KEY128, 0, 0, 0,\\\r\n    NEH_DEC_LOAD | NEH_KEY192, 0, 0, 0,\\\r\n    NEH_DEC_LOAD | NEH_KEY256, 0, 0, 0 }\r\n\r\n#define neh_enc_gen_key(x)  ((x) == 128 ? (NEH_ENC_GEN | NEH_KEY128) :      \\\r\n     (x) == 192 ? (NEH_ENC_GEN | NEH_KEY192) : (NEH_ENC_GEN | NEH_KEY256))\r\n\r\n#define neh_enc_load_key(x) ((x) == 128 ? (NEH_ENC_LOAD | NEH_KEY128) :     \\\r\n     (x) == 192 ? (NEH_ENC_LOAD | NEH_KEY192) : (NEH_ENC_LOAD | NEH_KEY256))\r\n\r\n#define neh_enc_hybrid_key(x)   ((x) == 128 ? (NEH_ENC_GEN | NEH_KEY128) :  \\\r\n     (x) == 192 ? (NEH_ENC_LOAD | NEH_KEY192) : (NEH_ENC_LOAD | NEH_KEY256))\r\n\r\n#define neh_dec_gen_key(x)  ((x) == 128 ? (NEH_DEC_GEN | NEH_KEY128) :      \\\r\n     (x) == 192 ? (NEH_DEC_GEN | NEH_KEY192) : (NEH_DEC_GEN | NEH_KEY256))\r\n\r\n#define neh_dec_load_key(x) ((x) == 128 ? (NEH_DEC_LOAD | NEH_KEY128) :     \\\r\n     (x) == 192 ? (NEH_DEC_LOAD | NEH_KEY192) : (NEH_DEC_LOAD | NEH_KEY256))\r\n\r\n#define neh_dec_hybrid_key(x)   ((x) == 128 ? (NEH_DEC_GEN | NEH_KEY128) :  \\\r\n     (x) == 192 ? (NEH_DEC_LOAD | NEH_KEY192) : (NEH_DEC_LOAD | NEH_KEY256))\r\n\r\n#if defined( _MSC_VER ) && ( _MSC_VER > 1200 )\r\n#define aligned_auto(type, name, no, stride)  __declspec(align(stride)) type name[no]\r\n#else\r\n#define aligned_auto(type, name, no, stride)                \\\r\n    unsigned char _##name[no * sizeof(type) + stride];      \\\r\n    type *name = (type*)(16 * ((((unsigned long)(_##name)) + stride - 1) / stride))\r\n#endif\r\n\r\n#if defined( _MSC_VER ) && ( _MSC_VER > 1200 )\r\n#define aligned_array(type, name, no, stride) __declspec(align(stride)) type name[no]\r\n#elif defined( __GNUC__ )\r\n#define aligned_array(type, name, no, stride) type name[no] __attribute__ ((aligned(stride)))\r\n#else\r\n#define aligned_array(type, name, no, stride) type name[no]\r\n#endif\r\n\r\n/* VIA ACE codeword     */\r\n\r\nstatic unsigned char via_flags = 0;\r\n\r\n#if defined ( _MSC_VER ) && ( _MSC_VER > 800 )\r\n\r\n#define NEH_REKEY   __asm pushfd __asm popfd\r\n#define NEH_AES     __asm _emit 0xf3 __asm _emit 0x0f __asm _emit 0xa7\r\n#define NEH_ECB     NEH_AES __asm _emit 0xc8\r\n#define NEH_CBC     NEH_AES __asm _emit 0xd0\r\n#define NEH_CFB     NEH_AES __asm _emit 0xe0\r\n#define NEH_OFB     NEH_AES __asm _emit 0xe8\r\n#define NEH_RNG     __asm _emit 0x0f __asm _emit 0xa7 __asm _emit 0xc0\r\n\r\nINLINE int has_cpuid(void)\r\n{   char ret_value;\r\n    __asm\r\n    {   pushfd                  /* save EFLAGS register     */\r\n        mov     eax,[esp]       /* copy it to eax           */\r\n        mov     edx,0x00200000  /* CPUID bit position       */\r\n        xor     eax,edx         /* toggle the CPUID bit     */\r\n        push    eax             /* attempt to set EFLAGS to */\r\n        popfd                   /*     the new value        */\r\n        pushfd                  /* get the new EFLAGS value */\r\n        pop     eax             /*     into eax             */\r\n        xor     eax,[esp]       /* xor with original value  */\r\n        and     eax,edx         /* has CPUID bit changed?   */\r\n        setne   al              /* set to 1 if we have been */\r\n        mov     ret_value,al    /*     able to change it    */\r\n        popfd                   /* restore original EFLAGS  */\r\n    }\r\n    return (int)ret_value;\r\n}\r\n\r\nINLINE int is_via_cpu(void)\r\n{   char ret_value;\r\n    __asm\r\n    {   push    ebx\r\n        xor     eax,eax         /* use CPUID to get vendor  */\r\n        cpuid                   /* identity string          */\r\n        xor     eax,eax         /* is it \"CentaurHauls\" ?   */\r\n        sub     ebx,0x746e6543  /* 'Cent'                   */\r\n        or      eax,ebx\r\n        sub     edx,0x48727561  /* 'aurH'                   */\r\n        or      eax,edx\r\n        sub     ecx,0x736c7561  /* 'auls'                   */\r\n        or      eax,ecx\r\n        sete    al              /* set to 1 if it is VIA ID */\r\n        mov     dl,NEH_CPU_READ /* mark CPU type as read    */\r\n        or      dl,al           /* & store result in flags  */\r\n        mov     [via_flags],dl  /* set VIA detected flag    */\r\n        mov     ret_value,al    /*     able to change it    */\r\n        pop     ebx\r\n    }\r\n    return (int)ret_value;\r\n}\r\n\r\nINLINE int read_via_flags(void)\r\n{   char ret_value = 0;\r\n    __asm\r\n    {   mov     eax,0xC0000000  /* Centaur extended CPUID   */\r\n        cpuid\r\n        mov     edx,0xc0000001  /* >= 0xc0000001 if support */\r\n        cmp     eax,edx         /* for VIA extended feature */\r\n        jnae    no_rng          /*     flags is available   */\r\n        mov     eax,edx         /* read Centaur extended    */\r\n        cpuid                   /*     feature flags        */\r\n        mov     eax,NEH_FLAGS_MASK  /* mask out and save    */\r\n        and     eax,edx         /*  the RNG and ACE flags   */\r\n        or      [via_flags],al  /* present & enabled flags  */\r\n        mov     ret_value,al    /*     able to change it    */\r\nno_rng:\r\n    }\r\n    return (int)ret_value;\r\n}\r\n\r\nINLINE unsigned int via_rng_in(void *buf)\r\n{   char ret_value = 0x1f;\r\n    __asm\r\n    {   push    edi\r\n        mov     edi,buf         /* input buffer address     */\r\n        xor     edx,edx         /* try to fetch 8 bytes     */\r\n        NEH_RNG                 /* do RNG read operation    */\r\n        and     ret_value,al    /* count of bytes returned  */\r\n        pop     edi\r\n    }\r\n    return (int)ret_value;\r\n}\r\n\r\nINLINE void via_ecb_op5(\r\n            const void *k, const void *c, const void *s, void *d, int l)\r\n{   __asm\r\n    {   push    ebx\r\n        NEH_REKEY\r\n        mov     ebx, (k)\r\n        mov     edx, (c)\r\n        mov     esi, (s)\r\n        mov     edi, (d)\r\n        mov     ecx, (l)\r\n        NEH_ECB\r\n        pop     ebx\r\n    }\r\n}\r\n\r\nINLINE void via_cbc_op6(\r\n            const void *k, const void *c, const void *s, void *d, int l, void *v)\r\n{   __asm\r\n    {   push    ebx\r\n        NEH_REKEY\r\n        mov     ebx, (k)\r\n        mov     edx, (c)\r\n        mov     esi, (s)\r\n        mov     edi, (d)\r\n        mov     ecx, (l)\r\n        mov     eax, (v)\r\n        NEH_CBC\r\n        pop     ebx\r\n    }\r\n}\r\n\r\nINLINE void via_cbc_op7(\r\n        const void *k, const void *c, const void *s, void *d, int l, void *v, void *w)\r\n{   __asm\r\n    {   push    ebx\r\n        NEH_REKEY\r\n        mov     ebx, (k)\r\n        mov     edx, (c)\r\n        mov     esi, (s)\r\n        mov     edi, (d)\r\n        mov     ecx, (l)\r\n        mov     eax, (v)\r\n        NEH_CBC\r\n        mov     esi, eax\r\n        mov     edi, (w)\r\n        movsd\r\n        movsd\r\n        movsd\r\n        movsd\r\n        pop     ebx\r\n    }\r\n}\r\n\r\nINLINE void via_cfb_op6(\r\n            const void *k, const void *c, const void *s, void *d, int l, void *v)\r\n{   __asm\r\n    {   push    ebx\r\n        NEH_REKEY\r\n        mov     ebx, (k)\r\n        mov     edx, (c)\r\n        mov     esi, (s)\r\n        mov     edi, (d)\r\n        mov     ecx, (l)\r\n        mov     eax, (v)\r\n        NEH_CFB\r\n        pop     ebx\r\n    }\r\n}\r\n\r\nINLINE void via_cfb_op7(\r\n        const void *k, const void *c, const void *s, void *d, int l, void *v, void *w)\r\n{   __asm\r\n    {   push    ebx\r\n        NEH_REKEY\r\n        mov     ebx, (k)\r\n        mov     edx, (c)\r\n        mov     esi, (s)\r\n        mov     edi, (d)\r\n        mov     ecx, (l)\r\n        mov     eax, (v)\r\n        NEH_CFB\r\n        mov     esi, eax\r\n        mov     edi, (w)\r\n        movsd\r\n        movsd\r\n        movsd\r\n        movsd\r\n        pop     ebx\r\n    }\r\n}\r\n\r\nINLINE void via_ofb_op6(\r\n            const void *k, const void *c, const void *s, void *d, int l, void *v)\r\n{   __asm\r\n    {   push    ebx\r\n        NEH_REKEY\r\n        mov     ebx, (k)\r\n        mov     edx, (c)\r\n        mov     esi, (s)\r\n        mov     edi, (d)\r\n        mov     ecx, (l)\r\n        mov     eax, (v)\r\n        NEH_OFB\r\n        pop     ebx\r\n    }\r\n}\r\n\r\n#elif defined( __GNUC__ )\r\n\r\n#define NEH_REKEY   asm(\"pushfl\\n popfl\\n\\t\")\r\n#define NEH_ECB     asm(\".byte 0xf3, 0x0f, 0xa7, 0xc8\\n\\t\")\r\n#define NEH_CBC     asm(\".byte 0xf3, 0x0f, 0xa7, 0xd0\\n\\t\")\r\n#define NEH_CFB     asm(\".byte 0xf3, 0x0f, 0xa7, 0xe0\\n\\t\")\r\n#define NEH_OFB     asm(\".byte 0xf3, 0x0f, 0xa7, 0xe8\\n\\t\")\r\n#define NEH_RNG     asm(\".byte 0x0f, 0xa7, 0xc0\\n\\t\");\r\n\r\nINLINE int has_cpuid(void)\r\n{   int val;\r\n    asm(\"pushfl\\n\\t\");\r\n    asm(\"movl  0(%esp),%eax\\n\\t\");\r\n    asm(\"xor   $0x00200000,%eax\\n\\t\");\r\n    asm(\"pushl %eax\\n\\t\");\r\n    asm(\"popfl\\n\\t\");\r\n    asm(\"pushfl\\n\\t\");\r\n    asm(\"popl  %eax\\n\\t\");\r\n    asm(\"xorl  0(%esp),%edx\\n\\t\");\r\n    asm(\"andl  $0x00200000,%eax\\n\\t\");\r\n    asm(\"movl  %%eax,%0\\n\\t\" : \"=m\" (val));\r\n    asm(\"popfl\\n\\t\");\r\n    return val ? 1 : 0;\r\n}\r\n\r\nINLINE int is_via_cpu(void)\r\n{   int val;\r\n    asm(\"pushl %ebx\\n\\t\");\r\n    asm(\"xorl %eax,%eax\\n\\t\");\r\n    asm(\"cpuid\\n\\t\");\r\n    asm(\"xorl %eax,%eax\\n\\t\");\r\n    asm(\"subl $0x746e6543,%ebx\\n\\t\");\r\n    asm(\"orl  %ebx,%eax\\n\\t\");\r\n    asm(\"subl $0x48727561,%edx\\n\\t\");\r\n    asm(\"orl  %edx,%eax\\n\\t\");\r\n    asm(\"subl $0x736c7561,%ecx\\n\\t\");\r\n    asm(\"orl  %ecx,%eax\\n\\t\");\r\n    asm(\"movl %%eax,%0\\n\\t\" : \"=m\" (val));\r\n    asm(\"popl %ebx\\n\\t\");\r\n    val = (val ? 0 : 1);\r\n    via_flags = (val | NEH_CPU_READ);\r\n    return val;\r\n}\r\n\r\nINLINE int read_via_flags(void)\r\n{   unsigned char   val;\r\n    asm(\"movl $0xc0000000,%eax\\n\\t\");\r\n    asm(\"cpuid\\n\\t\");\r\n    asm(\"movl $0xc0000001,%edx\\n\\t\");\r\n    asm(\"cmpl %edx,%eax\\n\\t\");\r\n    asm(\"setae %al\\n\\t\");\r\n    asm(\"movb %%al,%0\\n\\t\" : \"=m\" (val));\r\n    if(!val) return 0;\r\n    asm(\"movl $0xc0000001,%eax\\n\\t\");\r\n    asm(\"cpuid\\n\\t\");\r\n    asm(\"movb %%dl,%0\\n\\t\" : \"=m\" (val));\r\n    val &= NEH_FLAGS_MASK;\r\n    via_flags |= val;\r\n    return (int) val;\r\n}\r\n\r\nINLINE int via_rng_in(void *buf)\r\n{   int val;\r\n    asm(\"pushl %edi\\n\\t\");\r\n    asm(\"movl %0,%%edi\\n\\t\" : : \"m\" (buf));\r\n    asm(\"xorl %edx,%edx\\n\\t\");\r\n    NEH_RNG\r\n    asm(\"andl $0x0000001f,%eax\\n\\t\");\r\n    asm(\"movl %%eax,%0\\n\\t\" : \"=m\" (val));\r\n    asm(\"popl %edi\\n\\t\");\r\n    return val;\r\n}\r\n\r\nINLINE volatile  void via_ecb_op5(\r\n            const void *k, const void *c, const void *s, void *d, int l)\r\n{\r\n    asm(\"pushl %ebx\\n\\t\");\r\n    NEH_REKEY;\r\n    asm(\"movl %0, %%ebx\\n\\t\" : : \"m\" (k));\r\n    asm(\"movl %0, %%edx\\n\\t\" : : \"m\" (c));\r\n    asm(\"movl %0, %%esi\\n\\t\" : : \"m\" (s));\r\n    asm(\"movl %0, %%edi\\n\\t\" : : \"m\" (d));\r\n    asm(\"movl %0, %%ecx\\n\\t\" : : \"m\" (l));\r\n    NEH_ECB;\r\n    asm(\"popl %ebx\\n\\t\");\r\n}\r\n\r\nINLINE volatile  void via_cbc_op6(\r\n            const void *k, const void *c, const void *s, void *d, int l, void *v)\r\n{\r\n    asm(\"pushl %ebx\\n\\t\");\r\n    NEH_REKEY;\r\n    asm(\"movl %0, %%ebx\\n\\t\" : : \"m\" (k));\r\n    asm(\"movl %0, %%edx\\n\\t\" : : \"m\" (c));\r\n    asm(\"movl %0, %%esi\\n\\t\" : : \"m\" (s));\r\n    asm(\"movl %0, %%edi\\n\\t\" : : \"m\" (d));\r\n    asm(\"movl %0, %%ecx\\n\\t\" : : \"m\" (l));\r\n    asm(\"movl %0, %%eax\\n\\t\" : : \"m\" (v));\r\n    NEH_CBC;\r\n    asm(\"popl %ebx\\n\\t\");\r\n}\r\n\r\nINLINE volatile  void via_cbc_op7(\r\n        const void *k, const void *c, const void *s, void *d, int l, void *v, void *w)\r\n{\r\n    asm(\"pushl %ebx\\n\\t\");\r\n    NEH_REKEY;\r\n    asm(\"movl %0, %%ebx\\n\\t\" : : \"m\" (k));\r\n    asm(\"movl %0, %%edx\\n\\t\" : : \"m\" (c));\r\n    asm(\"movl %0, %%esi\\n\\t\" : : \"m\" (s));\r\n    asm(\"movl %0, %%edi\\n\\t\" : : \"m\" (d));\r\n    asm(\"movl %0, %%ecx\\n\\t\" : : \"m\" (l));\r\n    asm(\"movl %0, %%eax\\n\\t\" : : \"m\" (v));\r\n    NEH_CBC;\r\n    asm(\"movl %eax,%esi\\n\\t\");\r\n    asm(\"movl %0, %%edi\\n\\t\" : : \"m\" (w));\r\n    asm(\"movsl; movsl; movsl; movsl\\n\\t\");\r\n    asm(\"popl %ebx\\n\\t\");\r\n}\r\n\r\nINLINE volatile  void via_cfb_op6(\r\n            const void *k, const void *c, const void *s, void *d, int l, void *v)\r\n{\r\n    asm(\"pushl %ebx\\n\\t\");\r\n    NEH_REKEY;\r\n    asm(\"movl %0, %%ebx\\n\\t\" : : \"m\" (k));\r\n    asm(\"movl %0, %%edx\\n\\t\" : : \"m\" (c));\r\n    asm(\"movl %0, %%esi\\n\\t\" : : \"m\" (s));\r\n    asm(\"movl %0, %%edi\\n\\t\" : : \"m\" (d));\r\n    asm(\"movl %0, %%ecx\\n\\t\" : : \"m\" (l));\r\n    asm(\"movl %0, %%eax\\n\\t\" : : \"m\" (v));\r\n    NEH_CFB;\r\n    asm(\"popl %ebx\\n\\t\");\r\n}\r\n\r\nINLINE volatile  void via_cfb_op7(\r\n        const void *k, const void *c, const void *s, void *d, int l, void *v, void *w)\r\n{\r\n    asm(\"pushl %ebx\\n\\t\");\r\n    NEH_REKEY;\r\n    asm(\"movl %0, %%ebx\\n\\t\" : : \"m\" (k));\r\n    asm(\"movl %0, %%edx\\n\\t\" : : \"m\" (c));\r\n    asm(\"movl %0, %%esi\\n\\t\" : : \"m\" (s));\r\n    asm(\"movl %0, %%edi\\n\\t\" : : \"m\" (d));\r\n    asm(\"movl %0, %%ecx\\n\\t\" : : \"m\" (l));\r\n    asm(\"movl %0, %%eax\\n\\t\" : : \"m\" (v));\r\n    NEH_CFB;\r\n    asm(\"movl %eax,%esi\\n\\t\");\r\n    asm(\"movl %0, %%edi\\n\\t\" : : \"m\" (w));\r\n    asm(\"movsl; movsl; movsl; movsl\\n\\t\");\r\n    asm(\"popl %ebx\\n\\t\");\r\n}\r\n\r\nINLINE volatile  void via_ofb_op6(\r\n            const void *k, const void *c, const void *s, void *d, int l, void *v)\r\n{\r\n    asm(\"pushl %ebx\\n\\t\");\r\n    NEH_REKEY;\r\n    asm(\"movl %0, %%ebx\\n\\t\" : : \"m\" (k));\r\n    asm(\"movl %0, %%edx\\n\\t\" : : \"m\" (c));\r\n    asm(\"movl %0, %%esi\\n\\t\" : : \"m\" (s));\r\n    asm(\"movl %0, %%edi\\n\\t\" : : \"m\" (d));\r\n    asm(\"movl %0, %%ecx\\n\\t\" : : \"m\" (l));\r\n    asm(\"movl %0, %%eax\\n\\t\" : : \"m\" (v));\r\n    NEH_OFB;\r\n    asm(\"popl %ebx\\n\\t\");\r\n}\r\n\r\n#else\r\n#error VIA ACE is not available with this compiler\r\n#endif\r\n\r\nINLINE int via_ace_test(void)\r\n{\r\n    return has_cpuid() && is_via_cpu() && ((read_via_flags() & NEH_ACE_FLAGS) == NEH_ACE_FLAGS);\r\n}\r\n\r\n#define VIA_ACE_AVAILABLE   (((via_flags & NEH_ACE_FLAGS) == NEH_ACE_FLAGS)         \\\r\n    || (via_flags & NEH_CPU_READ) && (via_flags & NEH_CPU_IS_VIA) || via_ace_test())\r\n\r\nINLINE int via_rng_test(void)\r\n{\r\n    return has_cpuid() && is_via_cpu() && ((read_via_flags() & NEH_RNG_FLAGS) == NEH_RNG_FLAGS);\r\n}\r\n\r\n#define VIA_RNG_AVAILABLE   (((via_flags & NEH_RNG_FLAGS) == NEH_RNG_FLAGS)         \\\r\n    || (via_flags & NEH_CPU_READ) && (via_flags & NEH_CPU_IS_VIA) || via_rng_test())\r\n\r\nINLINE int read_via_rng(void *buf, int count)\r\n{   int nbr, max_reads, lcnt = count;\r\n    unsigned char *p, *q;\r\n    aligned_auto(unsigned char, bp, 64, 16);\r\n\r\n    if(!VIA_RNG_AVAILABLE)\r\n        return 0;\r\n\r\n    do\r\n    {\r\n        max_reads = MAX_READ_ATTEMPTS;\r\n        do\r\n            nbr = via_rng_in(bp);\r\n        while\r\n            (nbr == 0 && --max_reads);\r\n\r\n        lcnt -= nbr;\r\n        p = (unsigned char*)buf; q = bp;\r\n        while(nbr--)\r\n            *p++ = *q++;\r\n    }\r\n    while\r\n        (lcnt && max_reads);\r\n\r\n    return count - lcnt;\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/aes/aescrypt.c",
    "content": "/*\r\n---------------------------------------------------------------------------\r\nCopyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.\r\n\r\nThe redistribution and use of this software (with or without changes)\r\nis allowed without the payment of fees or royalties provided that:\r\n\r\n  source code distributions include the above copyright notice, this\r\n  list of conditions and the following disclaimer;\r\n\r\n  binary distributions include the above copyright notice, this list\r\n  of conditions and the following disclaimer in their documentation.\r\n\r\nThis software is provided 'as is' with no explicit or implied warranties\r\nin respect of its operation, including, but not limited to, correctness\r\nand fitness for purpose.\r\n---------------------------------------------------------------------------\r\nIssue Date: 20/12/2007\r\n*/\r\n\r\n#include \"aesopt.h\"\r\n#include \"aestab.h\"\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\"\r\n{\r\n#endif\r\n\r\n#define si(y,x,k,c) (s(y,c) = word_in(x, c) ^ (k)[c])\r\n#define so(y,x,c)   word_out(y, c, s(x,c))\r\n\r\n#if defined(ARRAYS)\r\n#define locals(y,x)     x[4],y[4]\r\n#else\r\n#define locals(y,x)     x##0,x##1,x##2,x##3,y##0,y##1,y##2,y##3\r\n#endif\r\n\r\n#define l_copy(y, x)    s(y,0) = s(x,0); s(y,1) = s(x,1); \\\r\n                        s(y,2) = s(x,2); s(y,3) = s(x,3);\r\n#define state_in(y,x,k) si(y,x,k,0); si(y,x,k,1); si(y,x,k,2); si(y,x,k,3)\r\n#define state_out(y,x)  so(y,x,0); so(y,x,1); so(y,x,2); so(y,x,3)\r\n#define round(rm,y,x,k) rm(y,x,k,0); rm(y,x,k,1); rm(y,x,k,2); rm(y,x,k,3)\r\n\r\n#if ( FUNCS_IN_C & ENCRYPTION_IN_C )\r\n\r\n/* Visual C++ .Net v7.1 provides the fastest encryption code when using\r\n   Pentium optimiation with small code but this is poor for decryption\r\n   so we need to control this with the following VC++ pragmas\r\n*/\r\n\r\n#if defined( _MSC_VER ) && !defined( _WIN64 )\r\n#pragma optimize( \"s\", on )\r\n#endif\r\n\r\n/* Given the column (c) of the output state variable, the following\r\n   macros give the input state variables which are needed in its\r\n   computation for each row (r) of the state. All the alternative\r\n   macros give the same end values but expand into different ways\r\n   of calculating these values.  In particular the complex macro\r\n   used for dynamically variable block sizes is designed to expand\r\n   to a compile time constant whenever possible but will expand to\r\n   conditional clauses on some branches (I am grateful to Frank\r\n   Yellin for this construction)\r\n*/\r\n\r\n#define fwd_var(x,r,c)\\\r\n ( r == 0 ? ( c == 0 ? s(x,0) : c == 1 ? s(x,1) : c == 2 ? s(x,2) : s(x,3))\\\r\n : r == 1 ? ( c == 0 ? s(x,1) : c == 1 ? s(x,2) : c == 2 ? s(x,3) : s(x,0))\\\r\n : r == 2 ? ( c == 0 ? s(x,2) : c == 1 ? s(x,3) : c == 2 ? s(x,0) : s(x,1))\\\r\n :          ( c == 0 ? s(x,3) : c == 1 ? s(x,0) : c == 2 ? s(x,1) : s(x,2)))\r\n\r\n#if defined(FT4_SET)\r\n#undef  dec_fmvars\r\n#define fwd_rnd(y,x,k,c)    (s(y,c) = (k)[c] ^ four_tables(x,t_use(f,n),fwd_var,rf1,c))\r\n#elif defined(FT1_SET)\r\n#undef  dec_fmvars\r\n#define fwd_rnd(y,x,k,c)    (s(y,c) = (k)[c] ^ one_table(x,upr,t_use(f,n),fwd_var,rf1,c))\r\n#else\r\n#define fwd_rnd(y,x,k,c)    (s(y,c) = (k)[c] ^ fwd_mcol(no_table(x,t_use(s,box),fwd_var,rf1,c)))\r\n#endif\r\n\r\n#if defined(FL4_SET)\r\n#define fwd_lrnd(y,x,k,c)   (s(y,c) = (k)[c] ^ four_tables(x,t_use(f,l),fwd_var,rf1,c))\r\n#elif defined(FL1_SET)\r\n#define fwd_lrnd(y,x,k,c)   (s(y,c) = (k)[c] ^ one_table(x,ups,t_use(f,l),fwd_var,rf1,c))\r\n#else\r\n#define fwd_lrnd(y,x,k,c)   (s(y,c) = (k)[c] ^ no_table(x,t_use(s,box),fwd_var,rf1,c))\r\n#endif\r\n\r\nAES_RETURN aes_encrypt(const unsigned char *in, unsigned char *out, const aes_encrypt_ctx cx[1])\r\n{   uint_32t         locals(b0, b1);\r\n    const uint_32t   *kp;\r\n#if defined( dec_fmvars )\r\n    dec_fmvars; /* declare variables for fwd_mcol() if needed */\r\n#endif\r\n\r\n    if( cx->inf.b[0] != 10 * 16 && cx->inf.b[0] != 12 * 16 && cx->inf.b[0] != 14 * 16 )\r\n        return EXIT_FAILURE;\r\n\r\n    kp = cx->ks;\r\n    state_in(b0, in, kp);\r\n\r\n#if (ENC_UNROLL == FULL)\r\n\r\n    switch(cx->inf.b[0])\r\n    {\r\n    case 14 * 16:\r\n        round(fwd_rnd,  b1, b0, kp + 1 * N_COLS);\r\n        round(fwd_rnd,  b0, b1, kp + 2 * N_COLS);\r\n        kp += 2 * N_COLS;\r\n    case 12 * 16:\r\n        round(fwd_rnd,  b1, b0, kp + 1 * N_COLS);\r\n        round(fwd_rnd,  b0, b1, kp + 2 * N_COLS);\r\n        kp += 2 * N_COLS;\r\n    case 10 * 16:\r\n        round(fwd_rnd,  b1, b0, kp + 1 * N_COLS);\r\n        round(fwd_rnd,  b0, b1, kp + 2 * N_COLS);\r\n        round(fwd_rnd,  b1, b0, kp + 3 * N_COLS);\r\n        round(fwd_rnd,  b0, b1, kp + 4 * N_COLS);\r\n        round(fwd_rnd,  b1, b0, kp + 5 * N_COLS);\r\n        round(fwd_rnd,  b0, b1, kp + 6 * N_COLS);\r\n        round(fwd_rnd,  b1, b0, kp + 7 * N_COLS);\r\n        round(fwd_rnd,  b0, b1, kp + 8 * N_COLS);\r\n        round(fwd_rnd,  b1, b0, kp + 9 * N_COLS);\r\n        round(fwd_lrnd, b0, b1, kp +10 * N_COLS);\r\n    }\r\n\r\n#else\r\n\r\n#if (ENC_UNROLL == PARTIAL)\r\n    {   uint_32t    rnd;\r\n        for(rnd = 0; rnd < (cx->inf.b[0] >> 5) - 1; ++rnd)\r\n        {\r\n            kp += N_COLS;\r\n            round(fwd_rnd, b1, b0, kp);\r\n            kp += N_COLS;\r\n            round(fwd_rnd, b0, b1, kp);\r\n        }\r\n        kp += N_COLS;\r\n        round(fwd_rnd,  b1, b0, kp);\r\n#else\r\n    {   uint_32t    rnd;\r\n        for(rnd = 0; rnd < (cx->inf.b[0] >> 4) - 1; ++rnd)\r\n        {\r\n            kp += N_COLS;\r\n            round(fwd_rnd, b1, b0, kp);\r\n            l_copy(b0, b1);\r\n        }\r\n#endif\r\n        kp += N_COLS;\r\n        round(fwd_lrnd, b0, b1, kp);\r\n    }\r\n#endif\r\n\r\n    state_out(out, b0);\r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n#endif\r\n\r\n#if ( FUNCS_IN_C & DECRYPTION_IN_C)\r\n\r\n/* Visual C++ .Net v7.1 provides the fastest encryption code when using\r\n   Pentium optimiation with small code but this is poor for decryption\r\n   so we need to control this with the following VC++ pragmas\r\n*/\r\n\r\n#if defined( _MSC_VER ) && !defined( _WIN64 )\r\n#pragma optimize( \"t\", on )\r\n#endif\r\n\r\n/* Given the column (c) of the output state variable, the following\r\n   macros give the input state variables which are needed in its\r\n   computation for each row (r) of the state. All the alternative\r\n   macros give the same end values but expand into different ways\r\n   of calculating these values.  In particular the complex macro\r\n   used for dynamically variable block sizes is designed to expand\r\n   to a compile time constant whenever possible but will expand to\r\n   conditional clauses on some branches (I am grateful to Frank\r\n   Yellin for this construction)\r\n*/\r\n\r\n#define inv_var(x,r,c)\\\r\n ( r == 0 ? ( c == 0 ? s(x,0) : c == 1 ? s(x,1) : c == 2 ? s(x,2) : s(x,3))\\\r\n : r == 1 ? ( c == 0 ? s(x,3) : c == 1 ? s(x,0) : c == 2 ? s(x,1) : s(x,2))\\\r\n : r == 2 ? ( c == 0 ? s(x,2) : c == 1 ? s(x,3) : c == 2 ? s(x,0) : s(x,1))\\\r\n :          ( c == 0 ? s(x,1) : c == 1 ? s(x,2) : c == 2 ? s(x,3) : s(x,0)))\r\n\r\n#if defined(IT4_SET)\r\n#undef  dec_imvars\r\n#define inv_rnd(y,x,k,c)    (s(y,c) = (k)[c] ^ four_tables(x,t_use(i,n),inv_var,rf1,c))\r\n#elif defined(IT1_SET)\r\n#undef  dec_imvars\r\n#define inv_rnd(y,x,k,c)    (s(y,c) = (k)[c] ^ one_table(x,upr,t_use(i,n),inv_var,rf1,c))\r\n#else\r\n#define inv_rnd(y,x,k,c)    (s(y,c) = inv_mcol((k)[c] ^ no_table(x,t_use(i,box),inv_var,rf1,c)))\r\n#endif\r\n\r\n#if defined(IL4_SET)\r\n#define inv_lrnd(y,x,k,c)   (s(y,c) = (k)[c] ^ four_tables(x,t_use(i,l),inv_var,rf1,c))\r\n#elif defined(IL1_SET)\r\n#define inv_lrnd(y,x,k,c)   (s(y,c) = (k)[c] ^ one_table(x,ups,t_use(i,l),inv_var,rf1,c))\r\n#else\r\n#define inv_lrnd(y,x,k,c)   (s(y,c) = (k)[c] ^ no_table(x,t_use(i,box),inv_var,rf1,c))\r\n#endif\r\n\r\n/* This code can work with the decryption key schedule in the   */\r\n/* order that is used for encrytpion (where the 1st decryption  */\r\n/* round key is at the high end ot the schedule) or with a key  */\r\n/* schedule that has been reversed to put the 1st decryption    */\r\n/* round key at the low end of the schedule in memory (when     */\r\n/* AES_REV_DKS is defined)                                      */\r\n\r\n#ifdef AES_REV_DKS\r\n#define key_ofs     0\r\n#define rnd_key(n)  (kp + n * N_COLS)\r\n#else\r\n#define key_ofs     1\r\n#define rnd_key(n)  (kp - n * N_COLS)\r\n#endif\r\n\r\nAES_RETURN aes_decrypt(const unsigned char *in, unsigned char *out, const aes_decrypt_ctx cx[1])\r\n{   uint_32t        locals(b0, b1);\r\n#if defined( dec_imvars )\r\n    dec_imvars; /* declare variables for inv_mcol() if needed */\r\n#endif\r\n    const uint_32t *kp;\r\n\r\n    if( cx->inf.b[0] != 10 * 16 && cx->inf.b[0] != 12 * 16 && cx->inf.b[0] != 14 * 16 )\r\n        return EXIT_FAILURE;\r\n\r\n    kp = cx->ks + (key_ofs ? (cx->inf.b[0] >> 2) : 0);\r\n    state_in(b0, in, kp);\r\n\r\n#if (DEC_UNROLL == FULL)\r\n\r\n    kp = cx->ks + (key_ofs ? 0 : (cx->inf.b[0] >> 2));\r\n    switch(cx->inf.b[0])\r\n    {\r\n    case 14 * 16:\r\n        round(inv_rnd,  b1, b0, rnd_key(-13));\r\n        round(inv_rnd,  b0, b1, rnd_key(-12));\r\n    case 12 * 16:\r\n        round(inv_rnd,  b1, b0, rnd_key(-11));\r\n        round(inv_rnd,  b0, b1, rnd_key(-10));\r\n    case 10 * 16:\r\n        round(inv_rnd,  b1, b0, rnd_key(-9));\r\n        round(inv_rnd,  b0, b1, rnd_key(-8));\r\n        round(inv_rnd,  b1, b0, rnd_key(-7));\r\n        round(inv_rnd,  b0, b1, rnd_key(-6));\r\n        round(inv_rnd,  b1, b0, rnd_key(-5));\r\n        round(inv_rnd,  b0, b1, rnd_key(-4));\r\n        round(inv_rnd,  b1, b0, rnd_key(-3));\r\n        round(inv_rnd,  b0, b1, rnd_key(-2));\r\n        round(inv_rnd,  b1, b0, rnd_key(-1));\r\n        round(inv_lrnd, b0, b1, rnd_key( 0));\r\n    }\r\n\r\n#else\r\n\r\n#if (DEC_UNROLL == PARTIAL)\r\n    {   uint_32t    rnd;\r\n        for(rnd = 0; rnd < (cx->inf.b[0] >> 5) - 1; ++rnd)\r\n        {\r\n            kp = rnd_key(1);\r\n            round(inv_rnd, b1, b0, kp);\r\n            kp = rnd_key(1);\r\n            round(inv_rnd, b0, b1, kp);\r\n        }\r\n        kp = rnd_key(1);\r\n        round(inv_rnd, b1, b0, kp);\r\n#else\r\n    {   uint_32t    rnd;\r\n        for(rnd = 0; rnd < (cx->inf.b[0] >> 4) - 1; ++rnd)\r\n        {\r\n            kp = rnd_key(1);\r\n            round(inv_rnd, b1, b0, kp);\r\n            l_copy(b0, b1);\r\n        }\r\n#endif\r\n        kp = rnd_key(1);\r\n        round(inv_lrnd, b0, b1, kp);\r\n        }\r\n#endif\r\n\r\n    state_out(out, b0);\r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n#endif\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/aes/aeskey.c",
    "content": "/*\r\n---------------------------------------------------------------------------\r\nCopyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.\r\n\r\nThe redistribution and use of this software (with or without changes)\r\nis allowed without the payment of fees or royalties provided that:\r\n\r\n  source code distributions include the above copyright notice, this\r\n  list of conditions and the following disclaimer;\r\n\r\n  binary distributions include the above copyright notice, this list\r\n  of conditions and the following disclaimer in their documentation.\r\n\r\nThis software is provided 'as is' with no explicit or implied warranties\r\nin respect of its operation, including, but not limited to, correctness\r\nand fitness for purpose.\r\n---------------------------------------------------------------------------\r\nIssue Date: 20/12/2007\r\n*/\r\n\r\n#include \"aesopt.h\"\r\n#include \"aestab.h\"\r\n\r\n#ifdef USE_VIA_ACE_IF_PRESENT\r\n#  include \"aes_via_ace.h\"\r\n#endif\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\"\r\n{\r\n#endif\r\n\r\n/* Initialise the key schedule from the user supplied key. The key\r\n   length can be specified in bytes, with legal values of 16, 24\r\n   and 32, or in bits, with legal values of 128, 192 and 256. These\r\n   values correspond with Nk values of 4, 6 and 8 respectively.\r\n\r\n   The following macros implement a single cycle in the key\r\n   schedule generation process. The number of cycles needed\r\n   for each cx->n_col and nk value is:\r\n\r\n    nk =             4  5  6  7  8\r\n    ------------------------------\r\n    cx->n_col = 4   10  9  8  7  7\r\n    cx->n_col = 5   14 11 10  9  9\r\n    cx->n_col = 6   19 15 12 11 11\r\n    cx->n_col = 7   21 19 16 13 14\r\n    cx->n_col = 8   29 23 19 17 14\r\n*/\r\n\r\n#if defined( REDUCE_CODE_SIZE )\r\n#  define ls_box ls_sub\r\n   uint_32t ls_sub(const uint_32t t, const uint_32t n);\r\n#  define inv_mcol im_sub\r\n   uint_32t im_sub(const uint_32t x);\r\n#  ifdef ENC_KS_UNROLL\r\n#    undef ENC_KS_UNROLL\r\n#  endif\r\n#  ifdef DEC_KS_UNROLL\r\n#    undef DEC_KS_UNROLL\r\n#  endif\r\n#endif\r\n\r\n#if (FUNCS_IN_C & ENC_KEYING_IN_C)\r\n\r\n#if defined(AES_128) || defined( AES_VAR )\r\n\r\n#define ke4(k,i) \\\r\n{   k[4*(i)+4] = ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; \\\r\n    k[4*(i)+5] = ss[1] ^= ss[0]; \\\r\n    k[4*(i)+6] = ss[2] ^= ss[1]; \\\r\n    k[4*(i)+7] = ss[3] ^= ss[2]; \\\r\n}\r\n\r\nAES_RETURN aes_encrypt_key128(const unsigned char *key, aes_encrypt_ctx cx[1])\r\n{   uint_32t    ss[4];\r\n\r\n    cx->ks[0] = ss[0] = word_in(key, 0);\r\n    cx->ks[1] = ss[1] = word_in(key, 1);\r\n    cx->ks[2] = ss[2] = word_in(key, 2);\r\n    cx->ks[3] = ss[3] = word_in(key, 3);\r\n\r\n#ifdef ENC_KS_UNROLL\r\n    ke4(cx->ks, 0);  ke4(cx->ks, 1);\r\n    ke4(cx->ks, 2);  ke4(cx->ks, 3);\r\n    ke4(cx->ks, 4);  ke4(cx->ks, 5);\r\n    ke4(cx->ks, 6);  ke4(cx->ks, 7);\r\n    ke4(cx->ks, 8);\r\n#else\r\n    {   uint_32t i;\r\n        for(i = 0; i < 9; ++i)\r\n            ke4(cx->ks, i);\r\n    }\r\n#endif\r\n    ke4(cx->ks, 9);\r\n    cx->inf.l = 0;\r\n    cx->inf.b[0] = 10 * 16;\r\n\r\n#ifdef USE_VIA_ACE_IF_PRESENT\r\n    if(VIA_ACE_AVAILABLE)\r\n        cx->inf.b[1] = 0xff;\r\n#endif\r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n#endif\r\n\r\n#if defined(AES_192) || defined( AES_VAR )\r\n\r\n#define kef6(k,i) \\\r\n{   k[6*(i)+ 6] = ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; \\\r\n    k[6*(i)+ 7] = ss[1] ^= ss[0]; \\\r\n    k[6*(i)+ 8] = ss[2] ^= ss[1]; \\\r\n    k[6*(i)+ 9] = ss[3] ^= ss[2]; \\\r\n}\r\n\r\n#define ke6(k,i) \\\r\n{   kef6(k,i); \\\r\n    k[6*(i)+10] = ss[4] ^= ss[3]; \\\r\n    k[6*(i)+11] = ss[5] ^= ss[4]; \\\r\n}\r\n\r\nAES_RETURN aes_encrypt_key192(const unsigned char *key, aes_encrypt_ctx cx[1])\r\n{   uint_32t    ss[6];\r\n\r\n    cx->ks[0] = ss[0] = word_in(key, 0);\r\n    cx->ks[1] = ss[1] = word_in(key, 1);\r\n    cx->ks[2] = ss[2] = word_in(key, 2);\r\n    cx->ks[3] = ss[3] = word_in(key, 3);\r\n    cx->ks[4] = ss[4] = word_in(key, 4);\r\n    cx->ks[5] = ss[5] = word_in(key, 5);\r\n\r\n#ifdef ENC_KS_UNROLL\r\n    ke6(cx->ks, 0);  ke6(cx->ks, 1);\r\n    ke6(cx->ks, 2);  ke6(cx->ks, 3);\r\n    ke6(cx->ks, 4);  ke6(cx->ks, 5);\r\n    ke6(cx->ks, 6);\r\n#else\r\n    {   uint_32t i;\r\n        for(i = 0; i < 7; ++i)\r\n            ke6(cx->ks, i);\r\n    }\r\n#endif\r\n    kef6(cx->ks, 7);\r\n    cx->inf.l = 0;\r\n    cx->inf.b[0] = 12 * 16;\r\n\r\n#ifdef USE_VIA_ACE_IF_PRESENT\r\n    if(VIA_ACE_AVAILABLE)\r\n        cx->inf.b[1] = 0xff;\r\n#endif\r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n#endif\r\n\r\n#if defined(AES_256) || defined( AES_VAR )\r\n\r\n#define kef8(k,i) \\\r\n{   k[8*(i)+ 8] = ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; \\\r\n    k[8*(i)+ 9] = ss[1] ^= ss[0]; \\\r\n    k[8*(i)+10] = ss[2] ^= ss[1]; \\\r\n    k[8*(i)+11] = ss[3] ^= ss[2]; \\\r\n}\r\n\r\n#define ke8(k,i) \\\r\n{   kef8(k,i); \\\r\n    k[8*(i)+12] = ss[4] ^= ls_box(ss[3],0); \\\r\n    k[8*(i)+13] = ss[5] ^= ss[4]; \\\r\n    k[8*(i)+14] = ss[6] ^= ss[5]; \\\r\n    k[8*(i)+15] = ss[7] ^= ss[6]; \\\r\n}\r\n\r\nAES_RETURN aes_encrypt_key256(const unsigned char *key, aes_encrypt_ctx cx[1])\r\n{   uint_32t    ss[8];\r\n\r\n    cx->ks[0] = ss[0] = word_in(key, 0);\r\n    cx->ks[1] = ss[1] = word_in(key, 1);\r\n    cx->ks[2] = ss[2] = word_in(key, 2);\r\n    cx->ks[3] = ss[3] = word_in(key, 3);\r\n    cx->ks[4] = ss[4] = word_in(key, 4);\r\n    cx->ks[5] = ss[5] = word_in(key, 5);\r\n    cx->ks[6] = ss[6] = word_in(key, 6);\r\n    cx->ks[7] = ss[7] = word_in(key, 7);\r\n\r\n#ifdef ENC_KS_UNROLL\r\n    ke8(cx->ks, 0); ke8(cx->ks, 1);\r\n    ke8(cx->ks, 2); ke8(cx->ks, 3);\r\n    ke8(cx->ks, 4); ke8(cx->ks, 5);\r\n#else\r\n    {   uint_32t i;\r\n        for(i = 0; i < 6; ++i)\r\n            ke8(cx->ks,  i);\r\n    }\r\n#endif\r\n    kef8(cx->ks, 6);\r\n    cx->inf.l = 0;\r\n    cx->inf.b[0] = 14 * 16;\r\n\r\n#ifdef USE_VIA_ACE_IF_PRESENT\r\n    if(VIA_ACE_AVAILABLE)\r\n        cx->inf.b[1] = 0xff;\r\n#endif\r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n#endif\r\n\r\n#if defined( AES_VAR )\r\n\r\nAES_RETURN aes_encrypt_key(const unsigned char *key, int key_len, aes_encrypt_ctx cx[1])\r\n{   \r\n    switch(key_len)\r\n    {\r\n    case 16: case 128: return aes_encrypt_key128(key, cx);\r\n    case 24: case 192: return aes_encrypt_key192(key, cx);\r\n    case 32: case 256: return aes_encrypt_key256(key, cx);\r\n    default: return EXIT_FAILURE;\r\n    }\r\n}\r\n\r\n#endif\r\n\r\n#endif\r\n\r\n#if (FUNCS_IN_C & DEC_KEYING_IN_C)\r\n\r\n/* this is used to store the decryption round keys  */\r\n/* in forward or reverse order                      */\r\n\r\n#ifdef AES_REV_DKS\r\n#define v(n,i)  ((n) - (i) + 2 * ((i) & 3))\r\n#else\r\n#define v(n,i)  (i)\r\n#endif\r\n\r\n#if DEC_ROUND == NO_TABLES\r\n#define ff(x)   (x)\r\n#else\r\n#define ff(x)   inv_mcol(x)\r\n#if defined( dec_imvars )\r\n#define d_vars  dec_imvars\r\n#endif\r\n#endif\r\n\r\n#if defined(AES_128) || defined( AES_VAR )\r\n\r\n#define k4e(k,i) \\\r\n{   k[v(40,(4*(i))+4)] = ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; \\\r\n    k[v(40,(4*(i))+5)] = ss[1] ^= ss[0]; \\\r\n    k[v(40,(4*(i))+6)] = ss[2] ^= ss[1]; \\\r\n    k[v(40,(4*(i))+7)] = ss[3] ^= ss[2]; \\\r\n}\r\n\r\n#if 1\r\n\r\n#define kdf4(k,i) \\\r\n{   ss[0] = ss[0] ^ ss[2] ^ ss[1] ^ ss[3]; \\\r\n    ss[1] = ss[1] ^ ss[3]; \\\r\n    ss[2] = ss[2] ^ ss[3]; \\\r\n    ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; \\\r\n    ss[i % 4] ^= ss[4]; \\\r\n    ss[4] ^= k[v(40,(4*(i)))];   k[v(40,(4*(i))+4)] = ff(ss[4]); \\\r\n    ss[4] ^= k[v(40,(4*(i))+1)]; k[v(40,(4*(i))+5)] = ff(ss[4]); \\\r\n    ss[4] ^= k[v(40,(4*(i))+2)]; k[v(40,(4*(i))+6)] = ff(ss[4]); \\\r\n    ss[4] ^= k[v(40,(4*(i))+3)]; k[v(40,(4*(i))+7)] = ff(ss[4]); \\\r\n}\r\n\r\n#define kd4(k,i) \\\r\n{   ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; \\\r\n    ss[i % 4] ^= ss[4]; ss[4] = ff(ss[4]); \\\r\n    k[v(40,(4*(i))+4)] = ss[4] ^= k[v(40,(4*(i)))]; \\\r\n    k[v(40,(4*(i))+5)] = ss[4] ^= k[v(40,(4*(i))+1)]; \\\r\n    k[v(40,(4*(i))+6)] = ss[4] ^= k[v(40,(4*(i))+2)]; \\\r\n    k[v(40,(4*(i))+7)] = ss[4] ^= k[v(40,(4*(i))+3)]; \\\r\n}\r\n\r\n#define kdl4(k,i) \\\r\n{   ss[4] = ls_box(ss[(i+3) % 4], 3) ^ t_use(r,c)[i]; ss[i % 4] ^= ss[4]; \\\r\n    k[v(40,(4*(i))+4)] = (ss[0] ^= ss[1]) ^ ss[2] ^ ss[3]; \\\r\n    k[v(40,(4*(i))+5)] = ss[1] ^ ss[3]; \\\r\n    k[v(40,(4*(i))+6)] = ss[0]; \\\r\n    k[v(40,(4*(i))+7)] = ss[1]; \\\r\n}\r\n\r\n#else\r\n\r\n#define kdf4(k,i) \\\r\n{   ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[v(40,(4*(i))+ 4)] = ff(ss[0]); \\\r\n    ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ff(ss[1]); \\\r\n    ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ff(ss[2]); \\\r\n    ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ff(ss[3]); \\\r\n}\r\n\r\n#define kd4(k,i) \\\r\n{   ss[4] = ls_box(ss[3],3) ^ t_use(r,c)[i]; \\\r\n    ss[0] ^= ss[4]; ss[4] = ff(ss[4]); k[v(40,(4*(i))+ 4)] = ss[4] ^= k[v(40,(4*(i)))]; \\\r\n    ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ss[4] ^= k[v(40,(4*(i))+ 1)]; \\\r\n    ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ss[4] ^= k[v(40,(4*(i))+ 2)]; \\\r\n    ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ss[4] ^= k[v(40,(4*(i))+ 3)]; \\\r\n}\r\n\r\n#define kdl4(k,i) \\\r\n{   ss[0] ^= ls_box(ss[3],3) ^ t_use(r,c)[i]; k[v(40,(4*(i))+ 4)] = ss[0]; \\\r\n    ss[1] ^= ss[0]; k[v(40,(4*(i))+ 5)] = ss[1]; \\\r\n    ss[2] ^= ss[1]; k[v(40,(4*(i))+ 6)] = ss[2]; \\\r\n    ss[3] ^= ss[2]; k[v(40,(4*(i))+ 7)] = ss[3]; \\\r\n}\r\n\r\n#endif\r\n\r\nAES_RETURN aes_decrypt_key128(const unsigned char *key, aes_decrypt_ctx cx[1])\r\n{   uint_32t    ss[5];\r\n#if defined( d_vars )\r\n        d_vars;\r\n#endif\r\n    cx->ks[v(40,(0))] = ss[0] = word_in(key, 0);\r\n    cx->ks[v(40,(1))] = ss[1] = word_in(key, 1);\r\n    cx->ks[v(40,(2))] = ss[2] = word_in(key, 2);\r\n    cx->ks[v(40,(3))] = ss[3] = word_in(key, 3);\r\n\r\n#ifdef DEC_KS_UNROLL\r\n     kdf4(cx->ks, 0); kd4(cx->ks, 1);\r\n     kd4(cx->ks, 2);  kd4(cx->ks, 3);\r\n     kd4(cx->ks, 4);  kd4(cx->ks, 5);\r\n     kd4(cx->ks, 6);  kd4(cx->ks, 7);\r\n     kd4(cx->ks, 8);  kdl4(cx->ks, 9);\r\n#else\r\n    {   uint_32t i;\r\n        for(i = 0; i < 10; ++i)\r\n            k4e(cx->ks, i);\r\n#if !(DEC_ROUND == NO_TABLES)\r\n        for(i = N_COLS; i < 10 * N_COLS; ++i)\r\n            cx->ks[i] = inv_mcol(cx->ks[i]);\r\n#endif\r\n    }\r\n#endif\r\n    cx->inf.l = 0;\r\n    cx->inf.b[0] = 10 * 16;\r\n\r\n#ifdef USE_VIA_ACE_IF_PRESENT\r\n    if(VIA_ACE_AVAILABLE)\r\n        cx->inf.b[1] = 0xff;\r\n#endif\r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n#endif\r\n\r\n#if defined(AES_192) || defined( AES_VAR )\r\n\r\n#define k6ef(k,i) \\\r\n{   k[v(48,(6*(i))+ 6)] = ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; \\\r\n    k[v(48,(6*(i))+ 7)] = ss[1] ^= ss[0]; \\\r\n    k[v(48,(6*(i))+ 8)] = ss[2] ^= ss[1]; \\\r\n    k[v(48,(6*(i))+ 9)] = ss[3] ^= ss[2]; \\\r\n}\r\n\r\n#define k6e(k,i) \\\r\n{   k6ef(k,i); \\\r\n    k[v(48,(6*(i))+10)] = ss[4] ^= ss[3]; \\\r\n    k[v(48,(6*(i))+11)] = ss[5] ^= ss[4]; \\\r\n}\r\n\r\n#define kdf6(k,i) \\\r\n{   ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[v(48,(6*(i))+ 6)] = ff(ss[0]); \\\r\n    ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ff(ss[1]); \\\r\n    ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ff(ss[2]); \\\r\n    ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ff(ss[3]); \\\r\n    ss[4] ^= ss[3]; k[v(48,(6*(i))+10)] = ff(ss[4]); \\\r\n    ss[5] ^= ss[4]; k[v(48,(6*(i))+11)] = ff(ss[5]); \\\r\n}\r\n\r\n#define kd6(k,i) \\\r\n{   ss[6] = ls_box(ss[5],3) ^ t_use(r,c)[i]; \\\r\n    ss[0] ^= ss[6]; ss[6] = ff(ss[6]); k[v(48,(6*(i))+ 6)] = ss[6] ^= k[v(48,(6*(i)))]; \\\r\n    ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ss[6] ^= k[v(48,(6*(i))+ 1)]; \\\r\n    ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ss[6] ^= k[v(48,(6*(i))+ 2)]; \\\r\n    ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ss[6] ^= k[v(48,(6*(i))+ 3)]; \\\r\n    ss[4] ^= ss[3]; k[v(48,(6*(i))+10)] = ss[6] ^= k[v(48,(6*(i))+ 4)]; \\\r\n    ss[5] ^= ss[4]; k[v(48,(6*(i))+11)] = ss[6] ^= k[v(48,(6*(i))+ 5)]; \\\r\n}\r\n\r\n#define kdl6(k,i) \\\r\n{   ss[0] ^= ls_box(ss[5],3) ^ t_use(r,c)[i]; k[v(48,(6*(i))+ 6)] = ss[0]; \\\r\n    ss[1] ^= ss[0]; k[v(48,(6*(i))+ 7)] = ss[1]; \\\r\n    ss[2] ^= ss[1]; k[v(48,(6*(i))+ 8)] = ss[2]; \\\r\n    ss[3] ^= ss[2]; k[v(48,(6*(i))+ 9)] = ss[3]; \\\r\n}\r\n\r\nAES_RETURN aes_decrypt_key192(const unsigned char *key, aes_decrypt_ctx cx[1])\r\n{   uint_32t    ss[7];\r\n#if defined( d_vars )\r\n        d_vars;\r\n#endif\r\n    cx->ks[v(48,(0))] = ss[0] = word_in(key, 0);\r\n    cx->ks[v(48,(1))] = ss[1] = word_in(key, 1);\r\n    cx->ks[v(48,(2))] = ss[2] = word_in(key, 2);\r\n    cx->ks[v(48,(3))] = ss[3] = word_in(key, 3);\r\n\r\n#ifdef DEC_KS_UNROLL\r\n    cx->ks[v(48,(4))] = ff(ss[4] = word_in(key, 4));\r\n    cx->ks[v(48,(5))] = ff(ss[5] = word_in(key, 5));\r\n    kdf6(cx->ks, 0); kd6(cx->ks, 1);\r\n    kd6(cx->ks, 2);  kd6(cx->ks, 3);\r\n    kd6(cx->ks, 4);  kd6(cx->ks, 5);\r\n    kd6(cx->ks, 6);  kdl6(cx->ks, 7);\r\n#else\r\n    cx->ks[v(48,(4))] = ss[4] = word_in(key, 4);\r\n    cx->ks[v(48,(5))] = ss[5] = word_in(key, 5);\r\n    {   uint_32t i;\r\n\r\n        for(i = 0; i < 7; ++i)\r\n            k6e(cx->ks, i);\r\n        k6ef(cx->ks, 7);\r\n#if !(DEC_ROUND == NO_TABLES)\r\n        for(i = N_COLS; i < 12 * N_COLS; ++i)\r\n            cx->ks[i] = inv_mcol(cx->ks[i]);\r\n#endif\r\n    }\r\n#endif\r\n    cx->inf.l = 0;\r\n    cx->inf.b[0] = 12 * 16;\r\n\r\n#ifdef USE_VIA_ACE_IF_PRESENT\r\n    if(VIA_ACE_AVAILABLE)\r\n        cx->inf.b[1] = 0xff;\r\n#endif\r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n#endif\r\n\r\n#if defined(AES_256) || defined( AES_VAR )\r\n\r\n#define k8ef(k,i) \\\r\n{   k[v(56,(8*(i))+ 8)] = ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; \\\r\n    k[v(56,(8*(i))+ 9)] = ss[1] ^= ss[0]; \\\r\n    k[v(56,(8*(i))+10)] = ss[2] ^= ss[1]; \\\r\n    k[v(56,(8*(i))+11)] = ss[3] ^= ss[2]; \\\r\n}\r\n\r\n#define k8e(k,i) \\\r\n{   k8ef(k,i); \\\r\n    k[v(56,(8*(i))+12)] = ss[4] ^= ls_box(ss[3],0); \\\r\n    k[v(56,(8*(i))+13)] = ss[5] ^= ss[4]; \\\r\n    k[v(56,(8*(i))+14)] = ss[6] ^= ss[5]; \\\r\n    k[v(56,(8*(i))+15)] = ss[7] ^= ss[6]; \\\r\n}\r\n\r\n#define kdf8(k,i) \\\r\n{   ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[v(56,(8*(i))+ 8)] = ff(ss[0]); \\\r\n    ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ff(ss[1]); \\\r\n    ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ff(ss[2]); \\\r\n    ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ff(ss[3]); \\\r\n    ss[4] ^= ls_box(ss[3],0); k[v(56,(8*(i))+12)] = ff(ss[4]); \\\r\n    ss[5] ^= ss[4]; k[v(56,(8*(i))+13)] = ff(ss[5]); \\\r\n    ss[6] ^= ss[5]; k[v(56,(8*(i))+14)] = ff(ss[6]); \\\r\n    ss[7] ^= ss[6]; k[v(56,(8*(i))+15)] = ff(ss[7]); \\\r\n}\r\n\r\n#define kd8(k,i) \\\r\n{   ss[8] = ls_box(ss[7],3) ^ t_use(r,c)[i]; \\\r\n    ss[0] ^= ss[8]; ss[8] = ff(ss[8]); k[v(56,(8*(i))+ 8)] = ss[8] ^= k[v(56,(8*(i)))]; \\\r\n    ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ss[8] ^= k[v(56,(8*(i))+ 1)]; \\\r\n    ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ss[8] ^= k[v(56,(8*(i))+ 2)]; \\\r\n    ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ss[8] ^= k[v(56,(8*(i))+ 3)]; \\\r\n    ss[8] = ls_box(ss[3],0); \\\r\n    ss[4] ^= ss[8]; ss[8] = ff(ss[8]); k[v(56,(8*(i))+12)] = ss[8] ^= k[v(56,(8*(i))+ 4)]; \\\r\n    ss[5] ^= ss[4]; k[v(56,(8*(i))+13)] = ss[8] ^= k[v(56,(8*(i))+ 5)]; \\\r\n    ss[6] ^= ss[5]; k[v(56,(8*(i))+14)] = ss[8] ^= k[v(56,(8*(i))+ 6)]; \\\r\n    ss[7] ^= ss[6]; k[v(56,(8*(i))+15)] = ss[8] ^= k[v(56,(8*(i))+ 7)]; \\\r\n}\r\n\r\n#define kdl8(k,i) \\\r\n{   ss[0] ^= ls_box(ss[7],3) ^ t_use(r,c)[i]; k[v(56,(8*(i))+ 8)] = ss[0]; \\\r\n    ss[1] ^= ss[0]; k[v(56,(8*(i))+ 9)] = ss[1]; \\\r\n    ss[2] ^= ss[1]; k[v(56,(8*(i))+10)] = ss[2]; \\\r\n    ss[3] ^= ss[2]; k[v(56,(8*(i))+11)] = ss[3]; \\\r\n}\r\n\r\nAES_RETURN aes_decrypt_key256(const unsigned char *key, aes_decrypt_ctx cx[1])\r\n{   uint_32t    ss[9];\r\n#if defined( d_vars )\r\n        d_vars;\r\n#endif\r\n    cx->ks[v(56,(0))] = ss[0] = word_in(key, 0);\r\n    cx->ks[v(56,(1))] = ss[1] = word_in(key, 1);\r\n    cx->ks[v(56,(2))] = ss[2] = word_in(key, 2);\r\n    cx->ks[v(56,(3))] = ss[3] = word_in(key, 3);\r\n\r\n#ifdef DEC_KS_UNROLL\r\n    cx->ks[v(56,(4))] = ff(ss[4] = word_in(key, 4));\r\n    cx->ks[v(56,(5))] = ff(ss[5] = word_in(key, 5));\r\n    cx->ks[v(56,(6))] = ff(ss[6] = word_in(key, 6));\r\n    cx->ks[v(56,(7))] = ff(ss[7] = word_in(key, 7));\r\n    kdf8(cx->ks, 0); kd8(cx->ks, 1);\r\n    kd8(cx->ks, 2);  kd8(cx->ks, 3);\r\n    kd8(cx->ks, 4);  kd8(cx->ks, 5);\r\n    kdl8(cx->ks, 6);\r\n#else\r\n    cx->ks[v(56,(4))] = ss[4] = word_in(key, 4);\r\n    cx->ks[v(56,(5))] = ss[5] = word_in(key, 5);\r\n    cx->ks[v(56,(6))] = ss[6] = word_in(key, 6);\r\n    cx->ks[v(56,(7))] = ss[7] = word_in(key, 7);\r\n    {   uint_32t i;\r\n\r\n        for(i = 0; i < 6; ++i)\r\n            k8e(cx->ks,  i);\r\n        k8ef(cx->ks,  6);\r\n#if !(DEC_ROUND == NO_TABLES)\r\n        for(i = N_COLS; i < 14 * N_COLS; ++i)\r\n            cx->ks[i] = inv_mcol(cx->ks[i]);\r\n#endif\r\n    }\r\n#endif\r\n    cx->inf.l = 0;\r\n    cx->inf.b[0] = 14 * 16;\r\n\r\n#ifdef USE_VIA_ACE_IF_PRESENT\r\n    if(VIA_ACE_AVAILABLE)\r\n        cx->inf.b[1] = 0xff;\r\n#endif\r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n#endif\r\n\r\n#if defined( AES_VAR )\r\n\r\nAES_RETURN aes_decrypt_key(const unsigned char *key, int key_len, aes_decrypt_ctx cx[1])\r\n{\r\n    switch(key_len)\r\n    {\r\n    case 16: case 128: return aes_decrypt_key128(key, cx);\r\n    case 24: case 192: return aes_decrypt_key192(key, cx);\r\n    case 32: case 256: return aes_decrypt_key256(key, cx);\r\n    default: return EXIT_FAILURE;\r\n    }\r\n}\r\n\r\n#endif\r\n\r\n#endif\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/aes/aesopt.h",
    "content": "/*\r\n---------------------------------------------------------------------------\r\nCopyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.\r\n\r\nThe redistribution and use of this software (with or without changes)\r\nis allowed without the payment of fees or royalties provided that:\r\n\r\n  source code distributions include the above copyright notice, this\r\n  list of conditions and the following disclaimer;\r\n\r\n  binary distributions include the above copyright notice, this list\r\n  of conditions and the following disclaimer in their documentation.\r\n\r\nThis software is provided 'as is' with no explicit or implied warranties\r\nin respect of its operation, including, but not limited to, correctness\r\nand fitness for purpose.\r\n---------------------------------------------------------------------------\r\nIssue Date: 20/12/2007\r\n\r\n This file contains the compilation options for AES (Rijndael) and code\r\n that is common across encryption, key scheduling and table generation.\r\n\r\n OPERATION\r\n\r\n These source code files implement the AES algorithm Rijndael designed by\r\n Joan Daemen and Vincent Rijmen. This version is designed for the standard\r\n block size of 16 bytes and for key sizes of 128, 192 and 256 bits (16, 24\r\n and 32 bytes).\r\n\r\n This version is designed for flexibility and speed using operations on\r\n 32-bit words rather than operations on bytes.  It can be compiled with\r\n either big or little endian internal byte order but is faster when the\r\n native byte order for the processor is used.\r\n\r\n THE CIPHER INTERFACE\r\n\r\n The cipher interface is implemented as an array of bytes in which lower\r\n AES bit sequence indexes map to higher numeric significance within bytes.\r\n\r\n  uint_8t                 (an unsigned  8-bit type)\r\n  uint_32t                (an unsigned 32-bit type)\r\n  struct aes_encrypt_ctx  (structure for the cipher encryption context)\r\n  struct aes_decrypt_ctx  (structure for the cipher decryption context)\r\n  AES_RETURN                the function return type\r\n\r\n  C subroutine calls:\r\n\r\n  AES_RETURN aes_encrypt_key128(const unsigned char *key, aes_encrypt_ctx cx[1]);\r\n  AES_RETURN aes_encrypt_key192(const unsigned char *key, aes_encrypt_ctx cx[1]);\r\n  AES_RETURN aes_encrypt_key256(const unsigned char *key, aes_encrypt_ctx cx[1]);\r\n  AES_RETURN aes_encrypt(const unsigned char *in, unsigned char *out,\r\n                                                  const aes_encrypt_ctx cx[1]);\r\n\r\n  AES_RETURN aes_decrypt_key128(const unsigned char *key, aes_decrypt_ctx cx[1]);\r\n  AES_RETURN aes_decrypt_key192(const unsigned char *key, aes_decrypt_ctx cx[1]);\r\n  AES_RETURN aes_decrypt_key256(const unsigned char *key, aes_decrypt_ctx cx[1]);\r\n  AES_RETURN aes_decrypt(const unsigned char *in, unsigned char *out,\r\n                                                  const aes_decrypt_ctx cx[1]);\r\n\r\n IMPORTANT NOTE: If you are using this C interface with dynamic tables make sure that\r\n you call aes_init() before AES is used so that the tables are initialised.\r\n\r\n C++ aes class subroutines:\r\n\r\n     Class AESencrypt  for encryption\r\n\r\n      Construtors:\r\n          AESencrypt(void)\r\n          AESencrypt(const unsigned char *key) - 128 bit key\r\n      Members:\r\n          AES_RETURN key128(const unsigned char *key)\r\n          AES_RETURN key192(const unsigned char *key)\r\n          AES_RETURN key256(const unsigned char *key)\r\n          AES_RETURN encrypt(const unsigned char *in, unsigned char *out) const\r\n\r\n      Class AESdecrypt  for encryption\r\n      Construtors:\r\n          AESdecrypt(void)\r\n          AESdecrypt(const unsigned char *key) - 128 bit key\r\n      Members:\r\n          AES_RETURN key128(const unsigned char *key)\r\n          AES_RETURN key192(const unsigned char *key)\r\n          AES_RETURN key256(const unsigned char *key)\r\n          AES_RETURN decrypt(const unsigned char *in, unsigned char *out) const\r\n*/\r\n\r\n#if !defined( _AESOPT_H )\r\n#define _AESOPT_H\r\n\r\n#if defined( __cplusplus )\r\n#include \"aescpp.h\"\r\n#else\r\n#include \"aes.h\"\r\n#endif\r\n\r\n/*  PLATFORM SPECIFIC INCLUDES */\r\n\r\n#include \"brg_endian.h\"\r\n\r\n/*  CONFIGURATION - THE USE OF DEFINES\r\n\r\n    Later in this section there are a number of defines that control the\r\n    operation of the code.  In each section, the purpose of each define is\r\n    explained so that the relevant form can be included or excluded by\r\n    setting either 1's or 0's respectively on the branches of the related\r\n    #if clauses.  The following local defines should not be changed.\r\n*/\r\n\r\n#define ENCRYPTION_IN_C     1\r\n#define DECRYPTION_IN_C     2\r\n#define ENC_KEYING_IN_C     4\r\n#define DEC_KEYING_IN_C     8\r\n\r\n#define NO_TABLES           0\r\n#define ONE_TABLE           1\r\n#define FOUR_TABLES         4\r\n#define NONE                0\r\n#define PARTIAL             1\r\n#define FULL                2\r\n\r\n/*  --- START OF USER CONFIGURED OPTIONS --- */\r\n\r\n/*  1. BYTE ORDER WITHIN 32 BIT WORDS\r\n\r\n    The fundamental data processing units in Rijndael are 8-bit bytes. The\r\n    input, output and key input are all enumerated arrays of bytes in which\r\n    bytes are numbered starting at zero and increasing to one less than the\r\n    number of bytes in the array in question. This enumeration is only used\r\n    for naming bytes and does not imply any adjacency or order relationship\r\n    from one byte to another. When these inputs and outputs are considered\r\n    as bit sequences, bits 8*n to 8*n+7 of the bit sequence are mapped to\r\n    byte[n] with bit 8n+i in the sequence mapped to bit 7-i within the byte.\r\n    In this implementation bits are numbered from 0 to 7 starting at the\r\n    numerically least significant end of each byte (bit n represents 2^n).\r\n\r\n    However, Rijndael can be implemented more efficiently using 32-bit\r\n    words by packing bytes into words so that bytes 4*n to 4*n+3 are placed\r\n    into word[n]. While in principle these bytes can be assembled into words\r\n    in any positions, this implementation only supports the two formats in\r\n    which bytes in adjacent positions within words also have adjacent byte\r\n    numbers. This order is called big-endian if the lowest numbered bytes\r\n    in words have the highest numeric significance and little-endian if the\r\n    opposite applies.\r\n\r\n    This code can work in either order irrespective of the order used by the\r\n    machine on which it runs. Normally the internal byte order will be set\r\n    to the order of the processor on which the code is to be run but this\r\n    define can be used to reverse this in special situations\r\n\r\n    WARNING: Assembler code versions rely on PLATFORM_BYTE_ORDER being set.\r\n    This define will hence be redefined later (in section 4) if necessary\r\n*/\r\n\r\n#if 1\r\n#  define ALGORITHM_BYTE_ORDER PLATFORM_BYTE_ORDER\r\n#elif 0\r\n#  define ALGORITHM_BYTE_ORDER IS_LITTLE_ENDIAN\r\n#elif 0\r\n#  define ALGORITHM_BYTE_ORDER IS_BIG_ENDIAN\r\n#else\r\n#  error The algorithm byte order is not defined\r\n#endif\r\n\r\n/*  2. VIA ACE SUPPORT */\r\n\r\n#if !defined(__APPLE__) && defined( __GNUC__ ) && defined( __i386__ ) \\\r\n || defined( _WIN32   ) && defined( _M_IX86  ) \\\r\n && !(defined( _WIN64 ) || defined( _WIN32_WCE ) || defined( _MSC_VER ) && ( _MSC_VER <= 800 ))\r\n#  define VIA_ACE_POSSIBLE\r\n#endif\r\n\r\n/*  Define this option if support for the VIA ACE is required. This uses\r\n    inline assembler instructions and is only implemented for the Microsoft,\r\n    Intel and GCC compilers.  If VIA ACE is known to be present, then defining\r\n    ASSUME_VIA_ACE_PRESENT will remove the ordinary encryption/decryption\r\n    code.  If USE_VIA_ACE_IF_PRESENT is defined then VIA ACE will be used if\r\n    it is detected (both present and enabled) but the normal AES code will\r\n    also be present.\r\n\r\n    When VIA ACE is to be used, all AES encryption contexts MUST be 16 byte\r\n    aligned; other input/output buffers do not need to be 16 byte aligned\r\n    but there are very large performance gains if this can be arranged.\r\n    VIA ACE also requires the decryption key schedule to be in reverse\r\n    order (which later checks below ensure).\r\n*/\r\n\r\n#if 1 && defined( VIA_ACE_POSSIBLE ) && !defined( USE_VIA_ACE_IF_PRESENT )\r\n#  define USE_VIA_ACE_IF_PRESENT\r\n#endif\r\n\r\n#if 0 && defined( VIA_ACE_POSSIBLE ) && !defined( ASSUME_VIA_ACE_PRESENT )\r\n#  define ASSUME_VIA_ACE_PRESENT\r\n#  endif\r\n\r\n/*  3. ASSEMBLER SUPPORT\r\n\r\n    This define (which can be on the command line) enables the use of the\r\n    assembler code routines for encryption, decryption and key scheduling\r\n    as follows:\r\n\r\n    ASM_X86_V1C uses the assembler (aes_x86_v1.asm) with large tables for\r\n                encryption and decryption and but with key scheduling in C\r\n    ASM_X86_V2  uses assembler (aes_x86_v2.asm) with compressed tables for\r\n                encryption, decryption and key scheduling\r\n    ASM_X86_V2C uses assembler (aes_x86_v2.asm) with compressed tables for\r\n                encryption and decryption and but with key scheduling in C\r\n    ASM_AMD64_C uses assembler (aes_amd64.asm) with compressed tables for\r\n                encryption and decryption and but with key scheduling in C\r\n\r\n    Change one 'if 0' below to 'if 1' to select the version or define\r\n    as a compilation option.\r\n*/\r\n\r\n#if 0 && !defined( ASM_X86_V1C )\r\n#  define ASM_X86_V1C\r\n#elif 0 && !defined( ASM_X86_V2  )\r\n#  define ASM_X86_V2\r\n#elif 0 && !defined( ASM_X86_V2C )\r\n#  define ASM_X86_V2C\r\n#elif 0 && !defined( ASM_AMD64_C )\r\n#  define ASM_AMD64_C\r\n#endif\r\n\r\n#if (defined ( ASM_X86_V1C ) || defined( ASM_X86_V2 ) || defined( ASM_X86_V2C )) \\\r\n      && !defined( _M_IX86 ) || defined( ASM_AMD64_C ) && !defined( _M_X64 )\r\n#  error Assembler code is only available for x86 and AMD64 systems\r\n#endif\r\n\r\n/*  4. FAST INPUT/OUTPUT OPERATIONS.\r\n\r\n    On some machines it is possible to improve speed by transferring the\r\n    bytes in the input and output arrays to and from the internal 32-bit\r\n    variables by addressing these arrays as if they are arrays of 32-bit\r\n    words.  On some machines this will always be possible but there may\r\n    be a large performance penalty if the byte arrays are not aligned on\r\n    the normal word boundaries. On other machines this technique will\r\n    lead to memory access errors when such 32-bit word accesses are not\r\n    properly aligned. The option SAFE_IO avoids such problems but will\r\n    often be slower on those machines that support misaligned access\r\n    (especially so if care is taken to align the input  and output byte\r\n    arrays on 32-bit word boundaries). If SAFE_IO is not defined it is\r\n    assumed that access to byte arrays as if they are arrays of 32-bit\r\n    words will not cause problems when such accesses are misaligned.\r\n*/\r\n#if 1 && !defined( _MSC_VER )\r\n#  define SAFE_IO\r\n#endif\r\n\r\n/*  5. LOOP UNROLLING\r\n\r\n    The code for encryption and decrytpion cycles through a number of rounds\r\n    that can be implemented either in a loop or by expanding the code into a\r\n    long sequence of instructions, the latter producing a larger program but\r\n    one that will often be much faster. The latter is called loop unrolling.\r\n    There are also potential speed advantages in expanding two iterations in\r\n    a loop with half the number of iterations, which is called partial loop\r\n    unrolling.  The following options allow partial or full loop unrolling\r\n    to be set independently for encryption and decryption\r\n*/\r\n#if 1\r\n#  define ENC_UNROLL  FULL\r\n#elif 0\r\n#  define ENC_UNROLL  PARTIAL\r\n#else\r\n#  define ENC_UNROLL  NONE\r\n#endif\r\n\r\n#if 1\r\n#  define DEC_UNROLL  FULL\r\n#elif 0\r\n#  define DEC_UNROLL  PARTIAL\r\n#else\r\n#  define DEC_UNROLL  NONE\r\n#endif\r\n\r\n#if 1\r\n#  define ENC_KS_UNROLL\r\n#endif\r\n\r\n#if 1\r\n#  define DEC_KS_UNROLL\r\n#endif\r\n\r\n/*  6. FAST FINITE FIELD OPERATIONS\r\n\r\n    If this section is included, tables are used to provide faster finite\r\n    field arithmetic (this has no effect if FIXED_TABLES is defined).\r\n*/\r\n#if 1\r\n#  define FF_TABLES\r\n#endif\r\n\r\n/*  7. INTERNAL STATE VARIABLE FORMAT\r\n\r\n    The internal state of Rijndael is stored in a number of local 32-bit\r\n    word varaibles which can be defined either as an array or as individual\r\n    names variables. Include this section if you want to store these local\r\n    varaibles in arrays. Otherwise individual local variables will be used.\r\n*/\r\n#if 1\r\n#  define ARRAYS\r\n#endif\r\n\r\n/*  8. FIXED OR DYNAMIC TABLES\r\n\r\n    When this section is included the tables used by the code are compiled\r\n    statically into the binary file.  Otherwise the subroutine aes_init()\r\n    must be called to compute them before the code is first used.\r\n*/\r\n#if 1 && !(defined( _MSC_VER ) && ( _MSC_VER <= 800 ))\r\n#  define FIXED_TABLES\r\n#endif\r\n\r\n/*  9. MASKING OR CASTING FROM LONGER VALUES TO BYTES\r\n\r\n    In some systems it is better to mask longer values to extract bytes \r\n    rather than using a cast. This option allows this choice.\r\n*/\r\n#if 0\r\n#  define to_byte(x)  ((uint_8t)(x))\r\n#else\r\n#  define to_byte(x)  ((x) & 0xff)\r\n#endif\r\n\r\n/*  10. TABLE ALIGNMENT\r\n\r\n    On some sytsems speed will be improved by aligning the AES large lookup\r\n    tables on particular boundaries. This define should be set to a power of\r\n    two giving the desired alignment. It can be left undefined if alignment\r\n    is not needed.  This option is specific to the Microsft VC++ compiler -\r\n    it seems to sometimes cause trouble for the VC++ version 6 compiler.\r\n*/\r\n\r\n#if 1 && defined( _MSC_VER ) && ( _MSC_VER >= 1300 )\r\n#  define TABLE_ALIGN 32\r\n#endif\r\n\r\n/*  11.  REDUCE CODE AND TABLE SIZE\r\n\r\n    This replaces some expanded macros with function calls if AES_ASM_V2 or\r\n    AES_ASM_V2C are defined\r\n*/\r\n\r\n#if 1 && (defined( ASM_X86_V2 ) || defined( ASM_X86_V2C ))\r\n#  define REDUCE_CODE_SIZE\r\n#endif\r\n\r\n/*  12. TABLE OPTIONS\r\n\r\n    This cipher proceeds by repeating in a number of cycles known as 'rounds'\r\n    which are implemented by a round function which can optionally be speeded\r\n    up using tables.  The basic tables are each 256 32-bit words, with either\r\n    one or four tables being required for each round function depending on\r\n    how much speed is required. The encryption and decryption round functions\r\n    are different and the last encryption and decrytpion round functions are\r\n    different again making four different round functions in all.\r\n\r\n    This means that:\r\n      1. Normal encryption and decryption rounds can each use either 0, 1\r\n         or 4 tables and table spaces of 0, 1024 or 4096 bytes each.\r\n      2. The last encryption and decryption rounds can also use either 0, 1\r\n         or 4 tables and table spaces of 0, 1024 or 4096 bytes each.\r\n\r\n    Include or exclude the appropriate definitions below to set the number\r\n    of tables used by this implementation.\r\n*/\r\n\r\n#if 1   /* set tables for the normal encryption round */\r\n#  define ENC_ROUND   FOUR_TABLES\r\n#elif 0\r\n#  define ENC_ROUND   ONE_TABLE\r\n#else\r\n#  define ENC_ROUND   NO_TABLES\r\n#endif\r\n\r\n#if 1   /* set tables for the last encryption round */\r\n#  define LAST_ENC_ROUND  FOUR_TABLES\r\n#elif 0\r\n#  define LAST_ENC_ROUND  ONE_TABLE\r\n#else\r\n#  define LAST_ENC_ROUND  NO_TABLES\r\n#endif\r\n\r\n#if 1   /* set tables for the normal decryption round */\r\n#  define DEC_ROUND   FOUR_TABLES\r\n#elif 0\r\n#  define DEC_ROUND   ONE_TABLE\r\n#else\r\n#  define DEC_ROUND   NO_TABLES\r\n#endif\r\n\r\n#if 1   /* set tables for the last decryption round */\r\n#  define LAST_DEC_ROUND  FOUR_TABLES\r\n#elif 0\r\n#  define LAST_DEC_ROUND  ONE_TABLE\r\n#else\r\n#  define LAST_DEC_ROUND  NO_TABLES\r\n#endif\r\n\r\n/*  The decryption key schedule can be speeded up with tables in the same\r\n    way that the round functions can.  Include or exclude the following\r\n    defines to set this requirement.\r\n*/\r\n#if 1\r\n#  define KEY_SCHED   FOUR_TABLES\r\n#elif 0\r\n#  define KEY_SCHED   ONE_TABLE\r\n#else\r\n#  define KEY_SCHED   NO_TABLES\r\n#endif\r\n\r\n/*  ---- END OF USER CONFIGURED OPTIONS ---- */\r\n\r\n/* VIA ACE support is only available for VC++ and GCC */\r\n\r\n#if !defined( _MSC_VER ) && !defined( __GNUC__ )\r\n#  if defined( ASSUME_VIA_ACE_PRESENT )\r\n#    undef ASSUME_VIA_ACE_PRESENT\r\n#  endif\r\n#  if defined( USE_VIA_ACE_IF_PRESENT )\r\n#    undef USE_VIA_ACE_IF_PRESENT\r\n#  endif\r\n#endif\r\n\r\n#if defined( ASSUME_VIA_ACE_PRESENT ) && !defined( USE_VIA_ACE_IF_PRESENT )\r\n#  define USE_VIA_ACE_IF_PRESENT\r\n#endif\r\n\r\n#if defined( USE_VIA_ACE_IF_PRESENT ) && !defined ( AES_REV_DKS )\r\n#  define AES_REV_DKS\r\n#endif\r\n\r\n/* Assembler support requires the use of platform byte order */\r\n\r\n#if ( defined( ASM_X86_V1C ) || defined( ASM_X86_V2C ) || defined( ASM_AMD64_C ) ) \\\r\n    && (ALGORITHM_BYTE_ORDER != PLATFORM_BYTE_ORDER)\r\n#  undef  ALGORITHM_BYTE_ORDER\r\n#  define ALGORITHM_BYTE_ORDER PLATFORM_BYTE_ORDER\r\n#endif\r\n\r\n/* In this implementation the columns of the state array are each held in\r\n   32-bit words. The state array can be held in various ways: in an array\r\n   of words, in a number of individual word variables or in a number of\r\n   processor registers. The following define maps a variable name x and\r\n   a column number c to the way the state array variable is to be held.\r\n   The first define below maps the state into an array x[c] whereas the\r\n   second form maps the state into a number of individual variables x0,\r\n   x1, etc.  Another form could map individual state colums to machine\r\n   register names.\r\n*/\r\n\r\n#if defined( ARRAYS )\r\n#  define s(x,c) x[c]\r\n#else\r\n#  define s(x,c) x##c\r\n#endif\r\n\r\n/*  This implementation provides subroutines for encryption, decryption\r\n    and for setting the three key lengths (separately) for encryption\r\n    and decryption. Since not all functions are needed, masks are set\r\n    up here to determine which will be implemented in C\r\n*/\r\n\r\n#if !defined( AES_ENCRYPT )\r\n#  define EFUNCS_IN_C   0\r\n#elif defined( ASSUME_VIA_ACE_PRESENT ) || defined( ASM_X86_V1C ) \\\r\n    || defined( ASM_X86_V2C ) || defined( ASM_AMD64_C )\r\n#  define EFUNCS_IN_C   ENC_KEYING_IN_C\r\n#elif !defined( ASM_X86_V2 )\r\n#  define EFUNCS_IN_C   ( ENCRYPTION_IN_C | ENC_KEYING_IN_C )\r\n#else\r\n#  define EFUNCS_IN_C   0\r\n#endif\r\n\r\n#if !defined( AES_DECRYPT )\r\n#  define DFUNCS_IN_C   0\r\n#elif defined( ASSUME_VIA_ACE_PRESENT ) || defined( ASM_X86_V1C ) \\\r\n    || defined( ASM_X86_V2C ) || defined( ASM_AMD64_C )\r\n#  define DFUNCS_IN_C   DEC_KEYING_IN_C\r\n#elif !defined( ASM_X86_V2 )\r\n#  define DFUNCS_IN_C   ( DECRYPTION_IN_C | DEC_KEYING_IN_C )\r\n#else\r\n#  define DFUNCS_IN_C   0\r\n#endif\r\n\r\n#define FUNCS_IN_C  ( EFUNCS_IN_C | DFUNCS_IN_C )\r\n\r\n/* END OF CONFIGURATION OPTIONS */\r\n\r\n#define RC_LENGTH   (5 * (AES_BLOCK_SIZE / 4 - 2))\r\n\r\n/* Disable or report errors on some combinations of options */\r\n\r\n#if ENC_ROUND == NO_TABLES && LAST_ENC_ROUND != NO_TABLES\r\n#  undef  LAST_ENC_ROUND\r\n#  define LAST_ENC_ROUND  NO_TABLES\r\n#elif ENC_ROUND == ONE_TABLE && LAST_ENC_ROUND == FOUR_TABLES\r\n#  undef  LAST_ENC_ROUND\r\n#  define LAST_ENC_ROUND  ONE_TABLE\r\n#endif\r\n\r\n#if ENC_ROUND == NO_TABLES && ENC_UNROLL != NONE\r\n#  undef  ENC_UNROLL\r\n#  define ENC_UNROLL  NONE\r\n#endif\r\n\r\n#if DEC_ROUND == NO_TABLES && LAST_DEC_ROUND != NO_TABLES\r\n#  undef  LAST_DEC_ROUND\r\n#  define LAST_DEC_ROUND  NO_TABLES\r\n#elif DEC_ROUND == ONE_TABLE && LAST_DEC_ROUND == FOUR_TABLES\r\n#  undef  LAST_DEC_ROUND\r\n#  define LAST_DEC_ROUND  ONE_TABLE\r\n#endif\r\n\r\n#if DEC_ROUND == NO_TABLES && DEC_UNROLL != NONE\r\n#  undef  DEC_UNROLL\r\n#  define DEC_UNROLL  NONE\r\n#endif\r\n\r\n#if defined( bswap32 )\r\n#  define aes_sw32    bswap32\r\n#elif defined( bswap_32 )\r\n#  define aes_sw32    bswap_32\r\n#else\r\n#  define brot(x,n)   (((uint_32t)(x) <<  n) | ((uint_32t)(x) >> (32 - n)))\r\n#  define aes_sw32(x) ((brot((x),8) & 0x00ff00ff) | (brot((x),24) & 0xff00ff00))\r\n#endif\r\n\r\n/*  upr(x,n):  rotates bytes within words by n positions, moving bytes to\r\n               higher index positions with wrap around into low positions\r\n    ups(x,n):  moves bytes by n positions to higher index positions in\r\n               words but without wrap around\r\n    bval(x,n): extracts a byte from a word\r\n\r\n    WARNING:   The definitions given here are intended only for use with\r\n               unsigned variables and with shift counts that are compile\r\n               time constants\r\n*/\r\n\r\n#if ( ALGORITHM_BYTE_ORDER == IS_LITTLE_ENDIAN )\r\n#  define upr(x,n)      (((uint_32t)(x) << (8 * (n))) | ((uint_32t)(x) >> (32 - 8 * (n))))\r\n#  define ups(x,n)      ((uint_32t) (x) << (8 * (n)))\r\n#  define bval(x,n)     to_byte((x) >> (8 * (n)))\r\n#  define bytes2word(b0, b1, b2, b3)  \\\r\n        (((uint_32t)(b3) << 24) | ((uint_32t)(b2) << 16) | ((uint_32t)(b1) << 8) | (b0))\r\n#endif\r\n\r\n#if ( ALGORITHM_BYTE_ORDER == IS_BIG_ENDIAN )\r\n#  define upr(x,n)      (((uint_32t)(x) >> (8 * (n))) | ((uint_32t)(x) << (32 - 8 * (n))))\r\n#  define ups(x,n)      ((uint_32t) (x) >> (8 * (n)))\r\n#  define bval(x,n)     to_byte((x) >> (24 - 8 * (n)))\r\n#  define bytes2word(b0, b1, b2, b3)  \\\r\n        (((uint_32t)(b0) << 24) | ((uint_32t)(b1) << 16) | ((uint_32t)(b2) << 8) | (b3))\r\n#endif\r\n\r\n#if defined( SAFE_IO )\r\n#  define word_in(x,c)    bytes2word(((const uint_8t*)(x)+4*c)[0], ((const uint_8t*)(x)+4*c)[1], \\\r\n                                   ((const uint_8t*)(x)+4*c)[2], ((const uint_8t*)(x)+4*c)[3])\r\n#  define word_out(x,c,v) { ((uint_8t*)(x)+4*c)[0] = bval(v,0); ((uint_8t*)(x)+4*c)[1] = bval(v,1); \\\r\n                          ((uint_8t*)(x)+4*c)[2] = bval(v,2); ((uint_8t*)(x)+4*c)[3] = bval(v,3); }\r\n#elif ( ALGORITHM_BYTE_ORDER == PLATFORM_BYTE_ORDER )\r\n#  define word_in(x,c)    (*((uint_32t*)(x)+(c)))\r\n#  define word_out(x,c,v) (*((uint_32t*)(x)+(c)) = (v))\r\n#else\r\n#  define word_in(x,c)    aes_sw32(*((uint_32t*)(x)+(c)))\r\n#  define word_out(x,c,v) (*((uint_32t*)(x)+(c)) = aes_sw32(v))\r\n#endif\r\n\r\n/* the finite field modular polynomial and elements */\r\n\r\n#define WPOLY   0x011b\r\n#define BPOLY     0x1b\r\n\r\n/* multiply four bytes in GF(2^8) by 'x' {02} in parallel */\r\n\r\n#define gf_c1  0x80808080\r\n#define gf_c2  0x7f7f7f7f\r\n#define gf_mulx(x)  ((((x) & gf_c2) << 1) ^ ((((x) & gf_c1) >> 7) * BPOLY))\r\n\r\n/* The following defines provide alternative definitions of gf_mulx that might\r\n   give improved performance if a fast 32-bit multiply is not available. Note\r\n   that a temporary variable u needs to be defined where gf_mulx is used.\r\n\r\n#define gf_mulx(x) (u = (x) & gf_c1, u |= (u >> 1), ((x) & gf_c2) << 1) ^ ((u >> 3) | (u >> 6))\r\n#define gf_c4  (0x01010101 * BPOLY)\r\n#define gf_mulx(x) (u = (x) & gf_c1, ((x) & gf_c2) << 1) ^ ((u - (u >> 7)) & gf_c4)\r\n*/\r\n\r\n/* Work out which tables are needed for the different options   */\r\n\r\n#if defined( ASM_X86_V1C )\r\n#  if defined( ENC_ROUND )\r\n#    undef  ENC_ROUND\r\n#  endif\r\n#  define ENC_ROUND   FOUR_TABLES\r\n#  if defined( LAST_ENC_ROUND )\r\n#    undef  LAST_ENC_ROUND\r\n#  endif\r\n#  define LAST_ENC_ROUND  FOUR_TABLES\r\n#  if defined( DEC_ROUND )\r\n#    undef  DEC_ROUND\r\n#  endif\r\n#  define DEC_ROUND   FOUR_TABLES\r\n#  if defined( LAST_DEC_ROUND )\r\n#    undef  LAST_DEC_ROUND\r\n#  endif\r\n#  define LAST_DEC_ROUND  FOUR_TABLES\r\n#  if defined( KEY_SCHED )\r\n#    undef  KEY_SCHED\r\n#    define KEY_SCHED   FOUR_TABLES\r\n#  endif\r\n#endif\r\n\r\n#if ( FUNCS_IN_C & ENCRYPTION_IN_C ) || defined( ASM_X86_V1C )\r\n#  if ENC_ROUND == ONE_TABLE\r\n#    define FT1_SET\r\n#  elif ENC_ROUND == FOUR_TABLES\r\n#    define FT4_SET\r\n#  else\r\n#    define SBX_SET\r\n#  endif\r\n#  if LAST_ENC_ROUND == ONE_TABLE\r\n#    define FL1_SET\r\n#  elif LAST_ENC_ROUND == FOUR_TABLES\r\n#    define FL4_SET\r\n#  elif !defined( SBX_SET )\r\n#    define SBX_SET\r\n#  endif\r\n#endif\r\n\r\n#if ( FUNCS_IN_C & DECRYPTION_IN_C ) || defined( ASM_X86_V1C )\r\n#  if DEC_ROUND == ONE_TABLE\r\n#    define IT1_SET\r\n#  elif DEC_ROUND == FOUR_TABLES\r\n#    define IT4_SET\r\n#  else\r\n#    define ISB_SET\r\n#  endif\r\n#  if LAST_DEC_ROUND == ONE_TABLE\r\n#    define IL1_SET\r\n#  elif LAST_DEC_ROUND == FOUR_TABLES\r\n#    define IL4_SET\r\n#  elif !defined(ISB_SET)\r\n#    define ISB_SET\r\n#  endif\r\n#endif\r\n\r\n#if !(defined( REDUCE_CODE_SIZE ) && (defined( ASM_X86_V2 ) || defined( ASM_X86_V2C )))\r\n#  if ((FUNCS_IN_C & ENC_KEYING_IN_C) || (FUNCS_IN_C & DEC_KEYING_IN_C))\r\n#    if KEY_SCHED == ONE_TABLE\r\n#      if !defined( FL1_SET )  && !defined( FL4_SET ) \r\n#        define LS1_SET\r\n#      endif\r\n#    elif KEY_SCHED == FOUR_TABLES\r\n#      if !defined( FL4_SET )\r\n#        define LS4_SET\r\n#      endif\r\n#    elif !defined( SBX_SET )\r\n#      define SBX_SET\r\n#    endif\r\n#  endif\r\n#  if (FUNCS_IN_C & DEC_KEYING_IN_C)\r\n#    if KEY_SCHED == ONE_TABLE\r\n#      define IM1_SET\r\n#    elif KEY_SCHED == FOUR_TABLES\r\n#      define IM4_SET\r\n#    elif !defined( SBX_SET )\r\n#      define SBX_SET\r\n#    endif\r\n#  endif\r\n#endif\r\n\r\n/* generic definitions of Rijndael macros that use tables    */\r\n\r\n#define no_table(x,box,vf,rf,c) bytes2word( \\\r\n    box[bval(vf(x,0,c),rf(0,c))], \\\r\n    box[bval(vf(x,1,c),rf(1,c))], \\\r\n    box[bval(vf(x,2,c),rf(2,c))], \\\r\n    box[bval(vf(x,3,c),rf(3,c))])\r\n\r\n#define one_table(x,op,tab,vf,rf,c) \\\r\n (     tab[bval(vf(x,0,c),rf(0,c))] \\\r\n  ^ op(tab[bval(vf(x,1,c),rf(1,c))],1) \\\r\n  ^ op(tab[bval(vf(x,2,c),rf(2,c))],2) \\\r\n  ^ op(tab[bval(vf(x,3,c),rf(3,c))],3))\r\n\r\n#define four_tables(x,tab,vf,rf,c) \\\r\n (  tab[0][bval(vf(x,0,c),rf(0,c))] \\\r\n  ^ tab[1][bval(vf(x,1,c),rf(1,c))] \\\r\n  ^ tab[2][bval(vf(x,2,c),rf(2,c))] \\\r\n  ^ tab[3][bval(vf(x,3,c),rf(3,c))])\r\n\r\n#define vf1(x,r,c)  (x)\r\n#define rf1(r,c)    (r)\r\n#define rf2(r,c)    ((8+r-c)&3)\r\n\r\n/* perform forward and inverse column mix operation on four bytes in long word x in */\r\n/* parallel. NOTE: x must be a simple variable, NOT an expression in these macros.  */\r\n\r\n#if !(defined( REDUCE_CODE_SIZE ) && (defined( ASM_X86_V2 ) || defined( ASM_X86_V2C ))) \r\n\r\n#if defined( FM4_SET )      /* not currently used */\r\n#  define fwd_mcol(x)       four_tables(x,t_use(f,m),vf1,rf1,0)\r\n#elif defined( FM1_SET )    /* not currently used */\r\n#  define fwd_mcol(x)       one_table(x,upr,t_use(f,m),vf1,rf1,0)\r\n#else\r\n#  define dec_fmvars        uint_32t g2\r\n#  define fwd_mcol(x)       (g2 = gf_mulx(x), g2 ^ upr((x) ^ g2, 3) ^ upr((x), 2) ^ upr((x), 1))\r\n#endif\r\n\r\n#if defined( IM4_SET )\r\n#  define inv_mcol(x)       four_tables(x,t_use(i,m),vf1,rf1,0)\r\n#elif defined( IM1_SET )\r\n#  define inv_mcol(x)       one_table(x,upr,t_use(i,m),vf1,rf1,0)\r\n#else\r\n#  define dec_imvars        uint_32t g2, g4, g9\r\n#  define inv_mcol(x)       (g2 = gf_mulx(x), g4 = gf_mulx(g2), g9 = (x) ^ gf_mulx(g4), g4 ^= g9, \\\r\n                            (x) ^ g2 ^ g4 ^ upr(g2 ^ g9, 3) ^ upr(g4, 2) ^ upr(g9, 1))\r\n#endif\r\n\r\n#if defined( FL4_SET )\r\n#  define ls_box(x,c)       four_tables(x,t_use(f,l),vf1,rf2,c)\r\n#elif defined( LS4_SET )\r\n#  define ls_box(x,c)       four_tables(x,t_use(l,s),vf1,rf2,c)\r\n#elif defined( FL1_SET )\r\n#  define ls_box(x,c)       one_table(x,upr,t_use(f,l),vf1,rf2,c)\r\n#elif defined( LS1_SET )\r\n#  define ls_box(x,c)       one_table(x,upr,t_use(l,s),vf1,rf2,c)\r\n#else\r\n#  define ls_box(x,c)       no_table(x,t_use(s,box),vf1,rf2,c)\r\n#endif\r\n\r\n#endif\r\n\r\n#if defined( ASM_X86_V1C ) && defined( AES_DECRYPT ) && !defined( ISB_SET )\r\n#  define ISB_SET\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/aes/aestab.c",
    "content": "/*\r\n---------------------------------------------------------------------------\r\nCopyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.\r\n\r\nThe redistribution and use of this software (with or without changes)\r\nis allowed without the payment of fees or royalties provided that:\r\n\r\n  source code distributions include the above copyright notice, this\r\n  list of conditions and the following disclaimer;\r\n\r\n  binary distributions include the above copyright notice, this list\r\n  of conditions and the following disclaimer in their documentation.\r\n\r\nThis software is provided 'as is' with no explicit or implied warranties\r\nin respect of its operation, including, but not limited to, correctness\r\nand fitness for purpose.\r\n---------------------------------------------------------------------------\r\nIssue Date: 20/12/2007\r\n*/\r\n\r\n#define DO_TABLES\r\n\r\n#include \"aes.h\"\r\n#include \"aesopt.h\"\r\n\r\n#if defined(FIXED_TABLES)\r\n\r\n#define sb_data(w) {\\\r\n    w(0x63), w(0x7c), w(0x77), w(0x7b), w(0xf2), w(0x6b), w(0x6f), w(0xc5),\\\r\n    w(0x30), w(0x01), w(0x67), w(0x2b), w(0xfe), w(0xd7), w(0xab), w(0x76),\\\r\n    w(0xca), w(0x82), w(0xc9), w(0x7d), w(0xfa), w(0x59), w(0x47), w(0xf0),\\\r\n    w(0xad), w(0xd4), w(0xa2), w(0xaf), w(0x9c), w(0xa4), w(0x72), w(0xc0),\\\r\n    w(0xb7), w(0xfd), w(0x93), w(0x26), w(0x36), w(0x3f), w(0xf7), w(0xcc),\\\r\n    w(0x34), w(0xa5), w(0xe5), w(0xf1), w(0x71), w(0xd8), w(0x31), w(0x15),\\\r\n    w(0x04), w(0xc7), w(0x23), w(0xc3), w(0x18), w(0x96), w(0x05), w(0x9a),\\\r\n    w(0x07), w(0x12), w(0x80), w(0xe2), w(0xeb), w(0x27), w(0xb2), w(0x75),\\\r\n    w(0x09), w(0x83), w(0x2c), w(0x1a), w(0x1b), w(0x6e), w(0x5a), w(0xa0),\\\r\n    w(0x52), w(0x3b), w(0xd6), w(0xb3), w(0x29), w(0xe3), w(0x2f), w(0x84),\\\r\n    w(0x53), w(0xd1), w(0x00), w(0xed), w(0x20), w(0xfc), w(0xb1), w(0x5b),\\\r\n    w(0x6a), w(0xcb), w(0xbe), w(0x39), w(0x4a), w(0x4c), w(0x58), w(0xcf),\\\r\n    w(0xd0), w(0xef), w(0xaa), w(0xfb), w(0x43), w(0x4d), w(0x33), w(0x85),\\\r\n    w(0x45), w(0xf9), w(0x02), w(0x7f), w(0x50), w(0x3c), w(0x9f), w(0xa8),\\\r\n    w(0x51), w(0xa3), w(0x40), w(0x8f), w(0x92), w(0x9d), w(0x38), w(0xf5),\\\r\n    w(0xbc), w(0xb6), w(0xda), w(0x21), w(0x10), w(0xff), w(0xf3), w(0xd2),\\\r\n    w(0xcd), w(0x0c), w(0x13), w(0xec), w(0x5f), w(0x97), w(0x44), w(0x17),\\\r\n    w(0xc4), w(0xa7), w(0x7e), w(0x3d), w(0x64), w(0x5d), w(0x19), w(0x73),\\\r\n    w(0x60), w(0x81), w(0x4f), w(0xdc), w(0x22), w(0x2a), w(0x90), w(0x88),\\\r\n    w(0x46), w(0xee), w(0xb8), w(0x14), w(0xde), w(0x5e), w(0x0b), w(0xdb),\\\r\n    w(0xe0), w(0x32), w(0x3a), w(0x0a), w(0x49), w(0x06), w(0x24), w(0x5c),\\\r\n    w(0xc2), w(0xd3), w(0xac), w(0x62), w(0x91), w(0x95), w(0xe4), w(0x79),\\\r\n    w(0xe7), w(0xc8), w(0x37), w(0x6d), w(0x8d), w(0xd5), w(0x4e), w(0xa9),\\\r\n    w(0x6c), w(0x56), w(0xf4), w(0xea), w(0x65), w(0x7a), w(0xae), w(0x08),\\\r\n    w(0xba), w(0x78), w(0x25), w(0x2e), w(0x1c), w(0xa6), w(0xb4), w(0xc6),\\\r\n    w(0xe8), w(0xdd), w(0x74), w(0x1f), w(0x4b), w(0xbd), w(0x8b), w(0x8a),\\\r\n    w(0x70), w(0x3e), w(0xb5), w(0x66), w(0x48), w(0x03), w(0xf6), w(0x0e),\\\r\n    w(0x61), w(0x35), w(0x57), w(0xb9), w(0x86), w(0xc1), w(0x1d), w(0x9e),\\\r\n    w(0xe1), w(0xf8), w(0x98), w(0x11), w(0x69), w(0xd9), w(0x8e), w(0x94),\\\r\n    w(0x9b), w(0x1e), w(0x87), w(0xe9), w(0xce), w(0x55), w(0x28), w(0xdf),\\\r\n    w(0x8c), w(0xa1), w(0x89), w(0x0d), w(0xbf), w(0xe6), w(0x42), w(0x68),\\\r\n    w(0x41), w(0x99), w(0x2d), w(0x0f), w(0xb0), w(0x54), w(0xbb), w(0x16) }\r\n\r\n#define isb_data(w) {\\\r\n    w(0x52), w(0x09), w(0x6a), w(0xd5), w(0x30), w(0x36), w(0xa5), w(0x38),\\\r\n    w(0xbf), w(0x40), w(0xa3), w(0x9e), w(0x81), w(0xf3), w(0xd7), w(0xfb),\\\r\n    w(0x7c), w(0xe3), w(0x39), w(0x82), w(0x9b), w(0x2f), w(0xff), w(0x87),\\\r\n    w(0x34), w(0x8e), w(0x43), w(0x44), w(0xc4), w(0xde), w(0xe9), w(0xcb),\\\r\n    w(0x54), w(0x7b), w(0x94), w(0x32), w(0xa6), w(0xc2), w(0x23), w(0x3d),\\\r\n    w(0xee), w(0x4c), w(0x95), w(0x0b), w(0x42), w(0xfa), w(0xc3), w(0x4e),\\\r\n    w(0x08), w(0x2e), w(0xa1), w(0x66), w(0x28), w(0xd9), w(0x24), w(0xb2),\\\r\n    w(0x76), w(0x5b), w(0xa2), w(0x49), w(0x6d), w(0x8b), w(0xd1), w(0x25),\\\r\n    w(0x72), w(0xf8), w(0xf6), w(0x64), w(0x86), w(0x68), w(0x98), w(0x16),\\\r\n    w(0xd4), w(0xa4), w(0x5c), w(0xcc), w(0x5d), w(0x65), w(0xb6), w(0x92),\\\r\n    w(0x6c), w(0x70), w(0x48), w(0x50), w(0xfd), w(0xed), w(0xb9), w(0xda),\\\r\n    w(0x5e), w(0x15), w(0x46), w(0x57), w(0xa7), w(0x8d), w(0x9d), w(0x84),\\\r\n    w(0x90), w(0xd8), w(0xab), w(0x00), w(0x8c), w(0xbc), w(0xd3), w(0x0a),\\\r\n    w(0xf7), w(0xe4), w(0x58), w(0x05), w(0xb8), w(0xb3), w(0x45), w(0x06),\\\r\n    w(0xd0), w(0x2c), w(0x1e), w(0x8f), w(0xca), w(0x3f), w(0x0f), w(0x02),\\\r\n    w(0xc1), w(0xaf), w(0xbd), w(0x03), w(0x01), w(0x13), w(0x8a), w(0x6b),\\\r\n    w(0x3a), w(0x91), w(0x11), w(0x41), w(0x4f), w(0x67), w(0xdc), w(0xea),\\\r\n    w(0x97), w(0xf2), w(0xcf), w(0xce), w(0xf0), w(0xb4), w(0xe6), w(0x73),\\\r\n    w(0x96), w(0xac), w(0x74), w(0x22), w(0xe7), w(0xad), w(0x35), w(0x85),\\\r\n    w(0xe2), w(0xf9), w(0x37), w(0xe8), w(0x1c), w(0x75), w(0xdf), w(0x6e),\\\r\n    w(0x47), w(0xf1), w(0x1a), w(0x71), w(0x1d), w(0x29), w(0xc5), w(0x89),\\\r\n    w(0x6f), w(0xb7), w(0x62), w(0x0e), w(0xaa), w(0x18), w(0xbe), w(0x1b),\\\r\n    w(0xfc), w(0x56), w(0x3e), w(0x4b), w(0xc6), w(0xd2), w(0x79), w(0x20),\\\r\n    w(0x9a), w(0xdb), w(0xc0), w(0xfe), w(0x78), w(0xcd), w(0x5a), w(0xf4),\\\r\n    w(0x1f), w(0xdd), w(0xa8), w(0x33), w(0x88), w(0x07), w(0xc7), w(0x31),\\\r\n    w(0xb1), w(0x12), w(0x10), w(0x59), w(0x27), w(0x80), w(0xec), w(0x5f),\\\r\n    w(0x60), w(0x51), w(0x7f), w(0xa9), w(0x19), w(0xb5), w(0x4a), w(0x0d),\\\r\n    w(0x2d), w(0xe5), w(0x7a), w(0x9f), w(0x93), w(0xc9), w(0x9c), w(0xef),\\\r\n    w(0xa0), w(0xe0), w(0x3b), w(0x4d), w(0xae), w(0x2a), w(0xf5), w(0xb0),\\\r\n    w(0xc8), w(0xeb), w(0xbb), w(0x3c), w(0x83), w(0x53), w(0x99), w(0x61),\\\r\n    w(0x17), w(0x2b), w(0x04), w(0x7e), w(0xba), w(0x77), w(0xd6), w(0x26),\\\r\n    w(0xe1), w(0x69), w(0x14), w(0x63), w(0x55), w(0x21), w(0x0c), w(0x7d) }\r\n\r\n#define mm_data(w) {\\\r\n    w(0x00), w(0x01), w(0x02), w(0x03), w(0x04), w(0x05), w(0x06), w(0x07),\\\r\n    w(0x08), w(0x09), w(0x0a), w(0x0b), w(0x0c), w(0x0d), w(0x0e), w(0x0f),\\\r\n    w(0x10), w(0x11), w(0x12), w(0x13), w(0x14), w(0x15), w(0x16), w(0x17),\\\r\n    w(0x18), w(0x19), w(0x1a), w(0x1b), w(0x1c), w(0x1d), w(0x1e), w(0x1f),\\\r\n    w(0x20), w(0x21), w(0x22), w(0x23), w(0x24), w(0x25), w(0x26), w(0x27),\\\r\n    w(0x28), w(0x29), w(0x2a), w(0x2b), w(0x2c), w(0x2d), w(0x2e), w(0x2f),\\\r\n    w(0x30), w(0x31), w(0x32), w(0x33), w(0x34), w(0x35), w(0x36), w(0x37),\\\r\n    w(0x38), w(0x39), w(0x3a), w(0x3b), w(0x3c), w(0x3d), w(0x3e), w(0x3f),\\\r\n    w(0x40), w(0x41), w(0x42), w(0x43), w(0x44), w(0x45), w(0x46), w(0x47),\\\r\n    w(0x48), w(0x49), w(0x4a), w(0x4b), w(0x4c), w(0x4d), w(0x4e), w(0x4f),\\\r\n    w(0x50), w(0x51), w(0x52), w(0x53), w(0x54), w(0x55), w(0x56), w(0x57),\\\r\n    w(0x58), w(0x59), w(0x5a), w(0x5b), w(0x5c), w(0x5d), w(0x5e), w(0x5f),\\\r\n    w(0x60), w(0x61), w(0x62), w(0x63), w(0x64), w(0x65), w(0x66), w(0x67),\\\r\n    w(0x68), w(0x69), w(0x6a), w(0x6b), w(0x6c), w(0x6d), w(0x6e), w(0x6f),\\\r\n    w(0x70), w(0x71), w(0x72), w(0x73), w(0x74), w(0x75), w(0x76), w(0x77),\\\r\n    w(0x78), w(0x79), w(0x7a), w(0x7b), w(0x7c), w(0x7d), w(0x7e), w(0x7f),\\\r\n    w(0x80), w(0x81), w(0x82), w(0x83), w(0x84), w(0x85), w(0x86), w(0x87),\\\r\n    w(0x88), w(0x89), w(0x8a), w(0x8b), w(0x8c), w(0x8d), w(0x8e), w(0x8f),\\\r\n    w(0x90), w(0x91), w(0x92), w(0x93), w(0x94), w(0x95), w(0x96), w(0x97),\\\r\n    w(0x98), w(0x99), w(0x9a), w(0x9b), w(0x9c), w(0x9d), w(0x9e), w(0x9f),\\\r\n    w(0xa0), w(0xa1), w(0xa2), w(0xa3), w(0xa4), w(0xa5), w(0xa6), w(0xa7),\\\r\n    w(0xa8), w(0xa9), w(0xaa), w(0xab), w(0xac), w(0xad), w(0xae), w(0xaf),\\\r\n    w(0xb0), w(0xb1), w(0xb2), w(0xb3), w(0xb4), w(0xb5), w(0xb6), w(0xb7),\\\r\n    w(0xb8), w(0xb9), w(0xba), w(0xbb), w(0xbc), w(0xbd), w(0xbe), w(0xbf),\\\r\n    w(0xc0), w(0xc1), w(0xc2), w(0xc3), w(0xc4), w(0xc5), w(0xc6), w(0xc7),\\\r\n    w(0xc8), w(0xc9), w(0xca), w(0xcb), w(0xcc), w(0xcd), w(0xce), w(0xcf),\\\r\n    w(0xd0), w(0xd1), w(0xd2), w(0xd3), w(0xd4), w(0xd5), w(0xd6), w(0xd7),\\\r\n    w(0xd8), w(0xd9), w(0xda), w(0xdb), w(0xdc), w(0xdd), w(0xde), w(0xdf),\\\r\n    w(0xe0), w(0xe1), w(0xe2), w(0xe3), w(0xe4), w(0xe5), w(0xe6), w(0xe7),\\\r\n    w(0xe8), w(0xe9), w(0xea), w(0xeb), w(0xec), w(0xed), w(0xee), w(0xef),\\\r\n    w(0xf0), w(0xf1), w(0xf2), w(0xf3), w(0xf4), w(0xf5), w(0xf6), w(0xf7),\\\r\n    w(0xf8), w(0xf9), w(0xfa), w(0xfb), w(0xfc), w(0xfd), w(0xfe), w(0xff) }\r\n\r\n#define rc_data(w) {\\\r\n    w(0x01), w(0x02), w(0x04), w(0x08), w(0x10),w(0x20), w(0x40), w(0x80),\\\r\n    w(0x1b), w(0x36) }\r\n\r\n#define h0(x)   (x)\r\n\r\n#define w0(p)   bytes2word(p, 0, 0, 0)\r\n#define w1(p)   bytes2word(0, p, 0, 0)\r\n#define w2(p)   bytes2word(0, 0, p, 0)\r\n#define w3(p)   bytes2word(0, 0, 0, p)\r\n\r\n#define u0(p)   bytes2word(f2(p), p, p, f3(p))\r\n#define u1(p)   bytes2word(f3(p), f2(p), p, p)\r\n#define u2(p)   bytes2word(p, f3(p), f2(p), p)\r\n#define u3(p)   bytes2word(p, p, f3(p), f2(p))\r\n\r\n#define v0(p)   bytes2word(fe(p), f9(p), fd(p), fb(p))\r\n#define v1(p)   bytes2word(fb(p), fe(p), f9(p), fd(p))\r\n#define v2(p)   bytes2word(fd(p), fb(p), fe(p), f9(p))\r\n#define v3(p)   bytes2word(f9(p), fd(p), fb(p), fe(p))\r\n\r\n#endif\r\n\r\n#if defined(FIXED_TABLES) || !defined(FF_TABLES)\r\n\r\n#define f2(x)   ((x<<1) ^ (((x>>7) & 1) * WPOLY))\r\n#define f4(x)   ((x<<2) ^ (((x>>6) & 1) * WPOLY) ^ (((x>>6) & 2) * WPOLY))\r\n#define f8(x)   ((x<<3) ^ (((x>>5) & 1) * WPOLY) ^ (((x>>5) & 2) * WPOLY) \\\r\n                        ^ (((x>>5) & 4) * WPOLY))\r\n#define f3(x)   (f2(x) ^ x)\r\n#define f9(x)   (f8(x) ^ x)\r\n#define fb(x)   (f8(x) ^ f2(x) ^ x)\r\n#define fd(x)   (f8(x) ^ f4(x) ^ x)\r\n#define fe(x)   (f8(x) ^ f4(x) ^ f2(x))\r\n\r\n#else\r\n\r\n#define f2(x) ((x) ? pow[log[x] + 0x19] : 0)\r\n#define f3(x) ((x) ? pow[log[x] + 0x01] : 0)\r\n#define f9(x) ((x) ? pow[log[x] + 0xc7] : 0)\r\n#define fb(x) ((x) ? pow[log[x] + 0x68] : 0)\r\n#define fd(x) ((x) ? pow[log[x] + 0xee] : 0)\r\n#define fe(x) ((x) ? pow[log[x] + 0xdf] : 0)\r\n\r\n#endif\r\n\r\n#include \"aestab.h\"\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\"\r\n{\r\n#endif\r\n\r\n#if defined(FIXED_TABLES)\r\n\r\n/* implemented in case of wrong call for fixed tables */\r\n\r\nAES_RETURN aes_init(void)\r\n{\r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n#else   /*  Generate the tables for the dynamic table option */\r\n\r\n#if defined(FF_TABLES)\r\n\r\n#define gf_inv(x)   ((x) ? pow[ 255 - log[x]] : 0)\r\n\r\n#else \r\n\r\n/*  It will generally be sensible to use tables to compute finite\r\n    field multiplies and inverses but where memory is scarse this\r\n    code might sometimes be better. But it only has effect during\r\n    initialisation so its pretty unimportant in overall terms.\r\n*/\r\n\r\n/*  return 2 ^ (n - 1) where n is the bit number of the highest bit\r\n    set in x with x in the range 1 < x < 0x00000200.   This form is\r\n    used so that locals within fi can be bytes rather than words\r\n*/\r\n\r\nstatic uint_8t hibit(const uint_32t x)\r\n{   uint_8t r = (uint_8t)((x >> 1) | (x >> 2));\r\n\r\n    r |= (r >> 2);\r\n    r |= (r >> 4);\r\n    return (r + 1) >> 1;\r\n}\r\n\r\n/* return the inverse of the finite field element x */\r\n\r\nstatic uint_8t gf_inv(const uint_8t x)\r\n{   uint_8t p1 = x, p2 = BPOLY, n1 = hibit(x), n2 = 0x80, v1 = 1, v2 = 0;\r\n\r\n    if(x < 2) \r\n        return x;\r\n\r\n    for( ; ; )\r\n    {\r\n        if(n1)\r\n            while(n2 >= n1)             /* divide polynomial p2 by p1    */\r\n            {\r\n                n2 /= n1;               /* shift smaller polynomial left */ \r\n                p2 ^= (p1 * n2) & 0xff; /* and remove from larger one    */\r\n                v2 ^= v1 * n2;          /* shift accumulated value and   */ \r\n                n2 = hibit(p2);         /* add into result               */\r\n            }\r\n        else\r\n            return v1;\r\n\r\n        if(n2)                          /* repeat with values swapped    */ \r\n            while(n1 >= n2)\r\n            {\r\n                n1 /= n2; \r\n                p1 ^= p2 * n1; \r\n                v1 ^= v2 * n1; \r\n                n1 = hibit(p1);\r\n            }\r\n        else\r\n            return v2;\r\n    }\r\n}\r\n\r\n#endif\r\n\r\n/* The forward and inverse affine transformations used in the S-box */\r\nuint_8t fwd_affine(const uint_8t x)\r\n{   uint_32t w = x;\r\n    w ^= (w << 1) ^ (w << 2) ^ (w << 3) ^ (w << 4);\r\n    return 0x63 ^ ((w ^ (w >> 8)) & 0xff);\r\n}\r\n\r\nuint_8t inv_affine(const uint_8t x)\r\n{   uint_32t w = x;\r\n    w = (w << 1) ^ (w << 3) ^ (w << 6);\r\n    return 0x05 ^ ((w ^ (w >> 8)) & 0xff);\r\n}\r\n\r\nstatic int init = 0;\r\n\r\nAES_RETURN aes_init(void)\r\n{   uint_32t  i, w;\r\n\r\n#if defined(FF_TABLES)\r\n\r\n    uint_8t  pow[512], log[256];\r\n\r\n    if(init)\r\n        return EXIT_SUCCESS;\r\n    /*  log and power tables for GF(2^8) finite field with\r\n        WPOLY as modular polynomial - the simplest primitive\r\n        root is 0x03, used here to generate the tables\r\n    */\r\n\r\n    i = 0; w = 1;\r\n    do\r\n    {\r\n        pow[i] = (uint_8t)w;\r\n        pow[i + 255] = (uint_8t)w;\r\n        log[w] = (uint_8t)i++;\r\n        w ^=  (w << 1) ^ (w & 0x80 ? WPOLY : 0);\r\n    }\r\n    while (w != 1);\r\n\r\n#else\r\n    if(init)\r\n        return EXIT_SUCCESS;\r\n#endif\r\n\r\n    for(i = 0, w = 1; i < RC_LENGTH; ++i)\r\n    {\r\n        t_set(r,c)[i] = bytes2word(w, 0, 0, 0);\r\n        w = f2(w);\r\n    }\r\n\r\n    for(i = 0; i < 256; ++i)\r\n    {   uint_8t    b;\r\n\r\n        b = fwd_affine(gf_inv((uint_8t)i));\r\n        w = bytes2word(f2(b), b, b, f3(b));\r\n\r\n#if defined( SBX_SET )\r\n        t_set(s,box)[i] = b;\r\n#endif\r\n\r\n#if defined( FT1_SET )                 /* tables for a normal encryption round */\r\n        t_set(f,n)[i] = w;\r\n#endif\r\n#if defined( FT4_SET )\r\n        t_set(f,n)[0][i] = w;\r\n        t_set(f,n)[1][i] = upr(w,1);\r\n        t_set(f,n)[2][i] = upr(w,2);\r\n        t_set(f,n)[3][i] = upr(w,3);\r\n#endif\r\n        w = bytes2word(b, 0, 0, 0);\r\n\r\n#if defined( FL1_SET )            /* tables for last encryption round (may also   */\r\n        t_set(f,l)[i] = w;        /* be used in the key schedule)                 */\r\n#endif\r\n#if defined( FL4_SET )\r\n        t_set(f,l)[0][i] = w;\r\n        t_set(f,l)[1][i] = upr(w,1);\r\n        t_set(f,l)[2][i] = upr(w,2);\r\n        t_set(f,l)[3][i] = upr(w,3);\r\n#endif\r\n\r\n#if defined( LS1_SET )\t\t\t/* table for key schedule if t_set(f,l) above is*/\r\n        t_set(l,s)[i] = w;      /* not of the required form                     */\r\n#endif\r\n#if defined( LS4_SET )\r\n        t_set(l,s)[0][i] = w;\r\n        t_set(l,s)[1][i] = upr(w,1);\r\n        t_set(l,s)[2][i] = upr(w,2);\r\n        t_set(l,s)[3][i] = upr(w,3);\r\n#endif\r\n\r\n        b = gf_inv(inv_affine((uint_8t)i));\r\n        w = bytes2word(fe(b), f9(b), fd(b), fb(b));\r\n\r\n#if defined( IM1_SET )\t\t\t/* tables for the inverse mix column operation  */\r\n        t_set(i,m)[b] = w;\r\n#endif\r\n#if defined( IM4_SET )\r\n        t_set(i,m)[0][b] = w;\r\n        t_set(i,m)[1][b] = upr(w,1);\r\n        t_set(i,m)[2][b] = upr(w,2);\r\n        t_set(i,m)[3][b] = upr(w,3);\r\n#endif\r\n\r\n#if defined( ISB_SET )\r\n        t_set(i,box)[i] = b;\r\n#endif\r\n#if defined( IT1_SET )\t\t\t/* tables for a normal decryption round */\r\n        t_set(i,n)[i] = w;\r\n#endif\r\n#if defined( IT4_SET )\r\n        t_set(i,n)[0][i] = w;\r\n        t_set(i,n)[1][i] = upr(w,1);\r\n        t_set(i,n)[2][i] = upr(w,2);\r\n        t_set(i,n)[3][i] = upr(w,3);\r\n#endif\r\n        w = bytes2word(b, 0, 0, 0);\r\n#if defined( IL1_SET )\t\t\t/* tables for last decryption round */\r\n        t_set(i,l)[i] = w;\r\n#endif\r\n#if defined( IL4_SET )\r\n        t_set(i,l)[0][i] = w;\r\n        t_set(i,l)[1][i] = upr(w,1);\r\n        t_set(i,l)[2][i] = upr(w,2);\r\n        t_set(i,l)[3][i] = upr(w,3);\r\n#endif\r\n    }\r\n    init = 1;\r\n    return EXIT_SUCCESS;\r\n}\r\n\r\n#endif\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/aes/aestab.h",
    "content": "/*\r\n---------------------------------------------------------------------------\r\nCopyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.\r\n\r\nThe redistribution and use of this software (with or without changes)\r\nis allowed without the payment of fees or royalties provided that:\r\n\r\n  source code distributions include the above copyright notice, this\r\n  list of conditions and the following disclaimer;\r\n\r\n  binary distributions include the above copyright notice, this list\r\n  of conditions and the following disclaimer in their documentation.\r\n\r\nThis software is provided 'as is' with no explicit or implied warranties\r\nin respect of its operation, including, but not limited to, correctness\r\nand fitness for purpose.\r\n---------------------------------------------------------------------------\r\nIssue Date: 20/12/2007\r\n\r\n This file contains the code for declaring the tables needed to implement\r\n AES. The file aesopt.h is assumed to be included before this header file.\r\n If there are no global variables, the definitions here can be used to put\r\n the AES tables in a structure so that a pointer can then be added to the\r\n AES context to pass them to the AES routines that need them.   If this\r\n facility is used, the calling program has to ensure that this pointer is\r\n managed appropriately.  In particular, the value of the t_dec(in,it) item\r\n in the table structure must be set to zero in order to ensure that the\r\n tables are initialised. In practice the three code sequences in aeskey.c\r\n that control the calls to aes_init() and the aes_init() routine itself will\r\n have to be changed for a specific implementation. If global variables are\r\n available it will generally be preferable to use them with the precomputed\r\n FIXED_TABLES option that uses static global tables.\r\n\r\n The following defines can be used to control the way the tables\r\n are defined, initialised and used in embedded environments that\r\n require special features for these purposes\r\n\r\n    the 't_dec' construction is used to declare fixed table arrays\r\n    the 't_set' construction is used to set fixed table values\r\n    the 't_use' construction is used to access fixed table values\r\n\r\n    256 byte tables:\r\n\r\n        t_xxx(s,box)    => forward S box\r\n        t_xxx(i,box)    => inverse S box\r\n\r\n    256 32-bit word OR 4 x 256 32-bit word tables:\r\n\r\n        t_xxx(f,n)      => forward normal round\r\n        t_xxx(f,l)      => forward last round\r\n        t_xxx(i,n)      => inverse normal round\r\n        t_xxx(i,l)      => inverse last round\r\n        t_xxx(l,s)      => key schedule table\r\n        t_xxx(i,m)      => key schedule table\r\n\r\n    Other variables and tables:\r\n\r\n        t_xxx(r,c)      => the rcon table\r\n*/\r\n\r\n#if !defined( _AESTAB_H )\r\n#define _AESTAB_H\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif\r\n\r\n#define t_dec(m,n) t_##m##n\r\n#define t_set(m,n) t_##m##n\r\n#define t_use(m,n) t_##m##n\r\n\r\n#if defined(FIXED_TABLES)\r\n#  if !defined( __GNUC__ ) && (defined( __MSDOS__ ) || defined( __WIN16__ ))\r\n/*   make tables far data to avoid using too much DGROUP space (PG) */\r\n#    define CONST const far\r\n#  else\r\n#    define CONST const\r\n#  endif\r\n#else\r\n#  define CONST\r\n#endif\r\n\r\n#if defined(DO_TABLES)\r\n#  define EXTERN\r\n#else\r\n#  define EXTERN extern\r\n#endif\r\n\r\n#if defined(_MSC_VER) && defined(TABLE_ALIGN)\r\n#define ALIGN __declspec(align(TABLE_ALIGN))\r\n#else\r\n#define ALIGN\r\n#endif\r\n\r\n#if defined( __WATCOMC__ ) && ( __WATCOMC__ >= 1100 )\r\n#  define XP_DIR __cdecl\r\n#else\r\n#  define XP_DIR\r\n#endif\r\n\r\n#if defined(DO_TABLES) && defined(FIXED_TABLES)\r\n#define d_1(t,n,b,e)       EXTERN ALIGN CONST XP_DIR t n[256]    =   b(e)\r\n#define d_4(t,n,b,e,f,g,h) EXTERN ALIGN CONST XP_DIR t n[4][256] = { b(e), b(f), b(g), b(h) }\r\nEXTERN ALIGN CONST uint_32t t_dec(r,c)[RC_LENGTH] = rc_data(w0);\r\n#else\r\n#define d_1(t,n,b,e)       EXTERN ALIGN CONST XP_DIR t n[256]\r\n#define d_4(t,n,b,e,f,g,h) EXTERN ALIGN CONST XP_DIR t n[4][256]\r\nEXTERN ALIGN CONST uint_32t t_dec(r,c)[RC_LENGTH];\r\n#endif\r\n\r\n#if defined( SBX_SET )\r\n    d_1(uint_8t, t_dec(s,box), sb_data, h0);\r\n#endif\r\n#if defined( ISB_SET )\r\n    d_1(uint_8t, t_dec(i,box), isb_data, h0);\r\n#endif\r\n\r\n#if defined( FT1_SET )\r\n    d_1(uint_32t, t_dec(f,n), sb_data, u0);\r\n#endif\r\n#if defined( FT4_SET )\r\n    d_4(uint_32t, t_dec(f,n), sb_data, u0, u1, u2, u3);\r\n#endif\r\n\r\n#if defined( FL1_SET )\r\n    d_1(uint_32t, t_dec(f,l), sb_data, w0);\r\n#endif\r\n#if defined( FL4_SET )\r\n    d_4(uint_32t, t_dec(f,l), sb_data, w0, w1, w2, w3);\r\n#endif\r\n\r\n#if defined( IT1_SET )\r\n    d_1(uint_32t, t_dec(i,n), isb_data, v0);\r\n#endif\r\n#if defined( IT4_SET )\r\n    d_4(uint_32t, t_dec(i,n), isb_data, v0, v1, v2, v3);\r\n#endif\r\n\r\n#if defined( IL1_SET )\r\n    d_1(uint_32t, t_dec(i,l), isb_data, w0);\r\n#endif\r\n#if defined( IL4_SET )\r\n    d_4(uint_32t, t_dec(i,l), isb_data, w0, w1, w2, w3);\r\n#endif\r\n\r\n#if defined( LS1_SET )\r\n#if defined( FL1_SET )\r\n#undef  LS1_SET\r\n#else\r\n    d_1(uint_32t, t_dec(l,s), sb_data, w0);\r\n#endif\r\n#endif\r\n\r\n#if defined( LS4_SET )\r\n#if defined( FL4_SET )\r\n#undef  LS4_SET\r\n#else\r\n    d_4(uint_32t, t_dec(l,s), sb_data, w0, w1, w2, w3);\r\n#endif\r\n#endif\r\n\r\n#if defined( IM1_SET )\r\n    d_1(uint_32t, t_dec(i,m), mm_data, v0);\r\n#endif\r\n#if defined( IM4_SET )\r\n    d_4(uint_32t, t_dec(i,m), mm_data, v0, v1, v2, v3);\r\n#endif\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/aes/brg_endian.h",
    "content": "/*\r\n---------------------------------------------------------------------------\r\nCopyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.\r\n\r\nThe redistribution and use of this software (with or without changes)\r\nis allowed without the payment of fees or royalties provided that:\r\n\r\n  source code distributions include the above copyright notice, this\r\n  list of conditions and the following disclaimer;\r\n\r\n  binary distributions include the above copyright notice, this list\r\n  of conditions and the following disclaimer in their documentation.\r\n\r\nThis software is provided 'as is' with no explicit or implied warranties\r\nin respect of its operation, including, but not limited to, correctness\r\nand fitness for purpose.\r\n---------------------------------------------------------------------------\r\nIssue Date: 20/12/2007\r\n*/\r\n\r\n#ifndef _BRG_ENDIAN_H\r\n#define _BRG_ENDIAN_H\r\n\r\n#define IS_BIG_ENDIAN      4321 /* byte 0 is most significant (mc68k) */\r\n#define IS_LITTLE_ENDIAN   1234 /* byte 0 is least significant (i386) */\r\n\r\n/* Include files where endian defines and byteswap functions may reside */\r\n#if defined( __sun )\r\n#  include <sys/isa_defs.h>\r\n#elif defined( __FreeBSD__ ) || defined( __OpenBSD__ ) || defined( __NetBSD__ )\r\n#  include <sys/endian.h>\r\n#elif defined( BSD ) && ( BSD >= 199103 ) || defined( __APPLE__ ) || \\\r\n      defined( __CYGWIN32__ ) || defined( __DJGPP__ ) || defined( __osf__ )\r\n#  include <machine/endian.h>\r\n#elif defined( __linux__ ) || defined( __GNUC__ ) || defined( __GNU_LIBRARY__ )\r\n#  if !defined( __MINGW32__ ) && !defined( _AIX )\r\n#    include <endian.h>\r\n#    if !defined( __BEOS__ )\r\n#      include <byteswap.h>\r\n#    endif\r\n#  endif\r\n#endif\r\n\r\n/* Now attempt to set the define for platform byte order using any  */\r\n/* of the four forms SYMBOL, _SYMBOL, __SYMBOL & __SYMBOL__, which  */\r\n/* seem to encompass most endian symbol definitions                 */\r\n\r\n#if defined( BIG_ENDIAN ) && defined( LITTLE_ENDIAN )\r\n#  if defined( BYTE_ORDER ) && BYTE_ORDER == BIG_ENDIAN\r\n#    define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN\r\n#  elif defined( BYTE_ORDER ) && BYTE_ORDER == LITTLE_ENDIAN\r\n#    define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN\r\n#  endif\r\n#elif defined( BIG_ENDIAN )\r\n#  define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN\r\n#elif defined( LITTLE_ENDIAN )\r\n#  define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN\r\n#endif\r\n\r\n#if defined( _BIG_ENDIAN ) && defined( _LITTLE_ENDIAN )\r\n#  if defined( _BYTE_ORDER ) && _BYTE_ORDER == _BIG_ENDIAN\r\n#    define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN\r\n#  elif defined( _BYTE_ORDER ) && _BYTE_ORDER == _LITTLE_ENDIAN\r\n#    define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN\r\n#  endif\r\n#elif defined( _BIG_ENDIAN )\r\n#  define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN\r\n#elif defined( _LITTLE_ENDIAN )\r\n#  define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN\r\n#endif\r\n\r\n#if defined( __BIG_ENDIAN ) && defined( __LITTLE_ENDIAN )\r\n#  if defined( __BYTE_ORDER ) && __BYTE_ORDER == __BIG_ENDIAN\r\n#    define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN\r\n#  elif defined( __BYTE_ORDER ) && __BYTE_ORDER == __LITTLE_ENDIAN\r\n#    define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN\r\n#  endif\r\n#elif defined( __BIG_ENDIAN )\r\n#  define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN\r\n#elif defined( __LITTLE_ENDIAN )\r\n#  define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN\r\n#endif\r\n\r\n#if defined( __BIG_ENDIAN__ ) && defined( __LITTLE_ENDIAN__ )\r\n#  if defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __BIG_ENDIAN__\r\n#    define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN\r\n#  elif defined( __BYTE_ORDER__ ) && __BYTE_ORDER__ == __LITTLE_ENDIAN__\r\n#    define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN\r\n#  endif\r\n#elif defined( __BIG_ENDIAN__ )\r\n#  define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN\r\n#elif defined( __LITTLE_ENDIAN__ )\r\n#  define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN\r\n#endif\r\n\r\n/*  if the platform byte order could not be determined, then try to */\r\n/*  set this define using common machine defines                    */\r\n#if !defined(PLATFORM_BYTE_ORDER)\r\n\r\n#if   defined( __alpha__ ) || defined( __alpha ) || defined( i386 )       || \\\r\n      defined( __i386__ )  || defined( _M_I86 )  || defined( _M_IX86 )    || \\\r\n      defined( __OS2__ )   || defined( sun386 )  || defined( __TURBOC__ ) || \\\r\n      defined( vax )       || defined( vms )     || defined( VMS )        || \\\r\n      defined( __VMS )     || defined( _M_X64 )\r\n#  define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN\r\n\r\n#elif defined( AMIGA )   || defined( applec )    || defined( __AS400__ )  || \\\r\n      defined( _CRAY )   || defined( __hppa )    || defined( __hp9000 )   || \\\r\n      defined( ibm370 )  || defined( mc68000 )   || defined( m68k )       || \\\r\n      defined( __MRC__ ) || defined( __MVS__ )   || defined( __MWERKS__ ) || \\\r\n      defined( sparc )   || defined( __sparc)    || defined( SYMANTEC_C ) || \\\r\n      defined( __VOS__ ) || defined( __TIGCC__ ) || defined( __TANDEM )   || \\\r\n      defined( THINK_C ) || defined( __VMCMS__ ) || defined( _AIX )\r\n#  define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN\r\n\r\n#elif 0     /* **** EDIT HERE IF NECESSARY **** */\r\n#  define PLATFORM_BYTE_ORDER IS_LITTLE_ENDIAN\r\n#elif 0     /* **** EDIT HERE IF NECESSARY **** */\r\n#  define PLATFORM_BYTE_ORDER IS_BIG_ENDIAN\r\n#else\r\n#  error Please edit lines 126 or 128 in brg_endian.h to set the platform byte order\r\n#endif\r\n\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/aes/brg_types.h",
    "content": "/*\r\n---------------------------------------------------------------------------\r\nCopyright (c) 1998-2010, Brian Gladman, Worcester, UK. All rights reserved.\r\n\r\nThe redistribution and use of this software (with or without changes)\r\nis allowed without the payment of fees or royalties provided that:\r\n\r\n  source code distributions include the above copyright notice, this\r\n  list of conditions and the following disclaimer;\r\n\r\n  binary distributions include the above copyright notice, this list\r\n  of conditions and the following disclaimer in their documentation.\r\n\r\nThis software is provided 'as is' with no explicit or implied warranties\r\nin respect of its operation, including, but not limited to, correctness\r\nand fitness for purpose.\r\n---------------------------------------------------------------------------\r\nIssue Date: 20/12/2007\r\n\r\n The unsigned integer types defined here are of the form uint_<nn>t where\r\n <nn> is the length of the type; for example, the unsigned 32-bit type is\r\n 'uint_32t'.  These are NOT the same as the 'C99 integer types' that are\r\n defined in the inttypes.h and stdint.h headers since attempts to use these\r\n types have shown that support for them is still highly variable.  However,\r\n since the latter are of the form uint<nn>_t, a regular expression search\r\n and replace (in VC++ search on 'uint_{:z}t' and replace with 'uint\\1_t')\r\n can be used to convert the types used here to the C99 standard types.\r\n*/\r\n\r\n#ifndef _BRG_TYPES_H\r\n#define _BRG_TYPES_H\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif\r\n\r\n#include <limits.h>\r\n\r\n#if defined( _MSC_VER ) && ( _MSC_VER >= 1300 )\r\n#  include <stddef.h>\r\n#  define ptrint_t intptr_t\r\n#elif defined( __ECOS__ )\r\n#  define intptr_t unsigned int\r\n#  define ptrint_t intptr_t\r\n#elif defined( __GNUC__ ) && ( __GNUC__ >= 3 )\r\n#  include <stdint.h>\r\n#  define ptrint_t intptr_t\r\n#else\r\n#  define ptrint_t int\r\n#endif\r\n\r\n#ifndef BRG_UI8\r\n#  define BRG_UI8\r\n#  if UCHAR_MAX == 255u\r\n     typedef unsigned char uint_8t;\r\n#  else\r\n#    error Please define uint_8t as an 8-bit unsigned integer type in brg_types.h\r\n#  endif\r\n#endif\r\n\r\n#ifndef BRG_UI16\r\n#  define BRG_UI16\r\n#  if USHRT_MAX == 65535u\r\n     typedef unsigned short uint_16t;\r\n#  else\r\n#    error Please define uint_16t as a 16-bit unsigned short type in brg_types.h\r\n#  endif\r\n#endif\r\n\r\n#ifndef BRG_UI32\r\n#  define BRG_UI32\r\n#  if UINT_MAX == 4294967295u\r\n#    define li_32(h) 0x##h##u\r\n     typedef unsigned int uint_32t;\r\n#  elif ULONG_MAX == 4294967295u\r\n#    define li_32(h) 0x##h##ul\r\n     typedef unsigned long uint_32t;\r\n#  elif defined( _CRAY )\r\n#    error This code needs 32-bit data types, which Cray machines do not provide\r\n#  else\r\n#    error Please define uint_32t as a 32-bit unsigned integer type in brg_types.h\r\n#  endif\r\n#endif\r\n\r\n#ifndef BRG_UI64\r\n#  if defined( __BORLANDC__ ) && !defined( __MSDOS__ )\r\n#    define BRG_UI64\r\n#    define li_64(h) 0x##h##ui64\r\n     typedef unsigned __int64 uint_64t;\r\n#  elif defined( _MSC_VER ) && ( _MSC_VER < 1300 )    /* 1300 == VC++ 7.0 */\r\n#    define BRG_UI64\r\n#    define li_64(h) 0x##h##ui64\r\n     typedef unsigned __int64 uint_64t;\r\n#  elif defined( __sun ) && defined( ULONG_MAX ) && ULONG_MAX == 0xfffffffful\r\n#    define BRG_UI64\r\n#    define li_64(h) 0x##h##ull\r\n     typedef unsigned long long uint_64t;\r\n#  elif defined( __MVS__ )\r\n#    define BRG_UI64\r\n#    define li_64(h) 0x##h##ull\r\n     typedef unsigned int long long uint_64t;\r\n#  elif defined( UINT_MAX ) && UINT_MAX > 4294967295u\r\n#    if UINT_MAX == 18446744073709551615u\r\n#      define BRG_UI64\r\n#      define li_64(h) 0x##h##u\r\n       typedef unsigned int uint_64t;\r\n#    endif\r\n#  elif defined( ULONG_MAX ) && ULONG_MAX > 4294967295u\r\n#    if ULONG_MAX == 18446744073709551615ul\r\n#      define BRG_UI64\r\n#      define li_64(h) 0x##h##ul\r\n       typedef unsigned long uint_64t;\r\n#    endif\r\n#  elif defined( ULLONG_MAX ) && ULLONG_MAX > 4294967295u\r\n#    if ULLONG_MAX == 18446744073709551615ull\r\n#      define BRG_UI64\r\n#      define li_64(h) 0x##h##ull\r\n       typedef unsigned long long uint_64t;\r\n#    endif\r\n#  elif defined( ULONG_LONG_MAX ) && ULONG_LONG_MAX > 4294967295u\r\n#    if ULONG_LONG_MAX == 18446744073709551615ull\r\n#      define BRG_UI64\r\n#      define li_64(h) 0x##h##ull\r\n       typedef unsigned long long uint_64t;\r\n#    endif\r\n#  endif\r\n#endif\r\n\r\n#if !defined( BRG_UI64 )\r\n#  if defined( NEED_UINT_64T )\r\n#    error Please define uint_64t as an unsigned 64 bit type in brg_types.h\r\n#  endif\r\n#endif\r\n\r\n#ifndef RETURN_VALUES\r\n#  define RETURN_VALUES\r\n#  if defined( DLL_EXPORT )\r\n#    if defined( _MSC_VER ) || defined ( __INTEL_COMPILER )\r\n#      define VOID_RETURN    __declspec( dllexport ) void __stdcall\r\n#      define INT_RETURN     __declspec( dllexport ) int  __stdcall\r\n#    elif defined( __GNUC__ )\r\n#      define VOID_RETURN    __declspec( __dllexport__ ) void\r\n#      define INT_RETURN     __declspec( __dllexport__ ) int\r\n#    else\r\n#      error Use of the DLL is only available on the Microsoft, Intel and GCC compilers\r\n#    endif\r\n#  elif defined( DLL_IMPORT )\r\n#    if defined( _MSC_VER ) || defined ( __INTEL_COMPILER )\r\n#      define VOID_RETURN    __declspec( dllimport ) void __stdcall\r\n#      define INT_RETURN     __declspec( dllimport ) int  __stdcall\r\n#    elif defined( __GNUC__ )\r\n#      define VOID_RETURN    __declspec( __dllimport__ ) void\r\n#      define INT_RETURN     __declspec( __dllimport__ ) int\r\n#    else\r\n#      error Use of the DLL is only available on the Microsoft, Intel and GCC compilers\r\n#    endif\r\n#  elif defined( __WATCOMC__ )\r\n#    define VOID_RETURN  void __cdecl\r\n#    define INT_RETURN   int  __cdecl\r\n#  else\r\n#    define VOID_RETURN  void\r\n#    define INT_RETURN   int\r\n#  endif\r\n#endif\r\n\r\n/*\tThese defines are used to detect and set the memory alignment of pointers.\r\n    Note that offsets are in bytes.\r\n\r\n    ALIGN_OFFSET(x,n)\t\t\treturn the positive or zero offset of \r\n                                the memory addressed by the pointer 'x' \r\n                                from an address that is aligned on an \r\n                                'n' byte boundary ('n' is a power of 2)\r\n\r\n    ALIGN_FLOOR(x,n)\t\t\treturn a pointer that points to memory\r\n                                that is aligned on an 'n' byte boundary \r\n                                and is not higher than the memory address\r\n                                pointed to by 'x' ('n' is a power of 2)\r\n\r\n    ALIGN_CEIL(x,n)\t\t\t\treturn a pointer that points to memory\r\n                                that is aligned on an 'n' byte boundary \r\n                                and is not lower than the memory address\r\n                                pointed to by 'x' ('n' is a power of 2)\r\n*/\r\n\r\n#define ALIGN_OFFSET(x,n)\t(((ptrint_t)(x)) & ((n) - 1))\r\n#define ALIGN_FLOOR(x,n)\t((uint_8t*)(x) - ( ((ptrint_t)(x)) & ((n) - 1)))\r\n#define ALIGN_CEIL(x,n)\t\t((uint_8t*)(x) + (-((ptrint_t)(x)) & ((n) - 1)))\r\n\r\n/*  These defines are used to declare buffers in a way that allows\r\n    faster operations on longer variables to be used.  In all these\r\n    defines 'size' must be a power of 2 and >= 8. NOTE that the \r\n    buffer size is in bytes but the type length is in bits\r\n\r\n    UNIT_TYPEDEF(x,size)        declares a variable 'x' of length \r\n                                'size' bits\r\n\r\n    BUFR_TYPEDEF(x,size,bsize)  declares a buffer 'x' of length 'bsize' \r\n                                bytes defined as an array of variables\r\n                                each of 'size' bits (bsize must be a \r\n                                multiple of size / 8)\r\n\r\n    UNIT_CAST(x,size)           casts a variable to a type of \r\n                                length 'size' bits\r\n\r\n    UPTR_CAST(x,size)           casts a pointer to a pointer to a \r\n                                varaiable of length 'size' bits\r\n*/\r\n\r\n#define UI_TYPE(size)               uint_##size##t\r\n#define UNIT_TYPEDEF(x,size)        typedef UI_TYPE(size) x\r\n#define BUFR_TYPEDEF(x,size,bsize)  typedef UI_TYPE(size) x[bsize / (size >> 3)]\r\n#define UNIT_CAST(x,size)           ((UI_TYPE(size) )(x))  \r\n#define UPTR_CAST(x,size)           ((UI_TYPE(size)*)(x))\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/aes/entropy.c",
    "content": "#ifdef _WIN32\n#include <windows.h>\n#else\n#include <sys/stat.h>\n#include <fcntl.h>\n#include <unistd.h>\n#endif\n\n#if defined(__cplusplus)\nextern \"C\"\n{\n#endif\n\n#ifdef _WIN32\nint entropy_fun(unsigned char buf[], unsigned int len)\n{\n    HCRYPTPROV provider;\n    unsigned __int64 pentium_tsc[1];\n    unsigned int i;\n    int result = 0;\n\n\n    if (CryptAcquireContext(&provider, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT))\n    {\n        result = CryptGenRandom(provider, len, buf);\n        CryptReleaseContext(provider, 0);\n        if (result)\n            return len;\n    }\n\n    QueryPerformanceCounter((LARGE_INTEGER *)pentium_tsc);\n\n    for(i = 0; i < 8 && i < len; ++i)\n        buf[i] = ((unsigned char*)pentium_tsc)[i];\n\n    return i;\n}\n#else\nint entropy_fun(unsigned char buf[], unsigned int len)\n{\n    int frand = open(\"/dev/random\", O_RDONLY);\n    int rlen = 0;\n    if (frand != -1)\n    {\n        rlen = (int)read(frand, buf, len);\n        close(frand);\n    }\n    return rlen;\n}\n#endif\n\n#if defined(__cplusplus)\n}\n#endif\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/aes/entropy.h",
    "content": "\r\n#ifndef _ENTROPY_FUN_H\r\n#define _ENTROPY_FUN_H\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\"\r\n{\r\n#endif\r\n\r\nint entropy_fun(unsigned char buf[], unsigned int len);\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/aes/fileenc.c",
    "content": "/*\r\n   ---------------------------------------------------------------------------\r\n   Copyright (c) 2002, Dr Brian Gladman <                 >, Worcester, UK.\r\n   All rights reserved.\r\n\r\n   LICENSE TERMS\r\n\r\n   The free distribution and use of this software in both source and binary\r\n   form is allowed (with or without changes) provided that:\r\n\r\n   1. distributions of this source code include the above copyright\r\n      notice, this list of conditions and the following disclaimer;\r\n\r\n   2. distributions in binary form include the above copyright\r\n      notice, this list of conditions and the following disclaimer\r\n      in the documentation and/or other associated materials;\r\n\r\n   3. the copyright holder's name is not used to endorse products\r\n      built using this software without specific written permission.\r\n\r\n   ALTERNATIVELY, provided that this notice is retained in full, this product\r\n   may be distributed under the terms of the GNU General Public License (GPL),\r\n   in which case the provisions of the GPL apply INSTEAD OF those given above.\r\n\r\n   DISCLAIMER\r\n\r\n   This software is provided 'as is' with no explicit or implied warranties\r\n   in respect of its properties, including, but not limited to, correctness\r\n   and/or fitness for purpose.\r\n   -------------------------------------------------------------------------\r\n   Issue Date: 24/01/2003\r\n\r\n   This file implements password based file encryption and authentication\r\n   using AES in CTR mode, HMAC-SHA1 authentication and RFC2898 password\r\n   based key derivation.\r\n\r\n */\r\n\r\n#include <memory.h>\r\n\r\n#include \"fileenc.h\"\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\"\r\n{\r\n#endif\r\n\r\n/* subroutine for data encryption/decryption    */\r\n/* this could be speeded up a lot by aligning   */\r\n/* buffers and using 32 bit operations          */\r\n\r\nstatic void encr_data(unsigned char data[], unsigned long d_len, fcrypt_ctx cx[1])\r\n{\r\n    unsigned long i = 0, pos = cx->encr_pos;\r\n\r\n    while (i < d_len) {\r\n        if (pos == AES_BLOCK_SIZE) {\r\n            unsigned int j = 0;\r\n            /* increment encryption nonce   */\r\n            while (j < 8 && !++cx->nonce[j])\r\n                ++j;\r\n            /* encrypt the nonce to form next xor buffer    */\r\n            aes_encrypt(cx->nonce, cx->encr_bfr, cx->encr_ctx);\r\n            pos = 0;\r\n        }\r\n\r\n        data[i++] ^= cx->encr_bfr[pos++];\r\n    }\r\n\r\n    cx->encr_pos = (unsigned int)pos;\r\n}\r\n\r\nint fcrypt_init(\r\n    int mode,                               /* the mode to be used (input)          */\r\n    const unsigned char pwd[],              /* the user specified password (input)  */\r\n    unsigned int pwd_len,                   /* the length of the password (input)   */\r\n    const unsigned char salt[],             /* the salt (input)                     */\r\n#ifdef PASSWORD_VERIFIER\r\n    unsigned char pwd_ver[PWD_VER_LENGTH],  /* 2 byte password verifier (output)    */\r\n#endif\r\n    fcrypt_ctx cx[1])                       /* the file encryption context (output) */\r\n{\r\n    unsigned char kbuf[2 * MAX_KEY_LENGTH + PWD_VER_LENGTH];\r\n\r\n    if (pwd_len > MAX_PWD_LENGTH)\r\n        return PASSWORD_TOO_LONG;\r\n\r\n    if (mode < 1 || mode > 3)\r\n        return BAD_MODE;\r\n\r\n    cx->mode = mode;\r\n    cx->pwd_len = pwd_len;\r\n\r\n    /* derive the encryption and authentication keys and the password verifier   */\r\n    derive_key(pwd, pwd_len, salt, SALT_LENGTH(mode), KEYING_ITERATIONS,\r\n               kbuf, 2 * KEY_LENGTH(mode) + PWD_VER_LENGTH);\r\n\r\n    /* initialise the encryption nonce and buffer pos   */\r\n    cx->encr_pos = AES_BLOCK_SIZE;\r\n    /* if we need a random component in the encryption  */\r\n    /* nonce, this is where it would have to be set     */\r\n    memset(cx->nonce, 0, AES_BLOCK_SIZE * sizeof(unsigned char));\r\n\r\n    /* initialise for encryption using key 1            */\r\n    aes_encrypt_key(kbuf, KEY_LENGTH(mode), cx->encr_ctx);\r\n\r\n    /* initialise for authentication using key 2        */\r\n    hmac_sha_begin(cx->auth_ctx);\r\n    hmac_sha_key(kbuf + KEY_LENGTH(mode), KEY_LENGTH(mode), cx->auth_ctx);\r\n\r\n#ifdef PASSWORD_VERIFIER\r\n    memcpy(pwd_ver, kbuf + 2 * KEY_LENGTH(mode), PWD_VER_LENGTH);\r\n#endif\r\n\r\n    return GOOD_RETURN;\r\n}\r\n\r\n/* perform 'in place' encryption and authentication */\r\n\r\nvoid fcrypt_encrypt(unsigned char data[], unsigned int data_len, fcrypt_ctx cx[1])\r\n{\r\n    encr_data(data, data_len, cx);\r\n    hmac_sha_data(data, data_len, cx->auth_ctx);\r\n}\r\n\r\n/* perform 'in place' authentication and decryption */\r\n\r\nvoid fcrypt_decrypt(unsigned char data[], unsigned int data_len, fcrypt_ctx cx[1])\r\n{\r\n    hmac_sha_data(data, data_len, cx->auth_ctx);\r\n    encr_data(data, data_len, cx);\r\n}\r\n\r\n/* close encryption/decryption and return the MAC value */\r\n\r\nint fcrypt_end(unsigned char mac[], fcrypt_ctx cx[1])\r\n{\r\n    hmac_sha_end(mac, MAC_LENGTH(cx->mode), cx->auth_ctx);\r\n    return MAC_LENGTH(cx->mode);    /* return MAC length in bytes   */\r\n}\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/aes/fileenc.h",
    "content": "/*\r\n ---------------------------------------------------------------------------\r\n Copyright (c) 2002, Dr Brian Gladman <                 >, Worcester, UK.\r\n All rights reserved.\r\n\r\n LICENSE TERMS\r\n\r\n The free distribution and use of this software in both source and binary\r\n form is allowed (with or without changes) provided that:\r\n\r\n   1. distributions of this source code include the above copyright\r\n      notice, this list of conditions and the following disclaimer;\r\n\r\n   2. distributions in binary form include the above copyright\r\n      notice, this list of conditions and the following disclaimer\r\n      in the documentation and/or other associated materials;\r\n\r\n   3. the copyright holder's name is not used to endorse products\r\n      built using this software without specific written permission.\r\n\r\n ALTERNATIVELY, provided that this notice is retained in full, this product\r\n may be distributed under the terms of the GNU General Public License (GPL),\r\n in which case the provisions of the GPL apply INSTEAD OF those given above.\r\n\r\n DISCLAIMER\r\n\r\n This software is provided 'as is' with no explicit or implied warranties\r\n in respect of its properties, including, but not limited to, correctness\r\n and/or fitness for purpose.\r\n ---------------------------------------------------------------------------\r\n Issue Date: 24/01/2003\r\n\r\n This file contains the header file for fileenc.c, which implements password\r\n based file encryption and authentication using AES in CTR mode, HMAC-SHA1 \r\n authentication and RFC2898 password based key derivation.\r\n*/\r\n\r\n#ifndef _FENC_H\r\n#define _FENC_H\r\n\r\n#include \"aes.h\"\r\n#include \"hmac.h\"\r\n#include \"pwd2key.h\"\r\n\r\n#define PASSWORD_VERIFIER\r\n\r\n#define MAX_KEY_LENGTH        32\r\n#define MAX_PWD_LENGTH       128\r\n#define MAX_SALT_LENGTH       16\r\n#define KEYING_ITERATIONS   1000\r\n\r\n#ifdef  PASSWORD_VERIFIER\r\n#define PWD_VER_LENGTH         2\r\n#else\r\n#define PWD_VER_LENGTH         0\r\n#endif\r\n\r\n#define GOOD_RETURN            0\r\n#define PASSWORD_TOO_LONG   -100\r\n#define BAD_MODE            -101\r\n\r\n/*\r\n    Field lengths (in bytes) versus File Encryption Mode (0 < mode < 4)\r\n\r\n    Mode Key Salt  MAC Overhead\r\n       1  16    8   10       18\r\n       2  24   12   10       22\r\n       3  32   16   10       26\r\n\r\n   The following macros assume that the mode value is correct.\r\n*/\r\n\r\n#define KEY_LENGTH(mode)        (8 * (mode & 3) + 8)\r\n#define SALT_LENGTH(mode)       (4 * (mode & 3) + 4)\r\n#define MAC_LENGTH(mode)        (10)\r\n\r\n/* the context for file encryption   */\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\"\r\n{\r\n#endif\r\n\r\ntypedef struct\r\n{   unsigned char   nonce[AES_BLOCK_SIZE];      /* the CTR nonce          */\r\n    unsigned char   encr_bfr[AES_BLOCK_SIZE];   /* encrypt buffer         */\r\n    aes_encrypt_ctx encr_ctx[1];                /* encryption context     */\r\n    hmac_ctx        auth_ctx[1];                /* authentication context */\r\n    unsigned int    encr_pos;                   /* block position (enc)   */\r\n    unsigned int    pwd_len;                    /* password length        */\r\n    unsigned int    mode;                       /* File encryption mode   */\r\n} fcrypt_ctx;\r\n\r\n/* initialise file encryption or decryption */\r\n\r\nint fcrypt_init(\r\n    int mode,                               /* the mode to be used (input)          */\r\n    const unsigned char pwd[],              /* the user specified password (input)  */\r\n    unsigned int pwd_len,                   /* the length of the password (input)   */\r\n    const unsigned char salt[],             /* the salt (input)                     */\r\n#ifdef PASSWORD_VERIFIER\r\n    unsigned char pwd_ver[PWD_VER_LENGTH],  /* 2 byte password verifier (output)    */\r\n#endif\r\n    fcrypt_ctx      cx[1]);                 /* the file encryption context (output) */\r\n\r\n/* perform 'in place' encryption or decryption and authentication               */\r\n\r\nvoid fcrypt_encrypt(unsigned char data[], unsigned int data_len, fcrypt_ctx cx[1]);\r\nvoid fcrypt_decrypt(unsigned char data[], unsigned int data_len, fcrypt_ctx cx[1]);\r\n\r\n/* close encryption/decryption and return the MAC value */\r\n/* the return value is the length of the MAC            */\r\n\r\nint fcrypt_end(unsigned char mac[],     /* the MAC value (output)   */\r\n               fcrypt_ctx cx[1]);       /* the context (input)      */\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/aes/hmac.c",
    "content": "/*\r\n ---------------------------------------------------------------------------\r\n Copyright (c) 2002, Dr Brian Gladman, Worcester, UK.   All rights reserved.\r\n\r\n LICENSE TERMS\r\n\r\n The free distribution and use of this software in both source and binary\r\n form is allowed (with or without changes) provided that:\r\n\r\n   1. distributions of this source code include the above copyright\r\n      notice, this list of conditions and the following disclaimer;\r\n\r\n   2. distributions in binary form include the above copyright\r\n      notice, this list of conditions and the following disclaimer\r\n      in the documentation and/or other associated materials;\r\n\r\n   3. the copyright holder's name is not used to endorse products\r\n      built using this software without specific written permission.\r\n\r\n ALTERNATIVELY, provided that this notice is retained in full, this product\r\n may be distributed under the terms of the GNU General Public License (GPL),\r\n in which case the provisions of the GPL apply INSTEAD OF those given above.\r\n\r\n DISCLAIMER\r\n\r\n This software is provided 'as is' with no explicit or implied warranties\r\n in respect of its properties, including, but not limited to, correctness\r\n and/or fitness for purpose.\r\n ---------------------------------------------------------------------------\r\n Issue Date: 26/08/2003\r\n\r\n This is an implementation of HMAC, the FIPS standard keyed hash function\r\n*/\r\n\r\n#include \"hmac.h\"\r\n#include \"brg_types.h\"\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\"\r\n{\r\n#endif\r\n\r\n/* initialise the HMAC context to zero */\r\nvoid hmac_sha_begin(hmac_ctx cx[1])\r\n{\r\n    memset(cx, 0, sizeof(hmac_ctx));\r\n}\r\n\r\n/* input the HMAC key (can be called multiple times)    */\r\nint hmac_sha_key(const unsigned char key[], unsigned long key_len, hmac_ctx cx[1])\r\n{\r\n    if(cx->klen == HMAC_IN_DATA)                /* error if further key input   */\r\n        return HMAC_BAD_MODE;                   /* is attempted in data mode    */\r\n\r\n    if(cx->klen + key_len > HASH_INPUT_SIZE)    /* if the key has to be hashed  */\r\n    {\r\n        if(cx->klen <= HASH_INPUT_SIZE)         /* if the hash has not yet been */\r\n        {                                       /* started, initialise it and   */\r\n            sha_begin(cx->ctx);                 /* hash stored key characters   */\r\n            sha_hash(cx->key, cx->klen, cx->ctx);\r\n        }\r\n\r\n        sha_hash(key, key_len, cx->ctx);       /* hash long key data into hash */\r\n    }\r\n    else                                        /* otherwise store key data     */\r\n        memcpy(cx->key + cx->klen, key, key_len);\r\n\r\n    cx->klen += key_len;                        /* update the key length count  */\r\n    return HMAC_OK;\r\n}\r\n\r\n/* input the HMAC data (can be called multiple times) - */\r\n/* note that this call terminates the key input phase   */\r\nvoid hmac_sha_data(const unsigned char data[], unsigned long data_len, hmac_ctx cx[1])\r\n{   unsigned int i;\r\n\r\n    if(cx->klen != HMAC_IN_DATA)                /* if not yet in data phase */\r\n    {\r\n        if(cx->klen > HASH_INPUT_SIZE)          /* if key is being hashed   */\r\n        {                                       /* complete the hash and    */\r\n            sha_end(cx->key, cx->ctx);          /* store the result as the  */\r\n            cx->klen = HASH_OUTPUT_SIZE;        /* key and set new length   */\r\n        }\r\n\r\n        /* pad the key if necessary */\r\n        memset(cx->key + cx->klen, 0, HASH_INPUT_SIZE - cx->klen);\r\n\r\n        /* xor ipad into key value  */\r\n        for(i = 0; i < (HASH_INPUT_SIZE >> 2); ++i)\r\n            ((uint_32t*)cx->key)[i] ^= 0x36363636;\r\n\r\n        /* and start hash operation */\r\n        sha_begin(cx->ctx);\r\n        sha_hash(cx->key, HASH_INPUT_SIZE, cx->ctx);\r\n\r\n        /* mark as now in data mode */\r\n        cx->klen = HMAC_IN_DATA;\r\n    }\r\n\r\n    /* hash the data (if any)       */\r\n    if(data_len)\r\n        sha_hash(data, data_len, cx->ctx);\r\n}\r\n\r\n/* compute and output the MAC value */\r\nvoid hmac_sha_end(unsigned char mac[], unsigned long mac_len, hmac_ctx cx[1])\r\n{   unsigned char dig[HASH_OUTPUT_SIZE];\r\n    unsigned int i;\r\n\r\n    /* if no data has been entered perform a null data phase        */\r\n    if(cx->klen != HMAC_IN_DATA)\r\n        hmac_sha_data((const unsigned char*)0, 0, cx);\r\n\r\n    sha_end(dig, cx->ctx);         /* complete the inner hash       */\r\n\r\n    /* set outer key value using opad and removing ipad */\r\n    for(i = 0; i < (HASH_INPUT_SIZE >> 2); ++i)\r\n        ((uint_32t*)cx->key)[i] ^= 0x36363636 ^ 0x5c5c5c5c;\r\n\r\n    /* perform the outer hash operation */\r\n    sha_begin(cx->ctx);\r\n    sha_hash(cx->key, HASH_INPUT_SIZE, cx->ctx);\r\n    sha_hash(dig, HASH_OUTPUT_SIZE, cx->ctx);\r\n    sha_end(dig, cx->ctx);\r\n\r\n    /* output the hash value            */\r\n    for(i = 0; i < mac_len; ++i)\r\n        mac[i] = dig[i];\r\n}\r\n\r\n/* 'do it all in one go' subroutine     */\r\nvoid hmac_sha(const unsigned char key[], unsigned long key_len,\r\n          const unsigned char data[], unsigned long data_len,\r\n          unsigned char mac[], unsigned long mac_len)\r\n{   hmac_ctx    cx[1];\r\n\r\n    hmac_sha_begin(cx);\r\n    hmac_sha_key(key, key_len, cx);\r\n    hmac_sha_data(data, data_len, cx);\r\n    hmac_sha_end(mac, mac_len, cx);\r\n}\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/aes/hmac.h",
    "content": "/*\r\n ---------------------------------------------------------------------------\r\n Copyright (c) 2002, Dr Brian Gladman, Worcester, UK.   All rights reserved.\r\n\r\n LICENSE TERMS\r\n\r\n The free distribution and use of this software in both source and binary\r\n form is allowed (with or without changes) provided that:\r\n\r\n   1. distributions of this source code include the above copyright\r\n      notice, this list of conditions and the following disclaimer;\r\n\r\n   2. distributions in binary form include the above copyright\r\n      notice, this list of conditions and the following disclaimer\r\n      in the documentation and/or other associated materials;\r\n\r\n   3. the copyright holder's name is not used to endorse products\r\n      built using this software without specific written permission.\r\n\r\n ALTERNATIVELY, provided that this notice is retained in full, this product\r\n may be distributed under the terms of the GNU General Public License (GPL),\r\n in which case the provisions of the GPL apply INSTEAD OF those given above.\r\n\r\n DISCLAIMER\r\n\r\n This software is provided 'as is' with no explicit or implied warranties\r\n in respect of its properties, including, but not limited to, correctness\r\n and/or fitness for purpose.\r\n ---------------------------------------------------------------------------\r\n Issue Date: 26/08/2003\r\n\r\n This is an implementation of HMAC, the FIPS standard keyed hash function\r\n*/\r\n\r\n#ifndef _HMAC_H\r\n#define _HMAC_H\r\n\r\n#include <memory.h>\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\"\r\n{\r\n#endif\r\n\r\n#define USE_SHA1\r\n\r\n#if !defined(USE_SHA1) && !defined(USE_SHA256)\r\n#error define USE_SHA1 or USE_SHA256 to set the HMAC hash algorithm\r\n#endif\r\n\r\n#ifdef USE_SHA1\r\n\r\n#include \"sha1.h\"\r\n\r\n#define HASH_INPUT_SIZE     SHA1_BLOCK_SIZE\r\n#define HASH_OUTPUT_SIZE    SHA1_DIGEST_SIZE\r\n#define sha_ctx             sha1_ctx\r\n#define sha_begin           sha1_begin\r\n#define sha_hash            sha1_hash\r\n#define sha_end             sha1_end\r\n\r\n#endif\r\n\r\n#ifdef USE_SHA256\r\n\r\n#include \"sha2.h\"\r\n\r\n#define HASH_INPUT_SIZE     SHA256_BLOCK_SIZE\r\n#define HASH_OUTPUT_SIZE    SHA256_DIGEST_SIZE\r\n#define sha_ctx             sha256_ctx\r\n#define sha_begin           sha256_begin\r\n#define sha_hash            sha256_hash\r\n#define sha_end             sha256_end\r\n\r\n#endif\r\n\r\n#define HMAC_OK                0\r\n#define HMAC_BAD_MODE         -1\r\n#define HMAC_IN_DATA  0xffffffff\r\n\r\ntypedef struct\r\n{   unsigned char   key[HASH_INPUT_SIZE];\r\n    sha_ctx         ctx[1];\r\n    unsigned long   klen;\r\n} hmac_ctx;\r\n\r\nvoid hmac_sha_begin(hmac_ctx cx[1]);\r\n\r\nint  hmac_sha_key(const unsigned char key[], unsigned long key_len, hmac_ctx cx[1]);\r\n\r\nvoid hmac_sha_data(const unsigned char data[], unsigned long data_len, hmac_ctx cx[1]);\r\n\r\nvoid hmac_sha_end(unsigned char mac[], unsigned long mac_len, hmac_ctx cx[1]);\r\n\r\nvoid hmac_sha(const unsigned char key[], unsigned long key_len,\r\n          const unsigned char data[], unsigned long data_len,\r\n          unsigned char mac[], unsigned long mac_len);\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/aes/prng.c",
    "content": "/*\r\n ---------------------------------------------------------------------------\r\n Copyright (c) 2002, Dr Brian Gladman <                 >, Worcester, UK.\r\n All rights reserved.\r\n\r\n LICENSE TERMS\r\n\r\n The free distribution and use of this software in both source and binary\r\n form is allowed (with or without changes) provided that:\r\n\r\n   1. distributions of this source code include the above copyright\r\n      notice, this list of conditions and the following disclaimer;\r\n\r\n   2. distributions in binary form include the above copyright\r\n      notice, this list of conditions and the following disclaimer\r\n      in the documentation and/or other associated materials;\r\n\r\n   3. the copyright holder's name is not used to endorse products\r\n      built using this software without specific written permission.\r\n\r\n ALTERNATIVELY, provided that this notice is retained in full, this product\r\n may be distributed under the terms of the GNU General Public License (GPL),\r\n in which case the provisions of the GPL apply INSTEAD OF those given above.\r\n\r\n DISCLAIMER\r\n\r\n This software is provided 'as is' with no explicit or implied warranties\r\n in respect of its properties, including, but not limited to, correctness\r\n and/or fitness for purpose.\r\n ---------------------------------------------------------------------------\r\n Issue Date: 24/01/2003\r\n\r\n This file implements a random data pool based on the use of an external\r\n entropy function.  It is based on the ideas advocated by Peter Gutmann in\r\n his work on pseudo random sequence generators.  It is not a 'paranoid'\r\n random sequence generator and no attempt is made to protect the pool\r\n from prying eyes either by memory locking or by techniques to obscure\r\n its location in memory.\r\n*/\r\n\r\n#include <memory.h>\r\n#include \"prng.h\"\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\"\r\n{\r\n#endif\r\n\r\n/* mix a random data pool using the SHA1 compression function (as   */\r\n/* suggested by Peter Gutmann in his paper on random pools)         */\r\n\r\nstatic void prng_mix(unsigned char buf[])\r\n{   unsigned int    i, len;\r\n    sha1_ctx        ctx[1];\r\n\r\n    /*lint -e{663}  unusual array to pointer conversion */\r\n    for(i = 0; i < PRNG_POOL_SIZE; i += SHA1_DIGEST_SIZE)\r\n    {\r\n        /* copy digest size pool block into SHA1 hash block */\r\n        memcpy(ctx->hash, buf + (i ? i : PRNG_POOL_SIZE)\r\n                            - SHA1_DIGEST_SIZE, SHA1_DIGEST_SIZE);\r\n\r\n        /* copy data from pool into the SHA1 data buffer    */\r\n        len = PRNG_POOL_SIZE - i;\r\n        memcpy(ctx->wbuf, buf + i, (len > SHA1_BLOCK_SIZE ? SHA1_BLOCK_SIZE : len));\r\n\r\n        if(len < SHA1_BLOCK_SIZE)\r\n            memcpy(((char*)ctx->wbuf) + len, buf, SHA1_BLOCK_SIZE - len);\r\n\r\n        /* compress using the SHA1 compression function     */\r\n        sha1_compile(ctx);\r\n\r\n        /* put digest size block back into the random pool  */\r\n        memcpy(buf + i, ctx->hash, SHA1_DIGEST_SIZE);\r\n    }\r\n}\r\n\r\n/* refresh the output buffer and update the random pool by adding   */\r\n/* entropy and remixing                                             */\r\n\r\nstatic void update_pool(prng_ctx ctx[1])\r\n{   unsigned int    i = 0;\r\n\r\n    /* transfer random pool data to the output buffer   */\r\n    memcpy(ctx->obuf, ctx->rbuf, PRNG_POOL_SIZE);\r\n\r\n    /* enter entropy data into the pool */\r\n    while(i < PRNG_POOL_SIZE)\r\n        i += ctx->entropy(ctx->rbuf + i, PRNG_POOL_SIZE - i);\r\n\r\n    /* invert and xor the original pool data into the pool  */\r\n    for(i = 0; i < PRNG_POOL_SIZE; ++i)\r\n        ctx->rbuf[i] ^= ~ctx->obuf[i];\r\n\r\n    /* mix the pool and the output buffer   */\r\n    prng_mix(ctx->rbuf);\r\n    prng_mix(ctx->obuf);\r\n}\r\n\r\nvoid prng_init(prng_entropy_fn fun, prng_ctx ctx[1])\r\n{   int i;\r\n\r\n    /* clear the buffers and the counter in the context     */\r\n    memset(ctx, 0, sizeof(prng_ctx));\r\n\r\n    /* set the pointer to the entropy collection function   */\r\n    ctx->entropy = fun;\r\n\r\n    /* initialise the random data pool                      */\r\n    update_pool(ctx);\r\n\r\n    /* mix the pool a minimum number of times               */\r\n    for(i = 0; i < PRNG_MIN_MIX; ++i)\r\n        prng_mix(ctx->rbuf);\r\n\r\n    /* update the pool to prime the pool output buffer      */\r\n    update_pool(ctx);\r\n}\r\n\r\n/* provide random bytes from the random data pool   */\r\n\r\nvoid prng_rand(unsigned char data[], unsigned int data_len, prng_ctx ctx[1])\r\n{   unsigned char   *rp = data;\r\n    unsigned int    len, pos = ctx->pos;\r\n\r\n    while(data_len)\r\n    {\r\n        /* transfer 'data_len' bytes (or the number of bytes remaining  */\r\n        /* the pool output buffer if less) into the output              */\r\n        len = (data_len < PRNG_POOL_SIZE - pos ? data_len : PRNG_POOL_SIZE - pos);\r\n        memcpy(rp, ctx->obuf + pos, len);\r\n        rp += len;          /* update ouput buffer position pointer     */\r\n        pos += len;         /* update pool output buffer pointer        */\r\n        data_len -= len;    /* update the remaining data count          */\r\n\r\n        /* refresh the random pool if necessary */\r\n        if(pos == PRNG_POOL_SIZE)\r\n        {\r\n            update_pool(ctx); pos = 0;\r\n        }\r\n    }\r\n\r\n    ctx->pos = pos;\r\n}\r\n\r\nvoid prng_end(prng_ctx ctx[1])\r\n{\r\n    /* ensure the data in the context is destroyed  */\r\n    memset(ctx, 0, sizeof(prng_ctx));\r\n}\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/aes/prng.h",
    "content": "/*\r\n ---------------------------------------------------------------------------\r\n Copyright (c) 2002, Dr Brian Gladman <                 >, Worcester, UK.\r\n All rights reserved.\r\n\r\n LICENSE TERMS\r\n\r\n The free distribution and use of this software in both source and binary\r\n form is allowed (with or without changes) provided that:\r\n\r\n   1. distributions of this source code include the above copyright\r\n      notice, this list of conditions and the following disclaimer;\r\n\r\n   2. distributions in binary form include the above copyright\r\n      notice, this list of conditions and the following disclaimer\r\n      in the documentation and/or other associated materials;\r\n\r\n   3. the copyright holder's name is not used to endorse products\r\n      built using this software without specific written permission.\r\n\r\n ALTERNATIVELY, provided that this notice is retained in full, this product\r\n may be distributed under the terms of the GNU General Public License (GPL),\r\n in which case the provisions of the GPL apply INSTEAD OF those given above.\r\n\r\n DISCLAIMER\r\n\r\n This software is provided 'as is' with no explicit or implied warranties\r\n in respect of its properties, including, but not limited to, correctness\r\n and/or fitness for purpose.\r\n ---------------------------------------------------------------------------\r\n Issue Date: 24/01/2003\r\n\r\n This is the header file for an implementation of a random data pool based on\r\n the use of an external entropy function (inspired by Peter Gutmann's work).\r\n*/\r\n\r\n#ifndef _PRNG_H\r\n#define _PRNG_H\r\n\r\n#include \"sha1.h\"\r\n\r\n#define PRNG_POOL_LEN    256    /* minimum random pool size             */\r\n#define PRNG_MIN_MIX      20    /* min initial pool mixing iterations   */\r\n\r\n/* ensure that pool length is a multiple of the SHA1 digest size        */\r\n\r\n#define PRNG_POOL_SIZE  (SHA1_DIGEST_SIZE * (1 + (PRNG_POOL_LEN - 1) / SHA1_DIGEST_SIZE))\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\"\r\n{\r\n#endif\r\n\r\n/* A function for providing entropy is a parameter in the prng_init()   */\r\n/* call.  This function has the following form and returns a maximum    */\r\n/* of 'len' bytes of pseudo random data in the buffer 'buf'.  It can    */\r\n/* return less than 'len' bytes but will be repeatedly called for more  */\r\n/* data in this case.                                                   */\r\n\r\ntypedef int (*prng_entropy_fn)(unsigned char buf[], unsigned int len);\r\n\r\ntypedef struct\r\n{   unsigned char   rbuf[PRNG_POOL_SIZE];   /* the random pool          */\r\n    unsigned char   obuf[PRNG_POOL_SIZE];   /* pool output buffer       */\r\n    unsigned int    pos;                    /* output buffer position   */\r\n    prng_entropy_fn entropy;                /* entropy function pointer */\r\n} prng_ctx;\r\n\r\n/* initialise the random stream generator   */\r\nvoid prng_init(prng_entropy_fn fun, prng_ctx ctx[1]);\r\n\r\n/* obtain random bytes from the generator   */\r\nvoid prng_rand(unsigned char data[], unsigned int data_len, prng_ctx ctx[1]);\r\n\r\n/* close the random stream generator        */\r\nvoid prng_end(prng_ctx ctx[1]);\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/aes/pwd2key.c",
    "content": "/*\r\n ---------------------------------------------------------------------------\r\n Copyright (c) 2002, Dr Brian Gladman, Worcester, UK.   All rights reserved.\r\n\r\n LICENSE TERMS\r\n\r\n The free distribution and use of this software in both source and binary\r\n form is allowed (with or without changes) provided that:\r\n\r\n   1. distributions of this source code include the above copyright\r\n      notice, this list of conditions and the following disclaimer;\r\n\r\n   2. distributions in binary form include the above copyright\r\n      notice, this list of conditions and the following disclaimer\r\n      in the documentation and/or other associated materials;\r\n\r\n   3. the copyright holder's name is not used to endorse products\r\n      built using this software without specific written permission.\r\n\r\n ALTERNATIVELY, provided that this notice is retained in full, this product\r\n may be distributed under the terms of the GNU General Public License (GPL),\r\n in which case the provisions of the GPL apply INSTEAD OF those given above.\r\n\r\n DISCLAIMER\r\n\r\n This software is provided 'as is' with no explicit or implied warranties\r\n in respect of its properties, including, but not limited to, correctness\r\n and/or fitness for purpose.\r\n ---------------------------------------------------------------------------\r\n Issue Date: 26/08/2003\r\n\r\n This is an implementation of RFC2898, which specifies key derivation from\r\n a password and a salt value.\r\n*/\r\n\r\n#include <memory.h>\r\n#include \"hmac.h\"\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\"\r\n{\r\n#endif\r\n\r\nvoid derive_key(const unsigned char pwd[],  /* the PASSWORD     */\r\n               unsigned int pwd_len,        /* and its length   */\r\n               const unsigned char salt[],  /* the SALT and its */\r\n               unsigned int salt_len,       /* length           */\r\n               unsigned int iter,   /* the number of iterations */\r\n               unsigned char key[], /* space for the output key */\r\n               unsigned int key_len)/* and its required length  */\r\n{\r\n    unsigned int    i, j, k, n_blk;\r\n    unsigned char uu[HASH_OUTPUT_SIZE], ux[HASH_OUTPUT_SIZE];\r\n    hmac_ctx c1[1], c2[1], c3[1];\r\n\r\n    /* set HMAC context (c1) for password               */\r\n    hmac_sha_begin(c1);\r\n    hmac_sha_key(pwd, pwd_len, c1);\r\n\r\n    /* set HMAC context (c2) for password and salt      */\r\n    memcpy(c2, c1, sizeof(hmac_ctx));\r\n    hmac_sha_data(salt, salt_len, c2);\r\n\r\n    /* find the number of SHA blocks in the key         */\r\n    n_blk = 1 + (key_len - 1) / HASH_OUTPUT_SIZE;\r\n\r\n    for(i = 0; i < n_blk; ++i) /* for each block in key */\r\n    {\r\n        /* ux[] holds the running xor value             */\r\n        memset(ux, 0, HASH_OUTPUT_SIZE);\r\n\r\n        /* set HMAC context (c3) for password and salt  */\r\n        memcpy(c3, c2, sizeof(hmac_ctx));\r\n\r\n        /* enter additional data for 1st block into uu  */\r\n        uu[0] = (unsigned char)((i + 1) >> 24);\r\n        uu[1] = (unsigned char)((i + 1) >> 16);\r\n        uu[2] = (unsigned char)((i + 1) >> 8);\r\n        uu[3] = (unsigned char)(i + 1);\r\n\r\n        /* this is the key mixing iteration         */\r\n        for(j = 0, k = 4; j < iter; ++j)\r\n        {\r\n            /* add previous round data to HMAC      */\r\n            hmac_sha_data(uu, k, c3);\r\n\r\n            /* obtain HMAC for uu[]                 */\r\n            hmac_sha_end(uu, HASH_OUTPUT_SIZE, c3);\r\n\r\n            /* xor into the running xor block       */\r\n            for(k = 0; k < HASH_OUTPUT_SIZE; ++k)\r\n                ux[k] ^= uu[k];\r\n\r\n            /* set HMAC context (c3) for password   */\r\n            memcpy(c3, c1, sizeof(hmac_ctx));\r\n        }\r\n\r\n        /* compile key blocks into the key output   */\r\n        j = 0; k = i * HASH_OUTPUT_SIZE;\r\n        while(j < HASH_OUTPUT_SIZE && k < key_len)\r\n            key[k++] = ux[j++];\r\n    }\r\n}\r\n\r\n#ifdef TEST\r\n\r\n#include <stdio.h>\r\n\r\nstruct\r\n{   unsigned int    pwd_len;\r\n    unsigned int    salt_len;\r\n    unsigned int    it_count;\r\n    unsigned char   *pwd;\r\n    unsigned char   salt[32];\r\n    unsigned char   key[32];\r\n} tests[] =\r\n{\r\n    {   8, 4, 5, (unsigned char*)\"password\",\r\n        {   \r\n            0x12, 0x34, 0x56, 0x78 \r\n        },\r\n        {   \r\n            0x5c, 0x75, 0xce, 0xf0, 0x1a, 0x96, 0x0d, 0xf7,\r\n            0x4c, 0xb6, 0xb4, 0x9b, 0x9e, 0x38, 0xe6, 0xb5 \r\n        }\r\n    },\r\n    {   8, 8, 5, (unsigned char*)\"password\",\r\n        {   \r\n            0x12, 0x34, 0x56, 0x78, 0x78, 0x56, 0x34, 0x12 \r\n        },\r\n        {   \r\n            0xd1, 0xda, 0xa7, 0x86, 0x15, 0xf2, 0x87, 0xe6,\r\n            0xa1, 0xc8, 0xb1, 0x20, 0xd7, 0x06, 0x2a, 0x49 \r\n        }\r\n    },\r\n    {   8, 21, 1, (unsigned char*)\"password\",\r\n        {\r\n            \"ATHENA.MIT.EDUraeburn\"\r\n        },\r\n        {\r\n            0xcd, 0xed, 0xb5, 0x28, 0x1b, 0xb2, 0xf8, 0x01,\r\n            0x56, 0x5a, 0x11, 0x22, 0xb2, 0x56, 0x35, 0x15\r\n        }\r\n    },\r\n    {   8, 21, 2, (unsigned char*)\"password\",\r\n        {\r\n            \"ATHENA.MIT.EDUraeburn\"\r\n        },\r\n        {\r\n            0x01, 0xdb, 0xee, 0x7f, 0x4a, 0x9e, 0x24, 0x3e, \r\n            0x98, 0x8b, 0x62, 0xc7, 0x3c, 0xda, 0x93, 0x5d\r\n        }\r\n    },\r\n    {   8, 21, 1200, (unsigned char*)\"password\",\r\n        {\r\n            \"ATHENA.MIT.EDUraeburn\"\r\n        },\r\n        {\r\n            0x5c, 0x08, 0xeb, 0x61, 0xfd, 0xf7, 0x1e, 0x4e, \r\n            0x4e, 0xc3, 0xcf, 0x6b, 0xa1, 0xf5, 0x51, 0x2b\r\n        }\r\n    }\r\n};\r\n\r\nint main()\r\n{   unsigned int    i, j, key_len = 256;\r\n    unsigned char   key[256];\r\n\r\n    printf(\"\\nTest of RFC2898 Password Based Key Derivation\");\r\n    for(i = 0; i < 5; ++i)\r\n    {\r\n        derive_key(tests[i].pwd, tests[i].pwd_len, tests[i].salt,\r\n                    tests[i].salt_len, tests[i].it_count, key, key_len);\r\n\r\n        printf(\"\\ntest %i: \", i + 1);\r\n        printf(\"key %s\", memcmp(tests[i].key, key, 16) ? \"is bad\" : \"is good\");\r\n        for(j = 0; j < key_len && j < 64; j += 4)\r\n        {\r\n            if(j % 16 == 0)\r\n                printf(\"\\n\");\r\n            printf(\"0x%02x%02x%02x%02x \", key[j], key[j + 1], key[j + 2], key[j + 3]);\r\n        }\r\n        printf(j < key_len ? \" ... \\n\" : \"\\n\");\r\n    }\r\n    printf(\"\\n\");\r\n    return 0;\r\n}\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/aes/pwd2key.h",
    "content": "/*\r\n ---------------------------------------------------------------------------\r\n Copyright (c) 2002, Dr Brian Gladman, Worcester, UK.   All rights reserved.\r\n\r\n LICENSE TERMS\r\n\r\n The free distribution and use of this software in both source and binary \r\n form is allowed (with or without changes) provided that:\r\n\r\n   1. distributions of this source code include the above copyright \r\n      notice, this list of conditions and the following disclaimer;\r\n\r\n   2. distributions in binary form include the above copyright\r\n      notice, this list of conditions and the following disclaimer\r\n      in the documentation and/or other associated materials;\r\n\r\n   3. the copyright holder's name is not used to endorse products \r\n      built using this software without specific written permission. \r\n\r\n ALTERNATIVELY, provided that this notice is retained in full, this product\r\n may be distributed under the terms of the GNU General Public License (GPL),\r\n in which case the provisions of the GPL apply INSTEAD OF those given above.\r\n \r\n DISCLAIMER\r\n\r\n This software is provided 'as is' with no explicit or implied warranties\r\n in respect of its properties, including, but not limited to, correctness \r\n and/or fitness for purpose.\r\n ---------------------------------------------------------------------------\r\n Issue Date: 26/08/2003\r\n\r\n This is an implementation of RFC2898, which specifies key derivation from\r\n a password and a salt value.\r\n*/\r\n\r\n#ifndef PWD2KEY_H\r\n#define PWD2KEY_H\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\"\r\n{\r\n#endif\r\n\r\nvoid derive_key(\r\n        const unsigned char pwd[],   /* the PASSWORD, and   */\r\n        unsigned int pwd_len,        /*    its length       */ \r\n        const unsigned char salt[],  /* the SALT and its    */\r\n        unsigned int salt_len,       /*    length           */\r\n        unsigned int iter,      /* the number of iterations */\r\n        unsigned char key[],    /* space for the output key */\r\n        unsigned int key_len);  /* and its required length  */\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/aes/sha1.c",
    "content": "/*\r\n ---------------------------------------------------------------------------\r\n Copyright (c) 2002, Dr Brian Gladman, Worcester, UK.   All rights reserved.\r\n\r\n LICENSE TERMS\r\n\r\n The free distribution and use of this software in both source and binary\r\n form is allowed (with or without changes) provided that:\r\n\r\n   1. distributions of this source code include the above copyright\r\n      notice, this list of conditions and the following disclaimer;\r\n\r\n   2. distributions in binary form include the above copyright\r\n      notice, this list of conditions and the following disclaimer\r\n      in the documentation and/or other associated materials;\r\n\r\n   3. the copyright holder's name is not used to endorse products\r\n      built using this software without specific written permission.\r\n\r\n ALTERNATIVELY, provided that this notice is retained in full, this product\r\n may be distributed under the terms of the GNU General Public License (GPL),\r\n in which case the provisions of the GPL apply INSTEAD OF those given above.\r\n\r\n DISCLAIMER\r\n\r\n This software is provided 'as is' with no explicit or implied warranties\r\n in respect of its properties, including, but not limited to, correctness\r\n and/or fitness for purpose.\r\n ---------------------------------------------------------------------------\r\n Issue Date: 01/08/2005\r\n\r\n This is a byte oriented version of SHA1 that operates on arrays of bytes\r\n stored in memory.\r\n*/\r\n\r\n#include <string.h>     /* for memcpy() etc.        */\r\n\r\n#include \"sha1.h\"\r\n#include \"brg_endian.h\"\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\"\r\n{\r\n#endif\r\n\r\n#if defined( _MSC_VER ) && ( _MSC_VER > 800 )\r\n#pragma intrinsic(memcpy)\r\n#endif\r\n\r\n#if 0 && defined(_MSC_VER)\r\n#define rotl32  _lrotl\r\n#define rotr32  _lrotr\r\n#else\r\n#define rotl32(x,n)   (((x) << n) | ((x) >> (32 - n)))\r\n#define rotr32(x,n)   (((x) >> n) | ((x) << (32 - n)))\r\n#endif\r\n\r\n#if !defined(bswap_32)\r\n#define bswap_32(x) ((rotr32((x), 24) & 0x00ff00ff) | (rotr32((x), 8) & 0xff00ff00))\r\n#endif\r\n\r\n#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)\r\n#define SWAP_BYTES\r\n#else\r\n#undef  SWAP_BYTES\r\n#endif\r\n\r\n#if defined(SWAP_BYTES)\r\n#define bsw_32(p,n) \\\r\n    { int _i = (n); while(_i--) ((uint_32t*)p)[_i] = bswap_32(((uint_32t*)p)[_i]); }\r\n#else\r\n#define bsw_32(p,n)\r\n#endif\r\n\r\n#define SHA1_MASK   (SHA1_BLOCK_SIZE - 1)\r\n\r\n#if 0\r\n\r\n#define ch(x,y,z)       (((x) & (y)) ^ (~(x) & (z)))\r\n#define parity(x,y,z)   ((x) ^ (y) ^ (z))\r\n#define maj(x,y,z)      (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))\r\n\r\n#else   /* Discovered by Rich Schroeppel and Colin Plumb   */\r\n\r\n#define ch(x,y,z)       ((z) ^ ((x) & ((y) ^ (z))))\r\n#define parity(x,y,z)   ((x) ^ (y) ^ (z))\r\n#define maj(x,y,z)      (((x) & (y)) | ((z) & ((x) ^ (y))))\r\n\r\n#endif\r\n\r\n/* Compile 64 bytes of hash data into SHA1 context. Note    */\r\n/* that this routine assumes that the byte order in the     */\r\n/* ctx->wbuf[] at this point is in such an order that low   */\r\n/* address bytes in the ORIGINAL byte stream will go in     */\r\n/* this buffer to the high end of 32-bit words on BOTH big  */\r\n/* and little endian systems                                */\r\n\r\n#ifdef ARRAY\r\n#define q(v,n)  v[n]\r\n#else\r\n#define q(v,n)  v##n\r\n#endif\r\n\r\n#define one_cycle(v,a,b,c,d,e,f,k,h)            \\\r\n    q(v,e) += rotr32(q(v,a),27) +               \\\r\n              f(q(v,b),q(v,c),q(v,d)) + k + h;  \\\r\n    q(v,b)  = rotr32(q(v,b), 2)\r\n\r\n#define five_cycle(v,f,k,i)                 \\\r\n    one_cycle(v, 0,1,2,3,4, f,k,hf(i  ));   \\\r\n    one_cycle(v, 4,0,1,2,3, f,k,hf(i+1));   \\\r\n    one_cycle(v, 3,4,0,1,2, f,k,hf(i+2));   \\\r\n    one_cycle(v, 2,3,4,0,1, f,k,hf(i+3));   \\\r\n    one_cycle(v, 1,2,3,4,0, f,k,hf(i+4))\r\n\r\nVOID_RETURN sha1_compile(sha1_ctx ctx[1])\r\n{   uint_32t    *w = ctx->wbuf;\r\n\r\n#ifdef ARRAY\r\n    uint_32t    v[5];\r\n    memcpy(v, ctx->hash, 5 * sizeof(uint_32t));\r\n#else\r\n    uint_32t    v0, v1, v2, v3, v4;\r\n    v0 = ctx->hash[0]; v1 = ctx->hash[1];\r\n    v2 = ctx->hash[2]; v3 = ctx->hash[3];\r\n    v4 = ctx->hash[4];\r\n#endif\r\n\r\n#define hf(i)   w[i]\r\n\r\n    five_cycle(v, ch, 0x5a827999,  0);\r\n    five_cycle(v, ch, 0x5a827999,  5);\r\n    five_cycle(v, ch, 0x5a827999, 10);\r\n    one_cycle(v,0,1,2,3,4, ch, 0x5a827999, hf(15)); \\\r\n\r\n#undef  hf\r\n#define hf(i) (w[(i) & 15] = rotl32(                    \\\r\n                 w[((i) + 13) & 15] ^ w[((i) + 8) & 15] \\\r\n               ^ w[((i) +  2) & 15] ^ w[(i) & 15], 1))\r\n\r\n    one_cycle(v,4,0,1,2,3, ch, 0x5a827999, hf(16));\r\n    one_cycle(v,3,4,0,1,2, ch, 0x5a827999, hf(17));\r\n    one_cycle(v,2,3,4,0,1, ch, 0x5a827999, hf(18));\r\n    one_cycle(v,1,2,3,4,0, ch, 0x5a827999, hf(19));\r\n\r\n    five_cycle(v, parity, 0x6ed9eba1,  20);\r\n    five_cycle(v, parity, 0x6ed9eba1,  25);\r\n    five_cycle(v, parity, 0x6ed9eba1,  30);\r\n    five_cycle(v, parity, 0x6ed9eba1,  35);\r\n\r\n    five_cycle(v, maj, 0x8f1bbcdc,  40);\r\n    five_cycle(v, maj, 0x8f1bbcdc,  45);\r\n    five_cycle(v, maj, 0x8f1bbcdc,  50);\r\n    five_cycle(v, maj, 0x8f1bbcdc,  55);\r\n\r\n    five_cycle(v, parity, 0xca62c1d6,  60);\r\n    five_cycle(v, parity, 0xca62c1d6,  65);\r\n    five_cycle(v, parity, 0xca62c1d6,  70);\r\n    five_cycle(v, parity, 0xca62c1d6,  75);\r\n\r\n#ifdef ARRAY\r\n    ctx->hash[0] += v[0]; ctx->hash[1] += v[1];\r\n    ctx->hash[2] += v[2]; ctx->hash[3] += v[3];\r\n    ctx->hash[4] += v[4];\r\n#else\r\n    ctx->hash[0] += v0; ctx->hash[1] += v1;\r\n    ctx->hash[2] += v2; ctx->hash[3] += v3;\r\n    ctx->hash[4] += v4;\r\n#endif\r\n}\r\n\r\nVOID_RETURN sha1_begin(sha1_ctx ctx[1])\r\n{\r\n    ctx->count[0] = ctx->count[1] = 0;\r\n    ctx->hash[0] = 0x67452301;\r\n    ctx->hash[1] = 0xefcdab89;\r\n    ctx->hash[2] = 0x98badcfe;\r\n    ctx->hash[3] = 0x10325476;\r\n    ctx->hash[4] = 0xc3d2e1f0;\r\n}\r\n\r\n/* SHA1 hash data in an array of bytes into hash buffer and */\r\n/* call the hash_compile function as required.              */\r\n\r\nVOID_RETURN sha1_hash(const unsigned char data[], unsigned long len, sha1_ctx ctx[1])\r\n{   uint_32t pos = (uint_32t)(ctx->count[0] & SHA1_MASK),\r\n            space = SHA1_BLOCK_SIZE - pos;\r\n    const unsigned char *sp = data;\r\n\r\n    if((ctx->count[0] += len) < len)\r\n        ++(ctx->count[1]);\r\n\r\n    while(len >= space)     /* tranfer whole blocks if possible  */\r\n    {\r\n        memcpy(((unsigned char*)ctx->wbuf) + pos, sp, space);\r\n        sp += space; len -= space; space = SHA1_BLOCK_SIZE; pos = 0;\r\n        bsw_32(ctx->wbuf, SHA1_BLOCK_SIZE >> 2);\r\n        sha1_compile(ctx);\r\n    }\r\n\r\n    memcpy(((unsigned char*)ctx->wbuf) + pos, sp, len);\r\n}\r\n\r\n/* SHA1 final padding and digest calculation  */\r\n\r\nVOID_RETURN sha1_end(unsigned char hval[], sha1_ctx ctx[1])\r\n{   uint_32t    i = (uint_32t)(ctx->count[0] & SHA1_MASK);\r\n\r\n    /* put bytes in the buffer in an order in which references to   */\r\n    /* 32-bit words will put bytes with lower addresses into the    */\r\n    /* top of 32 bit words on BOTH big and little endian machines   */\r\n    bsw_32(ctx->wbuf, (i + 3) >> 2);\r\n\r\n    /* we now need to mask valid bytes and add the padding which is */\r\n    /* a single 1 bit and as many zero bits as necessary. Note that */\r\n    /* we can always add the first padding byte here because the    */\r\n    /* buffer always has at least one empty slot                    */\r\n    ctx->wbuf[i >> 2] &= 0xffffff80 << 8 * (~i & 3);\r\n    ctx->wbuf[i >> 2] |= 0x00000080 << 8 * (~i & 3);\r\n\r\n    /* we need 9 or more empty positions, one for the padding byte  */\r\n    /* (above) and eight for the length count. If there is not      */\r\n    /* enough space, pad and empty the buffer                       */\r\n    if(i > SHA1_BLOCK_SIZE - 9)\r\n    {\r\n        if(i < 60) ctx->wbuf[15] = 0;\r\n        sha1_compile(ctx);\r\n        i = 0;\r\n    }\r\n    else    /* compute a word index for the empty buffer positions  */\r\n        i = (i >> 2) + 1;\r\n\r\n    while(i < 14) /* and zero pad all but last two positions        */\r\n        ctx->wbuf[i++] = 0;\r\n\r\n    /* the following 32-bit length fields are assembled in the      */\r\n    /* wrong byte order on little endian machines but this is       */\r\n    /* corrected later since they are only ever used as 32-bit      */\r\n    /* word values.                                                 */\r\n    ctx->wbuf[14] = (ctx->count[1] << 3) | (ctx->count[0] >> 29);\r\n    ctx->wbuf[15] = ctx->count[0] << 3;\r\n    sha1_compile(ctx);\r\n\r\n    /* extract the hash value as bytes in case the hash buffer is   */\r\n    /* misaligned for 32-bit words                                  */\r\n    for(i = 0; i < SHA1_DIGEST_SIZE; ++i)\r\n        hval[i] = (unsigned char)(ctx->hash[i >> 2] >> (8 * (~i & 3)));\r\n}\r\n\r\nVOID_RETURN sha1(unsigned char hval[], const unsigned char data[], unsigned long len)\r\n{   sha1_ctx    cx[1];\r\n\r\n    sha1_begin(cx); sha1_hash(data, len, cx); sha1_end(hval, cx);\r\n}\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/aes/sha1.h",
    "content": "/*\r\n ---------------------------------------------------------------------------\r\n Copyright (c) 2002, Dr Brian Gladman, Worcester, UK.   All rights reserved.\r\n\r\n LICENSE TERMS\r\n\r\n The free distribution and use of this software in both source and binary\r\n form is allowed (with or without changes) provided that:\r\n\r\n   1. distributions of this source code include the above copyright\r\n      notice, this list of conditions and the following disclaimer;\r\n\r\n   2. distributions in binary form include the above copyright\r\n      notice, this list of conditions and the following disclaimer\r\n      in the documentation and/or other associated materials;\r\n\r\n   3. the copyright holder's name is not used to endorse products\r\n      built using this software without specific written permission.\r\n\r\n ALTERNATIVELY, provided that this notice is retained in full, this product\r\n may be distributed under the terms of the GNU General Public License (GPL),\r\n in which case the provisions of the GPL apply INSTEAD OF those given above.\r\n\r\n DISCLAIMER\r\n\r\n This software is provided 'as is' with no explicit or implied warranties\r\n in respect of its properties, including, but not limited to, correctness\r\n and/or fitness for purpose.\r\n ---------------------------------------------------------------------------\r\n Issue Date: 01/08/2005\r\n*/\r\n\r\n#ifndef _SHA1_H\r\n#define _SHA1_H\r\n\r\n#include <stdlib.h>\r\n#include \"brg_types.h\"\r\n\r\n#define SHA1_BLOCK_SIZE  64\r\n#define SHA1_DIGEST_SIZE 20\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\"\r\n{\r\n#endif\r\n\r\n/* type to hold the SHA256 context  */\r\n\r\ntypedef struct\r\n{   uint_32t count[2];\r\n    uint_32t hash[5];\r\n    uint_32t wbuf[16];\r\n} sha1_ctx;\r\n\r\n/* Note that these prototypes are the same for both bit and */\r\n/* byte oriented implementations. However the length fields */\r\n/* are in bytes or bits as appropriate for the version used */\r\n/* and bit sequences are input as arrays of bytes in which  */\r\n/* bit sequences run from the most to the least significant */\r\n/* end of each byte                                         */\r\n\r\nVOID_RETURN sha1_compile(sha1_ctx ctx[1]);\r\n\r\nVOID_RETURN sha1_begin(sha1_ctx ctx[1]);\r\nVOID_RETURN sha1_hash(const unsigned char data[], unsigned long len, sha1_ctx ctx[1]);\r\nVOID_RETURN sha1_end(unsigned char hval[], sha1_ctx ctx[1]);\r\nVOID_RETURN sha1(unsigned char hval[], const unsigned char data[], unsigned long len);\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/minizip/crypt.h",
    "content": "/* crypt.h -- base code for traditional PKWARE encryption\n   Version 1.01e, February 12th, 2005\n\n   Copyright (C) 1998-2005 Gilles Vollant\n   Modifications for Info-ZIP crypting\n     Copyright (C) 2003 Terry Thorsen\n\n   This code is a modified version of crypting code in Info-ZIP distribution\n\n   Copyright (C) 1990-2000 Info-ZIP.  All rights reserved.\n\n   See the Info-ZIP LICENSE file version 2000-Apr-09 or later for terms of use\n   which also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html\n\n   The encryption/decryption parts of this source code (as opposed to the\n   non-echoing password parts) were originally written in Europe. The\n   whole source package can be freely distributed, including from the USA.\n   (Prior to January 2000, re-export from the US was a violation of US law.)\n\n   This encryption code is a direct transcription of the algorithm from\n   Roger Schlafly, described by Phil Katz in the file appnote.txt. This\n   file (appnote.txt) is distributed with the PKZIP program (even in the\n   version without encryption capabilities).\n\n   If you don't need crypting in your application, just define symbols\n   NOCRYPT and NOUNCRYPT.\n*/\n\n#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))\n\n/***********************************************************************\n * Return the next byte in the pseudo-random sequence\n */\nstatic int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab)\n{\n    unsigned temp;  /* POTENTIAL BUG:  temp*(temp^1) may overflow in an\n                     * unpredictable manner on 16-bit systems; not a problem\n                     * with any known compiler so far, though */\n\n    temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;\n    return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);\n}\n\n/***********************************************************************\n * Update the encryption keys with the next byte of plain text\n */\nstatic int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c)\n{\n    (*(pkeys+0)) = CRC32((*(pkeys+0)), c);\n    (*(pkeys+1)) += (*(pkeys+0)) & 0xff;\n    (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;\n    {\n      register int keyshift = (int)((*(pkeys+1)) >> 24);\n      (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);\n    }\n    return c;\n}\n\n\n/***********************************************************************\n * Initialize the encryption keys and the random header according to\n * the given password.\n */\nstatic void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab)\n{\n    *(pkeys+0) = 305419896L;\n    *(pkeys+1) = 591751049L;\n    *(pkeys+2) = 878082192L;\n    while (*passwd != 0) {\n        update_keys(pkeys,pcrc_32_tab,(int)*passwd);\n        passwd++;\n    }\n}\n\n#define zdecode(pkeys,pcrc_32_tab,c) \\\n    (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))\n\n#define zencode(pkeys,pcrc_32_tab,c,t) \\\n    (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))\n\n#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED\n\n#define RAND_HEAD_LEN  12\n   /* \"last resort\" source for second part of crypt seed pattern */\n#  ifndef ZCR_SEED2\n#    define ZCR_SEED2 3141592654UL     /* use PI as default pattern */\n#  endif\n\nstatic int crypthead(const char* passwd,      /* password string */\n                     unsigned char* buf,      /* where to write header */\n                     int bufSize,\n                     unsigned long* pkeys,\n                     const unsigned long* pcrc_32_tab,\n                     unsigned long crcForCrypting)\n{\n    int n;                                  /* index in random header */\n    int t;                                  /* temporary */\n    int c;                                  /* random byte */\n    unsigned char header[RAND_HEAD_LEN-2];  /* random header */\n    static unsigned calls = 0;              /* ensure different random header each time */\n\n    if (bufSize<RAND_HEAD_LEN)\n      return 0;\n\n    /* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the\n     * output of rand() to get less predictability, since rand() is\n     * often poorly implemented.\n     */\n    if (++calls == 1)\n    {\n        srand((unsigned)(time(NULL) ^ ZCR_SEED2));\n    }\n    init_keys(passwd, pkeys, pcrc_32_tab);\n    for (n = 0; n < RAND_HEAD_LEN-2; n++)\n    {\n        c = (rand() >> 7) & 0xff;\n        header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t);\n    }\n    /* Encrypt random header (last two bytes is high word of crc) */\n    init_keys(passwd, pkeys, pcrc_32_tab);\n    for (n = 0; n < RAND_HEAD_LEN-2; n++)\n    {\n        buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t);\n    }\n    buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t);\n    buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);\n    return n;\n}\n\n#endif\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/minizip/ioapi.c",
    "content": "/* ioapi.h -- IO base function header for compress/uncompress .zip\n   part of the MiniZip project\n\n   Copyright (C) 1998-2010 Gilles Vollant\n     http://www.winimage.com/zLibDll/minizip.html\n   Modifications for Zip64 support\n     Copyright (C) 2009-2010 Mathias Svensson\n     http://result42.com\n\n   This program is distributed under the terms of the same license as zlib.\n   See the accompanying LICENSE file for the full text of the license.\n*/\n\n#include <stdlib.h>\n#include <string.h>\n\n#include \"ioapi.h\"\n\n#if defined(_WIN32)\n#  define snprintf _snprintf\n#endif\n\n#ifdef __APPLE__\n/* In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions */\n#  define FOPEN_FUNC(filename, mode) fopen(filename, mode)\n#  define FTELLO_FUNC(stream) ftello(stream)\n#  define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin)\n#else\n#  define FOPEN_FUNC(filename, mode) fopen64(filename, mode)\n#  define FTELLO_FUNC(stream) ftello64(stream)\n#  define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin)\n#endif\n\n/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */\n#ifndef SEEK_CUR\n#  define SEEK_CUR    1\n#endif\n#ifndef SEEK_END\n#  define SEEK_END    2\n#endif\n#ifndef SEEK_SET\n#  define SEEK_SET    0\n#endif\n\nvoidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)\n{\n    if (pfilefunc->zfile_func64.zopen64_file != NULL)\n        return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode);\n    return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque,(const char*)filename,mode);\n}\n\nvoidpf call_zopendisk64 OF((const zlib_filefunc64_32_def* pfilefunc, voidpf filestream, int number_disk, int mode))\n{\n    if (pfilefunc->zfile_func64.zopendisk64_file != NULL)\n        return (*(pfilefunc->zfile_func64.zopendisk64_file)) (pfilefunc->zfile_func64.opaque,filestream,number_disk,mode);\n    return (*(pfilefunc->zopendisk32_file))(pfilefunc->zfile_func64.opaque,filestream,number_disk,mode);\n}\n\nlong call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)\n{\n    uLong offsetTruncated;\n    if (pfilefunc->zfile_func64.zseek64_file != NULL)\n        return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin);\n    offsetTruncated = (uLong)offset;\n    if (offsetTruncated != offset)\n        return -1;\n    return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream,offsetTruncated,origin);\n}\n\nZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)\n{\n    uLong tell_uLong;\n    if (pfilefunc->zfile_func64.zseek64_file != NULL)\n        return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream);\n    tell_uLong = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream);\n    if ((tell_uLong) == 0xffffffff)\n        return (ZPOS64_T)-1;\n    return tell_uLong;\n}\n\nvoid fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32)\n{\n    p_filefunc64_32->zfile_func64.zopen64_file = NULL;\n    p_filefunc64_32->zfile_func64.zopendisk64_file = NULL;\n    p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file;\n    p_filefunc64_32->zopendisk32_file = p_filefunc32->zopendisk_file;\n    p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;\n    p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file;\n    p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file;\n    p_filefunc64_32->zfile_func64.ztell64_file = NULL;\n    p_filefunc64_32->zfile_func64.zseek64_file = NULL;\n    p_filefunc64_32->zfile_func64.zclose_file = p_filefunc32->zclose_file;\n    p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;\n    p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque;\n    p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file;\n    p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file;\n}\n\nstatic voidpf  ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode));\nstatic uLong   ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size));\nstatic uLong   ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size));\nstatic ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream));\nstatic long    ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));\nstatic int     ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream));\nstatic int     ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream));\n\ntypedef struct \n{\n    FILE *file;\n    int filenameLength;\n    void *filename;\n} FILE_IOPOSIX;\n\nstatic voidpf file_build_ioposix(FILE *file, const char *filename)\n{\n    FILE_IOPOSIX *ioposix = NULL;\n    if (file == NULL)\n        return NULL;\n    ioposix = (FILE_IOPOSIX*)malloc(sizeof(FILE_IOPOSIX));\n    ioposix->file = file;\n    ioposix->filenameLength = (int)strlen(filename) + 1;\n    ioposix->filename = (char*)malloc(ioposix->filenameLength * sizeof(char));\n    strncpy(ioposix->filename, filename, ioposix->filenameLength);\n    return (voidpf)ioposix;\n}\n\nstatic voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode)\n{\n    FILE* file = NULL;\n    const char* mode_fopen = NULL;\n    if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) == ZLIB_FILEFUNC_MODE_READ)\n        mode_fopen = \"rb\";\n    else if (mode & ZLIB_FILEFUNC_MODE_EXISTING)\n        mode_fopen = \"r+b\";\n    else if (mode & ZLIB_FILEFUNC_MODE_CREATE)\n        mode_fopen = \"wb\";\n\n    if ((filename != NULL) && (mode_fopen != NULL))\n    {\n        file = fopen(filename, mode_fopen);\n        return file_build_ioposix(file, filename);\n    }\n    return file;\n}\n\nstatic voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode)\n{\n    FILE* file = NULL;\n    const char* mode_fopen = NULL;\n    if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) == ZLIB_FILEFUNC_MODE_READ)\n        mode_fopen = \"rb\";\n    else if (mode & ZLIB_FILEFUNC_MODE_EXISTING)\n        mode_fopen = \"r+b\";\n    else if (mode & ZLIB_FILEFUNC_MODE_CREATE)\n        mode_fopen = \"wb\";\n\n    if ((filename != NULL) && (mode_fopen != NULL))\n    {\n        file = FOPEN_FUNC((const char*)filename, mode_fopen);\n        return file_build_ioposix(file, (const char*)filename);\n    }\n    return file;\n}\n\nstatic voidpf ZCALLBACK fopendisk64_file_func (voidpf opaque, voidpf stream, int number_disk, int mode)\n{\n    FILE_IOPOSIX *ioposix = NULL;\n    char *diskFilename = NULL;\n    voidpf ret = NULL;\n    int i = 0;\n\n    if (stream == NULL)\n        return NULL;\n    ioposix = (FILE_IOPOSIX*)stream;\n    diskFilename = (char*)malloc(ioposix->filenameLength * sizeof(char));\n    strncpy(diskFilename, ioposix->filename, ioposix->filenameLength);\n    for (i = ioposix->filenameLength - 1; i >= 0; i -= 1)\n    {\n        if (diskFilename[i] != '.') \n            continue;\n        snprintf(&diskFilename[i], ioposix->filenameLength - i, \".z%02d\", number_disk + 1);\n        break;\n    }\n    if (i >= 0)\n        ret = fopen64_file_func(opaque, diskFilename, mode);\n    free(diskFilename);\n    return ret;\n}\n\nstatic voidpf ZCALLBACK fopendisk_file_func (voidpf opaque, voidpf stream, int number_disk, int mode)\n{\n    FILE_IOPOSIX *ioposix = NULL;\n    char *diskFilename = NULL;\n    voidpf ret = NULL;\n    int i = 0;\n\n    if (stream == NULL)\n        return NULL;\n    ioposix = (FILE_IOPOSIX*)stream;\n    diskFilename = (char*)malloc(ioposix->filenameLength * sizeof(char));\n    strncpy(diskFilename, ioposix->filename, ioposix->filenameLength);\n    for (i = ioposix->filenameLength - 1; i >= 0; i -= 1)\n    {\n        if (diskFilename[i] != '.') \n            continue;\n        snprintf(&diskFilename[i], ioposix->filenameLength - i, \".z%02d\", number_disk + 1);\n        break;\n    }\n    if (i >= 0)\n        ret = fopen_file_func(opaque, diskFilename, mode);\n    free(diskFilename);\n    return ret;\n}\n\nstatic uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size)\n{\n    FILE_IOPOSIX *ioposix = NULL;\n    uLong ret;\n    if (stream == NULL)\n        return -1;\n    ioposix = (FILE_IOPOSIX*)stream;\n    ret = (uLong)fread(buf, 1, (size_t)size, ioposix->file);\n    return ret;\n}\n\nstatic uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size)\n{\n    FILE_IOPOSIX *ioposix = NULL;\n    uLong ret;\n    if (stream == NULL)\n        return -1;\n    ioposix = (FILE_IOPOSIX*)stream;\n    ret = (uLong)fwrite(buf, 1, (size_t)size, ioposix->file);\n    return ret;\n}\n\nstatic long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream)\n{\n    FILE_IOPOSIX *ioposix = NULL;\n    long ret = -1;\n    if (stream == NULL)\n        return ret;\n    ioposix = (FILE_IOPOSIX*)stream;\n    ret = ftell(ioposix->file);\n    return ret;\n}\n\nstatic ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream)\n{\n    FILE_IOPOSIX *ioposix = NULL;\n    ZPOS64_T ret = -1;\n    if (stream == NULL)\n        return ret;\n    ioposix = (FILE_IOPOSIX*)stream;\n    ret = FTELLO_FUNC(ioposix->file);\n    return ret;\n}\n\nstatic long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offset, int origin)\n{\n    FILE_IOPOSIX *ioposix = NULL;\n    int fseek_origin = 0;\n    long ret = 0;\n\n    if (stream == NULL)\n        return -1;\n    ioposix = (FILE_IOPOSIX*)stream;\n\n    switch (origin)\n    {\n        case ZLIB_FILEFUNC_SEEK_CUR:\n            fseek_origin = SEEK_CUR;\n            break;\n        case ZLIB_FILEFUNC_SEEK_END:\n            fseek_origin = SEEK_END;\n            break;\n        case ZLIB_FILEFUNC_SEEK_SET:\n            fseek_origin = SEEK_SET;\n            break;\n        default:\n            return -1;\n    }\n    if (fseek(ioposix->file, offset, fseek_origin) != 0)\n        ret = -1;\n    return ret;\n}\n\nstatic long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)\n{\n    FILE_IOPOSIX *ioposix = NULL;\n    int fseek_origin = 0;\n    long ret = 0;\n\n    if (stream == NULL)\n        return -1;\n    ioposix = (FILE_IOPOSIX*)stream;\n\n    switch (origin)\n    {\n        case ZLIB_FILEFUNC_SEEK_CUR:\n            fseek_origin = SEEK_CUR;\n            break;\n        case ZLIB_FILEFUNC_SEEK_END:\n            fseek_origin = SEEK_END;\n            break;\n        case ZLIB_FILEFUNC_SEEK_SET:\n            fseek_origin = SEEK_SET;\n            break;\n        default:\n            return -1;\n    }\n\n    if(FSEEKO_FUNC(ioposix->file, offset, fseek_origin) != 0)\n        ret = -1;\n\n    return ret;\n}\n\n\nstatic int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream)\n{\n    FILE_IOPOSIX *ioposix = NULL;\n    int ret = -1;\n    if (stream == NULL)\n        return ret;\n    ioposix = (FILE_IOPOSIX*)stream;\n    if (ioposix->filename != NULL)\n        free(ioposix->filename);\n    ret = fclose(ioposix->file);\n    free(ioposix);\n    return ret;\n}\n\nstatic int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream)\n{\n    FILE_IOPOSIX *ioposix = NULL;\n    int ret = -1;\n    if (stream == NULL)\n        return ret;\n    ioposix = (FILE_IOPOSIX*)stream;\n    ret = ferror(ioposix->file);\n    return ret;\n}\n\nvoid fill_fopen_filefunc (zlib_filefunc_def* pzlib_filefunc_def)\n{\n    pzlib_filefunc_def->zopen_file = fopen_file_func;\n    pzlib_filefunc_def->zopendisk_file = fopendisk_file_func;\n    pzlib_filefunc_def->zread_file = fread_file_func;\n    pzlib_filefunc_def->zwrite_file = fwrite_file_func;\n    pzlib_filefunc_def->ztell_file = ftell_file_func;\n    pzlib_filefunc_def->zseek_file = fseek_file_func;\n    pzlib_filefunc_def->zclose_file = fclose_file_func;\n    pzlib_filefunc_def->zerror_file = ferror_file_func;\n    pzlib_filefunc_def->opaque = NULL;\n}\n\nvoid fill_fopen64_filefunc (zlib_filefunc64_def* pzlib_filefunc_def)\n{\n    pzlib_filefunc_def->zopen64_file = fopen64_file_func;\n    pzlib_filefunc_def->zopendisk64_file = fopendisk64_file_func;\n    pzlib_filefunc_def->zread_file = fread_file_func;\n    pzlib_filefunc_def->zwrite_file = fwrite_file_func;\n    pzlib_filefunc_def->ztell64_file = ftell64_file_func;\n    pzlib_filefunc_def->zseek64_file = fseek64_file_func;\n    pzlib_filefunc_def->zclose_file = fclose_file_func;\n    pzlib_filefunc_def->zerror_file = ferror_file_func;\n    pzlib_filefunc_def->opaque = NULL;\n}\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/minizip/ioapi.h",
    "content": "/* ioapi.h -- IO base function header for compress/uncompress .zip\n   part of the MiniZip project\n\n   Copyright (C) 1998-2010 Gilles Vollant\n     http://www.winimage.com/zLibDll/minizip.html\n   Modifications for Zip64 support\n     Copyright (C) 2009-2010 Mathias Svensson\n     http://result42.com\n\n   This program is distributed under the terms of the same license as zlib.\n   See the accompanying LICENSE file for the full text of the license.\n*/\n\n#ifndef _ZLIBIOAPI64_H\n#define _ZLIBIOAPI64_H\n\n#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__))\n#  ifndef __USE_FILE_OFFSET64\n#    define __USE_FILE_OFFSET64\n#  endif\n#  ifndef __USE_LARGEFILE64\n#    define __USE_LARGEFILE64\n#  endif\n#  ifndef _LARGEFILE64_SOURCE\n#    define _LARGEFILE64_SOURCE\n#  endif\n#  ifndef _FILE_OFFSET_BIT\n#    define _FILE_OFFSET_BIT 64\n#  endif\n#endif\n\n#include <stdio.h>\n#include <stdlib.h>\n#include \"zlib.h\"\n\n#if defined(USE_FILE32API)\n#  define fopen64 fopen\n#  define ftello64 ftell\n#  define fseeko64 fseek\n#else\n#  if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__)\n#    define fopen64 fopen\n#    define ftello64 ftello\n#    define fseeko64 fseeko\n#  endif\n#  ifdef _MSC_VER\n#    define fopen64 fopen\n#    if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC)))\n#      define ftello64 _ftelli64\n#      define fseeko64 _fseeki64\n#    else /* old MSC */\n#      define ftello64 ftell\n#      define fseeko64 fseek\n#    endif\n#  endif\n#endif\n\n/* a type choosen by DEFINE */\n#ifdef HAVE_64BIT_INT_CUSTOM\ntypedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T;\n#else\n#  ifdef HAS_STDINT_H\n#    include \"stdint.h\"\n     typedef uint64_t ZPOS64_T;\n#  else\n#    if defined(_MSC_VER) || defined(__BORLANDC__)\n       typedef unsigned __int64 ZPOS64_T;\n#    else\n       typedef unsigned long long int ZPOS64_T;\n#    endif\n#  endif\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define ZLIB_FILEFUNC_SEEK_CUR (1)\n#define ZLIB_FILEFUNC_SEEK_END (2)\n#define ZLIB_FILEFUNC_SEEK_SET (0)\n\n#define ZLIB_FILEFUNC_MODE_READ             (1)\n#define ZLIB_FILEFUNC_MODE_WRITE            (2)\n#define ZLIB_FILEFUNC_MODE_READWRITEFILTER  (3)\n#define ZLIB_FILEFUNC_MODE_EXISTING         (4)\n#define ZLIB_FILEFUNC_MODE_CREATE           (8)\n\n#ifndef ZCALLBACK\n#  if (defined(WIN32) || defined(_WIN32) || defined (WINDOWS) || \\\n       defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)\n#    define ZCALLBACK CALLBACK\n#  else\n#    define ZCALLBACK\n#  endif\n#endif\n\ntypedef voidpf   (ZCALLBACK *open_file_func)      OF((voidpf opaque, const char* filename, int mode));\ntypedef voidpf   (ZCALLBACK *opendisk_file_func)  OF((voidpf opaque, voidpf stream, int number_disk, int mode));\ntypedef uLong    (ZCALLBACK *read_file_func)      OF((voidpf opaque, voidpf stream, void* buf, uLong size));\ntypedef uLong    (ZCALLBACK *write_file_func)     OF((voidpf opaque, voidpf stream, const void* buf, uLong size));\ntypedef int      (ZCALLBACK *close_file_func)     OF((voidpf opaque, voidpf stream));\ntypedef int      (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream));\n\ntypedef long     (ZCALLBACK *tell_file_func)      OF((voidpf opaque, voidpf stream));\ntypedef long     (ZCALLBACK *seek_file_func)      OF((voidpf opaque, voidpf stream, uLong offset, int origin));\n\n/* here is the \"old\" 32 bits structure structure */\ntypedef struct zlib_filefunc_def_s\n{\n    open_file_func      zopen_file;\n    opendisk_file_func  zopendisk_file;\n    read_file_func      zread_file;\n    write_file_func     zwrite_file;\n    tell_file_func      ztell_file;\n    seek_file_func      zseek_file;\n    close_file_func     zclose_file;\n    testerror_file_func zerror_file;\n    voidpf              opaque;\n} zlib_filefunc_def;\n\ntypedef ZPOS64_T (ZCALLBACK *tell64_file_func)    OF((voidpf opaque, voidpf stream));\ntypedef long     (ZCALLBACK *seek64_file_func)    OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));\ntypedef voidpf   (ZCALLBACK *open64_file_func)    OF((voidpf opaque, const void* filename, int mode));\ntypedef voidpf   (ZCALLBACK *opendisk64_file_func)OF((voidpf opaque, voidpf stream, int number_disk, int mode));\n\ntypedef struct zlib_filefunc64_def_s\n{\n    open64_file_func     zopen64_file;\n    opendisk64_file_func zopendisk64_file;\n    read_file_func       zread_file;\n    write_file_func      zwrite_file;\n    tell64_file_func     ztell64_file;\n    seek64_file_func     zseek64_file;\n    close_file_func      zclose_file;\n    testerror_file_func  zerror_file;\n    voidpf               opaque;\n} zlib_filefunc64_def;\n\nvoid fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));\nvoid fill_fopen64_filefunc OF((zlib_filefunc64_def* pzlib_filefunc_def));\n\n/* now internal definition, only for zip.c and unzip.h */\ntypedef struct zlib_filefunc64_32_def_s\n{\n    zlib_filefunc64_def zfile_func64;\n    open_file_func      zopen32_file;\n    opendisk_file_func  zopendisk32_file;\n    tell_file_func      ztell32_file;\n    seek_file_func      zseek32_file;\n} zlib_filefunc64_32_def;\n\n#define ZREAD64(filefunc,filestream,buf,size)       ((*((filefunc).zfile_func64.zread_file))        ((filefunc).zfile_func64.opaque,filestream,buf,size))\n#define ZWRITE64(filefunc,filestream,buf,size)      ((*((filefunc).zfile_func64.zwrite_file))       ((filefunc).zfile_func64.opaque,filestream,buf,size))\n/*#define ZTELL64(filefunc,filestream)                ((*((filefunc).ztell64_file))                   ((filefunc).opaque,filestream))*/\n/*#define ZSEEK64(filefunc,filestream,pos,mode)       ((*((filefunc).zseek64_file))                   ((filefunc).opaque,filestream,pos,mode))*/\n#define ZCLOSE64(filefunc,filestream)               ((*((filefunc).zfile_func64.zclose_file))       ((filefunc).zfile_func64.opaque,filestream))\n#define ZERROR64(filefunc,filestream)               ((*((filefunc).zfile_func64.zerror_file))       ((filefunc).zfile_func64.opaque,filestream))\n\nvoidpf   call_zopen64 OF((const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode));\nvoidpf   call_zopendisk64 OF((const zlib_filefunc64_32_def* pfilefunc, voidpf filestream, int number_disk, int mode));\nlong     call_zseek64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin));\nZPOS64_T call_ztell64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream));\n\nvoid fill_zlib_filefunc64_32_def_from_filefunc32 OF((zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32));\n\n#define ZOPEN64(filefunc,filename,mode)             (call_zopen64((&(filefunc)),(filename),(mode)))\n#define ZOPENDISK64(filefunc,filestream,diskn,mode) (call_zopendisk64((&(filefunc)),(filestream),(diskn),(mode)))\n#define ZTELL64(filefunc,filestream)                (call_ztell64((&(filefunc)),(filestream)))\n#define ZSEEK64(filefunc,filestream,pos,mode)       (call_zseek64((&(filefunc)),(filestream),(pos),(mode)))\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/minizip/mztools.c",
    "content": "/*\n  Additional tools for Minizip\n  Code: Xavier Roche '2004\n  License: Same as ZLIB (www.gzip.org)\n*/\n\n/* Code */\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include \"zlib.h\"\n#include \"unzip.h\"\n#include \"mztools.h\"\n\n#define READ_8(adr)  ((unsigned char)*(adr))\n#define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) )\n#define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) )\n\n#define WRITE_8(buff, n) do { \\\n  *((unsigned char*)(buff)) = (unsigned char) ((n) & 0xff); \\\n} while(0)\n#define WRITE_16(buff, n) do { \\\n  WRITE_8((unsigned char*)(buff), n); \\\n  WRITE_8(((unsigned char*)(buff)) + 1, (n) >> 8); \\\n} while(0)\n#define WRITE_32(buff, n) do { \\\n  WRITE_16((unsigned char*)(buff), (n) & 0xffff); \\\n  WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \\\n} while(0)\n\nextern int ZEXPORT unzRepair(file, fileOut, fileOutTmp, nRecovered, bytesRecovered)\nconst char* file;\nconst char* fileOut;\nconst char* fileOutTmp;\nuLong* nRecovered;\nuLong* bytesRecovered;\n{\n  int err = Z_OK;\n  FILE* fpZip = fopen(file, \"rb\");\n  FILE* fpOut = fopen(fileOut, \"wb\");\n  FILE* fpOutCD = fopen(fileOutTmp, \"wb\");\n  if (fpZip != NULL &&  fpOut != NULL) {\n    int entries = 0;\n    uLong totalBytes = 0;\n    char header[30];\n    char filename[256];\n    char extra[1024];\n    int offset = 0;\n    int offsetCD = 0;\n    while ( fread(header, 1, 30, fpZip) == 30 ) {\n      int currentOffset = offset;\n\n      /* File entry */\n      if (READ_32(header) == 0x04034b50) {\n        unsigned int version = READ_16(header + 4);\n        unsigned int gpflag = READ_16(header + 6);\n        unsigned int method = READ_16(header + 8);\n        unsigned int filetime = READ_16(header + 10);\n        unsigned int filedate = READ_16(header + 12);\n        unsigned int crc = READ_32(header + 14); /* crc */\n        unsigned int cpsize = READ_32(header + 18); /* compressed size */\n        unsigned int uncpsize = READ_32(header + 22); /* uncompressed sz */\n        unsigned int fnsize = READ_16(header + 26); /* file name length */\n        unsigned int extsize = READ_16(header + 28); /* extra field length */\n        filename[0] = extra[0] = '\\0';\n        \n        /* Header */\n        if (fwrite(header, 1, 30, fpOut) == 30) {\n          offset += 30;\n        } else {\n          err = Z_ERRNO;\n          break;\n        }\n        \n        /* Filename */\n        if (fnsize > 0) {\n          if (fread(filename, 1, fnsize, fpZip) == fnsize) {\n            if (fwrite(filename, 1, fnsize, fpOut) == fnsize) {\n              offset += fnsize;\n            } else {\n              err = Z_ERRNO;\n              break;\n            }\n          } else {\n            err = Z_ERRNO;\n            break;\n          }\n        } else {\n          err = Z_STREAM_ERROR;\n          break;\n        }\n\n        /* Extra field */\n        if (extsize > 0) {\n          if (fread(extra, 1, extsize, fpZip) == extsize) {\n            if (fwrite(extra, 1, extsize, fpOut) == extsize) {\n              offset += extsize;\n            } else {\n              err = Z_ERRNO;\n              break;\n            }\n          } else {\n            err = Z_ERRNO;\n            break;\n          }\n        }\n        \n        /* Data */\n        {\n          int dataSize = cpsize;\n          if (dataSize == 0) {\n            dataSize = uncpsize;\n          }\n          if (dataSize > 0) {\n            char* data = malloc(dataSize);\n            if (data != NULL) {\n              if ((int)fread(data, 1, dataSize, fpZip) == dataSize) {\n                if ((int)fwrite(data, 1, dataSize, fpOut) == dataSize) {\n                  offset += dataSize;\n                  totalBytes += dataSize;\n                } else {\n                  err = Z_ERRNO;\n                }\n              } else {\n                err = Z_ERRNO;\n              }\n              free(data);\n              if (err != Z_OK) {\n                break;\n              }\n            } else {\n              err = Z_MEM_ERROR;\n              break;\n            }\n          }\n        }\n        \n        /* Central directory entry */\n        {\n          char centralDirectoryEntryHeader[46];\n          //char* comment = \"\";\n          //int comsize = (int) strlen(comment);\n          WRITE_32(centralDirectoryEntryHeader, 0x02014b50);\n          WRITE_16(centralDirectoryEntryHeader + 4, version);\n          WRITE_16(centralDirectoryEntryHeader + 6, version);\n          WRITE_16(centralDirectoryEntryHeader + 8, gpflag);\n          WRITE_16(centralDirectoryEntryHeader + 10, method);\n          WRITE_16(centralDirectoryEntryHeader + 12, filetime);\n          WRITE_16(centralDirectoryEntryHeader + 14, filedate);\n          WRITE_32(centralDirectoryEntryHeader + 16, crc);\n          WRITE_32(centralDirectoryEntryHeader + 20, cpsize);\n          WRITE_32(centralDirectoryEntryHeader + 24, uncpsize);\n          WRITE_16(centralDirectoryEntryHeader + 28, fnsize);\n          WRITE_16(centralDirectoryEntryHeader + 30, extsize);\n          WRITE_16(centralDirectoryEntryHeader + 32, 0 /*comsize*/);\n          WRITE_16(centralDirectoryEntryHeader + 34, 0);     /* disk # */\n          WRITE_16(centralDirectoryEntryHeader + 36, 0);     /* int attrb */\n          WRITE_32(centralDirectoryEntryHeader + 38, 0);     /* ext attrb */\n          WRITE_32(centralDirectoryEntryHeader + 42, currentOffset);\n          /* Header */\n          if (fwrite(centralDirectoryEntryHeader, 1, 46, fpOutCD) == 46) {\n            offsetCD += 46;\n            \n            /* Filename */\n            if (fnsize > 0) {\n              if (fwrite(filename, 1, fnsize, fpOutCD) == fnsize) {\n                offsetCD += fnsize;\n              } else {\n                err = Z_ERRNO;\n                break;\n              }\n            } else {\n              err = Z_STREAM_ERROR;\n              break;\n            }\n            \n            /* Extra field */\n            if (extsize > 0) {\n              if (fwrite(extra, 1, extsize, fpOutCD) == extsize) {\n                offsetCD += extsize;\n              } else {\n                err = Z_ERRNO;\n                break;\n              }\n            }\n            \n            /* Comment field */\n            /*\n            if (comsize > 0) {\n              if ((int)fwrite(comment, 1, comsize, fpOutCD) == comsize) {\n                offsetCD += comsize;\n              } else {\n                err = Z_ERRNO;\n                break;\n              }\n            }\n            */\n            \n          } else {\n            err = Z_ERRNO;\n            break;\n          }\n        }\n\n        /* Success */\n        entries++;\n\n      } else {\n        break;\n      }\n    }\n\n    /* Final central directory  */\n    {\n      int entriesZip = entries;\n      char finalCentralDirectoryHeader[22];\n      //char* comment = \"\"; // \"ZIP File recovered by zlib/minizip/mztools\";\n      //int comsize = (int) strlen(comment);\n      if (entriesZip > 0xffff) {\n        entriesZip = 0xffff;\n      }\n      WRITE_32(finalCentralDirectoryHeader, 0x06054b50);\n      WRITE_16(finalCentralDirectoryHeader + 4, 0);    /* disk # */\n      WRITE_16(finalCentralDirectoryHeader + 6, 0);    /* disk # */\n      WRITE_16(finalCentralDirectoryHeader + 8, entriesZip);   /* hack */\n      WRITE_16(finalCentralDirectoryHeader + 10, entriesZip);  /* hack */\n      WRITE_32(finalCentralDirectoryHeader + 12, offsetCD);    /* size of CD */\n      WRITE_32(finalCentralDirectoryHeader + 16, offset);      /* offset to CD */\n      WRITE_16(finalCentralDirectoryHeader + 20, 0 /*comsize*/);     /* comment */\n      \n      /* Header */\n      if (fwrite(finalCentralDirectoryHeader, 1, 22, fpOutCD) == 22) {\n        \n        /* Comment field */\n        /*\n        if (comsize > 0) {\n          if ((int)fwrite(comment, 1, comsize, fpOutCD) != comsize) {\n            err = Z_ERRNO;\n          }\n        }\n        */\n      } else {\n        err = Z_ERRNO;\n      }\n    }\n\n    /* Final merge (file + central directory) */\n    fclose(fpOutCD);\n    if (err == Z_OK) {\n      fpOutCD = fopen(fileOutTmp, \"rb\");\n      if (fpOutCD != NULL) {\n        int nRead;\n        char buffer[8192];\n        while ( (nRead = (int)fread(buffer, 1, sizeof(buffer), fpOutCD)) > 0) {\n          if ((int)fwrite(buffer, 1, nRead, fpOut) != nRead) {\n            err = Z_ERRNO;\n            break;\n          }\n        }\n        fclose(fpOutCD);\n      }\n    }\n    \n    /* Close */\n    fclose(fpZip);\n    fclose(fpOut);\n    \n    /* Wipe temporary file */\n    (void)remove(fileOutTmp);\n    \n    /* Number of recovered entries */\n    if (err == Z_OK) {\n      if (nRecovered != NULL) {\n        *nRecovered = entries;\n      }\n      if (bytesRecovered != NULL) {\n        *bytesRecovered = totalBytes;\n      }\n    }\n  } else {\n    err = Z_STREAM_ERROR;\n  }\n  return err;\n}\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/minizip/mztools.h",
    "content": "/*\n  Additional tools for Minizip\n  Code: Xavier Roche '2004\n  License: Same as ZLIB (www.gzip.org)\n*/\n\n#ifndef _zip_tools_H\n#define _zip_tools_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef _ZLIB_H\n#include \"zlib.h\"\n#endif\n\n#include \"unzip.h\"\n\n/* Repair a ZIP file (missing central directory)\n   file: file to recover\n   fileOut: output file after recovery\n   fileOutTmp: temporary file name used for recovery\n*/\nextern int ZEXPORT unzRepair(const char* file,\n                             const char* fileOut,\n                             const char* fileOutTmp,\n                             uLong* nRecovered,\n                             uLong* bytesRecovered);\n\n#endif\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/minizip/unzip.c",
    "content": "/* unzip.c -- IO for uncompress .zip files using zlib\n   Version 1.1, February 14h, 2010\n   part of the MiniZip project\n\n   Copyright (C) 1998-2010 Gilles Vollant\n     http://www.winimage.com/zLibDll/minizip.html\n   Modifications of Unzip for Zip64\n     Copyright (C) 2007-2008 Even Rouault\n   Modifications for Zip64 support on both zip and unzip\n     Copyright (C) 2009-2010 Mathias Svensson\n     http://result42.com\n   Modifications for AES, PKWARE disk spanning\n     Copyright (C) 2010-2014 Nathan Moinvaziri\n\n   This program is distributed under the terms of the same license as zlib.\n   See the accompanying LICENSE file for the full text of the license.\n */\n\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n/*#ifndef NOUNCRYPT\n #  define NOUNCRYPT\n #endif*/\n\n#include \"zlib.h\"\n#include \"unzip.h\"\n\n#include \"Common.h\"\n\n#ifdef STDC\n#  include <stddef.h>\n#  include <string.h>\n#  include <stdlib.h>\n#endif\n#ifdef NO_ERRNO_H\nextern int errno;\n#else\n#  include <errno.h>\n#endif\n\n#ifdef HAVE_AES\n#  define AES_METHOD          (99)\n#  define AES_PWVERIFYSIZE    (2)\n#  define AES_MAXSALTLENGTH   (16)\n#  define AES_AUTHCODESIZE    (10)\n#  define AES_HEADERSIZE      (11)\n#  define AES_KEYSIZE(mode)   (64 + (mode * 64))\n\n#  include \"aes.h\"\n#  include \"fileenc.h\"\n#endif\n#ifndef NOUNCRYPT\n#  include \"crypt.h\"\n#endif\n\n#ifndef local\n#  define local static\n#endif\n/* compile with -Dlocal if your debugger can't find static symbols */\n\n#define DISKHEADERMAGIC          (0x08074b50)\n#define LOCALHEADERMAGIC         (0x04034b50)\n#define CENTRALHEADERMAGIC       (0x02014b50)\n#define ENDHEADERMAGIC           (0x06054b50)\n#define ZIP64ENDHEADERMAGIC      (0x06064b50)\n#define ZIP64ENDLOCHEADERMAGIC   (0x07064b50)\n\n#define SIZECENTRALDIRITEM       (0x2e)\n#define SIZECENTRALHEADERLOCATOR (0x14) /* 20 */\n#define SIZEZIPLOCALHEADER       (0x1e)\n\n#ifndef BUFREADCOMMENT\n#  define BUFREADCOMMENT (0x400)\n#endif\n\n#ifndef UNZ_BUFSIZE\n#  define UNZ_BUFSIZE (64 * 1024)\n#endif\n#ifndef UNZ_MAXFILENAMEINZIP\n#  define UNZ_MAXFILENAMEINZIP (256)\n#endif\n\n#ifndef ALLOC\n#  define ALLOC(size) (malloc(size))\n#endif\n#ifndef TRYFREE\n#  define TRYFREE(p) {if (p) free(p); }\n#endif\n\nconst char unz_copyright[] =\n    \" unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll\";\n\n/* unz_file_info_interntal contain internal info about a file in zipfile*/\ntypedef struct unz_file_info64_internal_s {\n    ZPOS64_T offset_curfile;            /* relative offset of local header 8 bytes */\n    ZPOS64_T byte_before_the_zipfile;   /* byte before the zipfile, (>0 for sfx) */\n#ifdef HAVE_AES\n    uLong aes_encryption_mode;\n    uLong aes_compression_method;\n    uLong aes_version;\n#endif\n} unz_file_info64_internal;\n\n/* file_in_zip_read_info_s contain internal information about a file in zipfile */\ntypedef struct {\n    Bytef *read_buffer;                 /* internal buffer for compressed data */\n    z_stream stream;                    /* zLib stream structure for inflate */\n\n#ifdef HAVE_BZIP2\n    bz_stream bstream;                  /* bzLib stream structure for bziped */\n#endif\n#ifdef HAVE_AES\n    fcrypt_ctx aes_ctx;\n#endif\n\n    ZPOS64_T pos_in_zipfile;            /* position in byte on the zipfile, for fseek */\n    uLong stream_initialised;           /* flag set if stream structure is initialised */\n\n    ZPOS64_T offset_local_extrafield;   /* offset of the local extra field */\n    uInt size_local_extrafield;         /* size of the local extra field */\n    ZPOS64_T pos_local_extrafield;      /* position in the local extra field in read */\n    ZPOS64_T total_out_64;\n\n    uLong crc32;                        /* crc32 of all data uncompressed */\n    uLong crc32_wait;                   /* crc32 we must obtain after decompress all */\n    ZPOS64_T rest_read_compressed;      /* number of byte to be decompressed */\n    ZPOS64_T rest_read_uncompressed;    /* number of byte to be obtained after decomp */\n\n    zlib_filefunc64_32_def z_filefunc;\n\n    voidpf filestream;                  /* io structore of the zipfile */\n    uLong compression_method;           /* compression method (0==store) */\n    ZPOS64_T byte_before_the_zipfile;   /* byte before the zipfile, (>0 for sfx) */\n    int raw;\n} file_in_zip64_read_info_s;\n\n/* unz64_s contain internal information about the zipfile */\ntypedef struct {\n    zlib_filefunc64_32_def z_filefunc;\n    voidpf filestream;                  /* io structure of the current zipfile */\n    voidpf filestream_with_CD;          /* io structure of the disk with the central directory */\n    unz_global_info64 gi;               /* public global information */\n    ZPOS64_T byte_before_the_zipfile;   /* byte before the zipfile, (>0 for sfx)*/\n    ZPOS64_T num_file;                  /* number of the current file in the zipfile*/\n    ZPOS64_T pos_in_central_dir;        /* pos of the current file in the central dir*/\n    ZPOS64_T current_file_ok;           /* flag about the usability of the current file*/\n    ZPOS64_T central_pos;               /* position of the beginning of the central dir*/\n    uLong number_disk;                  /* number of the current disk, used for spanning ZIP*/\n    ZPOS64_T size_central_dir;          /* size of the central directory  */\n    ZPOS64_T offset_central_dir;        /* offset of start of central directory with\n                                           respect to the starting disk number */\n\n    unz_file_info64 cur_file_info;      /* public info about the current file in zip*/\n    unz_file_info64_internal cur_file_info_internal;\n    /* private info about it*/\n    file_in_zip64_read_info_s *pfile_in_zip_read;\n    /* structure about the current file if we are decompressing it */\n    int isZip64;                        /* is the current file zip64 */\n#ifndef NOUNCRYPT\n    unsigned long keys[3];              /* keys defining the pseudo-random sequence */\n    const unsigned long *pcrc_32_tab;\n#endif\n} unz64_s;\n\n/* Translate date/time from Dos format to tm_unz (readable more easily) */\nlocal void unz64local_DosDateToTmuDate(ZPOS64_T ulDosDate, tm_unz *ptm)\n{\n    ZPOS64_T uDate = (ZPOS64_T)(ulDosDate >> 16);\n\n    ptm->tm_mday = (uInt)(uDate & 0x1f);\n    ptm->tm_mon = (uInt)((((uDate) & 0x1E0) / 0x20) - 1);\n    ptm->tm_year = (uInt)(((uDate & 0x0FE00) / 0x0200) + 1980);\n    ptm->tm_hour = (uInt)((ulDosDate & 0xF800) / 0x800);\n    ptm->tm_min = (uInt)((ulDosDate & 0x7E0) / 0x20);\n    ptm->tm_sec = (uInt)(2 * (ulDosDate & 0x1f));\n\n#define unz64local_in_range(min, max, value) ((min) <= (value) && (value) <= (max))\n    if (!unz64local_in_range(0, 11, ptm->tm_mon) ||\n        !unz64local_in_range(1, 31, ptm->tm_mday) ||\n        !unz64local_in_range(0, 23, ptm->tm_hour) ||\n        !unz64local_in_range(0, 59, ptm->tm_min) ||\n        !unz64local_in_range(0, 59, ptm->tm_sec))\n        /* Invalid date stored, so don't return it. */\n        memset(ptm, 0, sizeof(tm_unz));\n#undef unz64local_in_range\n}\n\n/* Read a byte from a gz_stream; Return EOF for end of file. */\nlocal int unz64local_getByte(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, int *pi)\n{\n    unsigned char c;\n    int err = (int)ZREAD64(*pzlib_filefunc_def, filestream, &c, 1);\n    if (err == 1) {\n        *pi = (int)c;\n        return UNZ_OK;\n    }\n    if (ZERROR64(*pzlib_filefunc_def, filestream))\n        return UNZ_ERRNO;\n    return UNZ_EOF;\n}\n\nlocal int unz64local_getShort OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream, uLong * pX));\nlocal int unz64local_getShort(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, uLong *pX)\n{\n    uLong x;\n    int i = 0;\n    int err;\n\n    err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x = (uLong)i;\n    if (err == UNZ_OK)\n        err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x |= ((uLong)i) << 8;\n\n    if (err == UNZ_OK)\n        *pX = x;\n    else\n        *pX = 0;\n    return err;\n}\n\nlocal int unz64local_getLong OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream, uLong * pX));\nlocal int unz64local_getLong(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, uLong *pX)\n{\n    uLong x;\n    int i = 0;\n    int err;\n\n    err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x = (uLong)i;\n    if (err == UNZ_OK)\n        err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x |= ((uLong)i) << 8;\n    if (err == UNZ_OK)\n        err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x |= ((uLong)i) << 16;\n    if (err == UNZ_OK)\n        err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x += ((uLong)i) << 24;\n\n    if (err == UNZ_OK)\n        *pX = x;\n    else\n        *pX = 0;\n    return err;\n}\n\nlocal int unz64local_getLong64 OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream, ZPOS64_T * pX));\nlocal int unz64local_getLong64(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX)\n{\n    ZPOS64_T x;\n    int i = 0;\n    int err;\n\n    err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x = (ZPOS64_T)i;\n    if (err == UNZ_OK)\n        err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x |= ((ZPOS64_T)i) << 8;\n    if (err == UNZ_OK)\n        err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x |= ((ZPOS64_T)i) << 16;\n    if (err == UNZ_OK)\n        err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x |= ((ZPOS64_T)i) << 24;\n    if (err == UNZ_OK)\n        err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x |= ((ZPOS64_T)i) << 32;\n    if (err == UNZ_OK)\n        err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x |= ((ZPOS64_T)i) << 40;\n    if (err == UNZ_OK)\n        err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x |= ((ZPOS64_T)i) << 48;\n    if (err == UNZ_OK)\n        err = unz64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x |= ((ZPOS64_T)i) << 56;\n\n    if (err == UNZ_OK)\n        *pX = x;\n    else\n        *pX = 0;\n    return err;\n}\n\n/* Locate the Central directory of a zip file (at the end, just before the global comment) */\nlocal ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream));\nlocal ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream)\n{\n    unsigned char *buf;\n    ZPOS64_T file_size;\n    ZPOS64_T back_read = 4;\n    ZPOS64_T max_back = 0xffff; /* maximum size of global comment */\n    ZPOS64_T pos_found = 0;\n    uLong read_size;\n    ZPOS64_T read_pos;\n    int i;\n\n    buf = (unsigned char *)ALLOC(BUFREADCOMMENT + 4);\n    if (buf == NULL)\n        return 0;\n\n    if (ZSEEK64(*pzlib_filefunc_def, filestream, 0, ZLIB_FILEFUNC_SEEK_END) != 0) {\n        TRYFREE(buf);\n        return 0;\n    }\n\n    file_size = ZTELL64(*pzlib_filefunc_def, filestream);\n\n    if (max_back > file_size)\n        max_back = file_size;\n\n    while (back_read < max_back) {\n        if (back_read + BUFREADCOMMENT > max_back)\n            back_read = max_back;\n        else\n            back_read += BUFREADCOMMENT;\n\n        read_pos = file_size - back_read;\n        read_size = ((BUFREADCOMMENT + 4) < (file_size - read_pos)) ?\n                    (BUFREADCOMMENT + 4) : (uLong)(file_size - read_pos);\n\n        if (ZSEEK64(*pzlib_filefunc_def, filestream, read_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)\n            break;\n        if (ZREAD64(*pzlib_filefunc_def, filestream, buf, read_size) != read_size)\n            break;\n\n        for (i = (int)read_size - 3; (i--) > 0; )\n            if (((*(buf + i)) == (ENDHEADERMAGIC & 0xff)) &&\n                ((*(buf + i + 1)) == (ENDHEADERMAGIC >> 8 & 0xff)) &&\n                ((*(buf + i + 2)) == (ENDHEADERMAGIC >> 16 & 0xff)) &&\n                ((*(buf + i + 3)) == (ENDHEADERMAGIC >> 24 & 0xff))) {\n                pos_found = read_pos + i;\n                break;\n            }\n\n        if (pos_found != 0)\n            break;\n    }\n    TRYFREE(buf);\n    return pos_found;\n}\n\n/* Locate the Central directory 64 of a zipfile (at the end, just before the global comment) */\nlocal ZPOS64_T unz64local_SearchCentralDir64 OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream,\n                                                 const ZPOS64_T endcentraloffset));\nlocal ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream,\n                                             const ZPOS64_T endcentraloffset)\n{\n    ZPOS64_T offset;\n    uLong uL;\n\n    /* Zip64 end of central directory locator */\n    if (ZSEEK64(*pzlib_filefunc_def, filestream, endcentraloffset - SIZECENTRALHEADERLOCATOR, ZLIB_FILEFUNC_SEEK_SET) != 0)\n        return 0;\n\n    /* read locator signature */\n    if (unz64local_getLong(pzlib_filefunc_def, filestream, &uL) != UNZ_OK)\n        return 0;\n    if (uL != ZIP64ENDLOCHEADERMAGIC)\n        return 0;\n    /* number of the disk with the start of the zip64 end of  central directory */\n    if (unz64local_getLong(pzlib_filefunc_def, filestream, &uL) != UNZ_OK)\n        return 0;\n    /* relative offset of the zip64 end of central directory record */\n    if (unz64local_getLong64(pzlib_filefunc_def, filestream, &offset) != UNZ_OK)\n        return 0;\n    /* total number of disks */\n    if (unz64local_getLong(pzlib_filefunc_def, filestream, &uL) != UNZ_OK)\n        return 0;\n    /* Goto end of central directory record */\n    if (ZSEEK64(*pzlib_filefunc_def, filestream, offset, ZLIB_FILEFUNC_SEEK_SET) != 0)\n        return 0;\n    /* the signature */\n    if (unz64local_getLong(pzlib_filefunc_def, filestream, &uL) != UNZ_OK)\n        return 0;\n    if (uL != ZIP64ENDHEADERMAGIC)\n        return 0;\n\n    return offset;\n}\n\nlocal unzFile unzOpenInternal(const void *path, zlib_filefunc64_32_def *pzlib_filefunc64_32_def)\n{\n    unz64_s us;\n    unz64_s *s;\n    ZPOS64_T central_pos;\n    uLong uL;\n    voidpf filestream = NULL;\n    ZPOS64_T number_entry_CD;\n    int err = UNZ_OK;\n\n    if (unz_copyright[0] != ' ')\n        return NULL;\n\n    us.filestream = NULL;\n    us.filestream_with_CD = NULL;\n    us.z_filefunc.zseek32_file = NULL;\n    us.z_filefunc.ztell32_file = NULL;\n    if (pzlib_filefunc64_32_def == NULL)\n        fill_fopen64_filefunc(&us.z_filefunc.zfile_func64);\n    else\n        us.z_filefunc = *pzlib_filefunc64_32_def;\n\n    us.filestream = ZOPEN64(us.z_filefunc, path, ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING);\n\n    if (us.filestream == NULL)\n        return NULL;\n\n    us.filestream_with_CD = us.filestream;\n    us.isZip64 = 0;\n\n    /* Use unz64local_SearchCentralDir first. Only based on the result\n       is it necessary to locate the unz64local_SearchCentralDir64 */\n    central_pos = unz64local_SearchCentralDir(&us.z_filefunc, us.filestream);\n    if (central_pos) {\n        if (ZSEEK64(us.z_filefunc, us.filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)\n            err = UNZ_ERRNO;\n\n        /* the signature, already checked */\n        if (unz64local_getLong(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)\n            err = UNZ_ERRNO;\n        /* number of this disk */\n        if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)\n            err = UNZ_ERRNO;\n        us.number_disk = uL;\n        /* number of the disk with the start of the central directory */\n        if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)\n            err = UNZ_ERRNO;\n        us.gi.number_disk_with_CD = uL;\n        /* total number of entries in the central directory on this disk */\n        if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)\n            err = UNZ_ERRNO;\n        us.gi.number_entry = uL;\n        /* total number of entries in the central directory */\n        if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)\n            err = UNZ_ERRNO;\n        number_entry_CD = uL;\n        if (number_entry_CD != us.gi.number_entry)\n            err = UNZ_BADZIPFILE;\n        /* size of the central directory */\n        if (unz64local_getLong(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)\n            err = UNZ_ERRNO;\n        us.size_central_dir = uL;\n        /* offset of start of central directory with respect to the starting disk number */\n        if (unz64local_getLong(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)\n            err = UNZ_ERRNO;\n        us.offset_central_dir = uL;\n        /* zipfile comment length */\n        if (unz64local_getShort(&us.z_filefunc, us.filestream, &us.gi.size_comment) != UNZ_OK)\n            err = UNZ_ERRNO;\n\n        if ((err == UNZ_OK) &&\n            ((us.gi.number_entry == 0xffff) || (us.size_central_dir == 0xffff) || (us.offset_central_dir == 0xffffffff))) {\n            /* Format should be Zip64, as the central directory or file size is too large */\n            central_pos = unz64local_SearchCentralDir64(&us.z_filefunc, us.filestream, central_pos);\n            if (central_pos) {\n                ZPOS64_T uL64;\n\n                us.isZip64 = 1;\n\n                if (ZSEEK64(us.z_filefunc, us.filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)\n                    err = UNZ_ERRNO;\n\n                /* the signature, already checked */\n                if (unz64local_getLong(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)\n                    err = UNZ_ERRNO;\n                /* size of zip64 end of central directory record */\n                if (unz64local_getLong64(&us.z_filefunc, us.filestream, &uL64) != UNZ_OK)\n                    err = UNZ_ERRNO;\n                /* version made by */\n                if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)\n                    err = UNZ_ERRNO;\n                /* version needed to extract */\n                if (unz64local_getShort(&us.z_filefunc, us.filestream, &uL) != UNZ_OK)\n                    err = UNZ_ERRNO;\n                /* number of this disk */\n                if (unz64local_getLong(&us.z_filefunc, us.filestream, &us.number_disk) != UNZ_OK)\n                    err = UNZ_ERRNO;\n                /* number of the disk with the start of the central directory */\n                if (unz64local_getLong(&us.z_filefunc, us.filestream, &us.gi.number_disk_with_CD) != UNZ_OK)\n                    err = UNZ_ERRNO;\n                /* total number of entries in the central directory on this disk */\n                if (unz64local_getLong64(&us.z_filefunc, us.filestream, &us.gi.number_entry) != UNZ_OK)\n                    err = UNZ_ERRNO;\n                /* total number of entries in the central directory */\n                if (unz64local_getLong64(&us.z_filefunc, us.filestream, &number_entry_CD) != UNZ_OK)\n                    err = UNZ_ERRNO;\n                if (number_entry_CD != us.gi.number_entry)\n                    err = UNZ_BADZIPFILE;\n                /* size of the central directory */\n                if (unz64local_getLong64(&us.z_filefunc, us.filestream, &us.size_central_dir) != UNZ_OK)\n                    err = UNZ_ERRNO;\n                /* offset of start of central directory with respect to the starting disk number */\n                if (unz64local_getLong64(&us.z_filefunc, us.filestream, &us.offset_central_dir) != UNZ_OK)\n                    err = UNZ_ERRNO;\n            } else\n                err = UNZ_BADZIPFILE;\n        }\n    } else\n        err = UNZ_ERRNO;\n\n    if ((err == UNZ_OK) && (central_pos < us.offset_central_dir + us.size_central_dir))\n        err = UNZ_BADZIPFILE;\n\n    if (err != UNZ_OK) {\n        ZCLOSE64(us.z_filefunc, us.filestream);\n        return NULL;\n    }\n\n    if (us.gi.number_disk_with_CD == 0) {\n        /* If there is only one disk open another stream so we don't have to seek between the CD\n           and the file headers constantly */\n        filestream = ZOPEN64(us.z_filefunc, path, ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING);\n        if (filestream != NULL)\n            us.filestream = filestream;\n    }\n\n    /* Hack for zip files that have no respect for zip64\n       if ((central_pos > 0xffffffff) && (us.offset_central_dir < 0xffffffff))\n        us.offset_central_dir = central_pos - us.size_central_dir;*/\n\n    us.byte_before_the_zipfile = central_pos - (us.offset_central_dir + us.size_central_dir);\n    us.central_pos = central_pos;\n    us.pfile_in_zip_read = NULL;\n\n    s = (unz64_s *)ALLOC(sizeof(unz64_s));\n    if (s != NULL) {\n        *s = us;\n        unzGoToFirstFile((unzFile)s);\n    }\n    return (unzFile)s;\n}\n\nextern unzFile ZEXPORT unzOpen2(const char *path, zlib_filefunc_def *pzlib_filefunc32_def)\n{\n    if (pzlib_filefunc32_def != NULL) {\n        zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;\n        fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill, pzlib_filefunc32_def);\n        return unzOpenInternal(path, &zlib_filefunc64_32_def_fill);\n    }\n    return unzOpenInternal(path, NULL);\n}\n\nextern unzFile ZEXPORT unzOpen2_64(const void *path, zlib_filefunc64_def *pzlib_filefunc_def)\n{\n    if (pzlib_filefunc_def != NULL) {\n        zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;\n        zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def;\n        zlib_filefunc64_32_def_fill.ztell32_file = NULL;\n        zlib_filefunc64_32_def_fill.zseek32_file = NULL;\n        return unzOpenInternal(path, &zlib_filefunc64_32_def_fill);\n    }\n    return unzOpenInternal(path, NULL);\n}\n\nextern unzFile ZEXPORT unzOpen(const char *path)\n{\n    return unzOpenInternal(path, NULL);\n}\n\nextern unzFile ZEXPORT unzOpen64(const void *path)\n{\n    return unzOpenInternal(path, NULL);\n}\n\nextern int ZEXPORT unzClose(unzFile file)\n{\n    unz64_s *s;\n    if (file == NULL)\n        return UNZ_PARAMERROR;\n    s = (unz64_s *)file;\n\n    if (s->pfile_in_zip_read != NULL)\n        unzCloseCurrentFile(file);\n\n    if ((s->filestream != NULL) && (s->filestream != s->filestream_with_CD))\n        ZCLOSE64(s->z_filefunc, s->filestream);\n    if (s->filestream_with_CD != NULL)\n        ZCLOSE64(s->z_filefunc, s->filestream_with_CD);\n\n    s->filestream = NULL;\n    s->filestream_with_CD = NULL;\n    TRYFREE(s);\n    return UNZ_OK;\n}\n\n/* Goto to the next available disk for spanned archives */\nlocal int unzGoToNextDisk OF((unzFile file));\nlocal int unzGoToNextDisk(unzFile file)\n{\n    unz64_s *s;\n    file_in_zip64_read_info_s *pfile_in_zip_read_info;\n    uLong number_disk_next = 0;\n\n    s = (unz64_s *)file;\n    if (s == NULL)\n        return UNZ_PARAMERROR;\n    pfile_in_zip_read_info = s->pfile_in_zip_read;\n    number_disk_next = s->number_disk;\n\n    if ((pfile_in_zip_read_info != NULL) && (pfile_in_zip_read_info->rest_read_uncompressed > 0))\n        /* We are currently reading a file and we need the next sequential disk */\n        number_disk_next += 1;\n    else\n        /* Goto the disk for the current file */\n        number_disk_next = s->cur_file_info.disk_num_start;\n\n    if (number_disk_next != s->number_disk) {\n        /* Switch disks */\n        if ((s->filestream != NULL) && (s->filestream != s->filestream_with_CD))\n            ZCLOSE64(s->z_filefunc, s->filestream);\n\n        if (number_disk_next == s->gi.number_disk_with_CD) {\n            s->filestream = s->filestream_with_CD;\n        } else {\n            s->filestream = ZOPENDISK64(s->z_filefunc, s->filestream_with_CD, (unsigned int)number_disk_next,\n                                        ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING);\n        }\n\n        if (s->filestream == NULL)\n            return UNZ_ERRNO;\n\n        s->number_disk = number_disk_next;\n    }\n\n    return UNZ_OK;\n}\n\nextern int ZEXPORT unzGetGlobalInfo(unzFile file, unz_global_info *pglobal_info32)\n{\n    unz64_s *s;\n    if (file == NULL)\n        return UNZ_PARAMERROR;\n    s = (unz64_s *)file;\n    /* to do : check if number_entry is not truncated */\n    pglobal_info32->number_entry = (uLong)s->gi.number_entry;\n    pglobal_info32->size_comment = s->gi.size_comment;\n    pglobal_info32->number_disk_with_CD = s->gi.number_disk_with_CD;\n    return UNZ_OK;\n}\n\nextern int ZEXPORT unzGetGlobalInfo64(unzFile file, unz_global_info64 *pglobal_info)\n{\n    unz64_s *s;\n    if (file == NULL)\n        return UNZ_PARAMERROR;\n    s = (unz64_s *)file;\n    *pglobal_info = s->gi;\n    return UNZ_OK;\n}\n\nextern int ZEXPORT unzGetGlobalComment(unzFile file, char *comment, uLong comment_size)\n{\n    unz64_s *s;\n    uLong bytes_to_read = comment_size;\n    if (file == NULL)\n        return (int)UNZ_PARAMERROR;\n    s = (unz64_s *)file;\n\n    if (bytes_to_read > s->gi.size_comment)\n        bytes_to_read = s->gi.size_comment;\n\n    if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, s->central_pos + 22, ZLIB_FILEFUNC_SEEK_SET) != 0)\n        return UNZ_ERRNO;\n\n    if (bytes_to_read > 0) {\n        *comment = 0;\n        if (ZREAD64(s->z_filefunc, s->filestream_with_CD, comment, bytes_to_read) != bytes_to_read)\n            return UNZ_ERRNO;\n    }\n\n    if ((comment != NULL) && (comment_size > s->gi.size_comment))\n        *(comment + s->gi.size_comment) = 0;\n    return (int)bytes_to_read;\n}\n\n/* Get Info about the current file in the zipfile, with internal only info */\nlocal int unz64local_GetCurrentFileInfoInternal(unzFile file, unz_file_info64 *pfile_info,\n                                                unz_file_info64_internal *pfile_info_internal, char *filename, uLong filename_size, void *extrafield,\n                                                uLong extrafield_size, char *comment, uLong comment_size)\n{\n    unz64_s *s;\n    unz_file_info64 file_info;\n    unz_file_info64_internal file_info_internal;\n    ZPOS64_T bytes_to_read;\n    int err = UNZ_OK;\n    uLong uMagic;\n    long lSeek = 0;\n    ZPOS64_T current_pos = 0;\n    uLong acc = 0;\n    uLong uL;\n    ZPOS64_T uL64;\n\n    if (file == NULL)\n        return UNZ_PARAMERROR;\n    s = (unz64_s *)file;\n\n    if (ZSEEK64(s->z_filefunc, s->filestream_with_CD,\n                s->pos_in_central_dir + s->byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0)\n        err = UNZ_ERRNO;\n\n    /* Check the magic */\n    if (err == UNZ_OK) {\n        if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &uMagic) != UNZ_OK)\n            err = UNZ_ERRNO;\n        else if (uMagic != CENTRALHEADERMAGIC)\n            err = UNZ_BADZIPFILE;\n    }\n\n    /* Read central directory header */\n    if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.version) != UNZ_OK)\n        err = UNZ_ERRNO;\n    if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.version_needed) != UNZ_OK)\n        err = UNZ_ERRNO;\n    if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.flag) != UNZ_OK)\n        err = UNZ_ERRNO;\n    if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.compression_method) != UNZ_OK)\n        err = UNZ_ERRNO;\n    if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &file_info.dosDate) != UNZ_OK)\n        err = UNZ_ERRNO;\n    unz64local_DosDateToTmuDate(file_info.dosDate, &file_info.tmu_date);\n    if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &file_info.crc) != UNZ_OK)\n        err = UNZ_ERRNO;\n    if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK)\n        err = UNZ_ERRNO;\n    file_info.compressed_size = uL;\n    if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK)\n        err = UNZ_ERRNO;\n    file_info.uncompressed_size = uL;\n    if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.size_filename) != UNZ_OK)\n        err = UNZ_ERRNO;\n    if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.size_file_extra) != UNZ_OK)\n        err = UNZ_ERRNO;\n    if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.size_file_comment) != UNZ_OK)\n        err = UNZ_ERRNO;\n    if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.disk_num_start) != UNZ_OK)\n        err = UNZ_ERRNO;\n    if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &file_info.internal_fa) != UNZ_OK)\n        err = UNZ_ERRNO;\n    if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &file_info.external_fa) != UNZ_OK)\n        err = UNZ_ERRNO;\n    /* Relative offset of local header */\n    if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK)\n        err = UNZ_ERRNO;\n\n    file_info.size_file_extra_internal = 0;\n    file_info.disk_offset = uL;\n    file_info_internal.offset_curfile = uL;\n#ifdef HAVE_AES\n    file_info_internal.aes_compression_method = 0;\n    file_info_internal.aes_encryption_mode = 0;\n    file_info_internal.aes_version = 0;\n#endif\n\n    lSeek += file_info.size_filename;\n\n    if ((err == UNZ_OK) && (filename != NULL)) {\n        if (file_info.size_filename < filename_size) {\n            *(filename + file_info.size_filename) = 0;\n            bytes_to_read = file_info.size_filename;\n        } else\n            bytes_to_read = filename_size;\n\n        if ((file_info.size_filename > 0) && (filename_size > 0))\n            if (ZREAD64(s->z_filefunc, s->filestream_with_CD, filename, (uLong)bytes_to_read) != bytes_to_read)\n                err = UNZ_ERRNO;\n        lSeek -= (uLong)bytes_to_read;\n    }\n\n    /* Read extrafield */\n    if ((err == UNZ_OK) && (extrafield != NULL)) {\n        if (file_info.size_file_extra < extrafield_size)\n            bytes_to_read = file_info.size_file_extra;\n        else\n            bytes_to_read = extrafield_size;\n\n        if (lSeek != 0) {\n            if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, lSeek, ZLIB_FILEFUNC_SEEK_CUR) == 0)\n                lSeek = 0;\n            else\n                err = UNZ_ERRNO;\n        }\n\n        if ((file_info.size_file_extra > 0) && (extrafield_size > 0))\n            if (ZREAD64(s->z_filefunc, s->filestream_with_CD, extrafield, (uLong)bytes_to_read) != bytes_to_read)\n                err = UNZ_ERRNO;\n        lSeek += file_info.size_file_extra - (uLong)bytes_to_read;\n    } else\n        lSeek += file_info.size_file_extra;\n\n    if ((err == UNZ_OK) && (file_info.size_file_extra != 0)) {\n        if (lSeek != 0) {\n            if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, lSeek, ZLIB_FILEFUNC_SEEK_CUR) == 0)\n                lSeek = 0;\n            else\n                err = UNZ_ERRNO;\n        }\n\n        /* We are going to parse the extra field so we need to move back */\n        current_pos = ZTELL64(s->z_filefunc, s->filestream_with_CD);\n        if (current_pos < file_info.size_file_extra)\n            err = UNZ_ERRNO;\n        current_pos -= file_info.size_file_extra;\n        if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, current_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)\n            err = UNZ_ERRNO;\n\n        while ((err != UNZ_ERRNO) && (acc < file_info.size_file_extra)) {\n            uLong headerid;\n            uLong datasize;\n\n            if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &headerid) != UNZ_OK)\n                err = UNZ_ERRNO;\n            if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &datasize) != UNZ_OK)\n                err = UNZ_ERRNO;\n\n            /* ZIP64 extra fields */\n            if (headerid == 0x0001) {\n                /* Subtract size of ZIP64 field, since ZIP64 is handled internally */\n                file_info.size_file_extra_internal += 2 + 2 + datasize;\n\n                if (file_info.uncompressed_size == 0xffffffff) {\n                    if (unz64local_getLong64(&s->z_filefunc, s->filestream_with_CD, &file_info.uncompressed_size) != UNZ_OK)\n                        err = UNZ_ERRNO;\n                }\n                if (file_info.compressed_size == 0xffffffff) {\n                    if (unz64local_getLong64(&s->z_filefunc, s->filestream_with_CD, &file_info.compressed_size) != UNZ_OK)\n                        err = UNZ_ERRNO;\n                }\n                if (file_info_internal.offset_curfile == 0xffffffff) {\n                    /* Relative Header offset */\n                    if (unz64local_getLong64(&s->z_filefunc, s->filestream_with_CD, &uL64) != UNZ_OK)\n                        err = UNZ_ERRNO;\n                    file_info_internal.offset_curfile = uL64;\n                    file_info.disk_offset = uL64;\n                }\n                if (file_info.disk_num_start == 0xffffffff) {\n                    /* Disk Start Number */\n                    if (unz64local_getLong(&s->z_filefunc, s->filestream_with_CD, &file_info.disk_num_start) != UNZ_OK)\n                        err = UNZ_ERRNO;\n                }\n            }\n#ifdef HAVE_AES\n            /* AES header */\n            else if (headerid == 0x9901) {\n                /* Subtract size of AES field, since AES is handled internally */\n                file_info.size_file_extra_internal += 2 + 2 + datasize;\n\n                /* Verify version info */\n                if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK)\n                    err = UNZ_ERRNO;\n                /* Support AE-1 and AE-2 */\n                if (uL != 1 && uL != 2)\n                    err = UNZ_ERRNO;\n                file_info_internal.aes_version = uL;\n                if (unz64local_getByte(&s->z_filefunc, s->filestream_with_CD, (int *)&uL) != UNZ_OK)\n                    err = UNZ_ERRNO;\n                if ((char)uL != 'A')\n                    err = UNZ_ERRNO;\n                if (unz64local_getByte(&s->z_filefunc, s->filestream_with_CD, (int *)&uL) != UNZ_OK)\n                    err = UNZ_ERRNO;\n                if ((char)uL != 'E')\n                    err = UNZ_ERRNO;\n                /* Get AES encryption strength and actual compression method */\n                if (unz64local_getByte(&s->z_filefunc, s->filestream_with_CD, (int *)&uL) != UNZ_OK)\n                    err = UNZ_ERRNO;\n                file_info_internal.aes_encryption_mode = uL;\n                if (unz64local_getShort(&s->z_filefunc, s->filestream_with_CD, &uL) != UNZ_OK)\n                    err = UNZ_ERRNO;\n                file_info_internal.aes_compression_method = uL;\n            }\n#endif\n            else {\n                if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, datasize, ZLIB_FILEFUNC_SEEK_CUR) != 0)\n                    err = UNZ_ERRNO;\n            }\n\n            acc += 2 + 2 + datasize;\n        }\n    }\n\n    if (file_info.disk_num_start == s->gi.number_disk_with_CD)\n        file_info_internal.byte_before_the_zipfile = s->byte_before_the_zipfile;\n    else\n        file_info_internal.byte_before_the_zipfile = 0;\n\n    if ((err == UNZ_OK) && (comment != NULL)) {\n        if (file_info.size_file_comment < comment_size) {\n            *(comment + file_info.size_file_comment) = 0;\n            bytes_to_read = file_info.size_file_comment;\n        } else\n            bytes_to_read = comment_size;\n\n        if (lSeek != 0) {\n            if (ZSEEK64(s->z_filefunc, s->filestream_with_CD, lSeek, ZLIB_FILEFUNC_SEEK_CUR) != 0)\n                err = UNZ_ERRNO;\n        }\n\n        if ((file_info.size_file_comment > 0) && (comment_size > 0))\n            if (ZREAD64(s->z_filefunc, s->filestream_with_CD, comment, (uLong)bytes_to_read) != bytes_to_read)\n                err = UNZ_ERRNO;\n        lSeek += file_info.size_file_comment - (uLong)bytes_to_read;\n    } else\n        lSeek += file_info.size_file_comment;\n\n    if ((err == UNZ_OK) && (pfile_info != NULL))\n        *pfile_info = file_info;\n\n    if ((err == UNZ_OK) && (pfile_info_internal != NULL))\n        *pfile_info_internal = file_info_internal;\n\n    return err;\n}\n\nextern int ZEXPORT unzGetCurrentFileInfo(unzFile file, unz_file_info *pfile_info, char *filename,\n                                         uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size)\n{\n    unz_file_info64 file_info64;\n    int err;\n\n    err = unz64local_GetCurrentFileInfoInternal(file, &file_info64, NULL, filename, filename_size,\n                                                extrafield, extrafield_size, comment, comment_size);\n\n    if ((err == UNZ_OK) && (pfile_info != NULL)) {\n        pfile_info->version = file_info64.version;\n        pfile_info->version_needed = file_info64.version_needed;\n        pfile_info->flag = file_info64.flag;\n        pfile_info->compression_method = file_info64.compression_method;\n        pfile_info->dosDate = file_info64.dosDate;\n        pfile_info->crc = file_info64.crc;\n\n        pfile_info->size_filename = file_info64.size_filename;\n        pfile_info->size_file_extra = file_info64.size_file_extra - file_info64.size_file_extra_internal;\n        pfile_info->size_file_comment = file_info64.size_file_comment;\n\n        pfile_info->disk_num_start = file_info64.disk_num_start;\n        pfile_info->internal_fa = file_info64.internal_fa;\n        pfile_info->external_fa = file_info64.external_fa;\n\n        pfile_info->tmu_date = file_info64.tmu_date,\n\n        pfile_info->compressed_size = (uLong)file_info64.compressed_size;\n        pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size;\n\n    }\n    return err;\n}\n\nextern int ZEXPORT unzGetCurrentFileInfo64(unzFile file, unz_file_info64 *pfile_info, char *filename,\n                                           uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size)\n{\n    return unz64local_GetCurrentFileInfoInternal(file, pfile_info, NULL, filename, filename_size,\n                                                 extrafield, extrafield_size, comment, comment_size);\n}\n\n/* Read the local header of the current zipfile. Check the coherency of the local header and info in the\n   end of central directory about this file store in *piSizeVar the size of extra info in local header\n   (filename and size of extra field data) */\nlocal int unz64local_CheckCurrentFileCoherencyHeader(unz64_s *s, uInt *piSizeVar, ZPOS64_T *poffset_local_extrafield,\n                                                     uInt *psize_local_extrafield)\n{\n    uLong uMagic, uL, uFlags;\n    uLong size_filename;\n    uLong size_extra_field;\n    int err = UNZ_OK;\n    int compression_method = 0;\n\n    *piSizeVar = 0;\n    *poffset_local_extrafield = 0;\n    *psize_local_extrafield = 0;\n\n    err = unzGoToNextDisk((unzFile)s);\n    if (err != UNZ_OK)\n        return err;\n\n    if (ZSEEK64(s->z_filefunc, s->filestream, s->cur_file_info_internal.offset_curfile +\n                s->cur_file_info_internal.byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0)\n        return UNZ_ERRNO;\n\n    if (err == UNZ_OK) {\n        if (unz64local_getLong(&s->z_filefunc, s->filestream, &uMagic) != UNZ_OK)\n            err = UNZ_ERRNO;\n        else if (uMagic != LOCALHEADERMAGIC)\n            err = UNZ_BADZIPFILE;\n    }\n\n    if (unz64local_getShort(&s->z_filefunc, s->filestream, &uL) != UNZ_OK)\n        err = UNZ_ERRNO;\n    if (unz64local_getShort(&s->z_filefunc, s->filestream, &uFlags) != UNZ_OK)\n        err = UNZ_ERRNO;\n    if (unz64local_getShort(&s->z_filefunc, s->filestream, &uL) != UNZ_OK)\n        err = UNZ_ERRNO;\n    else if ((err == UNZ_OK) && (uL != s->cur_file_info.compression_method))\n        err = UNZ_BADZIPFILE;\n\n    compression_method = (int)s->cur_file_info.compression_method;\n#ifdef HAVE_AES\n    if (compression_method == AES_METHOD)\n        compression_method = (int)s->cur_file_info_internal.aes_compression_method;\n#endif\n\n    if ((err == UNZ_OK) && (compression_method != 0) &&\n#ifdef HAVE_BZIP2\n        (compression_method != Z_BZIP2ED) &&\n#endif\n        (compression_method != Z_DEFLATED))\n        err = UNZ_BADZIPFILE;\n\n    if (unz64local_getLong(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) /* date/time */\n        err = UNZ_ERRNO;\n    if (unz64local_getLong(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) /* crc */\n        err = UNZ_ERRNO;\n    else if ((err == UNZ_OK) && (uL != s->cur_file_info.crc) && ((uFlags & 8) == 0))\n        err = UNZ_BADZIPFILE;\n    if (unz64local_getLong(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) /* size compr */\n        err = UNZ_ERRNO;\n    else if ((uL != 0xffffffff) && (err == UNZ_OK) && (uL != s->cur_file_info.compressed_size) && ((uFlags & 8) == 0))\n        err = UNZ_BADZIPFILE;\n    if (unz64local_getLong(&s->z_filefunc, s->filestream, &uL) != UNZ_OK) /* size uncompr */\n        err = UNZ_ERRNO;\n    else if ((uL != 0xffffffff) && (err == UNZ_OK) && (uL != s->cur_file_info.uncompressed_size) && ((uFlags & 8) == 0))\n        err = UNZ_BADZIPFILE;\n    if (unz64local_getShort(&s->z_filefunc, s->filestream, &size_filename) != UNZ_OK)\n        err = UNZ_ERRNO;\n    else if ((err == UNZ_OK) && (size_filename != s->cur_file_info.size_filename))\n        err = UNZ_BADZIPFILE;\n\n    *piSizeVar += (uInt)size_filename;\n\n    if (unz64local_getShort(&s->z_filefunc, s->filestream, &size_extra_field) != UNZ_OK)\n        err = UNZ_ERRNO;\n    *poffset_local_extrafield = s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + size_filename;\n    *psize_local_extrafield = (uInt)size_extra_field;\n\n    *piSizeVar += (uInt)size_extra_field;\n\n    return err;\n}\n\n/*\n   Open for reading data the current file in the zipfile.\n   If there is no error and the file is opened, the return value is UNZ_OK.\n */\nextern int ZEXPORT unzOpenCurrentFile3(unzFile file, int *method, int *level, int raw, const char *password)\n{\n    int err = UNZ_OK;\n    int compression_method;\n    uInt iSizeVar;\n    unz64_s *s;\n    file_in_zip64_read_info_s *pfile_in_zip_read_info;\n    ZPOS64_T offset_local_extrafield;\n    uInt size_local_extrafield;\n#ifndef NOUNCRYPT\n    char source[12];\n#else\n    if (password != NULL)\n        return UNZ_PARAMERROR;\n#endif\n    if (file == NULL)\n        return UNZ_PARAMERROR;\n    s = (unz64_s *)file;\n    if (!s->current_file_ok)\n        return UNZ_PARAMERROR;\n\n    if (s->pfile_in_zip_read != NULL)\n        unzCloseCurrentFile(file);\n\n    if (unz64local_CheckCurrentFileCoherencyHeader(s, &iSizeVar, &offset_local_extrafield, &size_local_extrafield) != UNZ_OK)\n        return UNZ_BADZIPFILE;\n\n    pfile_in_zip_read_info = (file_in_zip64_read_info_s *)ALLOC(sizeof(file_in_zip64_read_info_s));\n    if (pfile_in_zip_read_info == NULL)\n        return UNZ_INTERNALERROR;\n\n    pfile_in_zip_read_info->read_buffer = (Bytef *)ALLOC(UNZ_BUFSIZE);\n    pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;\n    pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;\n    pfile_in_zip_read_info->pos_local_extrafield = 0;\n    pfile_in_zip_read_info->raw = raw;\n\n    if (pfile_in_zip_read_info->read_buffer == NULL) {\n        TRYFREE(pfile_in_zip_read_info);\n        return UNZ_INTERNALERROR;\n    }\n\n    pfile_in_zip_read_info->stream_initialised = 0;\n\n    compression_method = (int)s->cur_file_info.compression_method;\n#ifdef HAVE_AES\n    if (compression_method == AES_METHOD)\n        compression_method = (int)s->cur_file_info_internal.aes_compression_method;\n#endif\n\n    if (method != NULL)\n        *method = compression_method;\n\n    if (level != NULL) {\n        *level = 6;\n        switch (s->cur_file_info.flag & 0x06) {\n        case 6: *level = 1; break;\n        case 4: *level = 2; break;\n        case 2: *level = 9; break;\n        }\n    }\n\n    if ((compression_method != 0) &&\n#ifdef HAVE_BZIP2\n        (compression_method != Z_BZIP2ED) &&\n#endif\n        (compression_method != Z_DEFLATED))\n        err = UNZ_BADZIPFILE;\n\n    pfile_in_zip_read_info->crc32_wait = s->cur_file_info.crc;\n    pfile_in_zip_read_info->crc32 = 0;\n    pfile_in_zip_read_info->total_out_64 = 0;\n    pfile_in_zip_read_info->compression_method = compression_method;\n    pfile_in_zip_read_info->filestream = s->filestream;\n    pfile_in_zip_read_info->z_filefunc = s->z_filefunc;\n    if (s->number_disk == s->gi.number_disk_with_CD)\n        pfile_in_zip_read_info->byte_before_the_zipfile = s->byte_before_the_zipfile;\n    else\n        pfile_in_zip_read_info->byte_before_the_zipfile = 0;\n    pfile_in_zip_read_info->stream.total_out = 0;\n    pfile_in_zip_read_info->stream.total_in = 0;\n    pfile_in_zip_read_info->stream.next_in = NULL;\n\n    if (!raw) {\n        if (compression_method == Z_BZIP2ED) {\n#ifdef HAVE_BZIP2\n            pfile_in_zip_read_info->bstream.bzalloc = (void *(*)(void *, int, int)) 0;\n            pfile_in_zip_read_info->bstream.bzfree = (free_func)0;\n            pfile_in_zip_read_info->bstream.opaque = (voidpf)0;\n            pfile_in_zip_read_info->bstream.state = (voidpf)0;\n\n            pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;\n            pfile_in_zip_read_info->stream.zfree = (free_func)0;\n            pfile_in_zip_read_info->stream.opaque = (voidpf)0;\n            pfile_in_zip_read_info->stream.next_in = (voidpf)0;\n            pfile_in_zip_read_info->stream.avail_in = 0;\n\n            err = BZ2_bzDecompressInit(&pfile_in_zip_read_info->bstream, 0, 0);\n            if (err == Z_OK)\n                pfile_in_zip_read_info->stream_initialised = Z_BZIP2ED;\n            else {\n                TRYFREE(pfile_in_zip_read_info);\n                return err;\n            }\n#else\n            pfile_in_zip_read_info->raw = 1;\n#endif\n        } else if (compression_method == Z_DEFLATED) {\n            pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;\n            pfile_in_zip_read_info->stream.zfree = (free_func)0;\n            pfile_in_zip_read_info->stream.opaque = (voidpf)s;\n            pfile_in_zip_read_info->stream.next_in = 0;\n            pfile_in_zip_read_info->stream.avail_in = 0;\n\n            err = inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);\n            if (err == Z_OK)\n                pfile_in_zip_read_info->stream_initialised = Z_DEFLATED;\n            else {\n                TRYFREE(pfile_in_zip_read_info);\n                return err;\n            }\n            /* windowBits is passed < 0 to tell that there is no zlib header.\n             * Note that in this case inflate *requires* an extra \"dummy\" byte\n             * after the compressed stream in order to complete decompression and\n             * return Z_STREAM_END.\n             * In unzip, i don't wait absolutely Z_STREAM_END because I known the\n             * size of both compressed and uncompressed data\n             */\n        }\n    }\n\n    pfile_in_zip_read_info->rest_read_compressed = s->cur_file_info.compressed_size;\n    pfile_in_zip_read_info->rest_read_uncompressed = s->cur_file_info.uncompressed_size;\n    pfile_in_zip_read_info->pos_in_zipfile = s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + iSizeVar;\n    pfile_in_zip_read_info->stream.avail_in = (uInt)0;\n\n    s->pfile_in_zip_read = pfile_in_zip_read_info;\n\n#ifndef NOUNCRYPT\n    if ((password != NULL) && ((s->cur_file_info.flag & 1) != 0)) {\n        if (ZSEEK64(s->z_filefunc, s->filestream,\n                    s->pfile_in_zip_read->pos_in_zipfile + s->pfile_in_zip_read->byte_before_the_zipfile,\n                    ZLIB_FILEFUNC_SEEK_SET) != 0)\n            return UNZ_INTERNALERROR;\n#ifdef HAVE_AES\n        if (s->cur_file_info.compression_method == AES_METHOD) {\n            unsigned char passverify[AES_PWVERIFYSIZE];\n            unsigned char saltvalue[AES_MAXSALTLENGTH];\n            uInt saltlength;\n\n            if ((s->cur_file_info_internal.aes_encryption_mode < 1) ||\n                (s->cur_file_info_internal.aes_encryption_mode > 3))\n                return UNZ_INTERNALERROR;\n\n            saltlength = SALT_LENGTH(s->cur_file_info_internal.aes_encryption_mode);\n\n            if (ZREAD64(s->z_filefunc, s->filestream, saltvalue, saltlength) != saltlength)\n                return UNZ_INTERNALERROR;\n            if (ZREAD64(s->z_filefunc, s->filestream, passverify, AES_PWVERIFYSIZE) != AES_PWVERIFYSIZE)\n                return UNZ_INTERNALERROR;\n\n            fcrypt_init((int)s->cur_file_info_internal.aes_encryption_mode, (unsigned char *)password, (unsigned int)strlen(password), saltvalue,\n                        passverify, &s->pfile_in_zip_read->aes_ctx);\n\n            pfile_in_zip_read_info->rest_read_compressed -= saltlength + AES_PWVERIFYSIZE;\n            pfile_in_zip_read_info->rest_read_compressed -= AES_AUTHCODESIZE;\n\n            s->pfile_in_zip_read->pos_in_zipfile += saltlength + AES_PWVERIFYSIZE;\n        } else\n#endif\n        {\n            int i;\n            s->pcrc_32_tab = (const unsigned long *)get_crc_table();\n            init_keys(password, s->keys, s->pcrc_32_tab);\n\n            if (ZREAD64(s->z_filefunc, s->filestream, source, 12) < 12)\n                return UNZ_INTERNALERROR;\n\n            for (i = 0; i < 12; i++)\n                zdecode(s->keys, s->pcrc_32_tab, source[i]);\n\n            pfile_in_zip_read_info->rest_read_compressed -= 12;\n\n            s->pfile_in_zip_read->pos_in_zipfile += 12;\n        }\n    }\n#endif\n\n    return UNZ_OK;\n}\n\nextern int ZEXPORT unzOpenCurrentFile(unzFile file)\n{\n    return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);\n}\n\nextern int ZEXPORT unzOpenCurrentFilePassword(unzFile file, const char *password)\n{\n    return unzOpenCurrentFile3(file, NULL, NULL, 0, password);\n}\n\nextern int ZEXPORT unzOpenCurrentFile2(unzFile file, int *method, int *level, int raw)\n{\n    return unzOpenCurrentFile3(file, method, level, raw, NULL);\n}\n\n/* Read bytes from the current file.\n   buf contain buffer where data must be copied\n   len the size of buf.\n\n   return the number of byte copied if some bytes are copied\n   return 0 if the end of file was reached\n   return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */\nextern int ZEXPORT unzReadCurrentFile(unzFile file, voidp buf, unsigned len)\n{\n    int err = UNZ_OK;\n    uInt read = 0;\n    unz64_s *s;\n    file_in_zip64_read_info_s *pfile_in_zip_read_info;\n    if (file == NULL)\n        return UNZ_PARAMERROR;\n    s = (unz64_s *)file;\n    pfile_in_zip_read_info = s->pfile_in_zip_read;\n\n    if (pfile_in_zip_read_info == NULL)\n        return UNZ_PARAMERROR;\n    if (pfile_in_zip_read_info->read_buffer == NULL)\n        return UNZ_END_OF_LIST_OF_FILE;\n    if (len == 0)\n        return 0;\n\n    pfile_in_zip_read_info->stream.next_out = (Bytef *)buf;\n    pfile_in_zip_read_info->stream.avail_out = (uInt)len;\n\n    if (pfile_in_zip_read_info->raw) {\n        if (len > pfile_in_zip_read_info->rest_read_compressed + pfile_in_zip_read_info->stream.avail_in)\n            pfile_in_zip_read_info->stream.avail_out = (uInt)pfile_in_zip_read_info->rest_read_compressed +\n                                                       pfile_in_zip_read_info->stream.avail_in;\n    } else {\n        \n        // NOTE:\n        // This bit of code seems to try to set the amount of space in the output buffer based on the\n        // value stored in the headers stored in the .zip file. However, if those values are incorrect\n        // it may result in a loss of data when uncompresssing that file. The compressed data is still\n        // legit and will deflate without knowing the uncompressed code so this tidbit is unnecessary and\n        // may cause issues for some .zip files.\n        //\n        // It's removed in here to fix those issues.\n        //\n        // See: https://github.com/ZipArchive/ziparchive/issues/16\n        //\n        \n        /*\n        \n         \n         FIXME: Upgrading to minizip 1.1 caused issues here, Uncommented the code that was commented before. 11/24/2015\n         */\n        \n        if (len > pfile_in_zip_read_info->rest_read_uncompressed)\n            pfile_in_zip_read_info->stream.avail_out = (uInt)pfile_in_zip_read_info->rest_read_uncompressed;\n        \n         \n    \n    }\n\n    while (pfile_in_zip_read_info->stream.avail_out > 0) {\n        if (pfile_in_zip_read_info->stream.avail_in == 0) {\n            uInt bytes_to_read = UNZ_BUFSIZE;\n            uInt bytes_not_read = 0;\n            uInt bytes_read = 0;\n            uInt total_bytes_read = 0;\n\n            if (pfile_in_zip_read_info->stream.next_in != NULL)\n                bytes_not_read = (uInt)(pfile_in_zip_read_info->read_buffer + UNZ_BUFSIZE -\n                                        pfile_in_zip_read_info->stream.next_in);\n            bytes_to_read -= bytes_not_read;\n            if (bytes_not_read > 0)\n                memcpy(pfile_in_zip_read_info->read_buffer, pfile_in_zip_read_info->stream.next_in, bytes_not_read);\n            if (pfile_in_zip_read_info->rest_read_compressed < bytes_to_read)\n                bytes_to_read = (uInt)pfile_in_zip_read_info->rest_read_compressed;\n\n            while (total_bytes_read != bytes_to_read) {\n                if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream,\n                            pfile_in_zip_read_info->pos_in_zipfile + pfile_in_zip_read_info->byte_before_the_zipfile,\n                            ZLIB_FILEFUNC_SEEK_SET) != 0)\n                    return UNZ_ERRNO;\n\n                bytes_read = (int)ZREAD64(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream,\n                                          pfile_in_zip_read_info->read_buffer + bytes_not_read + total_bytes_read,\n                                          bytes_to_read - total_bytes_read);\n\n                total_bytes_read += bytes_read;\n                pfile_in_zip_read_info->pos_in_zipfile += bytes_read;\n\n                if (bytes_read == 0) {\n                    if (ZERROR64(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream))\n                        return UNZ_ERRNO;\n\n                    err = unzGoToNextDisk(file);\n                    if (err != UNZ_OK)\n                        return err;\n\n                    pfile_in_zip_read_info->pos_in_zipfile = 0;\n                    pfile_in_zip_read_info->filestream = s->filestream;\n                }\n            }\n\n#ifndef NOUNCRYPT\n            if ((s->cur_file_info.flag & 1) != 0) {\n#ifdef HAVE_AES\n                if (s->cur_file_info.compression_method == AES_METHOD) {\n                    fcrypt_decrypt(pfile_in_zip_read_info->read_buffer, bytes_to_read, &s->pfile_in_zip_read->aes_ctx);\n                } else\n#endif\n                {\n                    uInt i;\n                    for (i = 0; i < total_bytes_read; i++)\n                        pfile_in_zip_read_info->read_buffer[i] =\n                            zdecode(s->keys, s->pcrc_32_tab, pfile_in_zip_read_info->read_buffer[i]);\n                }\n            }\n#endif\n\n            pfile_in_zip_read_info->rest_read_compressed -= total_bytes_read;\n            pfile_in_zip_read_info->stream.next_in = (Bytef *)pfile_in_zip_read_info->read_buffer;\n            pfile_in_zip_read_info->stream.avail_in = (uInt)bytes_not_read + total_bytes_read;\n        }\n\n        if ((pfile_in_zip_read_info->compression_method == 0) || (pfile_in_zip_read_info->raw)) {\n            uInt copy, i;\n\n            if ((pfile_in_zip_read_info->stream.avail_in == 0) &&\n                (pfile_in_zip_read_info->rest_read_compressed == 0))\n                return (read == 0) ? UNZ_EOF : read;\n\n            if (pfile_in_zip_read_info->stream.avail_out < pfile_in_zip_read_info->stream.avail_in)\n                copy = pfile_in_zip_read_info->stream.avail_out;\n            else\n                copy = pfile_in_zip_read_info->stream.avail_in;\n\n            for (i = 0; i < copy; i++)\n                *(pfile_in_zip_read_info->stream.next_out + i) =\n                    *(pfile_in_zip_read_info->stream.next_in + i);\n\n            pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + copy;\n            pfile_in_zip_read_info->rest_read_uncompressed -= copy;\n            pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,\n                                                  pfile_in_zip_read_info->stream.next_out, copy);\n\n            pfile_in_zip_read_info->stream.avail_in -= copy;\n            pfile_in_zip_read_info->stream.avail_out -= copy;\n            pfile_in_zip_read_info->stream.next_out += copy;\n            pfile_in_zip_read_info->stream.next_in += copy;\n            pfile_in_zip_read_info->stream.total_out += copy;\n            read += copy;\n        } else if (pfile_in_zip_read_info->compression_method == Z_BZIP2ED) {\n#ifdef HAVE_BZIP2\n            uLong total_out_before, total_out_after;\n            const Bytef *buf_before;\n            uLong out_bytes;\n\n            pfile_in_zip_read_info->bstream.next_in = (char *)pfile_in_zip_read_info->stream.next_in;\n            pfile_in_zip_read_info->bstream.avail_in = pfile_in_zip_read_info->stream.avail_in;\n            pfile_in_zip_read_info->bstream.total_in_lo32 = pfile_in_zip_read_info->stream.total_in;\n            pfile_in_zip_read_info->bstream.total_in_hi32 = 0;\n            pfile_in_zip_read_info->bstream.next_out = (char *)pfile_in_zip_read_info->stream.next_out;\n            pfile_in_zip_read_info->bstream.avail_out = pfile_in_zip_read_info->stream.avail_out;\n            pfile_in_zip_read_info->bstream.total_out_lo32 = pfile_in_zip_read_info->stream.total_out;\n            pfile_in_zip_read_info->bstream.total_out_hi32 = 0;\n\n            total_out_before = pfile_in_zip_read_info->bstream.total_out_lo32;\n            buf_before = (const Bytef *)pfile_in_zip_read_info->bstream.next_out;\n\n            err = BZ2_bzDecompress(&pfile_in_zip_read_info->bstream);\n\n            total_out_after = pfile_in_zip_read_info->bstream.total_out_lo32;\n            out_bytes = total_out_after - total_out_before;\n\n            pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + out_bytes;\n            pfile_in_zip_read_info->rest_read_uncompressed -= out_bytes;\n            pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, buf_before, (uInt)(out_bytes));\n\n            read += (uInt)(total_out_after - total_out_before);\n\n            pfile_in_zip_read_info->stream.next_in = (Bytef *)pfile_in_zip_read_info->bstream.next_in;\n            pfile_in_zip_read_info->stream.avail_in = pfile_in_zip_read_info->bstream.avail_in;\n            pfile_in_zip_read_info->stream.total_in = pfile_in_zip_read_info->bstream.total_in_lo32;\n            pfile_in_zip_read_info->stream.next_out = (Bytef *)pfile_in_zip_read_info->bstream.next_out;\n            pfile_in_zip_read_info->stream.avail_out = pfile_in_zip_read_info->bstream.avail_out;\n            pfile_in_zip_read_info->stream.total_out = pfile_in_zip_read_info->bstream.total_out_lo32;\n\n            if (err == BZ_STREAM_END)\n                return (read == 0) ? UNZ_EOF : read;\n            if (err != BZ_OK)\n                break;\n#endif\n        } else {\n            ZPOS64_T total_out_before, total_out_after;\n            const Bytef *buf_before;\n            ZPOS64_T out_bytes;\n            int flush = Z_SYNC_FLUSH;\n\n            total_out_before = pfile_in_zip_read_info->stream.total_out;\n            buf_before = pfile_in_zip_read_info->stream.next_out;\n\n            /*\n               if ((pfile_in_zip_read_info->rest_read_uncompressed ==\n                     pfile_in_zip_read_info->stream.avail_out) &&\n                (pfile_in_zip_read_info->rest_read_compressed == 0))\n                flush = Z_FINISH;\n             */\n            err = inflate(&pfile_in_zip_read_info->stream, flush);\n\n            if ((err >= 0) && (pfile_in_zip_read_info->stream.msg != NULL))\n                err = Z_DATA_ERROR;\n\n            total_out_after = pfile_in_zip_read_info->stream.total_out;\n            out_bytes = total_out_after - total_out_before;\n\n            pfile_in_zip_read_info->total_out_64 += out_bytes;\n            pfile_in_zip_read_info->rest_read_uncompressed -= out_bytes;\n            pfile_in_zip_read_info->crc32 =\n                crc32(pfile_in_zip_read_info->crc32, buf_before, (uInt)(out_bytes));\n\n            read += (uInt)(total_out_after - total_out_before);\n\n            if (err == Z_STREAM_END)\n                return (read == 0) ? UNZ_EOF : read;\n            if (err != Z_OK)\n                break;\n        }\n    }\n\n    if (err == Z_OK)\n        return read;\n    return err;\n}\n\nextern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64(unzFile file)\n{\n    unz64_s *s;\n    file_in_zip64_read_info_s *pfile_in_zip_read_info;\n    s = (unz64_s *)file;\n    if (file == NULL)\n        return 0; /* UNZ_PARAMERROR */\n    pfile_in_zip_read_info = s->pfile_in_zip_read;\n    if (pfile_in_zip_read_info == NULL)\n        return 0; /* UNZ_PARAMERROR */\n    return pfile_in_zip_read_info->pos_in_zipfile + pfile_in_zip_read_info->byte_before_the_zipfile;\n}\n\nextern int ZEXPORT unzGetLocalExtrafield(unzFile file, voidp buf, unsigned len)\n{\n    unz64_s *s;\n    file_in_zip64_read_info_s *pfile_in_zip_read_info;\n    uInt read_now;\n    ZPOS64_T size_to_read;\n\n    if (file == NULL)\n        return UNZ_PARAMERROR;\n    s = (unz64_s *)file;\n    pfile_in_zip_read_info = s->pfile_in_zip_read;\n\n    if (pfile_in_zip_read_info == NULL)\n        return UNZ_PARAMERROR;\n\n    size_to_read = pfile_in_zip_read_info->size_local_extrafield - pfile_in_zip_read_info->pos_local_extrafield;\n\n    if (buf == NULL)\n        return (int)size_to_read;\n\n    if (len > size_to_read)\n        read_now = (uInt)size_to_read;\n    else\n        read_now = (uInt)len;\n\n    if (read_now == 0)\n        return 0;\n\n    if (ZSEEK64(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream,\n                pfile_in_zip_read_info->offset_local_extrafield + pfile_in_zip_read_info->pos_local_extrafield,\n                ZLIB_FILEFUNC_SEEK_SET) != 0)\n        return UNZ_ERRNO;\n\n    if (ZREAD64(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, buf, read_now) != read_now)\n        return UNZ_ERRNO;\n\n    return (int)read_now;\n}\n\nextern int ZEXPORT unzCloseCurrentFile(unzFile file)\n{\n    int err = UNZ_OK;\n\n    unz64_s *s;\n    file_in_zip64_read_info_s *pfile_in_zip_read_info;\n    if (file == NULL)\n        return UNZ_PARAMERROR;\n    s = (unz64_s *)file;\n    pfile_in_zip_read_info = s->pfile_in_zip_read;\n\n    if (pfile_in_zip_read_info == NULL)\n        return UNZ_PARAMERROR;\n\n#ifdef HAVE_AES\n    if (s->cur_file_info.compression_method == AES_METHOD) {\n        unsigned char authcode[AES_AUTHCODESIZE];\n        unsigned char rauthcode[AES_AUTHCODESIZE];\n\n        if (ZREAD64(s->z_filefunc, s->filestream, authcode, AES_AUTHCODESIZE) != AES_AUTHCODESIZE)\n            return UNZ_ERRNO;\n\n        if (fcrypt_end(rauthcode, &s->pfile_in_zip_read->aes_ctx) != AES_AUTHCODESIZE)\n            err = UNZ_CRCERROR;\n        if (memcmp(authcode, rauthcode, AES_AUTHCODESIZE) != 0)\n            err = UNZ_CRCERROR;\n    }\n    /* AES zip version AE-1 will expect a valid crc as well */\n    if ((s->cur_file_info.compression_method != AES_METHOD) ||\n        (s->cur_file_info_internal.aes_version == 0x0001))\n#endif\n    {\n        if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) &&\n            (!pfile_in_zip_read_info->raw)) {\n            if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)\n                err = UNZ_CRCERROR;\n        }\n    }\n\n    TRYFREE(pfile_in_zip_read_info->read_buffer);\n    pfile_in_zip_read_info->read_buffer = NULL;\n    if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED)\n        inflateEnd(&pfile_in_zip_read_info->stream);\n#ifdef HAVE_BZIP2\n    else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED)\n        BZ2_bzDecompressEnd(&pfile_in_zip_read_info->bstream);\n#endif\n\n    pfile_in_zip_read_info->stream_initialised = 0;\n    TRYFREE(pfile_in_zip_read_info);\n\n    s->pfile_in_zip_read = NULL;\n\n    return err;\n}\n\nextern int ZEXPORT unzGoToFirstFile2(unzFile file, unz_file_info64 *pfile_info, char *filename,\n                                     uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size)\n{\n    int err = UNZ_OK;\n    unz64_s *s;\n    if (file == NULL)\n        return UNZ_PARAMERROR;\n    s = (unz64_s *)file;\n    s->pos_in_central_dir = s->offset_central_dir;\n    s->num_file = 0;\n    err = unz64local_GetCurrentFileInfoInternal(file, &s->cur_file_info, &s->cur_file_info_internal,\n                                                filename, filename_size, extrafield, extrafield_size, comment, comment_size);\n    s->current_file_ok = (err == UNZ_OK);\n    if ((err == UNZ_OK) && (pfile_info != NULL))\n        memcpy(pfile_info, &s->cur_file_info, sizeof(unz_file_info64));\n    return err;\n}\n\nextern int ZEXPORT unzGoToFirstFile(unzFile file)\n{\n    return unzGoToFirstFile2(file, NULL, NULL, 0, NULL, 0, NULL, 0);\n}\n\nextern int ZEXPORT unzGoToNextFile2(unzFile file, unz_file_info64 *pfile_info, char *filename,\n                                    uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size)\n{\n    unz64_s *s;\n    int err;\n\n    if (file == NULL)\n        return UNZ_PARAMERROR;\n    s = (unz64_s *)file;\n    if (!s->current_file_ok)\n        return UNZ_END_OF_LIST_OF_FILE;\n    if (s->gi.number_entry != 0xffff)    /* 2^16 files overflow hack */\n        if (s->num_file + 1 == s->gi.number_entry)\n            return UNZ_END_OF_LIST_OF_FILE;\n    s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename +\n                             s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment;\n    s->num_file++;\n    err = unz64local_GetCurrentFileInfoInternal(file, &s->cur_file_info, &s->cur_file_info_internal,\n                                                filename, filename_size, extrafield, extrafield_size, comment, comment_size);\n    s->current_file_ok = (err == UNZ_OK);\n    if ((err == UNZ_OK) && (pfile_info != NULL))\n        memcpy(pfile_info, &s->cur_file_info, sizeof(unz_file_info64));\n    return err;\n}\n\nextern int ZEXPORT unzGoToNextFile(unzFile file)\n{\n    return unzGoToNextFile2(file, NULL, NULL, 0, NULL, 0, NULL, 0);\n}\n\nextern int ZEXPORT unzLocateFile(unzFile file, const char *filename, unzFileNameComparer filename_compare_func)\n{\n    unz64_s *s;\n    int err;\n    unz_file_info64 cur_file_info_saved;\n    unz_file_info64_internal cur_file_info_internal_saved;\n    ZPOS64_T num_file_saved;\n    ZPOS64_T pos_in_central_dir_saved;\n    char current_filename[UNZ_MAXFILENAMEINZIP + 1];\n\n    if (file == NULL)\n        return UNZ_PARAMERROR;\n    if (strlen(filename) >= UNZ_MAXFILENAMEINZIP)\n        return UNZ_PARAMERROR;\n    s = (unz64_s *)file;\n    if (!s->current_file_ok)\n        return UNZ_END_OF_LIST_OF_FILE;\n\n    /* Save the current state */\n    num_file_saved = s->num_file;\n    pos_in_central_dir_saved = s->pos_in_central_dir;\n    cur_file_info_saved = s->cur_file_info;\n    cur_file_info_internal_saved = s->cur_file_info_internal;\n\n    err = unzGoToFirstFile2(file, NULL, current_filename, sizeof(current_filename) - 1, NULL, 0, NULL, 0);\n\n    while (err == UNZ_OK) {\n        if (filename_compare_func != NULL)\n            err = filename_compare_func(file, current_filename, filename);\n        else\n            err = strcmp(current_filename, filename);\n        if (err == 0)\n            return UNZ_OK;\n        err = unzGoToNextFile2(file, NULL, current_filename, sizeof(current_filename) - 1, NULL, 0, NULL, 0);\n    }\n\n    /* We failed, so restore the state of the 'current file' to where we were. */\n    s->num_file = num_file_saved;\n    s->pos_in_central_dir = pos_in_central_dir_saved;\n    s->cur_file_info = cur_file_info_saved;\n    s->cur_file_info_internal = cur_file_info_internal_saved;\n    return err;\n}\n\nextern int ZEXPORT unzGetFilePos(unzFile file, unz_file_pos *file_pos)\n{\n    unz64_file_pos file_pos64;\n    int err = unzGetFilePos64(file, &file_pos64);\n    if (err == UNZ_OK) {\n        file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory;\n        file_pos->num_of_file = (uLong)file_pos64.num_of_file;\n    }\n    return err;\n}\n\nextern int ZEXPORT unzGoToFilePos(unzFile file, unz_file_pos *file_pos)\n{\n    unz64_file_pos file_pos64;\n\n    if (file_pos == NULL)\n        return UNZ_PARAMERROR;\n    file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory;\n    file_pos64.num_of_file = file_pos->num_of_file;\n    return unzGoToFilePos64(file, &file_pos64);\n}\n\nextern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos *file_pos)\n{\n    unz64_s *s;\n\n    if (file == NULL || file_pos == NULL)\n        return UNZ_PARAMERROR;\n    s = (unz64_s *)file;\n    if (!s->current_file_ok)\n        return UNZ_END_OF_LIST_OF_FILE;\n\n    file_pos->pos_in_zip_directory = s->pos_in_central_dir;\n    file_pos->num_of_file = s->num_file;\n\n    return UNZ_OK;\n}\n\nextern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos *file_pos)\n{\n    unz64_s *s;\n    int err;\n\n    if (file == NULL || file_pos == NULL)\n        return UNZ_PARAMERROR;\n    s = (unz64_s *)file;\n\n    /* jump to the right spot */\n    s->pos_in_central_dir = file_pos->pos_in_zip_directory;\n    s->num_file = file_pos->num_of_file;\n\n    /* set the current file */\n    err = unz64local_GetCurrentFileInfoInternal(file, &s->cur_file_info, &s->cur_file_info_internal, NULL, 0, NULL, 0, NULL, 0);\n    /* return results */\n    s->current_file_ok = (err == UNZ_OK);\n    return err;\n}\n\nextern uLong ZEXPORT unzGetOffset(unzFile file)\n{\n    ZPOS64_T offset64;\n\n    if (file == NULL)\n        return 0; /* UNZ_PARAMERROR; */\n    offset64 = unzGetOffset64(file);\n    return (uLong)offset64;\n}\n\nextern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file)\n{\n    unz64_s *s;\n\n    if (file == NULL)\n        return 0; /* UNZ_PARAMERROR; */\n    s = (unz64_s *)file;\n    if (!s->current_file_ok)\n        return 0;\n    if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff)\n        if (s->num_file == s->gi.number_entry)\n            return 0;\n    return s->pos_in_central_dir;\n}\n\nextern int ZEXPORT unzSetOffset(unzFile file, uLong pos)\n{\n    return unzSetOffset64(file, pos);\n}\n\nextern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos)\n{\n    unz64_s *s;\n    int err;\n\n    if (file == NULL)\n        return UNZ_PARAMERROR;\n    s = (unz64_s *)file;\n\n    s->pos_in_central_dir = pos;\n    s->num_file = s->gi.number_entry;      /* hack */\n    err = unz64local_GetCurrentFileInfoInternal(file, &s->cur_file_info, &s->cur_file_info_internal, NULL, 0, NULL, 0, NULL, 0);\n    s->current_file_ok = (err == UNZ_OK);\n    return err;\n}\n\nextern z_off_t ZEXPORT unztell(unzFile file)\n{\n    unz64_s *s;\n    file_in_zip64_read_info_s *pfile_in_zip_read_info;\n    if (file == NULL)\n        return UNZ_PARAMERROR;\n    s = (unz64_s *)file;\n    pfile_in_zip_read_info = s->pfile_in_zip_read;\n    if (pfile_in_zip_read_info == NULL)\n        return UNZ_PARAMERROR;\n    return (z_off_t)pfile_in_zip_read_info->stream.total_out;\n}\n\nextern ZPOS64_T ZEXPORT unztell64(unzFile file)\n{\n\n    unz64_s *s;\n    file_in_zip64_read_info_s *pfile_in_zip_read_info;\n    if (file == NULL)\n        return (ZPOS64_T)-1;\n    s = (unz64_s *)file;\n    pfile_in_zip_read_info = s->pfile_in_zip_read;\n\n    if (pfile_in_zip_read_info == NULL)\n        return (ZPOS64_T)-1;\n\n    return pfile_in_zip_read_info->total_out_64;\n}\n\nextern int ZEXPORT unzeof(unzFile file)\n{\n    unz64_s *s;\n    file_in_zip64_read_info_s *pfile_in_zip_read_info;\n    if (file == NULL)\n        return UNZ_PARAMERROR;\n    s = (unz64_s *)file;\n    pfile_in_zip_read_info = s->pfile_in_zip_read;\n\n    if (pfile_in_zip_read_info == NULL)\n        return UNZ_PARAMERROR;\n\n    if (pfile_in_zip_read_info->rest_read_uncompressed == 0)\n        return 1;\n    return 0;\n}\n\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/minizip/unzip.h",
    "content": "/* unzip.h -- IO for uncompress .zip files using zlib\n   Version 1.1, February 14h, 2010\n   part of the MiniZip project\n\n   Copyright (C) 1998-2010 Gilles Vollant\n     http://www.winimage.com/zLibDll/minizip.html\n   Modifications of Unzip for Zip64\n     Copyright (C) 2007-2008 Even Rouault\n   Modifications for Zip64 support on both zip and unzip\n     Copyright (C) 2009-2010 Mathias Svensson\n     http://result42.com\n\n   This program is distributed under the terms of the same license as zlib.\n   See the accompanying LICENSE file for the full text of the license.\n*/\n\n#include \"Common.h\"\n\n#ifndef _UNZ_H\n#define _UNZ_H\n\n#define HAVE_AES\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef _ZLIB_H\n#include \"zlib.h\"\n#endif\n\n#ifndef  _ZLIBIOAPI_H\n#include \"ioapi.h\"\n#endif\n\n#ifdef HAVE_BZIP2\n#include \"bzlib.h\"\n#endif\n\n#define Z_BZIP2ED 12\n\n#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)\n/* like the STRICT of WIN32, we define a pointer that cannot be converted\n    from (void*) without cast */\ntypedef struct TagunzFile__ { int unused; } unzFile__;\ntypedef unzFile__ *unzFile;\n#else\ntypedef voidp unzFile;\n#endif\n\n\n#define UNZ_OK                          (0)\n#define UNZ_END_OF_LIST_OF_FILE         (-100)\n#define UNZ_ERRNO                       (Z_ERRNO)\n#define UNZ_EOF                         (0)\n#define UNZ_PARAMERROR                  (-102)\n#define UNZ_BADZIPFILE                  (-103)\n#define UNZ_INTERNALERROR               (-104)\n#define UNZ_CRCERROR                    (-105)\n\n\n/***************************************************************************/\n/* Opening and close a zip file */\n\nextern unzFile ZEXPORT unzOpen OF((const char *path));\nextern unzFile ZEXPORT unzOpen64 OF((const void *path));\n/* Open a Zip file.\n\n   path should contain the full pathname (by example, on a Windows XP computer \n      \"c:\\\\zlib\\\\zlib113.zip\" or on an Unix computer \"zlib/zlib113.zip\". \n   return NULL if zipfile cannot be opened or doesn't exist\n   return unzFile handle if no error\n\n   NOTE: The \"64\" function take a const void* pointer, because  the path is just the value passed to the\n   open64_file_func callback. Under Windows, if UNICODE is defined, using fill_fopen64_filefunc, the path \n   is a pointer to a wide unicode string  (LPCTSTR is LPCWSTR), so const char* does not describe the reality */\n\nextern unzFile ZEXPORT unzOpen2 OF((const char *path, zlib_filefunc_def* pzlib_filefunc_def));\n/* Open a Zip file, like unzOpen, but provide a set of file low level API for read/write operations */\nextern unzFile ZEXPORT unzOpen2_64 OF((const void *path, zlib_filefunc64_def* pzlib_filefunc_def));\n/* Open a Zip file, like unz64Open, but provide a set of file low level API for read/write 64-bit operations */\n\nextern int ZEXPORT unzClose OF((unzFile file));\n/* Close a ZipFile opened with unzipOpen. If there is files inside the .Zip opened with unzOpenCurrentFile,\n   these files MUST be closed with unzipCloseCurrentFile before call unzipClose.\n\n   return UNZ_OK if there is no error */\n\nextern int ZEXPORT unzGetGlobalInfo OF((unzFile file, unz_global_info *pglobal_info));\nextern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file, unz_global_info64 *pglobal_info));\n/* Write info about the ZipFile in the *pglobal_info structure.\n\n   return UNZ_OK if no error */\n\nextern int ZEXPORT unzGetGlobalComment OF((unzFile file, char *comment, uLong comment_size));\n/* Get the global comment string of the ZipFile, in the comment buffer.\n\n   uSizeBuf is the size of the szComment buffer.\n   return the number of byte copied or an error code <0 */\n\n/***************************************************************************/\n/* Reading the content of the current zipfile, you can open it, read data from it, and close it\n   (you can close it before reading all the file) */\n\nextern int ZEXPORT unzOpenCurrentFile OF((unzFile file));\n/* Open for reading data the current file in the zipfile.\n\n   return UNZ_OK if no error */\n\nextern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, const char* password));\n/* Open for reading data the current file in the zipfile.\n   password is a crypting password\n\n   return UNZ_OK if no error */\n\nextern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, int* method, int* level, int raw));\n/* Same as unzOpenCurrentFile, but open for read raw the file (not uncompress)\n   if raw==1 *method will receive method of compression, *level will receive level of compression\n\n   NOTE: you can set level parameter as NULL (if you did not want known level,\n         but you CANNOT set method parameter as NULL */\n\nextern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, int* method, int* level, int raw, const char* password));\n/* Same as unzOpenCurrentFile, but takes extra parameter password for encrypted files */\n\nextern int ZEXPORT unzReadCurrentFile OF((unzFile file, voidp buf, unsigned len));\n/* Read bytes from the current file (opened by unzOpenCurrentFile)\n   buf contain buffer where data must be copied\n   len the size of buf.\n\n   return the number of byte copied if somes bytes are copied\n   return 0 if the end of file was reached\n   return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */\n\nextern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, unz_file_info *pfile_info, char *filename, \n    uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size));\nextern int ZEXPORT unzGetCurrentFileInfo64 OF((unzFile file, unz_file_info64 *pfile_info, char *filename,\n    uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size));\n/* Get Info about the current file\n\n   pfile_info if != NULL, the *pfile_info structure will contain somes info about the current file\n   filename if != NULL, the file name string will be copied in filename \n   filename_size is the size of the filename buffer\n   extrafield if != NULL, the extra field information from the central header will be copied in to\n   extrafield_size is the size of the extraField buffer \n   comment if != NULL, the comment string of the file will be copied in to\n   comment_size is the size of the comment buffer */\n\nextern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file));\n\nextern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, voidp buf, unsigned len));\n/* Read extra field from the current file (opened by unzOpenCurrentFile)\n   This is the local-header version of the extra field (sometimes, there is\n   more info in the local-header version than in the central-header)\n\n   if buf == NULL, it return the size of the local extra field\n   if buf != NULL, len is the size of the buffer, the extra header is copied in buf.\n\n   return number of bytes copied in buf, or (if <0) the error code */\n\nextern int ZEXPORT unzCloseCurrentFile OF((unzFile file));\n/* Close the file in zip opened with unzOpenCurrentFile\n\n   return UNZ_CRCERROR if all the file was read but the CRC is not good */\n\n/***************************************************************************/\n/* Browse the directory of the zipfile */\n\ntypedef int (*unzFileNameComparer)(unzFile file, const char *filename1, const char *filename2);\ntypedef int (*unzIteratorFunction)(unzFile file);\ntypedef int (*unzIteratorFunction2)(unzFile file, unz_file_info64 *pfile_info, char *filename,\n    uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size);\n\nextern int ZEXPORT unzGoToFirstFile OF((unzFile file));\n/* Set the current file of the zipfile to the first file.\n\n   return UNZ_OK if no error */\n\nextern int ZEXPORT unzGoToFirstFile2 OF((unzFile file, unz_file_info64 *pfile_info, char *filename,\n    uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size));\n/* Set the current file of the zipfile to the first file and retrieves the current info on success. \n   Not as seek intensive as unzGoToFirstFile + unzGetCurrentFileInfo.\n\n   return UNZ_OK if no error */\n\nextern int ZEXPORT unzGoToNextFile OF((unzFile file));\n/* Set the current file of the zipfile to the next file.\n\n   return UNZ_OK if no error\n   return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest */\n\nextern int ZEXPORT unzGoToNextFile2 OF((unzFile file, unz_file_info64 *pfile_info, char *filename,\n    uLong filename_size, void *extrafield, uLong extrafield_size, char *comment, uLong comment_size));\n/* Set the current file of the zipfile to the next file and retrieves the current \n   info on success. Does less seeking around than unzGotoNextFile + unzGetCurrentFileInfo.\n\n   return UNZ_OK if no error\n   return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest */\n\nextern int ZEXPORT unzLocateFile OF((unzFile file, const char *filename, unzFileNameComparer filename_compare_func));\n/* Try locate the file szFileName in the zipfile. For custom filename comparison pass in comparison function.\n\n   return UNZ_OK if the file is found (it becomes the current file)\n   return UNZ_END_OF_LIST_OF_FILE if the file is not found */\n\n/***************************************************************************/\n/* Raw access to zip file */\n\ntypedef struct unz_file_pos_s\n{\n    uLong pos_in_zip_directory;     /* offset in zip file directory */\n    uLong num_of_file;              /* # of file */\n} unz_file_pos;\n\nextern int ZEXPORT unzGetFilePos OF((unzFile file, unz_file_pos* file_pos));\nextern int ZEXPORT unzGoToFilePos OF((unzFile file, unz_file_pos* file_pos));\n\ntypedef struct unz64_file_pos_s\n{\n    ZPOS64_T pos_in_zip_directory;   /* offset in zip file directory */\n    ZPOS64_T num_of_file;            /* # of file */\n} unz64_file_pos;\n\nextern int ZEXPORT unzGetFilePos64 OF((unzFile file, unz64_file_pos* file_pos));\nextern int ZEXPORT unzGoToFilePos64 OF((unzFile file, const unz64_file_pos* file_pos));\n\nextern uLong ZEXPORT unzGetOffset OF((unzFile file));\nextern ZPOS64_T ZEXPORT unzGetOffset64 OF((unzFile file));\n/* Get the current file offset */\n\nextern int ZEXPORT unzSetOffset OF((unzFile file, uLong pos));\nextern int ZEXPORT unzSetOffset64 OF((unzFile file, ZPOS64_T pos));\n/* Set the current file offset */\n\nextern z_off_t ZEXPORT unztell OF((unzFile file));\nextern ZPOS64_T ZEXPORT unztell64 OF((unzFile file));\n/* return current position in uncompressed data */\n\nextern int ZEXPORT unzeof OF((unzFile file));\n/* return 1 if the end of file was reached, 0 elsewhere */\n\n/***************************************************************************/\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* _UNZ_H */\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/minizip/zip.c",
    "content": "/* zip.c -- IO on .zip files using zlib\n   Version 1.1, February 14h, 2010\n   part of the MiniZip project\n\n   Copyright (C) 1998-2010 Gilles Vollant\n     http://www.winimage.com/zLibDll/minizip.html\n   Modifications for Zip64 support\n     Copyright (C) 2009-2010 Mathias Svensson\n     http://result42.com\n   Modifications for AES, PKWARE disk spanning\n     Copyright (C) 2010-2014 Nathan Moinvaziri\n\n   This program is distributed under the terms of the same license as zlib.\n   See the accompanying LICENSE file for the full text of the license.\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <time.h>\n#include \"zlib.h\"\n#include \"zip.h\"\n\n#ifdef STDC\n#  include <stddef.h>\n#  include <string.h>\n#  include <stdlib.h>\n#endif\n#ifdef NO_ERRNO_H\nextern int errno;\n#else\n#   include <errno.h>\n#endif\n\n#ifdef HAVE_AES\n#  define AES_METHOD          (99)\n#  define AES_PWVERIFYSIZE    (2)\n#  define AES_AUTHCODESIZE    (10)\n#  define AES_MAXSALTLENGTH   (16)\n#  define AES_VERSION         (0x0001)\n#  define AES_ENCRYPTIONMODE  (0x03)\n\n#  include \"aes.h\"\n#  include \"fileenc.h\"\n#  include \"prng.h\"\n#  include \"entropy.h\"\n#endif\n\n#ifndef NOCRYPT\n#  define INCLUDECRYPTINGCODE_IFCRYPTALLOWED\n#  include \"crypt.h\"\n#endif\n\n#ifndef local\n#  define local static\n#endif\n/* compile with -Dlocal if your debugger can't find static symbols */\n\n#define SIZEDATA_INDATABLOCK        (4096 - (4 * 4))\n\n#define DISKHEADERMAGIC             (0x08074b50)\n#define LOCALHEADERMAGIC            (0x04034b50)\n#define CENTRALHEADERMAGIC          (0x02014b50)\n#define ENDHEADERMAGIC              (0x06054b50)\n#define ZIP64ENDHEADERMAGIC         (0x06064b50)\n#define ZIP64ENDLOCHEADERMAGIC      (0x07064b50)\n\n#define FLAG_LOCALHEADER_OFFSET     (0x06)\n#define CRC_LOCALHEADER_OFFSET      (0x0e)\n\n#define SIZECENTRALHEADER           (0x2e) /* 46 */\n#define SIZECENTRALHEADERLOCATOR    (0x14) /* 20 */\n#define SIZECENTRALDIRITEM          (0x2e)\n#define SIZEZIPLOCALHEADER          (0x1e)\n\n#ifndef BUFREADCOMMENT\n#  define BUFREADCOMMENT            (0x400)\n#endif\n#ifndef VERSIONMADEBY\n#  define VERSIONMADEBY             (0x0) /* platform dependent */\n#endif\n\n#ifndef Z_BUFSIZE\n#  define Z_BUFSIZE (64 * 1024)\n#endif\n#ifndef Z_MAXFILENAMEINZIP\n#  define Z_MAXFILENAMEINZIP (256)\n#endif\n\n#ifndef ALLOC\n#  define ALLOC(size) (malloc(size))\n#endif\n#ifndef TRYFREE\n#  define TRYFREE(p) {if (p) free(p); }\n#endif\n\n/* NOT sure that this work on ALL platform */\n#define MAKEULONG64(a, b) ((ZPOS64_T)(((unsigned long)(a)) | ((ZPOS64_T)((unsigned long)(b))) << 32))\n\n#ifndef DEF_MEM_LEVEL\n#  if MAX_MEM_LEVEL >= 8\n#    define DEF_MEM_LEVEL 8\n#  else\n#    define DEF_MEM_LEVEL  MAX_MEM_LEVEL\n#  endif\n#endif\n\nconst char zip_copyright[] = \" zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll\";\n\ntypedef struct linkedlist_datablock_internal_s {\n    struct linkedlist_datablock_internal_s *next_datablock;\n    uLong avail_in_this_block;\n    uLong filled_in_this_block;\n    uLong unused;  /* for future use and alignment */\n    unsigned char data[SIZEDATA_INDATABLOCK];\n} linkedlist_datablock_internal;\n\ntypedef struct linkedlist_data_s {\n    linkedlist_datablock_internal *first_block;\n    linkedlist_datablock_internal *last_block;\n} linkedlist_data;\n\ntypedef struct {\n    z_stream stream;                /* zLib stream structure for inflate */\n#ifdef HAVE_BZIP2\n    bz_stream bstream;              /* bzLib stream structure for bziped */\n#endif\n#ifdef HAVE_AES\n    fcrypt_ctx aes_ctx;\n    prng_ctx aes_rng[1];\n#endif\n    int stream_initialised;         /* 1 is stream is initialized */\n    uInt pos_in_buffered_data;      /* last written byte in buffered_data */\n\n    ZPOS64_T pos_local_header;      /* offset of the local header of the file currently writing */\n    char *central_header;           /* central header data for the current file */\n    uLong size_centralextra;\n    uLong size_centralheader;       /* size of the central header for cur file */\n    uLong size_centralextrafree;    /* Extra bytes allocated to the central header but that are not used */\n    uLong size_comment;\n    uLong flag;                     /* flag of the file currently writing */\n\n    int method;                     /* compression method written to file.*/\n    int compression_method;         /* compression method to use */\n    int raw;                        /* 1 for directly writing raw data */\n    Byte buffered_data[Z_BUFSIZE];  /* buffer contain compressed data to be writ*/\n    uLong dosDate;\n    uLong crc32;\n    int zip64;                      /* Add ZIP64 extended information in the extra field */\n    uLong number_disk;              /* number of current disk used for spanning ZIP */\n    ZPOS64_T pos_zip64extrainfo;\n    ZPOS64_T total_compressed;\n    ZPOS64_T total_uncompressed;\n#ifndef NOCRYPT\n    unsigned long keys[3];          /* keys defining the pseudo-random sequence */\n    const unsigned long *pcrc_32_tab;\n    int crypt_header_size;\n#endif\n} curfile64_info;\n\ntypedef struct {\n    zlib_filefunc64_32_def z_filefunc;\n    voidpf filestream;              /* io structure of the zipfile */\n    voidpf filestream_with_CD;      /* io structure of the zipfile with the central dir */\n    linkedlist_data central_dir;    /* datablock with central dir in construction*/\n    int in_opened_file_inzip;       /* 1 if a file in the zip is currently writ.*/\n    int append;                     /* append mode */\n    curfile64_info ci;              /* info on the file currently writing */\n\n    ZPOS64_T begin_pos;             /* position of the beginning of the zipfile */\n    ZPOS64_T add_position_when_writting_offset;\n    ZPOS64_T number_entry;\n    ZPOS64_T disk_size;             /* size of each disk */\n    uLong number_disk;              /* number of the current disk, used for spanning ZIP */\n    uLong number_disk_with_CD;      /* number the the disk with central dir, used for spanning ZIP */\n#ifndef NO_ADDFILEINEXISTINGZIP\n    char *globalcomment;\n#endif\n} zip64_internal;\n\n/* Allocate a new data block */\nlocal linkedlist_datablock_internal *allocate_new_datablock OF(());\nlocal linkedlist_datablock_internal *allocate_new_datablock()\n{\n    linkedlist_datablock_internal *ldi;\n\n    ldi = (linkedlist_datablock_internal *)ALLOC(sizeof(linkedlist_datablock_internal));\n\n    if (ldi != NULL) {\n        ldi->next_datablock = NULL;\n        ldi->filled_in_this_block = 0;\n        ldi->avail_in_this_block = SIZEDATA_INDATABLOCK;\n    }\n    return ldi;\n}\n\n/* Free data block in linked list */\nlocal void free_datablock OF((linkedlist_datablock_internal * ldi));\nlocal void free_datablock(linkedlist_datablock_internal *ldi)\n{\n    while (ldi != NULL) {\n        linkedlist_datablock_internal *ldinext = ldi->next_datablock;\n        TRYFREE(ldi);\n        ldi = ldinext;\n    }\n}\n\n/* Initialize linked list */\nlocal void init_linkedlist OF((linkedlist_data * ll));\nlocal void init_linkedlist(linkedlist_data *ll)\n{\n    ll->first_block = ll->last_block = NULL;\n}\n\n/* Free entire linked list and all data blocks */\nlocal void free_linkedlist OF((linkedlist_data * ll));\nlocal void free_linkedlist(linkedlist_data *ll)\n{\n    free_datablock(ll->first_block);\n    ll->first_block = ll->last_block = NULL;\n}\n\n/* Add data to linked list data block */\nlocal int add_data_in_datablock OF((linkedlist_data * ll, const void *buf, uLong len));\nlocal int add_data_in_datablock(linkedlist_data *ll, const void *buf, uLong len)\n{\n    linkedlist_datablock_internal *ldi;\n    const unsigned char *from_copy;\n\n    if (ll == NULL)\n        return ZIP_INTERNALERROR;\n\n    if (ll->last_block == NULL) {\n        ll->first_block = ll->last_block = allocate_new_datablock();\n        if (ll->first_block == NULL)\n            return ZIP_INTERNALERROR;\n    }\n\n    ldi = ll->last_block;\n    from_copy = (unsigned char *)buf;\n\n    while (len > 0) {\n        uInt copy_this;\n        uInt i;\n        unsigned char *to_copy;\n\n        if (ldi->avail_in_this_block == 0) {\n            ldi->next_datablock = allocate_new_datablock();\n            if (ldi->next_datablock == NULL)\n                return ZIP_INTERNALERROR;\n            ldi = ldi->next_datablock;\n            ll->last_block = ldi;\n        }\n\n        if (ldi->avail_in_this_block < len)\n            copy_this = (uInt)ldi->avail_in_this_block;\n        else\n            copy_this = (uInt)len;\n\n        to_copy = &(ldi->data[ldi->filled_in_this_block]);\n\n        for (i = 0; i < copy_this; i++)\n            *(to_copy + i) = *(from_copy + i);\n\n        ldi->filled_in_this_block += copy_this;\n        ldi->avail_in_this_block -= copy_this;\n        from_copy += copy_this;\n        len -= copy_this;\n    }\n    return ZIP_OK;\n}\n\nlocal uLong zip64local_TmzDateToDosDate OF((const tm_zip * ptm));\nlocal uLong zip64local_TmzDateToDosDate(const tm_zip *ptm)\n{\n    uLong year;\n#define zip64local_in_range(min, max, value) ((min) <= (value) && (value) <= (max))\n    /* Years supported:\n     * [00, 79] (assumed to be between 2000 and 2079)\n     * [80, 207] (assumed to be between 1980 and 2107, typical output of old\n         software that does 'year-1900' to get a double digit year)\n     * [1980, 2107]\n       Due to the date format limitations, only years between 1980 and 2107 can be stored.\n     */\n    if (!(zip64local_in_range(1980, 2107, ptm->tm_year) || zip64local_in_range(0, 207, ptm->tm_year)) ||\n        !zip64local_in_range(0, 11, ptm->tm_mon) ||\n        !zip64local_in_range(1, 31, ptm->tm_mday) ||\n        !zip64local_in_range(0, 23, ptm->tm_hour) ||\n        !zip64local_in_range(0, 59, ptm->tm_min) ||\n        !zip64local_in_range(0, 59, ptm->tm_sec))\n        return 0;\n#undef zip64local_in_range\n\n    year = (uLong)ptm->tm_year;\n    if (year >= 1980) /* range [1980, 2107] */\n        year -= 1980;\n    else if (year >= 80) /* range [80, 99] */\n        year -= 80;\n    else /* range [00, 79] */\n        year += 20;\n\n    return\n        (uLong)(((ptm->tm_mday) + (32 * (ptm->tm_mon + 1)) + (512 * year)) << 16) |\n        ((ptm->tm_sec / 2) + (32 * ptm->tm_min) + (2048 * (uLong)ptm->tm_hour));\n}\n\n/* Inputs a long in LSB order to the given file: nbByte == 1, 2 ,4 or 8 (byte, short or long, ZPOS64_T) */\nlocal int zip64local_putValue OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream,\n                                  ZPOS64_T x, int nbByte));\nlocal int zip64local_putValue(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream,\n                              ZPOS64_T x, int nbByte)\n{\n    unsigned char buf[8];\n    int n;\n    for (n = 0; n < nbByte; n++) {\n        buf[n] = (unsigned char)(x & 0xff);\n        x >>= 8;\n    }\n    if (x != 0) {\n        /* data overflow - hack for ZIP64 (X Roche) */\n        for (n = 0; n < nbByte; n++) {\n            buf[n] = 0xff;\n        }\n    }\n\n    if (ZWRITE64(*pzlib_filefunc_def, filestream, buf, nbByte) != (uLong)nbByte)\n        return ZIP_ERRNO;\n\n    return ZIP_OK;\n}\n\nlocal void zip64local_putValue_inmemory OF((void *dest, ZPOS64_T x, int nbByte));\nlocal void zip64local_putValue_inmemory(void *dest, ZPOS64_T x, int nbByte)\n{\n    unsigned char *buf = (unsigned char *)dest;\n    int n;\n    for (n = 0; n < nbByte; n++) {\n        buf[n] = (unsigned char)(x & 0xff);\n        x >>= 8;\n    }\n\n    if (x != 0) {\n        /* data overflow - hack for ZIP64 */\n        for (n = 0; n < nbByte; n++) {\n            buf[n] = 0xff;\n        }\n    }\n}\n\nlocal int zip64local_getByte OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream, int *pi));\nlocal int zip64local_getByte(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, int *pi)\n{\n    unsigned char c;\n    int err = (int)ZREAD64(*pzlib_filefunc_def, filestream, &c, 1);\n    if (err == 1) {\n        *pi = (int)c;\n        return ZIP_OK;\n    }\n    if (ZERROR64(*pzlib_filefunc_def, filestream))\n        return ZIP_ERRNO;\n    return ZIP_EOF;\n}\n\nlocal int zip64local_getShort OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream, uLong * pX));\nlocal int zip64local_getShort(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, uLong *pX)\n{\n    uLong x;\n    int i = 0;\n    int err;\n\n    err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x = (uLong)i;\n    if (err == ZIP_OK)\n        err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x += ((uLong)i) << 8;\n\n    if (err == ZIP_OK)\n        *pX = x;\n    else\n        *pX = 0;\n    return err;\n}\n\nlocal int zip64local_getLong OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream, uLong * pX));\nlocal int zip64local_getLong(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, uLong *pX)\n{\n    uLong x;\n    int i = 0;\n    int err;\n\n    err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x = (uLong)i;\n    if (err == ZIP_OK)\n        err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x += ((uLong)i) << 8;\n    if (err == ZIP_OK)\n        err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x += ((uLong)i) << 16;\n    if (err == ZIP_OK)\n        err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x += ((uLong)i) << 24;\n\n    if (err == ZIP_OK)\n        *pX = x;\n    else\n        *pX = 0;\n    return err;\n}\n\nlocal int zip64local_getLong64 OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream, ZPOS64_T * pX));\nlocal int zip64local_getLong64(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX)\n{\n    ZPOS64_T x;\n    int i = 0;\n    int err;\n\n    err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x = (ZPOS64_T)i;\n    if (err == ZIP_OK)\n        err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x += ((ZPOS64_T)i) << 8;\n    if (err == ZIP_OK)\n        err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x += ((ZPOS64_T)i) << 16;\n    if (err == ZIP_OK)\n        err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x += ((ZPOS64_T)i) << 24;\n    if (err == ZIP_OK)\n        err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x += ((ZPOS64_T)i) << 32;\n    if (err == ZIP_OK)\n        err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x += ((ZPOS64_T)i) << 40;\n    if (err == ZIP_OK)\n        err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x += ((ZPOS64_T)i) << 48;\n    if (err == ZIP_OK)\n        err = zip64local_getByte(pzlib_filefunc_def, filestream, &i);\n    x += ((ZPOS64_T)i) << 56;\n\n    if (err == ZIP_OK)\n        *pX = x;\n    else\n        *pX = 0;\n\n    return err;\n}\n\n/* Gets the amount of bytes left to write to the current disk for spanning archives */\nlocal int zipGetDiskSizeAvailable OF((zipFile file, ZPOS64_T * size_available));\nlocal int zipGetDiskSizeAvailable(zipFile file, ZPOS64_T *size_available)\n{\n    zip64_internal *zi;\n    ZPOS64_T current_disk_size;\n\n    zi = (zip64_internal *)file;\n    ZSEEK64(zi->z_filefunc, zi->filestream, 0, ZLIB_FILEFUNC_SEEK_END);\n    current_disk_size = ZTELL64(zi->z_filefunc, zi->filestream);\n    *size_available = zi->disk_size - current_disk_size;\n    return ZIP_OK;\n}\n\n/* Goes to a specific disk number for spanning archives */\nlocal int zipGoToSpecificDisk OF((zipFile file, int number_disk, int open_existing));\nlocal int zipGoToSpecificDisk(zipFile file, int number_disk, int open_existing)\n{\n    zip64_internal *zi;\n    int err = ZIP_OK;\n\n    zi = (zip64_internal *)file;\n    if (zi->disk_size == 0)\n        return err;\n\n    if ((zi->filestream != NULL) && (zi->filestream != zi->filestream_with_CD))\n        ZCLOSE64(zi->z_filefunc, zi->filestream);\n\n    zi->filestream = ZOPENDISK64(zi->z_filefunc, zi->filestream_with_CD, number_disk, (open_existing == 1) ?\n                                 (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING) :\n                                 (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE));\n\n    if (zi->filestream == NULL)\n        err = ZIP_ERRNO;\n\n    return err;\n}\n\n/* Goes to the first disk in a spanned archive */\nlocal int zipGoToFirstDisk OF((zipFile file));\nlocal int zipGoToFirstDisk(zipFile file)\n{\n    zip64_internal *zi;\n    int number_disk_next;\n    int err = ZIP_OK;\n\n    zi = (zip64_internal *)file;\n\n    if (zi->disk_size == 0)\n        return err;\n    number_disk_next = 0;\n    if (zi->number_disk_with_CD > 0)\n        number_disk_next = (int)zi->number_disk_with_CD - 1;\n    err = zipGoToSpecificDisk(file, number_disk_next, (zi->append == APPEND_STATUS_ADDINZIP));\n    if ((err == ZIP_ERRNO) && (zi->append == APPEND_STATUS_ADDINZIP))\n        err = zipGoToSpecificDisk(file, number_disk_next, 0);\n    if (err == ZIP_OK)\n        zi->number_disk = number_disk_next;\n    ZSEEK64(zi->z_filefunc, zi->filestream, 0, ZLIB_FILEFUNC_SEEK_END);\n    return err;\n}\n\n/* Goes to the next disk in a spanned archive */\nlocal int zipGoToNextDisk OF((zipFile file));\nlocal int zipGoToNextDisk(zipFile file)\n{\n    zip64_internal *zi;\n    ZPOS64_T size_available_in_disk;\n    int err = ZIP_OK;\n    int number_disk_next;\n\n    zi = (zip64_internal *)file;\n\n    if (zi->disk_size == 0)\n        return err;\n\n    number_disk_next = (int)zi->number_disk + 1;\n\n    do {\n        err = zipGoToSpecificDisk(file, number_disk_next, (zi->append == APPEND_STATUS_ADDINZIP));\n        if ((err == ZIP_ERRNO) && (zi->append == APPEND_STATUS_ADDINZIP))\n            err = zipGoToSpecificDisk(file, number_disk_next, 0);\n        if (err != ZIP_OK)\n            break;\n        err = zipGetDiskSizeAvailable(file, &size_available_in_disk);\n        if (err != ZIP_OK)\n            break;\n        zi->number_disk = number_disk_next;\n        zi->number_disk_with_CD = zi->number_disk + 1;\n\n        number_disk_next += 1;\n    } while (size_available_in_disk <= 0);\n\n    return err;\n}\n\n/* Locate the Central directory of a zipfile (at the end, just before the global comment) */\nlocal ZPOS64_T zip64local_SearchCentralDir OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream));\nlocal ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream)\n{\n    unsigned char *buf;\n    ZPOS64_T file_size;\n    ZPOS64_T back_read = 4;\n    ZPOS64_T max_back = 0xffff; /* maximum size of global comment */\n    ZPOS64_T pos_found = 0;\n    uLong read_size;\n    ZPOS64_T read_pos;\n    int i;\n\n    buf = (unsigned char *)ALLOC(BUFREADCOMMENT + 4);\n    if (buf == NULL)\n        return 0;\n\n    if (ZSEEK64(*pzlib_filefunc_def, filestream, 0, ZLIB_FILEFUNC_SEEK_END) != 0) {\n        TRYFREE(buf);\n        return 0;\n    }\n\n    file_size = ZTELL64(*pzlib_filefunc_def, filestream);\n\n    if (max_back > file_size)\n        max_back = file_size;\n\n    while (back_read < max_back) {\n        if (back_read + BUFREADCOMMENT > max_back)\n            back_read = max_back;\n        else\n            back_read += BUFREADCOMMENT;\n\n        read_pos = file_size - back_read;\n        read_size = ((BUFREADCOMMENT + 4) < (file_size - read_pos)) ?\n                    (BUFREADCOMMENT + 4) : (uLong)(file_size - read_pos);\n\n        if (ZSEEK64(*pzlib_filefunc_def, filestream, read_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)\n            break;\n        if (ZREAD64(*pzlib_filefunc_def, filestream, buf, read_size) != read_size)\n            break;\n\n        for (i = (int)read_size - 3; (i--) > 0; )\n            if ((*(buf + i)) == (ENDHEADERMAGIC & 0xff) &&\n                (*(buf + i + 1)) == (ENDHEADERMAGIC >> 8 & 0xff) &&\n                (*(buf + i + 2)) == (ENDHEADERMAGIC >> 16 & 0xff) &&\n                (*(buf + i + 3)) == (ENDHEADERMAGIC >> 24 & 0xff)) {\n                pos_found = read_pos + i;\n                break;\n            }\n\n        if (pos_found != 0)\n            break;\n    }\n    TRYFREE(buf);\n    return pos_found;\n}\n\n/* Locate the Central directory 64 of a zipfile (at the end, just before the global comment) */\nlocal ZPOS64_T zip64local_SearchCentralDir64 OF((const zlib_filefunc64_32_def * pzlib_filefunc_def, voidpf filestream,\n                                                 const ZPOS64_T endcentraloffset));\nlocal ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def *pzlib_filefunc_def, voidpf filestream,\n                                             const ZPOS64_T endcentraloffset)\n{\n    ZPOS64_T offset;\n    uLong uL;\n\n    /* Zip64 end of central directory locator */\n    if (ZSEEK64(*pzlib_filefunc_def, filestream, endcentraloffset - SIZECENTRALHEADERLOCATOR, ZLIB_FILEFUNC_SEEK_SET) != 0)\n        return 0;\n\n    /* read locator signature */\n    if (zip64local_getLong(pzlib_filefunc_def, filestream, &uL) != ZIP_OK)\n        return 0;\n    if (uL != ZIP64ENDLOCHEADERMAGIC)\n        return 0;\n    /* number of the disk with the start of the zip64 end of  central directory */\n    if (zip64local_getLong(pzlib_filefunc_def, filestream, &uL) != ZIP_OK)\n        return 0;\n    /* relative offset of the zip64 end of central directory record */\n    if (zip64local_getLong64(pzlib_filefunc_def, filestream, &offset) != ZIP_OK)\n        return 0;\n    /* total number of disks */\n    if (zip64local_getLong(pzlib_filefunc_def, filestream, &uL) != ZIP_OK)\n        return 0;\n    /* Goto end of central directory record */\n    if (ZSEEK64(*pzlib_filefunc_def, filestream, offset, ZLIB_FILEFUNC_SEEK_SET) != 0)\n        return 0;\n    /* the signature */\n    if (zip64local_getLong(pzlib_filefunc_def, filestream, &uL) != ZIP_OK)\n        return 0;\n    if (uL != ZIP64ENDHEADERMAGIC)\n        return 0;\n\n    return offset;\n}\n\nextern zipFile ZEXPORT zipOpen4(const void *pathname, int append, ZPOS64_T disk_size, zipcharpc *globalcomment,\n                                zlib_filefunc64_32_def *pzlib_filefunc64_32_def)\n{\n    zip64_internal ziinit;\n    zip64_internal *zi;\n#ifndef NO_ADDFILEINEXISTINGZIP\n    ZPOS64_T byte_before_the_zipfile;   /* byte before the zipfile, (>0 for sfx)*/\n    ZPOS64_T size_central_dir = 0;          /* size of the central directory  */\n    ZPOS64_T offset_central_dir = 0;        /* offset of start of central directory */\n    ZPOS64_T number_entry_CD = 0;           /* total number of entries in the central dir */\n    ZPOS64_T number_entry;\n    ZPOS64_T central_pos;\n    ZPOS64_T size_central_dir_to_read;\n    uLong uL;\n    uLong size_comment = 0;\n    size_t buf_size = SIZEDATA_INDATABLOCK;\n    void *buf_read;\n#endif\n    int err = ZIP_OK;\n    int mode;\n\n    ziinit.z_filefunc.zseek32_file = NULL;\n    ziinit.z_filefunc.ztell32_file = NULL;\n    if (pzlib_filefunc64_32_def == NULL)\n        fill_fopen64_filefunc(&ziinit.z_filefunc.zfile_func64);\n    else\n        ziinit.z_filefunc = *pzlib_filefunc64_32_def;\n\n    if (append == APPEND_STATUS_CREATE)\n        mode = (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE);\n    else\n        mode = (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING);\n\n    ziinit.filestream = ZOPEN64(ziinit.z_filefunc, pathname, mode);\n    if (ziinit.filestream == NULL)\n        return NULL;\n\n    if (append == APPEND_STATUS_CREATEAFTER) {\n        /* Don't support spanning ZIP with APPEND_STATUS_CREATEAFTER */\n        if (disk_size > 0)\n            return NULL;\n\n        ZSEEK64(ziinit.z_filefunc, ziinit.filestream, 0, SEEK_END);\n    }\n\n    ziinit.filestream_with_CD = ziinit.filestream;\n    ziinit.append = append;\n    ziinit.number_disk = 0;\n    ziinit.number_disk_with_CD = 0;\n    ziinit.disk_size = disk_size;\n    ziinit.begin_pos = ZTELL64(ziinit.z_filefunc, ziinit.filestream);\n    ziinit.in_opened_file_inzip = 0;\n    ziinit.ci.stream_initialised = 0;\n    ziinit.number_entry = 0;\n    ziinit.add_position_when_writting_offset = 0;\n    init_linkedlist(&(ziinit.central_dir));\n\n    zi = (zip64_internal *)ALLOC(sizeof(zip64_internal));\n    if (zi == NULL) {\n        ZCLOSE64(ziinit.z_filefunc, ziinit.filestream);\n        return NULL;\n    }\n\n#ifndef NO_ADDFILEINEXISTINGZIP\n    /* Add file in a zipfile */\n    ziinit.globalcomment = NULL;\n    if (append == APPEND_STATUS_ADDINZIP) {\n        /* Read and Cache Central Directory Records */\n        central_pos = zip64local_SearchCentralDir(&ziinit.z_filefunc, ziinit.filestream);\n        /* disable to allow appending to empty ZIP archive (must be standard zip, not zip64)\n            if (central_pos == 0)\n                err = ZIP_ERRNO;\n         */\n\n        if (err == ZIP_OK) {\n            /* read end of central directory info */\n            if (ZSEEK64(ziinit.z_filefunc, ziinit.filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)\n                err = ZIP_ERRNO;\n\n            /* the signature, already checked */\n            if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)\n                err = ZIP_ERRNO;\n            /* number of this disk */\n            if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &ziinit.number_disk) != ZIP_OK)\n                err = ZIP_ERRNO;\n            /* number of the disk with the start of the central directory */\n            if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &ziinit.number_disk_with_CD) != ZIP_OK)\n                err = ZIP_ERRNO;\n            /* total number of entries in the central dir on this disk */\n            number_entry = 0;\n            if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)\n                err = ZIP_ERRNO;\n            else\n                number_entry = uL;\n            /* total number of entries in the central dir */\n            number_entry_CD = 0;\n            if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)\n                err = ZIP_ERRNO;\n            else\n                number_entry_CD = uL;\n            if (number_entry_CD != number_entry)\n                err = ZIP_BADZIPFILE;\n            /* size of the central directory */\n            size_central_dir = 0;\n            if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)\n                err = ZIP_ERRNO;\n            else\n                size_central_dir = uL;\n            /* offset of start of central directory with respect to the starting disk number */\n            offset_central_dir = 0;\n            if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)\n                err = ZIP_ERRNO;\n            else\n                offset_central_dir = uL;\n            /* zipfile global comment length */\n            if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &size_comment) != ZIP_OK)\n                err = ZIP_ERRNO;\n\n            if ((err == ZIP_OK) && ((number_entry_CD == 0xffff) || (offset_central_dir == 0xffffffff))) {\n                /* Format should be Zip64, as the central directory or file size is too large */\n                central_pos = zip64local_SearchCentralDir64(&ziinit.z_filefunc, ziinit.filestream, central_pos);\n\n                if (central_pos) {\n                    ZPOS64_T sizeEndOfCentralDirectory;\n\n                    if (ZSEEK64(ziinit.z_filefunc, ziinit.filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)\n                        err = ZIP_ERRNO;\n\n                    /* the signature, already checked */\n                    if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)\n                        err = ZIP_ERRNO;\n                    /* size of zip64 end of central directory record */\n                    if (zip64local_getLong64(&ziinit.z_filefunc, ziinit.filestream, &sizeEndOfCentralDirectory) != ZIP_OK)\n                        err = ZIP_ERRNO;\n                    /* version made by */\n                    if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)\n                        err = ZIP_ERRNO;\n                    /* version needed to extract */\n                    if (zip64local_getShort(&ziinit.z_filefunc, ziinit.filestream, &uL) != ZIP_OK)\n                        err = ZIP_ERRNO;\n                    /* number of this disk */\n                    if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &ziinit.number_disk) != ZIP_OK)\n                        err = ZIP_ERRNO;\n                    /* number of the disk with the start of the central directory */\n                    if (zip64local_getLong(&ziinit.z_filefunc, ziinit.filestream, &ziinit.number_disk_with_CD) != ZIP_OK)\n                        err = ZIP_ERRNO;\n                    /* total number of entries in the central directory on this disk */\n                    if (zip64local_getLong64(&ziinit.z_filefunc, ziinit.filestream, &number_entry) != ZIP_OK)\n                        err = ZIP_ERRNO;\n                    /* total number of entries in the central directory */\n                    if (zip64local_getLong64(&ziinit.z_filefunc, ziinit.filestream, &number_entry_CD) != ZIP_OK)\n                        err = ZIP_ERRNO;\n                    if (number_entry_CD != number_entry)\n                        err = ZIP_BADZIPFILE;\n                    /* size of the central directory */\n                    if (zip64local_getLong64(&ziinit.z_filefunc, ziinit.filestream, &size_central_dir) != ZIP_OK)\n                        err = ZIP_ERRNO;\n                    /* offset of start of central directory with respect to the starting disk number */\n                    if (zip64local_getLong64(&ziinit.z_filefunc, ziinit.filestream, &offset_central_dir) != ZIP_OK)\n                        err = ZIP_ERRNO;\n                } else\n                    err = ZIP_BADZIPFILE;\n            }\n        }\n\n        if ((err == ZIP_OK) && (central_pos < offset_central_dir + size_central_dir))\n            err = ZIP_BADZIPFILE;\n\n        if (err != ZIP_OK) {\n            ZCLOSE64(ziinit.z_filefunc, ziinit.filestream);\n            TRYFREE(zi);\n            return NULL;\n        }\n\n        if (size_comment > 0) {\n            ziinit.globalcomment = (char *)ALLOC(size_comment + 1);\n            if (ziinit.globalcomment) {\n                size_comment = ZREAD64(ziinit.z_filefunc, ziinit.filestream, ziinit.globalcomment, size_comment);\n                ziinit.globalcomment[size_comment] = 0;\n            }\n        }\n\n        byte_before_the_zipfile = central_pos - (offset_central_dir + size_central_dir);\n        ziinit.add_position_when_writting_offset = byte_before_the_zipfile;\n\n        /* Store central directory in memory */\n        size_central_dir_to_read = size_central_dir;\n        buf_size = SIZEDATA_INDATABLOCK;\n        buf_read = (void *)ALLOC(buf_size);\n        if (buf_read == NULL)\n            err = ZIP_INTERNALERROR;\n\n        if (ZSEEK64(ziinit.z_filefunc, ziinit.filestream,\n                    offset_central_dir + byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0)\n            err = ZIP_ERRNO;\n\n        while ((size_central_dir_to_read > 0) && (err == ZIP_OK)) {\n            ZPOS64_T read_this = SIZEDATA_INDATABLOCK;\n            if (read_this > size_central_dir_to_read)\n                read_this = size_central_dir_to_read;\n\n            if (ZREAD64(ziinit.z_filefunc, ziinit.filestream, buf_read, (uLong)read_this) != read_this)\n                err = ZIP_ERRNO;\n\n            if (err == ZIP_OK)\n                err = add_data_in_datablock(&ziinit.central_dir, buf_read, (uLong)read_this);\n\n            size_central_dir_to_read -= read_this;\n        }\n        TRYFREE(buf_read);\n\n        ziinit.begin_pos = byte_before_the_zipfile;\n        ziinit.number_entry = number_entry_CD;\n\n        if (ZSEEK64(ziinit.z_filefunc, ziinit.filestream,\n                    offset_central_dir + byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0)\n            err = ZIP_ERRNO;\n    }\n\n    if (globalcomment)\n        *globalcomment = ziinit.globalcomment;\n#endif\n\n    if (err != ZIP_OK) {\n#ifndef NO_ADDFILEINEXISTINGZIP\n        TRYFREE(ziinit.globalcomment);\n#endif\n        TRYFREE(zi);\n        return NULL;\n    }\n\n    *zi = ziinit;\n    zipGoToFirstDisk((zipFile)zi);\n    return (zipFile)zi;\n}\n\nextern zipFile ZEXPORT zipOpen2(const char *pathname, int append, zipcharpc *globalcomment,\n                                zlib_filefunc_def *pzlib_filefunc32_def)\n{\n    if (pzlib_filefunc32_def != NULL) {\n        zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;\n        fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill, pzlib_filefunc32_def);\n        return zipOpen4(pathname, append, 0, globalcomment, &zlib_filefunc64_32_def_fill);\n    }\n    return zipOpen4(pathname, append, 0, globalcomment, NULL);\n}\n\nextern zipFile ZEXPORT zipOpen2_64(const void *pathname, int append, zipcharpc *globalcomment,\n                                   zlib_filefunc64_def *pzlib_filefunc_def)\n{\n    if (pzlib_filefunc_def != NULL) {\n        zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;\n        zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def;\n        zlib_filefunc64_32_def_fill.ztell32_file = NULL;\n        zlib_filefunc64_32_def_fill.zseek32_file = NULL;\n        return zipOpen4(pathname, append, 0, globalcomment, &zlib_filefunc64_32_def_fill);\n    }\n    return zipOpen4(pathname, append, 0, globalcomment, NULL);\n}\n\nextern zipFile ZEXPORT zipOpen3(const char *pathname, int append, ZPOS64_T disk_size, zipcharpc *globalcomment,\n                                zlib_filefunc_def *pzlib_filefunc32_def)\n{\n    if (pzlib_filefunc32_def != NULL) {\n        zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;\n        fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill, pzlib_filefunc32_def);\n        return zipOpen4(pathname, append, disk_size, globalcomment, &zlib_filefunc64_32_def_fill);\n    }\n    return zipOpen4(pathname, append, disk_size, globalcomment, NULL);\n}\n\nextern zipFile ZEXPORT zipOpen3_64(const void *pathname, int append, ZPOS64_T disk_size, zipcharpc *globalcomment,\n                                   zlib_filefunc64_def *pzlib_filefunc_def)\n{\n    if (pzlib_filefunc_def != NULL) {\n        zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;\n        zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def;\n        zlib_filefunc64_32_def_fill.ztell32_file = NULL;\n        zlib_filefunc64_32_def_fill.zseek32_file = NULL;\n        return zipOpen4(pathname, append, disk_size, globalcomment, &zlib_filefunc64_32_def_fill);\n    }\n    return zipOpen4(pathname, append, disk_size, globalcomment, NULL);\n}\n\nextern zipFile ZEXPORT zipOpen(const char *pathname, int append)\n{\n    return zipOpen3((const void *)pathname, append, 0, NULL, NULL);\n}\n\nextern zipFile ZEXPORT zipOpen64(const void *pathname, int append)\n{\n    return zipOpen3(pathname, append, 0, NULL, NULL);\n}\n\nextern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char *filename, const zip_fileinfo *zipfi,\n                                           const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,\n                                           uInt size_extrafield_global, const char *comment, int method, int level, int raw, int windowBits, int memLevel,\n                                           int strategy, const char *password, uLong crcForCrypting, uLong versionMadeBy, uLong flagBase, int zip64)\n{\n    zip64_internal *zi;\n    uInt size_filename;\n    uInt size_comment = 0;\n    uInt i;\n    int err = ZIP_OK;\n    ZPOS64_T size_available;\n    ZPOS64_T size_needed;\n\n#ifdef NOCRYPT\n    (crcForCrypting);\n    if (password != NULL)\n        return ZIP_PARAMERROR;\n#endif\n\n    if (file == NULL)\n        return ZIP_PARAMERROR;\n\n    if ((method != 0) &&\n#ifdef HAVE_BZIP2\n        (method != Z_BZIP2ED) &&\n#endif\n        (method != Z_DEFLATED))\n        return ZIP_PARAMERROR;\n\n    zi = (zip64_internal *)file;\n\n    if (zi->in_opened_file_inzip == 1) {\n        err = zipCloseFileInZip(file);\n        if (err != ZIP_OK)\n            return err;\n    }\n\n    if (filename == NULL)\n        filename = \"-\";\n    if (comment != NULL)\n        size_comment = (uInt)strlen(comment);\n\n    size_filename = (uInt)strlen(filename);\n\n    if (zipfi == NULL)\n        zi->ci.dosDate = 0;\n    else {\n        if (zipfi->dosDate != 0)\n            zi->ci.dosDate = zipfi->dosDate;\n        else\n            zi->ci.dosDate = zip64local_TmzDateToDosDate(&zipfi->tmz_date);\n    }\n\n    zi->ci.method = method;\n    zi->ci.compression_method = method;\n    zi->ci.crc32 = 0;\n    zi->ci.stream_initialised = 0;\n    zi->ci.pos_in_buffered_data = 0;\n    zi->ci.raw = raw;\n    zi->ci.flag = flagBase;\n    if ((level == 8) || (level == 9))\n        zi->ci.flag |= 2;\n    if (level == 2)\n        zi->ci.flag |= 4;\n    if (level == 1)\n        zi->ci.flag |= 6;\n    if (password != NULL) {\n        zi->ci.flag |= 1;\n#ifdef HAVE_AES\n        zi->ci.method = AES_METHOD;\n#endif\n    }\n\n    if (zi->disk_size > 0) {\n        if ((zi->number_disk == 0) && (zi->number_entry == 0))\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)DISKHEADERMAGIC, 4);\n\n        /* Make sure enough space available on current disk for local header */\n        zipGetDiskSizeAvailable((zipFile)zi, &size_available);\n        size_needed = 30 + size_filename + size_extrafield_local;\n        if (zi->ci.zip64)\n            size_needed += 20;\n#ifdef HAVE_AES\n        if (zi->ci.method == AES_METHOD)\n            size_needed += 11;\n#endif\n        if (size_available < size_needed)\n            zipGoToNextDisk((zipFile)zi);\n    }\n\n    zi->ci.pos_local_header = ZTELL64(zi->z_filefunc, zi->filestream);\n    zi->ci.size_comment = size_comment;\n    zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + size_extrafield_global;\n    zi->ci.size_centralextra = size_extrafield_global;\n    zi->ci.size_centralextrafree = 32; /* Extra space reserved for ZIP64 extra info */\n#ifdef HAVE_AES\n    if (zi->ci.method == AES_METHOD)\n        zi->ci.size_centralextrafree += 11; /* Extra space reserved for AES extra info */\n#endif\n    zi->ci.central_header = (char *)ALLOC((uInt)zi->ci.size_centralheader + zi->ci.size_centralextrafree + size_comment);\n    if (zi->ci.central_header == NULL)\n        return ZIP_INTERNALERROR;\n    \n    zi->ci.number_disk = zi->number_disk;\n\n    /* Write central directory header */\n    zip64local_putValue_inmemory(zi->ci.central_header, (uLong)CENTRALHEADERMAGIC, 4);\n    zip64local_putValue_inmemory(zi->ci.central_header + 4, (uLong)versionMadeBy, 2);\n    zip64local_putValue_inmemory(zi->ci.central_header + 6, (uLong)20, 2);\n    zip64local_putValue_inmemory(zi->ci.central_header + 8, (uLong)zi->ci.flag, 2);\n    zip64local_putValue_inmemory(zi->ci.central_header + 10, (uLong)zi->ci.method, 2);\n    zip64local_putValue_inmemory(zi->ci.central_header + 12, (uLong)zi->ci.dosDate, 4);\n    zip64local_putValue_inmemory(zi->ci.central_header + 16, (uLong)0, 4); /*crc*/\n    zip64local_putValue_inmemory(zi->ci.central_header + 20, (uLong)0, 4); /*compr size*/\n    zip64local_putValue_inmemory(zi->ci.central_header + 24, (uLong)0, 4); /*uncompr size*/\n    zip64local_putValue_inmemory(zi->ci.central_header + 28, (uLong)size_filename, 2);\n    zip64local_putValue_inmemory(zi->ci.central_header + 30, (uLong)size_extrafield_global, 2);\n    zip64local_putValue_inmemory(zi->ci.central_header + 32, (uLong)size_comment, 2);\n    zip64local_putValue_inmemory(zi->ci.central_header + 34, (uLong)zi->ci.number_disk, 2); /*disk nm start*/\n\n    if (zipfi == NULL)\n        zip64local_putValue_inmemory(zi->ci.central_header + 36, (uLong)0, 2);\n    else\n        zip64local_putValue_inmemory(zi->ci.central_header + 36, (uLong)zipfi->internal_fa, 2);\n    if (zipfi == NULL)\n        zip64local_putValue_inmemory(zi->ci.central_header + 38, (uLong)0, 4);\n    else\n        zip64local_putValue_inmemory(zi->ci.central_header + 38, (uLong)zipfi->external_fa, 4);\n    if (zi->ci.pos_local_header >= 0xffffffff)\n        zip64local_putValue_inmemory(zi->ci.central_header + 42, (uLong)0xffffffff, 4);\n    else\n        zip64local_putValue_inmemory(zi->ci.central_header + 42,\n                                     (uLong)zi->ci.pos_local_header - zi->add_position_when_writting_offset, 4);\n\n    for (i = 0; i < size_filename; i++)\n        zi->ci.central_header[SIZECENTRALHEADER + i] = filename[i];\n    for (i = 0; i < size_extrafield_global; i++)\n        zi->ci.central_header[SIZECENTRALHEADER + size_filename + i] =\n            ((const char *)extrafield_global)[i];\n    /* Store comment at the end for later repositioning */\n    for (i = 0; i < size_comment; i++)\n        zi->ci.central_header[zi->ci.size_centralheader +\n                              zi->ci.size_centralextrafree + i] = comment[i];\n\n    if (zi->ci.central_header == NULL)\n        return ZIP_INTERNALERROR;\n\n    zi->ci.zip64 = zip64;\n    zi->ci.total_compressed = 0;\n    zi->ci.total_uncompressed = 0;\n    zi->ci.pos_zip64extrainfo = 0;\n\n    /* Write the local header */\n    err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)LOCALHEADERMAGIC, 4);\n\n    if (err == ZIP_OK) {\n        if (zi->ci.zip64)\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)45, 2); /* version needed to extract */\n        else\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)20, 2); /* version needed to extract */\n    }\n    if (err == ZIP_OK)\n        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->ci.flag, 2);\n    if (err == ZIP_OK)\n        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->ci.method, 2);\n    if (err == ZIP_OK)\n        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->ci.dosDate, 4);\n\n    /* CRC & compressed size & uncompressed size will be filled in later and rewritten later */\n\n    if (err == ZIP_OK)\n        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0, 4); /* crc 32, unknown */\n    if (err == ZIP_OK) {\n        if (zi->ci.zip64)\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0xFFFFFFFF, 4); /* compressed size, unknown */\n        else\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0, 4); /* compressed size, unknown */\n    }\n    if (err == ZIP_OK) {\n        if (zi->ci.zip64) /* uncompressed size, unknown */\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0xFFFFFFFF, 4);\n        else /* uncompressed size, unknown */\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0, 4);\n    }\n    if (err == ZIP_OK)\n        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)size_filename, 2);\n    if (err == ZIP_OK) {\n        ZPOS64_T size_extrafield = size_extrafield_local;\n        if (zi->ci.zip64)\n            size_extrafield += 20;\n#ifdef HAVE_AES\n        if (zi->ci.method == AES_METHOD)\n            size_extrafield += 11;\n#endif\n        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)size_extrafield, 2);\n    }\n    if ((err == ZIP_OK) && (size_filename > 0)) {\n        if (ZWRITE64(zi->z_filefunc, zi->filestream, filename, size_filename) != size_filename)\n            err = ZIP_ERRNO;\n    }\n    if ((err == ZIP_OK) && (size_extrafield_local > 0)) {\n        if (ZWRITE64(zi->z_filefunc, zi->filestream, extrafield_local, size_extrafield_local) != size_extrafield_local)\n            err = ZIP_ERRNO;\n    }\n\n    /* Write the Zip64 extended info */\n    if ((err == ZIP_OK) && (zi->ci.zip64)) {\n        short headerid = 1;\n        short datasize = 16;\n        ZPOS64_T compressed_size = 0;\n        ZPOS64_T uncompressed_size = 0;\n\n        /* Remember position of Zip64 extended info for the local file header.\n           (needed when we update size after done with file) */\n        zi->ci.pos_zip64extrainfo = ZTELL64(zi->z_filefunc, zi->filestream);\n\n        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)headerid, 2);\n        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)datasize, 2);\n\n        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)uncompressed_size, 8);\n        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)compressed_size, 8);\n    }\n#ifdef HAVE_AES\n    /* Write the AES extended info */\n    if ((err == ZIP_OK) && (zi->ci.method == AES_METHOD)) {\n        int headerid = 0x9901;\n        short datasize = 7;\n\n        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, headerid, 2);\n        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, datasize, 2);\n\n        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, AES_VERSION, 2);\n        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, 'A', 1);\n        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, 'E', 1);\n        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, AES_ENCRYPTIONMODE, 1);\n        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->ci.compression_method, 2);\n    }\n#endif\n\n#ifdef HAVE_BZIP2\n    zi->ci.bstream.avail_in = (uInt)0;\n    zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE;\n    zi->ci.bstream.next_out = (char *)zi->ci.buffered_data;\n    zi->ci.bstream.total_in_hi32 = 0;\n    zi->ci.bstream.total_in_lo32 = 0;\n    zi->ci.bstream.total_out_hi32 = 0;\n    zi->ci.bstream.total_out_lo32 = 0;\n#endif\n\n    zi->ci.stream.avail_in = (uInt)0;\n    zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;\n    zi->ci.stream.next_out = zi->ci.buffered_data;\n    zi->ci.stream.total_in = 0;\n    zi->ci.stream.total_out = 0;\n    zi->ci.stream.data_type = Z_BINARY;\n\n    if ((err == ZIP_OK) && (!zi->ci.raw)) {\n        if (method == Z_DEFLATED) {\n            zi->ci.stream.zalloc = (alloc_func)0;\n            zi->ci.stream.zfree = (free_func)0;\n            zi->ci.stream.opaque = (voidpf)zi;\n\n            if (windowBits > 0)\n                windowBits = -windowBits;\n\n            err = deflateInit2(&zi->ci.stream, level, Z_DEFLATED, windowBits, memLevel, strategy);\n\n            if (err == Z_OK)\n                zi->ci.stream_initialised = Z_DEFLATED;\n        } else if (method == Z_BZIP2ED) {\n#ifdef HAVE_BZIP2\n            zi->ci.bstream.bzalloc = 0;\n            zi->ci.bstream.bzfree = 0;\n            zi->ci.bstream.opaque = (voidpf)0;\n\n            err = BZ2_bzCompressInit(&zi->ci.bstream, level, 0, 35);\n            if (err == BZ_OK)\n                zi->ci.stream_initialised = Z_BZIP2ED;\n#endif\n        }\n    }\n\n#ifndef NOCRYPT\n    zi->ci.crypt_header_size = 0;\n    if ((err == Z_OK) && ((zi->ci.flag & 1) != 0)) {\n#ifdef HAVE_AES\n        if (zi->ci.method == AES_METHOD) {\n            unsigned char passverify[AES_PWVERIFYSIZE];\n            unsigned char saltvalue[AES_MAXSALTLENGTH];\n            uInt saltlength;\n\n            if ((AES_ENCRYPTIONMODE < 1) || (AES_ENCRYPTIONMODE > 3))\n                return Z_ERRNO;\n\n            saltlength = SALT_LENGTH(AES_ENCRYPTIONMODE);\n\n            prng_init(entropy_fun, zi->ci.aes_rng);\n            prng_rand(saltvalue, saltlength, zi->ci.aes_rng);\n            prng_end(zi->ci.aes_rng);\n\n            fcrypt_init(AES_ENCRYPTIONMODE, (unsigned char *)password, (unsigned int)strlen(password), saltvalue, passverify, &zi->ci.aes_ctx);\n\n            if (ZWRITE64(zi->z_filefunc, zi->filestream, saltvalue, saltlength) != saltlength)\n                err = ZIP_ERRNO;\n            if (ZWRITE64(zi->z_filefunc, zi->filestream, passverify, AES_PWVERIFYSIZE) != AES_PWVERIFYSIZE)\n                err = ZIP_ERRNO;\n\n            zi->ci.crypt_header_size = saltlength + AES_PWVERIFYSIZE + AES_AUTHCODESIZE;\n        } else\n#endif\n        {\n            unsigned char bufHead[RAND_HEAD_LEN];\n            unsigned int sizeHead;\n\n            zi->ci.pcrc_32_tab = (const unsigned long *)get_crc_table();\n            /*init_keys(password, zi->ci.keys, zi->ci.pcrc_32_tab);*/\n\n            sizeHead = crypthead(password, bufHead, RAND_HEAD_LEN, zi->ci.keys, zi->ci.pcrc_32_tab, crcForCrypting);\n            zi->ci.crypt_header_size = sizeHead;\n\n            if (ZWRITE64(zi->z_filefunc, zi->filestream, bufHead, sizeHead) != sizeHead)\n                err = ZIP_ERRNO;\n        }\n    }\n#endif\n\n    if (err == Z_OK)\n        zi->in_opened_file_inzip = 1;\n    return err;\n}\n\nextern int ZEXPORT zipOpenNewFileInZip4(zipFile file, const char *filename, const zip_fileinfo *zipfi,\n                                        const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,\n                                        uInt size_extrafield_global, const char *comment, int method, int level, int raw, int windowBits,\n                                        int memLevel, int strategy, const char *password, uLong crcForCrypting, uLong versionMadeBy, uLong flagBase)\n{\n    return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local,\n                                   extrafield_global, size_extrafield_global, comment, method, level, raw, windowBits, memLevel,\n                                   strategy, password, crcForCrypting, versionMadeBy, flagBase, 0);\n}\n\nextern int ZEXPORT zipOpenNewFileInZip3(zipFile file, const char *filename, const zip_fileinfo *zipfi,\n                                        const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,\n                                        uInt size_extrafield_global, const char *comment, int method, int level, int raw, int windowBits,\n                                        int memLevel, int strategy, const char *password, uLong crcForCrypting)\n{\n    return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local,\n                                   extrafield_global, size_extrafield_global, comment, method, level, raw, windowBits, memLevel,\n                                   strategy, password, crcForCrypting, VERSIONMADEBY, 0, 0);\n}\n\nextern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char *filename, const zip_fileinfo *zipfi,\n                                           const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,\n                                           uInt size_extrafield_global, const char *comment, int method, int level, int raw, int windowBits,\n                                           int memLevel, int strategy, const char *password, uLong crcForCrypting, int zip64)\n{\n    return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local,\n                                   extrafield_global, size_extrafield_global, comment, method, level, raw, windowBits, memLevel, strategy,\n                                   password, crcForCrypting, VERSIONMADEBY, 0, zip64);\n}\n\nextern int ZEXPORT zipOpenNewFileInZip2(zipFile file, const char *filename, const zip_fileinfo *zipfi,\n                                        const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,\n                                        uInt size_extrafield_global, const char *comment, int method, int level, int raw)\n{\n    return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local,\n                                   extrafield_global, size_extrafield_global, comment, method, level, raw, -MAX_WBITS, DEF_MEM_LEVEL,\n                                   Z_DEFAULT_STRATEGY, NULL, 0, VERSIONMADEBY, 0, 0);\n}\n\nextern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file, const char *filename, const zip_fileinfo *zipfi,\n                                           const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,\n                                           uInt size_extrafield_global, const char *comment, int method, int level, int raw, int zip64)\n{\n    return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local,\n                                   extrafield_global, size_extrafield_global, comment, method, level, raw, -MAX_WBITS, DEF_MEM_LEVEL,\n                                   Z_DEFAULT_STRATEGY, NULL, 0, VERSIONMADEBY, 0, zip64);\n}\n\nextern int ZEXPORT zipOpenNewFileInZip64(zipFile file, const char *filename, const zip_fileinfo *zipfi,\n                                         const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,\n                                         uInt size_extrafield_global, const char *comment, int method, int level, int zip64)\n{\n    return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local,\n                                   extrafield_global, size_extrafield_global, comment, method, level, 0, -MAX_WBITS, DEF_MEM_LEVEL,\n                                   Z_DEFAULT_STRATEGY, NULL, 0, VERSIONMADEBY, 0, zip64);\n}\n\nextern int ZEXPORT zipOpenNewFileInZip(zipFile file, const char *filename, const zip_fileinfo *zipfi,\n                                       const void *extrafield_local, uInt size_extrafield_local, const void *extrafield_global,\n                                       uInt size_extrafield_global, const char *comment, int method, int level)\n{\n    return zipOpenNewFileInZip4_64(file, filename, zipfi, extrafield_local, size_extrafield_local,\n                                   extrafield_global, size_extrafield_global, comment, method, level, 0, -MAX_WBITS, DEF_MEM_LEVEL,\n                                   Z_DEFAULT_STRATEGY, NULL, 0, VERSIONMADEBY, 0, 0);\n}\n\n/* Flushes the write buffer to disk */\nlocal int zip64FlushWriteBuffer OF((zip64_internal * zi));\nlocal int zip64FlushWriteBuffer(zip64_internal *zi)\n{\n    int err = ZIP_OK;\n    uInt written = 0;\n    uInt total_written = 0;\n    uInt write = 0;\n    uInt max_write = 0;\n    ZPOS64_T size_available = 0;\n\n    if ((zi->ci.flag & 1) != 0) {\n#ifndef NOCRYPT\n#ifdef HAVE_AES\n        if (zi->ci.method == AES_METHOD) {\n            fcrypt_encrypt(zi->ci.buffered_data, zi->ci.pos_in_buffered_data, &zi->ci.aes_ctx);\n        } else\n#endif\n        {\n            uInt i;\n            int t;\n            for (i = 0; i < zi->ci.pos_in_buffered_data; i++)\n                zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab, zi->ci.buffered_data[i], t);\n        }\n#endif\n    }\n\n    write = zi->ci.pos_in_buffered_data;\n\n    do {\n        max_write = write;\n\n        if (zi->disk_size > 0) {\n            err = zipGetDiskSizeAvailable((zipFile)zi, &size_available);\n            if (err != ZIP_OK)\n                return err;\n\n            if (size_available == 0) {\n                err = zipGoToNextDisk((zipFile)zi);\n                if (err != ZIP_OK)\n                    return err;\n            }\n\n            if (size_available < (ZPOS64_T)max_write)\n                max_write = (uInt)size_available;\n        }\n\n        written = (unsigned int)ZWRITE64(zi->z_filefunc, zi->filestream, zi->ci.buffered_data + total_written, max_write);\n\n        if (ZERROR64(zi->z_filefunc, zi->filestream)) {\n            err = ZIP_ERRNO;\n            break;\n        }\n\n        total_written += written;\n        write -= written;\n    } while (write > 0);\n\n    zi->ci.total_compressed += zi->ci.pos_in_buffered_data;\n\n#ifdef HAVE_BZIP2\n    if (zi->ci.compression_method == Z_BZIP2ED) {\n        zi->ci.total_uncompressed += zi->ci.bstream.total_in_lo32;\n        zi->ci.bstream.total_in_lo32 = 0;\n        zi->ci.bstream.total_in_hi32 = 0;\n    } else\n#endif\n    {\n        zi->ci.total_uncompressed += zi->ci.stream.total_in;\n        zi->ci.stream.total_in = 0;\n    }\n\n    zi->ci.pos_in_buffered_data = 0;\n\n    return err;\n}\n\nextern int ZEXPORT zipWriteInFileInZip(zipFile file, const void *buf, unsigned int len)\n{\n    zip64_internal *zi;\n    int err = ZIP_OK;\n\n    if (file == NULL)\n        return ZIP_PARAMERROR;\n    zi = (zip64_internal *)file;\n\n    if (zi->in_opened_file_inzip == 0)\n        return ZIP_PARAMERROR;\n\n    zi->ci.crc32 = crc32(zi->ci.crc32, buf, (uInt)len);\n\n#ifdef HAVE_BZIP2\n    if ((zi->ci.compression_method == Z_BZIP2ED) && (!zi->ci.raw)) {\n        zi->ci.bstream.next_in = (void *)buf;\n        zi->ci.bstream.avail_in = len;\n        err = BZ_RUN_OK;\n\n        while ((err == BZ_RUN_OK) && (zi->ci.bstream.avail_in > 0)) {\n            if (zi->ci.bstream.avail_out == 0) {\n                if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)\n                    err = ZIP_ERRNO;\n                zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE;\n                zi->ci.bstream.next_out = (char *)zi->ci.buffered_data;\n            } else {\n                uLong uTotalOutBefore_lo = zi->ci.bstream.total_out_lo32;\n                uLong uTotalOutBefore_hi = zi->ci.bstream.total_out_hi32;\n\n                err = BZ2_bzCompress(&zi->ci.bstream, BZ_RUN);\n\n                zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore_lo);\n            }\n        }\n\n        if (err == BZ_RUN_OK)\n            err = ZIP_OK;\n    } else\n#endif\n    {\n        zi->ci.stream.next_in = (Bytef *)buf;\n        zi->ci.stream.avail_in = len;\n\n        while ((err == ZIP_OK) && (zi->ci.stream.avail_in > 0)) {\n            if (zi->ci.stream.avail_out == 0) {\n                if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)\n                    err = ZIP_ERRNO;\n                zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;\n                zi->ci.stream.next_out = zi->ci.buffered_data;\n            }\n\n            if (err != ZIP_OK)\n                break;\n\n            if ((zi->ci.compression_method == Z_DEFLATED) && (!zi->ci.raw)) {\n                uLong total_out_before = zi->ci.stream.total_out;\n                err = deflate(&zi->ci.stream, Z_NO_FLUSH);\n                zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - total_out_before);\n            } else {\n                uInt copy_this, i;\n                if (zi->ci.stream.avail_in < zi->ci.stream.avail_out)\n                    copy_this = zi->ci.stream.avail_in;\n                else\n                    copy_this = zi->ci.stream.avail_out;\n\n                for (i = 0; i < copy_this; i++)\n                    *(((char *)zi->ci.stream.next_out) + i) =\n                        *(((const char *)zi->ci.stream.next_in) + i);\n\n                zi->ci.stream.avail_in -= copy_this;\n                zi->ci.stream.avail_out -= copy_this;\n                zi->ci.stream.next_in += copy_this;\n                zi->ci.stream.next_out += copy_this;\n                zi->ci.stream.total_in += copy_this;\n                zi->ci.stream.total_out += copy_this;\n                zi->ci.pos_in_buffered_data += copy_this;\n            }\n        }\n    }\n\n    return err;\n}\n\nextern int ZEXPORT zipCloseFileInZipRaw(zipFile file, uLong uncompressed_size, uLong crc32)\n{\n    return zipCloseFileInZipRaw64(file, uncompressed_size, crc32);\n}\n\nextern int ZEXPORT zipCloseFileInZipRaw64(zipFile file, ZPOS64_T uncompressed_size, uLong crc32)\n{\n    zip64_internal *zi;\n    ZPOS64_T compressed_size;\n    uLong invalidValue = 0xffffffff;\n    uLong i = 0;\n    short datasize = 0;\n    int err = ZIP_OK;\n\n    if (file == NULL)\n        return ZIP_PARAMERROR;\n    zi = (zip64_internal *)file;\n\n    if (zi->in_opened_file_inzip == 0)\n        return ZIP_PARAMERROR;\n    zi->ci.stream.avail_in = 0;\n\n    if (!zi->ci.raw) {\n        if (zi->ci.compression_method == Z_DEFLATED) {\n            while (err == ZIP_OK) {\n                uLong total_out_before;\n                if (zi->ci.stream.avail_out == 0) {\n                    if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)\n                        err = ZIP_ERRNO;\n                    zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;\n                    zi->ci.stream.next_out = zi->ci.buffered_data;\n                }\n                total_out_before = zi->ci.stream.total_out;\n                err = deflate(&zi->ci.stream, Z_FINISH);\n                zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - total_out_before);\n            }\n        } else if (zi->ci.compression_method == Z_BZIP2ED) {\n#ifdef HAVE_BZIP2\n            err = BZ_FINISH_OK;\n            while (err == BZ_FINISH_OK) {\n                uLong total_out_before;\n                if (zi->ci.bstream.avail_out == 0) {\n                    if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)\n                        err = ZIP_ERRNO;\n                    zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE;\n                    zi->ci.bstream.next_out = (char *)zi->ci.buffered_data;\n                }\n                total_out_before = zi->ci.bstream.total_out_lo32;\n                err = BZ2_bzCompress(&zi->ci.bstream, BZ_FINISH);\n                if (err == BZ_STREAM_END)\n                    err = Z_STREAM_END;\n                zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - total_out_before);\n            }\n\n            if (err == BZ_FINISH_OK)\n                err = ZIP_OK;\n#endif\n        }\n    }\n\n    if (err == Z_STREAM_END)\n        err = ZIP_OK; /* this is normal */\n\n    if ((zi->ci.pos_in_buffered_data > 0) && (err == ZIP_OK)) {\n        if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)\n            err = ZIP_ERRNO;\n    }\n\n#ifdef HAVE_AES\n    if (zi->ci.method == AES_METHOD) {\n        unsigned char authcode[AES_AUTHCODESIZE];\n\n        fcrypt_end(authcode, &zi->ci.aes_ctx);\n\n        if (ZWRITE64(zi->z_filefunc, zi->filestream, authcode, AES_AUTHCODESIZE) != AES_AUTHCODESIZE)\n            err = ZIP_ERRNO;\n    }\n#endif\n\n    if (!zi->ci.raw) {\n        if (zi->ci.compression_method == Z_DEFLATED) {\n            int tmp_err = deflateEnd(&zi->ci.stream);\n            if (err == ZIP_OK)\n                err = tmp_err;\n            zi->ci.stream_initialised = 0;\n        }\n#ifdef HAVE_BZIP2\n        else if (zi->ci.compression_method == Z_BZIP2ED) {\n            int tmperr = BZ2_bzCompressEnd(&zi->ci.bstream);\n            if (err == ZIP_OK)\n                err = tmperr;\n            zi->ci.stream_initialised = 0;\n        }\n#endif\n\n        crc32 = (uLong)zi->ci.crc32;\n        uncompressed_size = zi->ci.total_uncompressed;\n    }\n\n    compressed_size = zi->ci.total_compressed;\n#ifndef NOCRYPT\n    compressed_size += zi->ci.crypt_header_size;\n#endif\n\n    /* Update current item crc and sizes */\n    if (compressed_size >= 0xffffffff || uncompressed_size >= 0xffffffff || zi->ci.pos_local_header >= 0xffffffff) {\n        zip64local_putValue_inmemory(zi->ci.central_header + 4, (uLong)45, 2); /* version made by */\n        zip64local_putValue_inmemory(zi->ci.central_header + 6, (uLong)45, 2); /* version needed */\n    }\n    zip64local_putValue_inmemory(zi->ci.central_header + 16, crc32, 4); /* crc */\n    if (compressed_size >= 0xffffffff)\n        zip64local_putValue_inmemory(zi->ci.central_header + 20, invalidValue, 4); /* compr size */\n    else\n        zip64local_putValue_inmemory(zi->ci.central_header + 20, compressed_size, 4); /* compr size */\n    if (zi->ci.stream.data_type == Z_ASCII)\n        zip64local_putValue_inmemory(zi->ci.central_header + 36, (uLong)Z_ASCII, 2); /* internal file attrib */\n    if (uncompressed_size >= 0xffffffff)\n        zip64local_putValue_inmemory(zi->ci.central_header + 24, invalidValue, 4); /* uncompr size */\n    else\n        zip64local_putValue_inmemory(zi->ci.central_header + 24, uncompressed_size, 4); /* uncompr size */\n\n    /* Add ZIP64 extra info field for uncompressed size */\n    if (uncompressed_size >= 0xffffffff)\n        datasize += 8;\n    /* Add ZIP64 extra info field for compressed size */\n    if (compressed_size >= 0xffffffff)\n        datasize += 8;\n    /* Add ZIP64 extra info field for relative offset to local file header of current file */\n    if (zi->ci.pos_local_header >= 0xffffffff)\n        datasize += 8;\n\n    /* Add Extra Information Header for 'ZIP64 information' */\n    if (datasize > 0) {\n        char *p = zi->ci.central_header + zi->ci.size_centralheader;\n\n        if ((uLong)(datasize + 4) > zi->ci.size_centralextrafree)\n            return ZIP_BADZIPFILE;\n\n        zip64local_putValue_inmemory(p, 0x0001, 2);\n        p += 2;\n        zip64local_putValue_inmemory(p, datasize, 2);\n        p += 2;\n\n        if (uncompressed_size >= 0xffffffff) {\n            zip64local_putValue_inmemory(p, uncompressed_size, 8);\n            p += 8;\n        }\n        if (compressed_size >= 0xffffffff) {\n            zip64local_putValue_inmemory(p, compressed_size, 8);\n            p += 8;\n        }\n        if (zi->ci.pos_local_header >= 0xffffffff) {\n            zip64local_putValue_inmemory(p, zi->ci.pos_local_header, 8);\n            p += 8;\n        }\n\n        zi->ci.size_centralextrafree -= datasize + 4;\n        zi->ci.size_centralheader += datasize + 4;\n        zi->ci.size_centralextra += datasize + 4;\n\n        zip64local_putValue_inmemory(zi->ci.central_header + 30, (uLong)zi->ci.size_centralextra, 2);\n    }\n\n#ifdef HAVE_AES\n    /* Write the AES extended info */\n    if (zi->ci.method == AES_METHOD) {\n        char *p = zi->ci.central_header + zi->ci.size_centralheader;\n\n        datasize = 7;\n\n        if ((uLong)(datasize + 4) > zi->ci.size_centralextrafree)\n            return ZIP_BADZIPFILE;\n\n        zip64local_putValue_inmemory(p, 0x9901, 2);\n        p += 2;\n        zip64local_putValue_inmemory(p, datasize, 2);\n        p += 2;\n        zip64local_putValue_inmemory(p, AES_VERSION, 2);\n        p += 2;\n        zip64local_putValue_inmemory(p, 'A', 1);\n        p += 1;\n        zip64local_putValue_inmemory(p, 'E', 1);\n        p += 1;\n        zip64local_putValue_inmemory(p, AES_ENCRYPTIONMODE, 1);\n        p += 1;\n        zip64local_putValue_inmemory(p, zi->ci.compression_method, 2);\n        p += 2;\n\n        zi->ci.size_centralextrafree -= datasize + 4;\n        zi->ci.size_centralheader += datasize + 4;\n        zi->ci.size_centralextra += datasize + 4;\n\n        zip64local_putValue_inmemory(zi->ci.central_header + 30, (uLong)zi->ci.size_centralextra, 2);\n    }\n#endif\n    /* Restore comment to correct position */\n    for (i = 0; i < zi->ci.size_comment; i++)\n        zi->ci.central_header[zi->ci.size_centralheader + i] =\n            zi->ci.central_header[zi->ci.size_centralheader + zi->ci.size_centralextrafree + i];\n    zi->ci.size_centralheader += zi->ci.size_comment;\n\n    if (err == ZIP_OK)\n        err = add_data_in_datablock(&zi->central_dir, zi->ci.central_header, (uLong)zi->ci.size_centralheader);\n\n    free(zi->ci.central_header);\n\n    if (err == ZIP_OK) {\n        /* Update the LocalFileHeader with the new values. */\n        ZPOS64_T cur_pos_inzip = ZTELL64(zi->z_filefunc, zi->filestream);\n        uLong cur_number_disk = zi->number_disk;\n\n        /* Local file header is stored on previous disk, switch to make edits */\n        if (zi->ci.number_disk != cur_number_disk)\n            err = zipGoToSpecificDisk(file, (int)zi->ci.number_disk, 1);\n\n        if (ZSEEK64(zi->z_filefunc, zi->filestream, zi->ci.pos_local_header + 14, ZLIB_FILEFUNC_SEEK_SET) != 0)\n            err = ZIP_ERRNO;\n        if (err == ZIP_OK)\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, crc32, 4); /* crc 32, unknown */\n\n        if (uncompressed_size >= 0xffffffff || compressed_size >= 0xffffffff) {\n            if (zi->ci.pos_zip64extrainfo > 0) {\n                /* Update the size in the ZIP64 extended field. */\n                if (ZSEEK64(zi->z_filefunc, zi->filestream, zi->ci.pos_zip64extrainfo + 4, ZLIB_FILEFUNC_SEEK_SET) != 0)\n                    err = ZIP_ERRNO;\n\n                if (err == ZIP_OK) /* compressed size, unknown */\n                    err = zip64local_putValue(&zi->z_filefunc, zi->filestream, uncompressed_size, 8);\n                if (err == ZIP_OK) /* uncompressed size, unknown */\n                    err = zip64local_putValue(&zi->z_filefunc, zi->filestream, compressed_size, 8);\n            } else\n                err = ZIP_BADZIPFILE; /* Caller passed zip64 = 0, so no room for zip64 info -> fatal */\n        } else {\n            if (err == ZIP_OK) /* compressed size, unknown */\n                err = zip64local_putValue(&zi->z_filefunc, zi->filestream, compressed_size, 4);\n            if (err == ZIP_OK) /* uncompressed size, unknown */\n                err = zip64local_putValue(&zi->z_filefunc, zi->filestream, uncompressed_size, 4);\n        }\n\n        /* Now switch back again to the disk we were on before */\n        if (zi->ci.number_disk != cur_number_disk)\n            err = zipGoToSpecificDisk(file, (int)cur_number_disk, 1);\n\n        if (ZSEEK64(zi->z_filefunc, zi->filestream, cur_pos_inzip, ZLIB_FILEFUNC_SEEK_SET) != 0)\n            err = ZIP_ERRNO;\n    }\n\n    zi->number_entry++;\n    zi->in_opened_file_inzip = 0;\n\n    return err;\n}\n\nextern int ZEXPORT zipCloseFileInZip(zipFile file)\n{\n    return zipCloseFileInZipRaw(file, 0, 0);\n}\n\nextern int ZEXPORT zipClose(zipFile file, const char *global_comment)\n{\n    zip64_internal *zi;\n    int err = 0;\n    uLong size_centraldir = 0;\n    uInt size_global_comment = 0;\n    ZPOS64_T centraldir_pos_inzip;\n    ZPOS64_T pos = 0;\n    uLong write = 0;\n\n    if (file == NULL)\n        return ZIP_PARAMERROR;\n\n    zi = (zip64_internal *)file;\n\n    if (zi->in_opened_file_inzip == 1)\n        err = zipCloseFileInZip(file);\n\n#ifndef NO_ADDFILEINEXISTINGZIP\n    if (global_comment == NULL)\n        global_comment = zi->globalcomment;\n#endif\n\n    if (zi->filestream != zi->filestream_with_CD) {\n        if (ZCLOSE64(zi->z_filefunc, zi->filestream) != 0)\n            if (err == ZIP_OK)\n                err = ZIP_ERRNO;\n        if (zi->disk_size > 0)\n            zi->number_disk_with_CD = zi->number_disk + 1;\n        zi->filestream = zi->filestream_with_CD;\n    }\n\n    centraldir_pos_inzip = ZTELL64(zi->z_filefunc, zi->filestream);\n\n    if (err == ZIP_OK) {\n        linkedlist_datablock_internal *ldi = zi->central_dir.first_block;\n        while (ldi != NULL) {\n            if ((err == ZIP_OK) && (ldi->filled_in_this_block > 0)) {\n                write = ZWRITE64(zi->z_filefunc, zi->filestream, ldi->data, ldi->filled_in_this_block);\n                if (write != ldi->filled_in_this_block)\n                    err = ZIP_ERRNO;\n            }\n\n            size_centraldir += ldi->filled_in_this_block;\n            ldi = ldi->next_datablock;\n        }\n    }\n\n    free_linkedlist(&(zi->central_dir));\n\n    pos = centraldir_pos_inzip - zi->add_position_when_writting_offset;\n\n    /* Write the ZIP64 central directory header */\n    if (pos >= 0xffffffff || zi->number_entry > 0xffff) {\n        ZPOS64_T zip64eocd_pos_inzip = ZTELL64(zi->z_filefunc, zi->filestream);\n        uLong zip64datasize = 44;\n\n        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)ZIP64ENDHEADERMAGIC, 4);\n\n        /* size of this 'zip64 end of central directory' */\n        if (err == ZIP_OK)\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)zip64datasize, 8);\n        /* version made by */\n        if (err == ZIP_OK)\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)45, 2);\n        /* version needed */\n        if (err == ZIP_OK)\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)45, 2);\n        /* number of this disk */\n        if (err == ZIP_OK)\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD, 4);\n        /* number of the disk with the start of the central directory */\n        if (err == ZIP_OK)\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD, 4);\n        /* total number of entries in the central dir on this disk */\n        if (err == ZIP_OK)\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8);\n        /* total number of entries in the central dir */\n        if (err == ZIP_OK)\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8);\n        /* size of the central directory */\n        if (err == ZIP_OK)\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)size_centraldir, 8);\n\n        if (err == ZIP_OK) {\n            /* offset of start of central directory with respect to the starting disk number */\n            ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writting_offset;\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)pos, 8);\n        }\n        if (err == ZIP_OK)\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)ZIP64ENDLOCHEADERMAGIC, 4);\n\n        /* number of the disk with the start of the central directory */\n        if (err == ZIP_OK)\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD, 4);\n        /*relative offset to the Zip64EndOfCentralDirectory */\n        if (err == ZIP_OK) {\n            ZPOS64_T pos = zip64eocd_pos_inzip - zi->add_position_when_writting_offset;\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, pos, 8);\n        }\n        /* number of the disk with the start of the central directory */\n        if (err == ZIP_OK)\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD + 1, 4);\n    }\n\n    /* Write the central directory header */\n\n    /* signature */\n    if (err == ZIP_OK)\n        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)ENDHEADERMAGIC, 4);\n    /* number of this disk */\n    if (err == ZIP_OK)\n        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD, 2);\n    /* number of the disk with the start of the central directory */\n    if (err == ZIP_OK)\n        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_disk_with_CD, 2);\n    /* total number of entries in the central dir on this disk */\n    if (err == ZIP_OK) {\n        if (zi->number_entry >= 0xffff)\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0xffff, 2); /* use value in ZIP64 record */\n        else\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_entry, 2);\n    }\n    /* total number of entries in the central dir */\n    if (err == ZIP_OK) {\n        if (zi->number_entry >= 0xffff)\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0xffff, 2); /* use value in ZIP64 record */\n        else\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)zi->number_entry, 2);\n    }\n    /* size of the central directory */\n    if (err == ZIP_OK)\n        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)size_centraldir, 4);\n    /* offset of start of central directory with respect to the starting disk number */\n    if (err == ZIP_OK) {\n        ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writting_offset;\n        if (pos >= 0xffffffff)\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)0xffffffff, 4);\n        else\n            err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)pos, 4);\n    }\n\n    /* Write global comment */\n\n    if (global_comment != NULL)\n        size_global_comment = (uInt)strlen(global_comment);\n    if (err == ZIP_OK)\n        err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (uLong)size_global_comment, 2);\n    if (err == ZIP_OK && size_global_comment > 0) {\n        if (ZWRITE64(zi->z_filefunc, zi->filestream, global_comment, size_global_comment) != size_global_comment)\n            err = ZIP_ERRNO;\n    }\n\n    if ((ZCLOSE64(zi->z_filefunc, zi->filestream) != 0) && (err == ZIP_OK))\n        err = ZIP_ERRNO;\n\n#ifndef NO_ADDFILEINEXISTINGZIP\n    TRYFREE(zi->globalcomment);\n#endif\n    TRYFREE(zi);\n\n    return err;\n}\n\n"
  },
  {
    "path": "Sublime/Pods/SSZipArchive/SSZipArchive/minizip/zip.h",
    "content": "/* zip.h -- IO on .zip files using zlib\n   Version 1.1, February 14h, 2010\n   part of the MiniZip project\n\n   Copyright (C) 1998-2010 Gilles Vollant\n     http://www.winimage.com/zLibDll/minizip.html\n   Modifications for Zip64 support\n     Copyright (C) 2009-2010 Mathias Svensson\n     http://result42.com\n\n   This program is distributed under the terms of the same license as zlib.\n   See the accompanying LICENSE file for the full text of the license.\n*/\n\n#ifndef _ZIP_H\n#define _ZIP_H\n\n#define HAVE_AES\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef _ZLIB_H\n#  include \"zlib.h\"\n#endif\n\n#ifndef _ZLIBIOAPI_H\n#  include \"ioapi.h\"\n#endif\n\n#ifdef HAVE_BZIP2\n#  include \"bzlib.h\"\n#endif\n\n#define Z_BZIP2ED 12\n\n#if defined(STRICTZIP) || defined(STRICTZIPUNZIP)\n/* like the STRICT of WIN32, we define a pointer that cannot be converted\n    from (void*) without cast */\ntypedef struct TagzipFile__ { int unused; } zipFile__;\ntypedef zipFile__ *zipFile;\n#else\ntypedef voidp zipFile;\n#endif\n\n#define ZIP_OK                          (0)\n#define ZIP_EOF                         (0)\n#define ZIP_ERRNO                       (Z_ERRNO)\n#define ZIP_PARAMERROR                  (-102)\n#define ZIP_BADZIPFILE                  (-103)\n#define ZIP_INTERNALERROR               (-104)\n\n#ifndef DEF_MEM_LEVEL\n#  if MAX_MEM_LEVEL >= 8\n#    define DEF_MEM_LEVEL 8\n#  else\n#    define DEF_MEM_LEVEL  MAX_MEM_LEVEL\n#  endif\n#endif\n/* default memLevel */\n\n/* tm_zip contain date/time info */\ntypedef struct tm_zip_s\n{\n    uInt tm_sec;                /* seconds after the minute - [0,59] */\n    uInt tm_min;                /* minutes after the hour - [0,59] */\n    uInt tm_hour;               /* hours since midnight - [0,23] */\n    uInt tm_mday;               /* day of the month - [1,31] */\n    uInt tm_mon;                /* months since January - [0,11] */\n    uInt tm_year;               /* years - [1980..2044] */\n} tm_zip;\n\ntypedef struct\n{\n    tm_zip      tmz_date;       /* date in understandable format           */\n    uLong       dosDate;        /* if dos_date == 0, tmu_date is used      */\n    uLong       internal_fa;    /* internal file attributes        2 bytes */\n    uLong       external_fa;    /* external file attributes        4 bytes */\n} zip_fileinfo;\n\ntypedef const char* zipcharpc;\n\n#define APPEND_STATUS_CREATE        (0)\n#define APPEND_STATUS_CREATEAFTER   (1)\n#define APPEND_STATUS_ADDINZIP      (2)\n\n/***************************************************************************/\n/* Writing a zip file */\n\nextern zipFile ZEXPORT zipOpen OF((const char *pathname, int append));\nextern zipFile ZEXPORT zipOpen64 OF((const void *pathname, int append));\n/* Create a zipfile.\n\n   pathname should contain the full pathname (by example, on a Windows XP computer \n      \"c:\\\\zlib\\\\zlib113.zip\" or on an Unix computer \"zlib/zlib113.zip\". \n\n   return NULL if zipfile cannot be opened\n   return zipFile handle if no error\n\n   If the file pathname exist and append == APPEND_STATUS_CREATEAFTER, the zip\n   will be created at the end of the file. (useful if the file contain a self extractor code)\n   If the file pathname exist and append == APPEND_STATUS_ADDINZIP, we will add files in existing \n   zip (be sure you don't add file that doesn't exist)\n\n   NOTE: There is no delete function into a zipfile. If you want delete file into a zipfile, \n   you must open a zipfile, and create another. Of course, you can use RAW reading and writing to copy\n   the file you did not want delete. */\n\nextern zipFile ZEXPORT zipOpen2 OF((const char *pathname, int append, zipcharpc* globalcomment, \n    zlib_filefunc_def* pzlib_filefunc_def));\n\nextern zipFile ZEXPORT zipOpen2_64 OF((const void *pathname, int append, zipcharpc* globalcomment, \n    zlib_filefunc64_def* pzlib_filefunc_def));\n\nextern zipFile ZEXPORT zipOpen3 OF((const char *pathname, int append, ZPOS64_T disk_size, \n    zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc_def));\n/* Same as zipOpen2 but allows specification of spanned zip size */\n\nextern zipFile ZEXPORT zipOpen3_64 OF((const void *pathname, int append, ZPOS64_T disk_size, \n    zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def));\n\nextern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,\n    const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, \n    uInt size_extrafield_global, const char* comment, int method, int level));\n/* Open a file in the ZIP for writing.\n\n   filename : the filename in zip (if NULL, '-' without quote will be used\n   *zipfi contain supplemental information\n   extrafield_local buffer to store the local header extra field data, can be NULL\n   size_extrafield_local size of extrafield_local buffer\n   extrafield_global buffer to store the global header extra field data, can be NULL\n   size_extrafield_global size of extrafield_local buffer\n   comment buffer for comment string\n   method contain the compression method (0 for store, Z_DEFLATED for deflate)\n   level contain the level of compression (can be Z_DEFAULT_COMPRESSION)\n   zip64 is set to 1 if a zip64 extended information block should be added to the local file header.\n   this MUST be '1' if the uncompressed size is >= 0xffffffff. */\n\nextern int ZEXPORT zipOpenNewFileInZip64 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,\n    const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, \n    uInt size_extrafield_global, const char* comment, int method, int level, int zip64));\n/* Same as zipOpenNewFileInZip with zip64 support */\n\nextern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,\n    const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, \n    uInt size_extrafield_global, const char* comment, int method, int level, int raw));\n/* Same as zipOpenNewFileInZip, except if raw=1, we write raw file */\n\nextern int ZEXPORT zipOpenNewFileInZip2_64 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,\n    const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, \n    uInt size_extrafield_global, const char* comment, int method, int level, int raw, int zip64));\n/* Same as zipOpenNewFileInZip3 with zip64 support */\n\nextern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,\n    const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, \n    uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel, \n    int strategy, const char* password, uLong crcForCrypting));\n/* Same as zipOpenNewFileInZip2, except\n    windowBits, memLevel, strategy : see parameter strategy in deflateInit2\n    password : crypting password (NULL for no crypting)\n    crcForCrypting : crc of file to compress (needed for crypting) */\n\nextern int ZEXPORT zipOpenNewFileInZip3_64 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,\n    const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, \n    uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel, \n    int strategy, const char* password, uLong crcForCrypting, int zip64));\n/* Same as zipOpenNewFileInZip3 with zip64 support */\n\nextern int ZEXPORT zipOpenNewFileInZip4 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,\n    const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, \n    uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel, \n    int strategy, const char* password, uLong crcForCrypting, uLong versionMadeBy, uLong flagBase));\n/* Same as zipOpenNewFileInZip3 except versionMadeBy & flag fields */\n\nextern int ZEXPORT zipOpenNewFileInZip4_64 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi,\n    const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, \n    uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel, \n    int strategy, const char* password, uLong crcForCrypting, uLong versionMadeBy, uLong flagBase, int zip64));\n/* Same as zipOpenNewFileInZip4 with zip64 support */\n\nextern int ZEXPORT zipWriteInFileInZip OF((zipFile file, const void* buf, unsigned len));\n/* Write data in the zipfile */\n\nextern int ZEXPORT zipCloseFileInZip OF((zipFile file));\n/* Close the current file in the zipfile */\n\nextern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, uLong uncompressed_size, uLong crc32));\nextern int ZEXPORT zipCloseFileInZipRaw64 OF((zipFile file, ZPOS64_T uncompressed_size, uLong crc32));\n/* Close the current file in the zipfile, for file opened with parameter raw=1 in zipOpenNewFileInZip2\n   uncompressed_size and crc32 are value for the uncompressed size */\n\nextern int ZEXPORT zipClose OF((zipFile file, const char* global_comment));\n/* Close the zipfile */\n\n/***************************************************************************/\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* _ZIP_H */\n"
  },
  {
    "path": "Sublime/Pods/Swifter/LICENSE",
    "content": "Copyright (c) 2014, Damian Kołakowski\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\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* 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\n* Neither the name of the {organization} nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "Sublime/Pods/Swifter/README.md",
    "content": "### What is Swift?\n\n>Swift is an innovative new programming language for Cocoa and Cocoa Touch. Writing code is interactive and fun, the syntax is concise yet expressive, and apps run lightning-fast. Swift is ready for your next iOS and OS X project — or for addition into your current app — because Swift code works side-by-side with Objective-C.\n\n### What is Swifter?\n\nTiny http server engine written in Swift ( https://developer.apple.com/swift/ ) programming language.\n\n![Platform](https://img.shields.io/badge/Platform-Linux%20&%20OSX-4BC51D.svg?style=flat)\n![Swift](https://img.shields.io/badge/Swift-2.2/3.0--dev-4BC51D.svg?style=flat)\n![Protocols](https://img.shields.io/badge/Protocols-HTTP%201.1%20&%20WebSockets-4BC51D.svg?style=flat)\n[![CocoaPods](https://img.shields.io/cocoapods/v/Swifter.svg?style=flat)]()\n[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\n\n### How to start?\n```swift\nlet server = HttpServer()\nserver[\"/hello\"] = { .OK(.HTML(\"You asked for \" + $0.url)) }\nserver.start()\n```\n### How to share files?\n```swift\nlet server = HttpServer()\nserver[\"/desktop/:path\"] = HttpHandlers.shareFilesFromDirectory(\"/Users/me/Desktop\")\nserver.start()\n```\n### How to redirect?\n```swift\nlet server = HttpServer()\nserver[\"/redirect\"] = { request in\n  return .MovedPermanently(\"http://www.google.com\")\n}\nserver.start()\n```\n### CocoaPods? Yes.\n```\nuse_frameworks!\npod 'Swifter', '~> 1.1.3'\n```\n\n### Carthage? Also yes.\n\n```\ngithub \"glock45/swifter\" == 1.1.3\n```\n"
  },
  {
    "path": "Sublime/Pods/Swifter/Sources/DemoServer.swift",
    "content": "//\n//  DemoServer.swift\n//  Swifter\n//\n//  Copyright (c) 2014-2016 Damian Kołakowski. All rights reserved.\n//\n\nimport Foundation\n\npublic func demoServer(publicDir: String) -> HttpServer {\n    \n    print(publicDir)\n    \n    let server = HttpServer()\n    \n    server[\"/public/:path\"] = HttpHandlers.shareFilesFromDirectory(publicDir)\n    \n    server[\"/files/:path\"] = HttpHandlers.directoryBrowser(\"/\")\n\n    server[\"/\"] = { r in\n        var listPage = \"Available services:<br><ul>\"\n        for services in server.routes {\n            if services.isEmpty {\n                listPage += \"<li><a href=\\\"/\\\">/</a></li>\"\n            } else {\n                listPage += \"<li><a href=\\\"\\(services)\\\">\\(services)</a></li>\"\n            }\n        }\n        listPage += \"</ul>\"\n        return .OK(.Html(listPage))\n    }\n    \n    server[\"/magic\"] = { .OK(.Html(\"You asked for \" + $0.path)) }\n    \n    server[\"/test/:param1/:param2\"] = { r in\n        var headersInfo = \"\"\n        for (name, value) in r.headers {\n            headersInfo += \"\\(name) : \\(value)<br>\"\n        }\n        var queryParamsInfo = \"\"\n        for (name, value) in r.queryParams {\n            queryParamsInfo += \"\\(name) : \\(value)<br>\"\n        }\n        var pathParamsInfo = \"\"\n        for token in r.params {\n            pathParamsInfo += \"\\(token.0) : \\(token.1)<br>\"\n        }\n        return .OK(.Html(\"<h3>Address: \\(r.address)</h3><h3>Url:</h3> \\(r.path)<h3>Method:</h3>\\(r.method)<h3>Headers:</h3>\\(headersInfo)<h3>Query:</h3>\\(queryParamsInfo)<h3>Path params:</h3>\\(pathParamsInfo)\"))\n    }\n    \n    server.GET[\"/upload\"] = { r in\n        if let html = NSData(contentsOfFile:\"\\(publicDir)/file.html\") {\n            var array = [UInt8](count: html.length, repeatedValue: 0)\n            html.getBytes(&array, length: html.length)\n            return HttpResponse.RAW(200, \"OK\", nil, { $0.write(array) })\n        }\n        return .NotFound\n    }\n    \n    server.POST[\"/upload\"] = { r in\n        var response = \"\"\n        for multipart in r.parseMultiPartFormData() {\n            response += \"Name: \\(multipart.name) File name: \\(multipart.fileName) Size: \\(multipart.body.count)<br>\"\n        }\n        return HttpResponse.OK(.Html(response))\n    }\n    \n    server.GET[\"/login\"] = { r in\n        if let html = NSData(contentsOfFile:\"\\(publicDir)/login.html\") {\n            var array = [UInt8](count: html.length, repeatedValue: 0)\n            html.getBytes(&array, length: html.length)\n            return HttpResponse.RAW(200, \"OK\", nil, { $0.write(array) })\n        }\n        return .NotFound\n    }\n    \n    server.POST[\"/login\"] = { r in\n        let formFields = r.parseUrlencodedForm()\n        return HttpResponse.OK(.Html(formFields.map({ \"\\($0.0) = \\($0.1)\" }).joinWithSeparator(\"<br>\")))\n    }\n    \n    server[\"/demo\"] = { r in\n        return .OK(.Html(\"<center><h2>Hello Swift</h2><img src=\\\"https://devimages.apple.com.edgekey.net/swift/images/swift-hero_2x.png\\\"/><br></center>\"))\n    }\n    \n    server[\"/raw\"] = { r in\n        return HttpResponse.RAW(200, \"OK\", [\"XXX-Custom-Header\": \"value\"], { $0.write([UInt8](\"test\".utf8)) })\n    }\n    \n    server[\"/json\"] = { r in\n        let jsonObject: NSDictionary = [NSString(string: \"foo\"): NSNumber(int: 3), NSString(string: \"bar\"): NSString(string: \"baz\")] \n        return .OK(.Json(jsonObject))\n    }\n    \n    server[\"/redirect\"] = { r in\n        return .MovedPermanently(\"http://www.google.com\")\n    }\n\n    server[\"/long\"] = { r in\n        var longResponse = \"\"\n        for k in 0..<1000 { longResponse += \"(\\(k)),->\" }\n        return .OK(.Html(longResponse))\n    }\n    \n    server[\"/wildcard/*/test/*/:param\"] = { r in\n        return .OK(.Html(r.path))\n    }\n    \n    server[\"/stream\"] = { r in\n        return HttpResponse.RAW(200, \"OK\", nil, { w in\n            for i in 0...100 {\n                w.write([UInt8](\"[chunk \\(i)]\".utf8));\n            }\n        })\n    }\n    \n    server[\"/websocket-echo\"] = HttpHandlers.websocket({ (session, text) in\n        session.writeText(text)\n    }, { (session, binary) in\n        session.writeBinary(binary)\n    })\n    \n    return server\n}\n"
  },
  {
    "path": "Sublime/Pods/Swifter/Sources/File.swift",
    "content": "//\n//  File.swift\n//  Swifter\n//\n//  Copyright (c) 2014-2016 Damian Kołakowski. All rights reserved.\n//\n\n#if os(Linux)\n    import Glibc\n#else\n    import Foundation\n#endif\n\npublic enum FileError: ErrorType {\n    case OpenFailed(String)\n    case WriteFailed(String)\n    case ReadFailed(String)\n    case SeekFailed(String)\n    case GetCurrentWorkingDirectoryFailed(String)\n}\n\npublic class File {\n    \n    public static func openNewForWriting(path: String) throws -> File {\n        return try openFileForMode(path, \"wb\")\n    }\n    \n    public static func openForReading(path: String) throws -> File {\n        return try openFileForMode(path, \"rb\")\n    }\n    \n    public static func openForWritingAndReading(path: String) throws -> File {\n        return try openFileForMode(path, \"r+b\")\n    }\n    \n    public static func openFileForMode(path: String, _ mode: String) throws -> File {\n        let file = fopen(path.withCString({ $0 }), mode.withCString({ $0 }))\n        guard file != nil else {\n            throw FileError.OpenFailed(descriptionOfLastError())\n        }\n        return File(file)\n    }\n    \n    public static func currentWorkingDirectory() throws -> String {\n        let path = getcwd(nil, 0)\n        if path == nil {\n            throw FileError.GetCurrentWorkingDirectoryFailed(descriptionOfLastError())\n        }\n        guard let result = String.fromCString(path) else {\n            throw FileError.GetCurrentWorkingDirectoryFailed(\"Could not convert getcwd(...)'s result to String.\")\n        }\n        return result\n    }\n    \n    private let pointer: UnsafeMutablePointer<FILE>\n    \n    public init(_ pointer: UnsafeMutablePointer<FILE>) {\n        self.pointer = pointer\n    }\n    \n    public func close() -> Void {\n        fclose(pointer)\n    }\n    \n    public func read(inout data: [UInt8]) throws -> Int {\n        if data.count <= 0 {\n            return data.count\n        }\n        let count = fread(&data, 1, data.count, self.pointer)\n        if count == data.count {\n            return count\n        }\n        if feof(self.pointer) != 0 {\n            return count\n        }\n        if ferror(self.pointer) != 0 {\n            throw FileError.ReadFailed(File.descriptionOfLastError())\n        }\n        throw FileError.ReadFailed(\"Unknown file read error occured.\")\n    }\n\n    public func write(data: [UInt8]) throws -> Void {\n        if data.count <= 0 {\n            return\n        }\n        try data.withUnsafeBufferPointer {\n            if fwrite($0.baseAddress, 1, data.count, self.pointer) != data.count {\n                throw FileError.WriteFailed(File.descriptionOfLastError())\n            }\n        }\n    }\n    \n    public func seek(offset: Int) throws -> Void {\n        if fseek(self.pointer, offset, SEEK_SET) != 0 {\n            throw FileError.SeekFailed(File.descriptionOfLastError())\n        }\n    }\n    \n    private static func descriptionOfLastError() -> String {\n        return String.fromCString(UnsafePointer(strerror(errno))) ?? \"Error: \\(errno)\"\n    }\n}\n\nextension File {\n    \n    public static func withNewFileOpenedForWriting<Result>(path: String, _ f: File throws -> Result) throws -> Result {\n        return try withFileOpenedForMode(path, mode: \"wb\", f)\n    }\n    \n    public static func withFileOpenedForReading<Result>(path: String, _ f: File throws -> Result) throws -> Result {\n        return try withFileOpenedForMode(path, mode: \"rb\", f)\n    }\n    \n    public static func withFileOpenedForWritingAndReading<Result>(path: String, _ f: File throws -> Result) throws -> Result {\n        return try withFileOpenedForMode(path, mode: \"r+b\", f)\n    }\n    \n    public static func withFileOpenedForMode<Result>(path: String, mode: String, _ f: File throws -> Result) throws -> Result {\n        let file = try File.openFileForMode(path, mode)\n        defer {\n            file.close()\n        }\n        return try f(file)\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Swifter/Sources/HttpHandlers+Files.swift",
    "content": "//\n//  HttpHandlers+Files.swift\n//  Swifter\n//\n//  Copyright (c) 2014-2016 Damian Kołakowski. All rights reserved.\n//\n\nimport Foundation\n\nextension HttpHandlers {\n    \n    public class func shareFilesFromDirectory(directoryPath: String) -> (HttpRequest -> HttpResponse) {\n        return { r in\n            guard let fileRelativePath = r.params.first else {\n                return .NotFound\n            }\n            let absolutePath = directoryPath + \"/\" + fileRelativePath.1\n            guard let file = try? File.openForReading(absolutePath) else {\n                return .NotFound\n            }\n            return .RAW(200, \"OK\", [:], { writer in\n                var buffer = [UInt8](count: 64, repeatedValue: 0)\n                while let count = try? file.read(&buffer) where count > 0 {\n                    writer.write(buffer[0..<count])\n                }\n                file.close()\n            })\n        }\n    }\n    \n    private static let rangePrefix = \"bytes=\"\n    \n    public class func directory(dir: String) -> (HttpRequest -> HttpResponse) {\n        return { r in\n            \n            guard let localPath = r.params.first else {\n                return HttpResponse.NotFound\n            }\n            \n            let filesPath = dir + \"/\" + localPath.1\n            \n            guard let fileBody = NSData(contentsOfFile: filesPath) else {\n                return HttpResponse.NotFound\n            }\n            \n            if let rangeHeader = r.headers[\"range\"] {\n                \n                guard rangeHeader.hasPrefix(HttpHandlers.rangePrefix) else {\n                    return .BadRequest(.Text(\"Invalid value of 'Range' header: \\(r.headers[\"range\"])\"))\n                }\n                \n                #if os(Linux)\n                    let rangeString = rangeHeader.substringFromIndex(HttpHandlers.rangePrefix.characters.count)\n                #else\n                    let rangeString = rangeHeader.substringFromIndex(rangeHeader.startIndex.advancedBy(HttpHandlers.rangePrefix.characters.count))\n                #endif\n                \n                let rangeStringExploded = rangeString.split(\"-\")\n                \n                guard rangeStringExploded.count == 2 else {\n                    return .BadRequest(.Text(\"Invalid value of 'Range' header: \\(r.headers[\"range\"])\"))\n                }\n                \n                let startStr = rangeStringExploded[0]\n                let endStr   = rangeStringExploded[1]\n                \n                guard let start = Int(startStr), end = Int(endStr) else {\n                    var array = [UInt8](count: fileBody.length, repeatedValue: 0)\n                    fileBody.getBytes(&array, length: fileBody.length)\n                    return HttpResponse.RAW(200, \"OK\", nil, { $0.write(array) })\n                }\n                \n                let chunkLength = end - start\n                let chunkRange = NSRange(location: start, length: chunkLength + 1)\n                \n                guard chunkRange.location + chunkRange.length <= fileBody.length else {\n                    return HttpResponse.RAW(416, \"Requested range not satisfiable\", nil, nil)\n                }\n                \n                let chunk = fileBody.subdataWithRange(chunkRange)\n                \n                let headers = [ \"Content-Range\" : \"bytes \\(startStr)-\\(endStr)/\\(fileBody.length)\" ]\n                \n                var content = [UInt8](count: chunk.length, repeatedValue: 0)\n                chunk.getBytes(&content, length: chunk.length)\n                return HttpResponse.RAW(206, \"Partial Content\", headers, { $0.write(content) })\n            } else {\n                var content = [UInt8](count: fileBody.length, repeatedValue: 0)\n                fileBody.getBytes(&content, length: fileBody.length)\n                return HttpResponse.RAW(200, \"OK\", nil, { $0.write(content) })\n            }\n        }\n    }\n    \n    public class func directoryBrowser(dir: String) -> (HttpRequest -> HttpResponse) {\n        return { r in\n            guard let (_, value) = r.params.first else {\n                return HttpResponse.NotFound\n            }\n            let filePath = dir + \"/\" + value\n            let fileManager = NSFileManager.defaultManager()\n            var isDir: ObjCBool = false\n            guard fileManager.fileExistsAtPath(filePath, isDirectory: &isDir) else {\n                return HttpResponse.NotFound\n            }\n            if isDir {\n                do {\n                    let files = try fileManager.contentsOfDirectoryAtPath(filePath)\n                    var response = \"<h3>\\(filePath)</h3></br><table>\"\n                    response += files.map({ \"<tr><td><a href=\\\"\\(r.path)/\\($0)\\\">\\($0)</a></td></tr>\"}).joinWithSeparator(\"\")\n                    response += \"</table>\"\n                    return HttpResponse.OK(.Html(response))\n                } catch {\n                    return HttpResponse.NotFound\n                }\n            } else {\n                if let content = NSData(contentsOfFile: filePath) {\n                    var array = [UInt8](count: content.length, repeatedValue: 0)\n                    content.getBytes(&array, length: content.length)\n                    return HttpResponse.RAW(200, \"OK\", nil, { $0.write(array) })\n                }\n                return HttpResponse.NotFound\n            }\n        }\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Swifter/Sources/HttpHandlers+WebSockets.swift",
    "content": "//\n//  HttpHandlers+WebSockets.swift\n//  Swifter\n//\n//  Copyright © 2014-2016 Damian Kołakowski. All rights reserved.\n//\n\nimport Foundation\n\nextension HttpHandlers {\n    \n    public class func websocket(\n            text: ((WebSocketSession, String) -> Void)?,\n        _ binary: ((WebSocketSession, [UInt8]) -> Void)?) -> (HttpRequest -> HttpResponse) {\n        return { r in\n            guard r.headers[\"upgrade\"] == \"websocket\" else {\n                return .BadRequest(.Text(\"Invalid value of 'Upgrade' header: \\(r.headers[\"upgrade\"])\"))\n            }\n            guard r.headers[\"connection\"] == \"Upgrade\" else {\n                return .BadRequest(.Text(\"Invalid value of 'Connection' header: \\(r.headers[\"connection\"])\"))\n            }\n            guard let secWebSocketKey = r.headers[\"sec-websocket-key\"] else {\n                return .BadRequest(.Text(\"Invalid value of 'Sec-Websocket-Key' header: \\(r.headers[\"sec-websocket-key\"])\"))\n            }\n            let protocolSessionClosure: (Socket -> Void) = { socket in\n                let session = WebSocketSession(socket)\n                while let frame = try? session.readFrame() {\n                    switch frame.opcode {\n                    case .Text:\n                        if let handleText = text {\n                            handleText(session, String.fromUInt8(frame.payload))\n                        }\n                    case .Binary:\n                        if let handleBinary = binary {\n                            handleBinary(session, frame.payload)\n                        }\n                    default: break\n                    }\n                }\n            }\n            let secWebSocketAccept = String.toBase64((secWebSocketKey + \"258EAFA5-E914-47DA-95CA-C5AB0DC85B11\").SHA1())\n            let headers = [ \"Upgrade\": \"WebSocket\", \"Connection\": \"Upgrade\", \"Sec-WebSocket-Accept\": secWebSocketAccept]\n            return HttpResponse.SwitchProtocols(headers, protocolSessionClosure)\n        }\n    }\n    \n    public class WebSocketSession {\n        \n        public enum Error: ErrorType { case UnknownOpCode(String), UnMaskedFrame }\n        public enum OpCode { case Continue, Close, Ping, Pong, Text, Binary }\n        \n        public class Frame {\n            public var opcode = OpCode.Close\n            public var fin = false\n            public var payload = [UInt8]()\n        }\n\n        private let socket: Socket\n        \n        public init(_ socket: Socket) {\n            self.socket = socket\n        }\n        \n        public func writeText(text: String) -> Void {\n            self.writeFrame(ArraySlice(text.utf8), OpCode.Text)\n        }\n    \n        public func writeBinary(binary: [UInt8]) -> Void {\n            self.writeBinary(ArraySlice(binary))\n        }\n        \n        public func writeBinary(binary: ArraySlice<UInt8>) -> Void {\n            self.writeFrame(binary, OpCode.Binary)\n        }\n        \n        private func writeFrame(data: ArraySlice<UInt8>, _ op: OpCode, _ fin: Bool = true) {\n            let finAndOpCode = encodeFinAndOpCode(fin, op: op)\n            let maskAndLngth = encodeLengthAndMaskFlag(UInt64(data.count), false)\n            do {\n                try self.socket.writeUInt8([finAndOpCode])\n                try self.socket.writeUInt8(maskAndLngth)\n                try self.socket.writeUInt8(data)\n            } catch {\n                print(error)\n            }\n        }\n        \n        private func encodeFinAndOpCode(fin: Bool, op: OpCode) -> UInt8 {\n            var encodedByte = UInt8(fin ? 0x80 : 0x00);\n            switch op {\n            case .Continue : encodedByte |= 0x00 & 0x0F;\n            case .Text     : encodedByte |= 0x01 & 0x0F;\n            case .Binary   : encodedByte |= 0x02 & 0x0F;\n            case .Close    : encodedByte |= 0x08 & 0x0F;\n            case .Ping     : encodedByte |= 0x09 & 0x0F;\n            case .Pong     : encodedByte |= 0x0A & 0x0F;\n            }\n            return encodedByte\n        }\n        \n        private func encodeLengthAndMaskFlag(len: UInt64, _ masked: Bool) -> [UInt8] {\n            let encodedLngth = UInt8(masked ? 0x80 : 0x00)\n            var encodedBytes = [UInt8]()\n            switch len {\n            case 0...125:\n                encodedBytes.append(encodedLngth | UInt8(len));\n            case 126...UInt64(UINT16_MAX):\n                encodedBytes.append(encodedLngth | 0x7E);\n                encodedBytes.append(UInt8(len >> 8));\n                encodedBytes.append(UInt8(len & 0xFF));\n            default:\n                encodedBytes.append(encodedLngth | 0x7F);\n                encodedBytes.append(UInt8(len >> 56) & 0xFF);\n                encodedBytes.append(UInt8(len >> 48) & 0xFF);\n                encodedBytes.append(UInt8(len >> 40) & 0xFF);\n                encodedBytes.append(UInt8(len >> 32) & 0xFF);\n                encodedBytes.append(UInt8(len >> 24) & 0xFF);\n                encodedBytes.append(UInt8(len >> 16) & 0xFF);\n                encodedBytes.append(UInt8(len >> 08) & 0xFF);\n                encodedBytes.append(UInt8(len >> 00) & 0xFF);\n            }\n            return encodedBytes\n        }\n        \n        public func readFrame() throws -> Frame {\n            let frm = Frame()\n            let fst = try socket.read()\n            frm.fin = fst & 0x80 != 0\n            let opc = fst & 0x0F\n            switch opc {\n                case 0x00: frm.opcode = OpCode.Continue\n                case 0x01: frm.opcode = OpCode.Text\n                case 0x02: frm.opcode = OpCode.Binary\n                case 0x08: frm.opcode = OpCode.Close\n                case 0x09: frm.opcode = OpCode.Ping\n                case 0x0A: frm.opcode = OpCode.Pong\n                // \"If an unknown opcode is received, the receiving endpoint MUST _Fail the WebSocket Connection_.\"\n                // http://tools.ietf.org/html/rfc6455#section-5.2 ( Page 29 )\n                default  : throw Error.UnknownOpCode(\"\\(opc)\")\n            }\n            let sec = try socket.read()\n            let msk = sec & 0x80 != 0\n            guard msk else {\n                // \"...a client MUST mask all frames that it sends to the serve..\"\n                // http://tools.ietf.org/html/rfc6455#section-5.1\n                throw Error.UnMaskedFrame\n            }\n            var len = UInt64(sec & 0x7F)\n            if len == 0x7E {\n                let b0 = UInt64(try socket.read())\n                let b1 = UInt64(try socket.read())\n                len = UInt64(littleEndian: b0 << 8 | b1)\n            } else if len == 0x7F {\n                let b0 = UInt64(try socket.read())\n                let b1 = UInt64(try socket.read())\n                let b2 = UInt64(try socket.read())\n                let b3 = UInt64(try socket.read())\n                let b4 = UInt64(try socket.read())\n                let b5 = UInt64(try socket.read())\n                let b6 = UInt64(try socket.read())\n                let b7 = UInt64(try socket.read())\n                len = UInt64(littleEndian: b0 << 54 | b1 << 48 | b2 << 40 | b3 << 32 | b4 << 24 | b5 << 16 | b6 << 8 | b7)\n            }\n            let mask = [try socket.read(), try socket.read(), try socket.read(), try socket.read()]\n            for i in 0..<len {\n                frm.payload.append(try socket.read() ^ mask[Int(i % 4)])\n            }\n            return frm\n        }\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Swifter/Sources/HttpHandlers.swift",
    "content": "//\n//  Handlers.swift\n//  Swifter\n//\n//  Copyright (c) 2014-2016 Damian Kołakowski. All rights reserved.\n//\n\nimport Foundation\n\npublic class HttpHandlers {\n\n}\n"
  },
  {
    "path": "Sublime/Pods/Swifter/Sources/HttpParser.swift",
    "content": "//\n//  HttpParser.swift\n//  Swifter\n// \n//  Copyright (c) 2014-2016 Damian Kołakowski. All rights reserved.\n//\n\n#if os(Linux)\n    import Glibc\n#else\n    import Foundation\n#endif\n\nenum HttpParserError: ErrorType {\n    case InvalidStatusLine(String)\n}\n\npublic class HttpParser {\n    \n    public init() { }\n    \n    public func readHttpRequest(socket: Socket) throws -> HttpRequest {\n        let statusLine = try socket.readLine()\n        let statusLineTokens = statusLine.split(\" \")\n        if statusLineTokens.count < 3 {\n            throw HttpParserError.InvalidStatusLine(statusLine)\n        }\n        let request = HttpRequest()\n        request.method = statusLineTokens[0]\n        request.path = statusLineTokens[1]\n        request.queryParams = extractQueryParams(request.path)\n        request.headers = try readHeaders(socket)\n        if let contentLength = request.headers[\"content-length\"], let contentLengthValue = Int(contentLength) {\n            request.body = try readBody(socket, size: contentLengthValue)\n        }\n        return request\n    }\n    \n    private func extractQueryParams(url: String) -> [(String, String)] {\n        guard let query = url.split(\"?\").last else {\n            return []\n        }\n        return query.split(\"&\").reduce([(String, String)]()) { (c, s) -> [(String, String)] in\n            let tokens = s.split(1, separator: \"=\")\n            if let name = tokens.first, value = tokens.last {\n                return c + [(name.removePercentEncoding(), value.removePercentEncoding())]\n            }\n            return c\n        }\n    }\n    \n    private func readBody(socket: Socket, size: Int) throws -> [UInt8] {\n        var body = [UInt8]()\n        for _ in 0..<size { body.append(try socket.read()) }\n        return body\n    }\n    \n    private func readHeaders(socket: Socket) throws -> [String: String] {\n        var headers = [String: String]()\n        repeat {\n            let headerLine = try socket.readLine()\n            if headerLine.isEmpty {\n                return headers\n            }\n            let headerTokens = headerLine.split(1, separator: \":\")\n            if let name = headerTokens.first, value = headerTokens.last {\n                headers[name.lowercaseString] = value.trim()\n            }\n        } while true\n    }\n    \n    func supportsKeepAlive(headers: [String: String]) -> Bool {\n        if let value = headers[\"connection\"] {\n            return \"keep-alive\" == value.trim()\n        }\n        return false\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Swifter/Sources/HttpRequest.swift",
    "content": "//\n//  HttpRequest.swift\n//  Swifter\n//\n//  Copyright (c) 2014-2016 Damian Kołakowski. All rights reserved.\n//\n\nimport Foundation\n\npublic class HttpRequest {\n    \n    public var path: String = \"\"\n    public var queryParams: [(String, String)] = []\n    public var method: String = \"\"\n    public var headers: [String: String] = [:]\n    public var body: [UInt8] = []\n    public var address: String? = \"\"\n    public var params: [String: String] = [:]\n    \n    public func parseUrlencodedForm() -> [(String, String)] {\n        guard let contentTypeHeader = headers[\"content-type\"] else {\n            return []\n        }\n        let contentTypeHeaderTokens = contentTypeHeader.split(\";\").map { $0.trim() }\n        guard let contentType = contentTypeHeaderTokens.first where contentType == \"application/x-www-form-urlencoded\" else {\n            return []\n        }\n        return String.fromUInt8(body).split(\"&\").map { param -> (String, String) in\n            let tokens = param.split(\"=\")\n            if let name = tokens.first, value = tokens.last where tokens.count == 2 {\n                return (name.replace(\"+\", \" \").removePercentEncoding(),\n                        value.replace(\"+\", \" \").removePercentEncoding())\n            }\n            return (\"\",\"\")\n        }\n    }\n    \n    public struct MultiPart {\n        \n        public let headers: [String: String]\n        public let body: [UInt8]\n        \n        public var name: String? {\n            return valueFor(\"content-disposition\", parameter: \"name\")?.unquote()\n        }\n        \n        public var fileName: String? {\n            return valueFor(\"content-disposition\", parameter: \"filename\")?.unquote()\n        }\n        \n        private func valueFor(headerName: String, parameter: String) -> String? {\n            return headers.reduce([String]()) { (combined, header: (key: String, value: String)) -> [String] in\n                guard header.key == headerName else {\n                    return combined\n                }\n                let headerValueParams = header.value.split(\";\").map { $0.trim() }\n                return headerValueParams.reduce(combined, combine: { (results, token) -> [String] in\n                    let parameterTokens = token.split(1, separator: \"=\")\n                    if parameterTokens.first == parameter, let value = parameterTokens.last {\n                        return results + [value]\n                    }\n                    return results\n                })\n            }.first\n        }\n    }\n    \n    public func parseMultiPartFormData() -> [MultiPart] {\n        guard let contentTypeHeader = headers[\"content-type\"] else {\n            return []\n        }\n        let contentTypeHeaderTokens = contentTypeHeader.split(\";\").map { $0.trim() }\n        guard let contentType = contentTypeHeaderTokens.first where contentType == \"multipart/form-data\" else {\n            return []\n        }\n        var boundary: String? = nil\n        contentTypeHeaderTokens.forEach({\n            let tokens = $0.split(\"=\")\n            if let key = tokens.first where key == \"boundary\" && tokens.count == 2 {\n                boundary = tokens.last\n            }\n        })\n        if let boundary = boundary where boundary.utf8.count > 0 {\n            return parseMultiPartFormData(body, boundary: \"--\\(boundary)\")\n        }\n        return []\n    }\n    \n    private func parseMultiPartFormData(data: [UInt8], boundary: String) -> [MultiPart] {\n        var generator = data.generate()\n        var result = [MultiPart]()\n        while let part = nextMultiPart(&generator, boundary: boundary, isFirst: result.isEmpty) {\n            result.append(part)\n        }\n        return result\n    }\n    \n    private func nextMultiPart(inout generator: IndexingGenerator<[UInt8]>, boundary: String, isFirst: Bool) -> MultiPart? {\n        if isFirst {\n            guard nextMultiPartLine(&generator) == boundary else {\n                return nil\n            }\n        } else {\n            nextMultiPartLine(&generator)\n        }\n        var headers = [String: String]()\n        while let line = nextMultiPartLine(&generator) where !line.isEmpty {\n            let tokens = line.split(\":\")\n            if let name = tokens.first, value = tokens.last where tokens.count == 2 {\n                headers[name.lowercaseString] = value.trim()\n            }\n        }\n        guard let body = nextMultiPartBody(&generator, boundary: boundary) else {\n            return nil\n        }\n        return MultiPart(headers: headers, body: body)\n    }\n    \n    private func nextMultiPartLine(inout generator: IndexingGenerator<[UInt8]>) -> String? {\n        var result = String()\n        while let value = generator.next() {\n            if value > HttpRequest.CR {\n                result.append(Character(UnicodeScalar(value)))\n            }\n            if value == HttpRequest.NL {\n                break\n            }\n        }\n        return result\n    }\n    \n    static let CR = UInt8(13)\n    static let NL = UInt8(10)\n    \n    private func nextMultiPartBody(inout generator: IndexingGenerator<[UInt8]>, boundary: String) -> [UInt8]? {\n        var body = [UInt8]()\n        let boundaryArray = [UInt8](boundary.utf8)\n        var matchOffset = 0;\n        while let x = generator.next() {\n            matchOffset = ( x == boundaryArray[matchOffset] ? matchOffset + 1 : 0 )\n            body.append(x)\n            if matchOffset == boundaryArray.count {\n                body.removeRange(Range<Int>(body.count-matchOffset ..< body.count))\n                if body.last == HttpRequest.NL {\n                    body.removeLast()\n                    if body.last == HttpRequest.CR {\n                        body.removeLast()\n                    }\n                }\n                return body\n            }\n        }\n        return nil\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Swifter/Sources/HttpResponse.swift",
    "content": "//\n//  HttpResponse.swift\n//  Swifter\n//\n//  Copyright (c) 2014-2016 Damian Kołakowski. All rights reserved.\n//\n\nimport Foundation\n\npublic enum SerializationError: ErrorType {\n    case InvalidObject\n    case NotSupported\n}\n\npublic protocol HttpResponseBodyWriter {\n    func write(data: [UInt8])\n    func write(data: ArraySlice<UInt8>)\n}\n\npublic enum HttpResponseBody {\n    \n    case Json(AnyObject)\n    case Html(String)\n    case Text(String)\n    case Custom(Any, (Any) throws -> String)\n    \n    func content() -> (Int, (HttpResponseBodyWriter throws -> Void)?) {\n        do {\n            switch self {\n            case .Json(let object):\n                guard NSJSONSerialization.isValidJSONObject(object) else {\n                    throw SerializationError.InvalidObject\n                }\n                let json = try NSJSONSerialization.dataWithJSONObject(object, options: NSJSONWritingOptions.PrettyPrinted)\n                let data = Array(UnsafeBufferPointer(start: UnsafePointer<UInt8>(json.bytes), count: json.length))\n                return (data.count, {\n                    $0.write(data)\n                })\n            case .Text(let body):\n                let data = [UInt8](body.utf8)\n                return (data.count, {\n                    $0.write(data)\n                })\n            case .Html(let body):\n                let serialised = \"<html><meta charset=\\\"UTF-8\\\"><body>\\(body)</body></html>\"\n                let data = [UInt8](serialised.utf8)\n                return (data.count, {\n                    $0.write(data)\n                })\n            case .Custom(let object, let closure):\n                let serialised = try closure(object)\n                let data = [UInt8](serialised.utf8)\n                return (data.count, {\n                    $0.write(data)\n                })\n            }\n        } catch {\n            let data = [UInt8](\"Serialisation error: \\(error)\".utf8)\n            return (data.count, {\n                $0.write(data)\n            })\n        }\n    }\n}\n\npublic enum HttpResponse {\n    \n    case SwitchProtocols([String: String], Socket -> Void)\n    case OK(HttpResponseBody), Created, Accepted\n    case MovedPermanently(String)\n    case BadRequest(HttpResponseBody?), Unauthorized, Forbidden, NotFound\n    case InternalServerError\n    case RAW(Int, String, [String:String]?, (HttpResponseBodyWriter -> Void)? )\n    \n    func statusCode() -> Int {\n        switch self {\n        case .SwitchProtocols(_, _)   : return 101\n        case .OK(_)                   : return 200\n        case .Created                 : return 201\n        case .Accepted                : return 202\n        case .MovedPermanently        : return 301\n        case .BadRequest(_)           : return 400\n        case .Unauthorized            : return 401\n        case .Forbidden               : return 403\n        case .NotFound                : return 404\n        case .InternalServerError     : return 500\n        case .RAW(let code, _ , _, _) : return code\n        }\n    }\n    \n    func reasonPhrase() -> String {\n        switch self {\n        case .SwitchProtocols(_, _)    : return \"Switching Protocols\"\n        case .OK(_)                    : return \"OK\"\n        case .Created                  : return \"Created\"\n        case .Accepted                 : return \"Accepted\"\n        case .MovedPermanently         : return \"Moved Permanently\"\n        case .BadRequest(_)            : return \"Bad Request\"\n        case .Unauthorized             : return \"Unauthorized\"\n        case .Forbidden                : return \"Forbidden\"\n        case .NotFound                 : return \"Not Found\"\n        case .InternalServerError      : return \"Internal Server Error\"\n        case .RAW(_, let phrase, _, _) : return phrase\n        }\n    }\n    \n    func headers() -> [String: String] {\n        var headers = [\"Server\" : \"Swifter \\(HttpServer.VERSION)\"]\n        switch self {\n        case .SwitchProtocols(let switchHeaders, _):\n            for (key, value) in switchHeaders {\n                headers[key] = value\n            }\n        case .OK(let body):\n            switch body {\n            case .Json(_)   : headers[\"Content-Type\"] = \"application/json\"\n            case .Html(_)   : headers[\"Content-Type\"] = \"text/html\"\n            default:break\n            }\n        case .MovedPermanently(let location):\n            headers[\"Location\"] = location\n        case .RAW(_, _, let rawHeaders, _):\n            if let rawHeaders = rawHeaders {\n                for (k, v) in rawHeaders {\n                    headers.updateValue(v, forKey: k)\n                }\n            }\n        default:break\n        }\n        return headers\n    }\n    \n    func content() -> (length: Int, write: (HttpResponseBodyWriter throws -> Void)?) {\n        switch self {\n        case .OK(let body)             : return body.content()\n        case .BadRequest(let body)     : return body?.content() ?? (-1, nil)\n        case .RAW(_, _, _, let writer) : return (-1, writer)\n        default                        : return (-1, nil)\n        }\n    }\n    \n    func socketSession() -> (Socket -> Void)?  {\n        switch self {\n        case SwitchProtocols(_, let handler) : return handler\n        default: return nil\n        }\n    }\n}\n\n/**\n    Makes it possible to compare handler responses with '==', but\n\tignores any associated values. This should generally be what\n\tyou want. E.g.:\n\t\n    let resp = handler(updatedRequest)\n        if resp == .NotFound {\n        print(\"Client requested not found: \\(request.url)\")\n    }\n*/\n\nfunc ==(inLeft: HttpResponse, inRight: HttpResponse) -> Bool {\n    return inLeft.statusCode() == inRight.statusCode()\n}\n\n"
  },
  {
    "path": "Sublime/Pods/Swifter/Sources/HttpRouter.swift",
    "content": "//\n//  HttpRouter.swift\n//  Swifter\n//\n//  Copyright (c) 2014-2016 Damian Kołakowski. All rights reserved.\n//\n\nimport Foundation\n\npublic class HttpRouter {\n    \n    private class Node {\n        var nodes = [String: Node]()\n        var handler: (HttpRequest -> HttpResponse)? = nil\n    }\n    \n    private var rootNode = Node()\n\n    public func routes() -> [String] {\n        var routes = [String]()\n        for (_, child) in rootNode.nodes {\n            routes.appendContentsOf(routesForNode(child));\n        }\n        return routes\n    }\n    \n    private func routesForNode(node: Node, prefix: String = \"\") -> [String] {\n        var result = [String]()\n        if let _ = node.handler {\n            result.append(prefix)\n        }\n        for (key, child) in node.nodes {\n            result.appendContentsOf(routesForNode(child, prefix: prefix + \"/\" + key));\n        }\n        return result\n    }\n    \n    public func register(method: String?, path: String, handler: (HttpRequest -> HttpResponse)?) {\n        var pathSegments = stripQuery(path).split(\"/\")\n        if let method = method {\n            pathSegments.insert(method, atIndex: 0)\n        } else {\n            pathSegments.insert(\"*\", atIndex: 0)\n        }\n        var pathSegmentsGenerator = pathSegments.generate()\n        inflate(&rootNode, generator: &pathSegmentsGenerator).handler = handler\n    }\n    \n    public func route(method: String?, path: String) -> ([String: String], HttpRequest -> HttpResponse)? {\n        if let method = method {\n            let pathSegments = (method + \"/\" + stripQuery(path)).split(\"/\")\n            var pathSegmentsGenerator = pathSegments.generate()\n            var params = [String:String]()\n            if let handler = findHandler(&rootNode, params: &params, generator: &pathSegmentsGenerator) {\n                return (params, handler)\n            }\n        }\n        let pathSegments = (\"*/\" + stripQuery(path)).split(\"/\")\n        var pathSegmentsGenerator = pathSegments.generate()\n        var params = [String:String]()\n        if let handler = findHandler(&rootNode, params: &params, generator: &pathSegmentsGenerator) {\n            return (params, handler)\n        }\n        return nil\n    }\n    \n    private func inflate(inout node: Node, inout generator: IndexingGenerator<[String]>) -> Node {\n        if let pathSegment = generator.next() {\n            if let _ = node.nodes[pathSegment] {\n                return inflate(&node.nodes[pathSegment]!, generator: &generator)\n            }\n            var nextNode = Node()\n            node.nodes[pathSegment] = nextNode\n            return inflate(&nextNode, generator: &generator)\n        }\n        return node\n    }\n    \n    private func findHandler(inout node: Node, inout params: [String: String], inout generator: IndexingGenerator<[String]>) -> (HttpRequest -> HttpResponse)? {\n        guard let pathToken = generator.next() else {\n            return node.handler\n        }\n        let variableNodes = node.nodes.filter { $0.0.characters.first == \":\" }\n        if let variableNode = variableNodes.first {\n            if variableNode.1.nodes.count == 0 {\n                // if it's the last element of the pattern and it's a variable, stop the search and\n                // append a tail as a value for the variable.\n                let tail = generator.joinWithSeparator(\"/\")\n                if tail.utf8.count > 0 {\n                    params[variableNode.0] = pathToken + \"/\" + tail\n                } else {\n                    params[variableNode.0] = pathToken\n                }\n                return variableNode.1.handler\n            }\n            params[variableNode.0] = pathToken\n            return findHandler(&node.nodes[variableNode.0]!, params: &params, generator: &generator)\n        }\n        if let _ = node.nodes[pathToken] {\n            return findHandler(&node.nodes[pathToken]!, params: &params, generator: &generator)\n        }\n        if let _ = node.nodes[\"*\"] {\n            return findHandler(&node.nodes[\"*\"]!, params: &params, generator: &generator)\n        }\n        return nil\n    }\n    \n    private func stripQuery(path: String) -> String {\n        if let path = path.split(\"?\").first {\n            return path\n        }\n        return path\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Swifter/Sources/HttpServer.swift",
    "content": "//\n//  HttpServer2.swift\n//  Swifter\n//\n//  Copyright (c) 2014-2016 Damian Kołakowski. All rights reserved.\n//\n\nimport Foundation\n\npublic class HttpServer: HttpServerIO {\n    \n    public static let VERSION = \"1.1.3\"\n    \n    private let router = HttpRouter()\n    \n    public override init() {\n        self.DELETE = MethodRoute(method: \"DELETE\", router: router)\n        self.UPDATE = MethodRoute(method: \"UPDATE\", router: router)\n        self.HEAD   = MethodRoute(method: \"HEAD\", router: router)\n        self.POST   = MethodRoute(method: \"POST\", router: router)\n        self.GET    = MethodRoute(method: \"GET\", router: router)\n        self.PUT    = MethodRoute(method: \"PUT\", router: router)\n        \n        self.delete = MethodRoute(method: \"DELETE\", router: router)\n        self.update = MethodRoute(method: \"UPDATE\", router: router)\n        self.head   = MethodRoute(method: \"HEAD\", router: router)\n        self.post   = MethodRoute(method: \"POST\", router: router)\n        self.get    = MethodRoute(method: \"GET\", router: router)\n        self.put    = MethodRoute(method: \"PUT\", router: router)\n    }\n    \n    public var DELETE, UPDATE, HEAD, POST, GET, PUT : MethodRoute\n    public var delete, update, head, post, get, put : MethodRoute\n\n    public subscript(path: String) -> (HttpRequest -> HttpResponse)? {\n        set {\n            router.register(nil, path: path, handler: newValue)\n        }\n        get { return nil }\n    }\n    \n    public var routes: [String] {\n        return router.routes();\n    }\n\n    override public func dispatch(method: String, path: String) -> ([String:String], HttpRequest -> HttpResponse) {\n        if let result = router.route(method, path: path) {\n            return result\n        }\n        return super.dispatch(method, path: path)\n    }\n    \n    public struct MethodRoute {\n        public let method: String\n        public let router: HttpRouter\n        public subscript(path: String) -> (HttpRequest -> HttpResponse)? {\n            set {\n                router.register(method, path: path, handler: newValue)\n            }\n            get { return nil }\n        }\n    }\n}"
  },
  {
    "path": "Sublime/Pods/Swifter/Sources/HttpServerIO.swift",
    "content": "//\n//  HttpServer.swift\n//  Swifter\n//\n//  Copyright (c) 2014-2016 Damian Kołakowski. All rights reserved.\n//\n\nimport Foundation\n\n#if os(Linux)\n    import Glibc\n    import NSLinux\n#endif\n\npublic class HttpServerIO {\n    \n    private var listenSocket: Socket = Socket(socketFileDescriptor: -1)\n    private var clientSockets: Set<Socket> = []\n    private let clientSocketsLock = NSLock()\n    \n    public func start(listenPort: in_port_t = 8080) throws {\n        stop()\n        listenSocket = try Socket.tcpSocketForListen(listenPort)\n        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {\n            while let socket = try? self.listenSocket.acceptClientSocket() {\n                self.lock(self.clientSocketsLock) {\n                    self.clientSockets.insert(socket)\n                }\n                dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {\n                    self.handleConnection(socket)\n                    self.lock(self.clientSocketsLock) {\n                        self.clientSockets.remove(socket)\n                    }\n                })\n            }\n            self.stop()\n        }\n    }\n    \n    public func stop() {\n        listenSocket.release()\n        lock(self.clientSocketsLock) {\n            for socket in self.clientSockets {\n                socket.shutdwn()\n            }\n            self.clientSockets.removeAll(keepCapacity: true)\n        }\n    }\n    \n    public func dispatch(method: String, path: String) -> ([String: String], HttpRequest -> HttpResponse) {\n        return ([:], { _ in HttpResponse.NotFound })\n    }\n    \n    private func handleConnection(socket: Socket) {\n        let address = try? socket.peername()\n        let parser = HttpParser()\n        while let request = try? parser.readHttpRequest(socket) {\n            let request = request\n            let (params, handler) = self.dispatch(request.method, path: request.path)\n            request.address = address\n            request.params = params;\n            let response = handler(request)\n            var keepConnection = parser.supportsKeepAlive(request.headers)\n            do {\n                keepConnection = try self.respond(socket, response: response, keepAlive: keepConnection)\n            } catch {\n                print(\"Failed to send response: \\(error)\")\n                break\n            }\n            if let session = response.socketSession() {\n                session(socket)\n                break\n            }\n            if !keepConnection { break }\n        }\n        socket.release()\n    }\n    \n    private func lock(handle: NSLock, closure: () -> ()) {\n        handle.lock()\n        closure()\n        handle.unlock();\n    }\n    \n    private struct InnerWriteContext: HttpResponseBodyWriter {\n        let socket: Socket\n        func write(data: [UInt8]) {\n            write(ArraySlice(data))\n        }\n        func write(data: ArraySlice<UInt8>) {\n            do {\n                try socket.writeUInt8(data)\n            } catch {\n                print(\"\\(error)\")\n            }\n        }\n    }\n    \n    private func respond(socket: Socket, response: HttpResponse, keepAlive: Bool) throws -> Bool {\n        try socket.writeUTF8(\"HTTP/1.1 \\(response.statusCode()) \\(response.reasonPhrase())\\r\\n\")\n        \n        let content = response.content()\n        \n        if content.length >= 0 {\n            try socket.writeUTF8(\"Content-Length: \\(content.length)\\r\\n\")\n        }\n        \n        if keepAlive && content.length != -1 {\n            try socket.writeUTF8(\"Connection: keep-alive\\r\\n\")\n        }\n        \n        for (name, value) in response.headers() {\n            try socket.writeUTF8(\"\\(name): \\(value)\\r\\n\")\n        }\n        \n        try socket.writeUTF8(\"\\r\\n\")\n    \n        if let writeClosure = content.write {\n            let context = InnerWriteContext(socket: socket)\n            try writeClosure(context)\n        }\n        \n        return keepAlive && content.length != -1;\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Swifter/Sources/Socket.swift",
    "content": "//\n//  Socket.swift\n//  Swifter\n//\n//  Copyright (c) 2014-2016 Damian Kołakowski. All rights reserved.\n//\n\n#if os(Linux)\n    import Glibc\n#else\n    import Foundation\n#endif\n\n/* Low level routines for POSIX sockets */\n\npublic enum SocketError: ErrorType {\n    case SocketCreationFailed(String)\n    case SocketSettingReUseAddrFailed(String)\n    case BindFailed(String)\n    case ListenFailed(String)\n    case WriteFailed(String)\n    case GetPeerNameFailed(String)\n    case ConvertingPeerNameFailed\n    case GetNameInfoFailed(String)\n    case AcceptFailed(String)\n    case RecvFailed(String)\n}\n\npublic class Socket: Hashable, Equatable {\n    \n    public class func tcpSocketForListen(port: in_port_t, maxPendingConnection: Int32 = SOMAXCONN) throws -> Socket {\n        \n        #if os(Linux)\n            let socketFileDescriptor = socket(AF_INET, Int32(SOCK_STREAM.rawValue), 0)\n        #else\n            let socketFileDescriptor = socket(AF_INET, SOCK_STREAM, 0)\n        #endif\n        \n        if socketFileDescriptor == -1 {\n            throw SocketError.SocketCreationFailed(Socket.descriptionOfLastError())\n        }\n        \n        var value: Int32 = 1\n        if setsockopt(socketFileDescriptor, SOL_SOCKET, SO_REUSEADDR, &value, socklen_t(sizeof(Int32))) == -1 {\n            let details = Socket.descriptionOfLastError()\n            Socket.release(socketFileDescriptor)\n            throw SocketError.SocketSettingReUseAddrFailed(details)\n        }\n        Socket.setNoSigPipe(socketFileDescriptor)\n        \n        #if os(Linux)\n            var addr = sockaddr_in()\n            addr.sin_family = sa_family_t(AF_INET)\n            addr.sin_port = Socket.htonsPort(port)\n            addr.sin_addr = in_addr(s_addr: in_addr_t(0))\n            addr.sin_zero = (0, 0, 0, 0, 0, 0, 0, 0)\n        #else\n            var addr = sockaddr_in()\n            addr.sin_len = __uint8_t(sizeof(sockaddr_in))\n            addr.sin_family = sa_family_t(AF_INET)\n            addr.sin_port = Socket.htonsPort(port)\n            addr.sin_addr = in_addr(s_addr: inet_addr(\"0.0.0.0\"))\n            addr.sin_zero = (0, 0, 0, 0, 0, 0, 0, 0)\n        #endif\n        \n        var bind_addr = sockaddr()\n        memcpy(&bind_addr, &addr, Int(sizeof(sockaddr_in)))\n        \n        if bind(socketFileDescriptor, &bind_addr, socklen_t(sizeof(sockaddr_in))) == -1 {\n            let details = Socket.descriptionOfLastError()\n            Socket.release(socketFileDescriptor)\n            throw SocketError.BindFailed(details)\n        }\n        \n        if listen(socketFileDescriptor, maxPendingConnection ) == -1 {\n            let details = Socket.descriptionOfLastError()\n            Socket.release(socketFileDescriptor)\n            throw SocketError.ListenFailed(details)\n        }\n        return Socket(socketFileDescriptor: socketFileDescriptor)\n    }\n    \n    private let socketFileDescriptor: Int32\n    \n    public init(socketFileDescriptor: Int32) {\n        self.socketFileDescriptor = socketFileDescriptor\n    }\n    \n    public var hashValue: Int { return Int(self.socketFileDescriptor) }\n    \n    public func release() {\n        Socket.release(self.socketFileDescriptor)\n    }\n    \n    public func shutdwn() {\n        Socket.shutdwn(self.socketFileDescriptor)\n    }\n    \n    public func acceptClientSocket() throws -> Socket {\n        var addr = sockaddr()        \n        var len: socklen_t = 0\n        let clientSocket = accept(self.socketFileDescriptor, &addr, &len)\n        if clientSocket == -1 {\n            throw SocketError.AcceptFailed(Socket.descriptionOfLastError())\n        }\n        Socket.setNoSigPipe(clientSocket)\n        return Socket(socketFileDescriptor: clientSocket)\n    }\n    \n    public func writeUTF8(string: String) throws {\n        try writeUInt8(ArraySlice(string.utf8))\n    }\n    \n    public func writeUInt8(data: [UInt8]) throws {\n        try writeUInt8(ArraySlice(data))\n    }\n    \n    public func writeUInt8(data: ArraySlice<UInt8>) throws {\n        try data.withUnsafeBufferPointer {\n            var sent = 0\n            while sent < data.count {\n                #if os(Linux)\n                    let s = send(self.socketFileDescriptor, $0.baseAddress + sent, Int(data.count - sent), Int32(MSG_NOSIGNAL))\n                #else\n                    let s = write(self.socketFileDescriptor, $0.baseAddress + sent, Int(data.count - sent))\n                #endif\n                if s <= 0 {\n                    throw SocketError.WriteFailed(Socket.descriptionOfLastError())\n                }\n                sent += s\n            }\n        }\n    }\n    \n    public func read() throws -> UInt8 {\n        var buffer = [UInt8](count: 1, repeatedValue: 0)\n        let next = recv(self.socketFileDescriptor as Int32, &buffer, Int(buffer.count), 0)\n        if next <= 0 {\n            throw SocketError.RecvFailed(Socket.descriptionOfLastError())\n        }\n        return buffer[0]\n    }\n    \n    private static let CR = UInt8(13)\n    private static let NL = UInt8(10)\n    \n    public func readLine() throws -> String {\n        var characters: String = \"\"\n        var n: UInt8 = 0\n        repeat {\n            n = try self.read()\n            if n > Socket.CR { characters.append(Character(UnicodeScalar(n))) }\n        } while n != Socket.NL\n        return characters\n    }\n    \n    public func peername() throws -> String {\n        var addr = sockaddr(), len: socklen_t = socklen_t(sizeof(sockaddr))\n        if getpeername(self.socketFileDescriptor, &addr, &len) != 0 {\n            throw SocketError.GetPeerNameFailed(Socket.descriptionOfLastError())\n        }\n        var hostBuffer = [CChar](count: Int(NI_MAXHOST), repeatedValue: 0)\n        if getnameinfo(&addr, len, &hostBuffer, socklen_t(hostBuffer.count), nil, 0, NI_NUMERICHOST) != 0 {\n            throw SocketError.GetNameInfoFailed(Socket.descriptionOfLastError())\n        }\n        guard let name = String.fromCString(hostBuffer) else {\n            throw SocketError.ConvertingPeerNameFailed\n        }\n        return name\n    }\n    \n    private class func descriptionOfLastError() -> String {\n        return String.fromCString(UnsafePointer(strerror(errno))) ?? \"Error: \\(errno)\"\n    }\n    \n    private class func setNoSigPipe(socket: Int32) {\n        #if os(Linux)\n            // There is no SO_NOSIGPIPE in Linux (nor some other systems). You can instead use the MSG_NOSIGNAL flag when calling send(),\n            // or use signal(SIGPIPE, SIG_IGN) to make your entire application ignore SIGPIPE.\n        #else\n            // Prevents crashes when blocking calls are pending and the app is paused ( via Home button ).\n            var no_sig_pipe: Int32 = 1\n            setsockopt(socket, SOL_SOCKET, SO_NOSIGPIPE, &no_sig_pipe, socklen_t(sizeof(Int32)))\n        #endif\n    }\n    \n    private class func shutdwn(socket: Int32) {\n        #if os(Linux)\n            shutdown(socket, Int32(SHUT_RDWR))\n        #else\n            Darwin.shutdown(socket, SHUT_RDWR)\n        #endif\n    }\n    \n    private class func release(socket: Int32) {\n        #if os(Linux)\n            shutdown(socket, Int32(SHUT_RDWR))\n        #else\n            Darwin.shutdown(socket, SHUT_RDWR)\n        #endif\n        close(socket)\n    }\n    \n    private class func htonsPort(port: in_port_t) -> in_port_t {\n        #if os(Linux)\n            return htons(port)\n        #else\n            let isLittleEndian = Int(OSHostByteOrder()) == OSLittleEndian\n            return isLittleEndian ? _OSSwapInt16(port) : port\n        #endif\n    }\n}\n\npublic func ==(socket1: Socket, socket2: Socket) -> Bool {\n    return socket1.socketFileDescriptor == socket2.socketFileDescriptor\n}\n"
  },
  {
    "path": "Sublime/Pods/Swifter/Sources/String+BASE64.swift",
    "content": "//\n//  String+BASE64.swift\n//  Swifter\n//\n//  Copyright © 2016 Damian Kołakowski. All rights reserved.\n//\n\n#if os(Linux)\n    import Glibc\n#else\n    import Foundation\n#endif\n\n\nextension String {\n    \n    private static let CODES = [UInt8](\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".utf8)\n    \n    public static func toBase64(data: [UInt8]) -> String {\n        \n        // Based on: https://en.wikipedia.org/wiki/Base64#Sample_Implementation_in_Java\n        \n        var result = [UInt8]()\n        var tmp: UInt8\n        for index in 0.stride(to: data.count, by: 3) {\n            let byte = data[index]\n            tmp = (byte & 0xFC) >> 2;\n            result.append(CODES[Int(tmp)])\n            tmp = (byte & 0x03) << 4;\n            if index + 1 < data.count {\n                tmp |= (data[index + 1] & 0xF0) >> 4;\n                result.append(CODES[Int(tmp)]);\n                tmp = (data[index + 1] & 0x0F) << 2;\n                if (index + 2 < data.count)  {\n                    tmp |= (data[index + 2] & 0xC0) >> 6;\n                    result.append(CODES[Int(tmp)]);\n                    tmp = data[index + 2] & 0x3F;\n                    result.append(CODES[Int(tmp)]);\n                } else  {\n                    result.append(CODES[Int(tmp)]);\n                    result.appendContentsOf([UInt8](\"=\".utf8));\n                }\n            } else {\n                result.append(CODES[Int(tmp)]);\n                result.appendContentsOf([UInt8](\"==\".utf8));\n            }\n        }\n        return String.fromUInt8(result)\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Swifter/Sources/String+Misc.swift",
    "content": "//\n//  String+Misc.swift\n//  Swifter\n//\n//  Copyright (c) 2014-2016 Damian Kołakowski. All rights reserved.\n//\n\n#if os(Linux)\n    import Glibc\n#else\n    import Foundation\n#endif\n\nextension String {\n\n    public func split(separator: Character) -> [String] {\n        return self.characters.split { $0 == separator }.map(String.init)\n    }\n    \n    public func split(maxSplit: Int = Int.max, separator: Character) -> [String] {\n        return self.characters.split(maxSplit) { $0 == separator }.map(String.init)\n    }\n    \n    public func replace(old: Character, _ new: Character) -> String {\n        var buffer = [Character]()\n        self.characters.forEach { buffer.append($0 == old ? new : $0) }\n        return String(buffer)\n    }\n    \n    public func unquote() -> String {\n        var scalars = self.unicodeScalars;\n        if scalars.first == \"\\\"\" && scalars.last == \"\\\"\" && scalars.count >= 2 {\n            scalars.removeFirst();\n            scalars.removeLast();\n            return String(scalars)\n        }\n        return self\n    }\n    \n    public func trim() -> String {\n        var scalars = self.unicodeScalars\n        while let _ = scalars.first?.asWhitespace() { scalars.removeFirst() }\n        while let _ = scalars.last?.asWhitespace() { scalars.removeLast() }\n        return String(scalars)\n    }\n    \n    public static func fromUInt8(array: [UInt8]) -> String {\n        // Apple changes the definition of String(data: .... ) every release so let's stay with 'fromUInt8(...)' wrapper.\n        return array.reduce(\"\", combine: { $0.0 + String(UnicodeScalar($0.1)) })\n    }\n    \n    public func removePercentEncoding() -> String {\n        var scalars = self.unicodeScalars\n        var output = \"\"\n        var decodeBuffer = [UInt8]()\n        while let scalar = scalars.popFirst() {\n            if scalar == \"%\" {\n                let first = scalars.popFirst()\n                let secon = scalars.popFirst()\n                if let first = first?.asAlpha(), secon = secon?.asAlpha() {\n                    decodeBuffer.append(first*16+secon)\n                } else {\n                    if !decodeBuffer.isEmpty {\n                        output.appendContentsOf(String.fromUInt8(decodeBuffer))\n                        decodeBuffer.removeAll()\n                    }\n                    if let first = first { output.append(Character(first)) }\n                    if let secon = secon { output.append(Character(secon)) }\n                }\n            } else {\n                if !decodeBuffer.isEmpty {\n                    output.appendContentsOf(String.fromUInt8(decodeBuffer))\n                    decodeBuffer.removeAll()\n                }\n                output.append(Character(scalar))\n            }\n        }\n        if !decodeBuffer.isEmpty {\n            output.appendContentsOf(String.fromUInt8(decodeBuffer))\n            decodeBuffer.removeAll()\n        }\n        return output\n    }\n}\n\nextension UnicodeScalar {\n    \n    public func asWhitespace() -> UInt8? {\n        if self.value >= 9 && self.value <= 13 {\n            return UInt8(self.value)\n        }\n        if self.value == 32 {\n            return UInt8(self.value)\n        }\n        return nil\n    }\n    \n    public func asAlpha() -> UInt8? {\n        if self.value >= 48 && self.value <= 57 {\n            return UInt8(self.value) - 48\n        }\n        if self.value >= 97 && self.value <= 102 {\n            return UInt8(self.value) - 87\n        }\n        if self.value >= 65 && self.value <= 70 {\n            return UInt8(self.value) - 55\n        }\n        return nil\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Swifter/Sources/String+SHA1.swift",
    "content": "//\n//  String+SHA1.swift\n//  Swifter\n//\n//  Copyright 2014-2016 Damian Kołakowski. All rights reserved.\n//\n\n#if os(Linux)\n    import Glibc\n#else\n    import Foundation\n#endif\n\n\nextension String {\n    \n    public func SHA1() -> String {\n        return SHA1().reduce(\"\") { $0 + String(format: \"%02x\", $1) }\n    }\n    \n    public func SHA1() -> [UInt8] {\n        \n        // Alghorithm from: https://en.wikipedia.org/wiki/SHA-1\n        \n        var message = [UInt8](self.utf8)\n        \n        var h0 = UInt32(littleEndian: 0x67452301)\n        var h1 = UInt32(littleEndian: 0xEFCDAB89)\n        var h2 = UInt32(littleEndian: 0x98BADCFE)\n        var h3 = UInt32(littleEndian: 0x10325476)\n        var h4 = UInt32(littleEndian: 0xC3D2E1F0)\n        \n        // ml = message length in bits (always a multiple of the number of bits in a character).\n        \n        let ml = UInt64(message.count * 8)\n        \n        // append the bit '1' to the message e.g. by adding 0x80 if message length is a multiple of 8 bits.\n        \n        message.append(0x80)\n        \n        // append 0 ≤ k < 512 bits '0', such that the resulting message length in bits is congruent to −64 ≡ 448 (mod 512)\n        \n        let padBytesCount = ( message.count + 8 ) % 64\n        \n        message.appendContentsOf([UInt8](count: 64 - padBytesCount, repeatedValue: 0))\n        \n        // append ml, in a 64-bit big-endian integer. Thus, the total length is a multiple of 512 bits.\n        \n        var mlBigEndian = ml.bigEndian\n        let bytePtr = withUnsafePointer(&mlBigEndian) { UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: sizeofValue(mlBigEndian)) }\n        \n        message.appendContentsOf(Array(bytePtr))\n        \n        // Process the message in successive 512-bit chunks ( 64 bytes chunks ):\n\n        for chunkStart in 0..<message.count/64 {\n            var words = [UInt32]()\n            let chunk = message[chunkStart*64..<chunkStart*64+64]\n            \n            // break chunk into sixteen 32-bit big-endian words w[i], 0 ≤ i ≤ 15\n            \n            for i in 0...15 {\n                let value = chunk.withUnsafeBufferPointer({ UnsafePointer<UInt32>($0.baseAddress + (i*4)).memory })\n                words.append(value.bigEndian)\n            }\n            \n            // Extend the sixteen 32-bit words into eighty 32-bit words:\n            \n            for i in 16...79 {\n                let value = words[i-3] ^ words[i-8] ^ words[i-14] ^ words[i-16]\n                words.append(rotateLeft(value, 1))\n            }\n            \n            // Initialize hash value for this chunk:\n            \n            var a = h0\n            var b = h1\n            var c = h2\n            var d = h3\n            var e = h4\n            \n            for i in 0..<80 {\n                var f = UInt32(0)\n                var k = UInt32(0)\n                switch i {\n                    case 0...19:\n                        f = (b & c) | ((~b) & d)\n                        k = 0x5A827999\n                    case 20...39:\n                        f = b ^ c ^ d\n                        k = 0x6ED9EBA1\n                    case 40...59:\n                        f = (b & c) | (b & d) | (c & d)\n                        k = 0x8F1BBCDC\n                    case 60...79:\n                        f = b ^ c ^ d\n                        k = 0xCA62C1D6\n                    default: break\n                }\n                let temp = (rotateLeft(a, 5) &+ f &+ e &+ k &+ words[i]) & 0xFFFFFFFF\n                e = d\n                d = c\n                c = rotateLeft(b, 30)\n                b = a\n                a = temp\n            }\n            \n            // Add this chunk's hash to result so far:\n            \n            h0 = ( h0 &+ a ) & 0xFFFFFFFF\n            h1 = ( h1 &+ b ) & 0xFFFFFFFF\n            h2 = ( h2 &+ c ) & 0xFFFFFFFF\n            h3 = ( h3 &+ d ) & 0xFFFFFFFF\n            h4 = ( h4 &+ e ) & 0xFFFFFFFF\n        }\n        \n        // Produce the final hash value (big-endian) as a 160 bit number:\n        \n        var result = [UInt8]()\n        \n        let h0Big = h0.bigEndian\n        let h1Big = h1.bigEndian\n        let h2Big = h2.bigEndian\n        let h3Big = h3.bigEndian\n        let h4Big = h4.bigEndian\n        \n        result += ([UInt8(h0Big & 0xFF), UInt8((h0Big >> 8) & 0xFF), UInt8((h0Big >> 16) & 0xFF), UInt8((h0Big >> 24) & 0xFF)]);\n        result += ([UInt8(h1Big & 0xFF), UInt8((h1Big >> 8) & 0xFF), UInt8((h1Big >> 16) & 0xFF), UInt8((h1Big >> 24) & 0xFF)]);\n        result += ([UInt8(h2Big & 0xFF), UInt8((h2Big >> 8) & 0xFF), UInt8((h2Big >> 16) & 0xFF), UInt8((h2Big >> 24) & 0xFF)]);\n        result += ([UInt8(h3Big & 0xFF), UInt8((h3Big >> 8) & 0xFF), UInt8((h3Big >> 16) & 0xFF), UInt8((h3Big >> 24) & 0xFF)]);\n        result += ([UInt8(h4Big & 0xff), UInt8((h4Big >> 8) & 0xFF), UInt8((h4Big >> 16) & 0xFF), UInt8((h4Big >> 24) & 0xFF)]);\n\n        return result;\n    }\n    \n    func rotateLeft(v: UInt32, _ n: UInt32) -> UInt32 {\n        return ((v << n) & 0xFFFFFFFF) | (v >> (32 - n))\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/SwiftyJSON/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Ruoyu Fu\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": "Sublime/Pods/SwiftyJSON/README.md",
    "content": "#SwiftyJSON [中文介绍](http://tangplin.github.io/swiftyjson/)\n\n[![Travis CI](https://travis-ci.org/SwiftyJSON/SwiftyJSON.svg?branch=master)](https://travis-ci.org/SwiftyJSON/SwiftyJSON)\n\nSwiftyJSON makes it easy to deal with JSON data in Swift.\n\n1. [Why is the typical JSON handling in Swift NOT good](#why-is-the-typical-json-handling-in-swift-not-good)\n1. [Requirements](#requirements)\n1. [Integration](#integration)\n1. [Usage](#usage)\n\t- [Initialization](#initialization)\n\t- [Subscript](#subscript)\n\t- [Loop](#loop)\n\t- [Error](#error)\n\t- [Optional getter](#optional-getter)\n\t- [Non-optional getter](#non-optional-getter)\n\t- [Setter](#setter)\n\t- [Raw object](#raw-object)\n\t- [Literal convertibles](#literal-convertibles)\n1. [Work with Alamofire](#work-with-alamofire)\n\n##Why is the typical JSON handling in Swift NOT good?\nSwift is very strict about types. But although explicit typing is good for saving us from mistakes, it becomes painful when dealing with JSON and other areas that are, by nature, implicit about types.\n\nTake the Twitter API for example. Say we want to retrieve a user's \"name\" value of some tweet in Swift (according to Twitter's API https://dev.twitter.com/docs/api/1.1/get/statuses/home_timeline).\n\nThe code would look like this:\n\n```swift\n\nif let statusesArray = try? NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments) as? [[String: AnyObject]],\n    let user = statusesArray[0][\"user\"] as? [String: AnyObject],\n    let username = user[\"name\"] as? String {\n    // Finally we got the username\n}\n\n```\n\nIt's not good.\n\nEven if we use optional chaining, it would be messy:\n\n```swift\n\nif let JSONObject = try NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments) as? [[String: AnyObject]],\n    let username = (JSONObject[0][\"user\"] as? [String: AnyObject])?[\"name\"] as? String {\n        // There's our username\n}\n\n```\nAn unreadable mess--for something that should really be simple!\n\nWith SwiftyJSON all you have to do is:\n\n```swift\n\nlet json = JSON(data: dataFromNetworking)\nif let userName = json[0][\"user\"][\"name\"].string {\n  //Now you got your value\n}\n\n```\n\nAnd don't worry about the Optional Wrapping thing. It's done for you automatically.\n\n```swift\n\nlet json = JSON(data: dataFromNetworking)\nif let userName = json[999999][\"wrong_key\"][\"wrong_name\"].string {\n    //Calm down, take it easy, the \".string\" property still produces the correct Optional String type with safety\n} else {\n    //Print the error\n    print(json[999999][\"wrong_key\"][\"wrong_name\"])\n}\n\n```\n\n## Requirements\n\n- iOS 7.0+ / Mac OS X 10.9+\n- Xcode 7\n\n##Integration\n\n####CocoaPods (iOS 8+, OS X 10.9+)\nYou can use [Cocoapods](http://cocoapods.org/) to install `SwiftyJSON`by adding it to your `Podfile`:\n```ruby\nplatform :ios, '8.0'\nuse_frameworks!\n\ntarget 'MyApp' do\n\tpod 'SwiftyJSON', :git => 'https://github.com/SwiftyJSON/SwiftyJSON.git'\nend\n```\nNote that this requires CocoaPods version 36, and your iOS deployment target to be at least 8.0:\n\n####Carthage (iOS 8+, OS X 10.9+)\nYou can use [Carthage](https://github.com/Carthage/Carthage) to install `SwiftyJSON` by adding it to your `Cartfile`:\n```\ngithub \"SwiftyJSON/SwiftyJSON\"\n```\n\n####Manually (iOS 7+, OS X 10.9+)\n\nTo use this library in your project manually you may:  \n\n1. for Projects, just drag SwiftyJSON.swift to the project tree\n2. for Workspaces, include the whole SwiftyJSON.xcodeproj\n\n## Usage\n\n####Initialization\n```swift\nimport SwiftyJSON\n```\n```swift\nlet json = JSON(data: dataFromNetworking)\n```\n```swift\nlet json = JSON(jsonObject)\n```\n```swift\nif let dataFromString = jsonString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) {\n    let json = JSON(data: dataFromString)\n}\n```\n\n####Subscript\n```swift\n//Getting a double from a JSON Array\nlet name = json[0].double\n```\n```swift\n//Getting a string from a JSON Dictionary\nlet name = json[\"name\"].stringValue\n```\n```swift\n//Getting a string using a path to the element\nlet path = [1,\"list\",2,\"name\"]\nlet name = json[path].string\n//Just the same\nlet name = json[1][\"list\"][2][\"name\"].string\n//Alternatively\nlet name = json[1,\"list\",2,\"name\"].string\n```\n```swift\n//With a hard way\nlet name = json[].string\n```\n```swift\n//With a custom way\nlet keys:[SubscriptType] = [1,\"list\",2,\"name\"]\nlet name = json[keys].string\n```\n####Loop\n```swift\n//If json is .Dictionary\nfor (key,subJson):(String, JSON) in json {\n   //Do something you want\n}\n```\n*The first element is always a String, even if the JSON is an Array*\n```swift\n//If json is .Array\n//The `index` is 0..<json.count's string value\nfor (index,subJson):(String, JSON) in json {\n    //Do something you want\n}\n```\n####Error\nUse a subscript to get/set a value in an Array or Dictionary\n\nIf the JSON is:\n*  an array, the app may crash with \"index out-of-bounds.\"\n*  a dictionary, it will be assigned `nil` without a reason.\n*  not an array or a dictionary, the app may crash with an \"unrecognised selector\" exception.\n\nThis will never happen in SwiftyJSON.\n\n```swift\nlet json = JSON([\"name\", \"age\"])\nif let name = json[999].string {\n    //Do something you want\n} else {\n    print(json[999].error) // \"Array[999] is out of bounds\"\n}\n```\n```swift\nlet json = JSON([\"name\":\"Jack\", \"age\": 25])\nif let name = json[\"address\"].string {\n    //Do something you want\n} else {\n    print(json[\"address\"].error) // \"Dictionary[\"address\"] does not exist\"\n}\n```\n```swift\nlet json = JSON(12345)\nif let age = json[0].string {\n    //Do something you want\n} else {\n    print(json[0])       // \"Array[0] failure, It is not an array\"\n    print(json[0].error) // \"Array[0] failure, It is not an array\"\n}\n\nif let name = json[\"name\"].string {\n    //Do something you want\n} else {\n    print(json[\"name\"])       // \"Dictionary[\\\"name\"] failure, It is not an dictionary\"\n    print(json[\"name\"].error) // \"Dictionary[\\\"name\"] failure, It is not an dictionary\"\n}\n```\n\n####Optional getter\n```swift\n//NSNumber\nif let id = json[\"user\"][\"favourites_count\"].number {\n   //Do something you want\n} else {\n   //Print the error\n   print(json[\"user\"][\"favourites_count\"].error)\n}\n```\n```swift\n//String\nif let id = json[\"user\"][\"name\"].string {\n   //Do something you want\n} else {\n   //Print the error\n   print(json[\"user\"][\"name\"])\n}\n```\n```swift\n//Bool\nif let id = json[\"user\"][\"is_translator\"].bool {\n   //Do something you want\n} else {\n   //Print the error\n   print(json[\"user\"][\"is_translator\"])\n}\n```\n```swift\n//Int\nif let id = json[\"user\"][\"id\"].int {\n   //Do something you want\n} else {\n   //Print the error\n   print(json[\"user\"][\"id\"])\n}\n...\n```\n####Non-optional getter\nNon-optional getter is named `xxxValue`\n```swift\n//If not a Number or nil, return 0\nlet id: Int = json[\"id\"].intValue\n```\n```swift\n//If not a String or nil, return \"\"\nlet name: String = json[\"name\"].stringValue\n```\n```swift\n//If not a Array or nil, return []\nlet list: Array<JSON> = json[\"list\"].arrayValue\n```\n```swift\n//If not a Dictionary or nil, return [:]\nlet user: Dictionary<String, JSON> = json[\"user\"].dictionaryValue\n```\n\n####Setter\n```swift\njson[\"name\"] = JSON(\"new-name\")\njson[0] = JSON(1)\n```\n```swift\njson[\"id\"].int =  1234567890\njson[\"coordinate\"].double =  8766.766\njson[\"name\"].string =  \"Jack\"\njson.arrayObject = [1,2,3,4]\njson.dictionary = [\"name\":\"Jack\", \"age\":25]\n```\n\n####Raw object\n```swift\nlet jsonObject: AnyObject = json.object\n```\n```swift\nif let jsonObject: AnyObject = json.rawValue\n```\n```swift\n//convert the JSON to raw NSData\nif let data = json.rawData() {\n    //Do something you want\n}\n```\n```swift\n//convert the JSON to a raw String\nif let string = json.rawString() {\n    //Do something you want\n}\n```\n####Existance\n```swift\n//shows you whether value specified in JSON or not\nif json[\"name\"].isExists()\n```\n\n####Literal convertibles\nFor more info about literal convertibles: [Swift Literal Convertibles](http://nshipster.com/swift-literal-convertible/)\n```swift\n//StringLiteralConvertible\nlet json: JSON = \"I'm a json\"\n```\n```swift\n//IntegerLiteralConvertible\nlet json: JSON =  12345\n```\n```swift\n//BooleanLiteralConvertible\nlet json: JSON =  true\n```\n```swift\n//FloatLiteralConvertible\nlet json: JSON =  2.8765\n```\n```swift\n//DictionaryLiteralConvertible\nlet json: JSON =  [\"I\":\"am\", \"a\":\"json\"]\n```\n```swift\n//ArrayLiteralConvertible\nlet json: JSON =  [\"I\", \"am\", \"a\", \"json\"]\n```\n```swift\n//NilLiteralConvertible\nlet json: JSON =  nil\n```\n```swift\n//With subscript in array\nvar json: JSON =  [1,2,3]\njson[0] = 100\njson[1] = 200\njson[2] = 300\njson[999] = 300 //Don't worry, nothing will happen\n```\n```swift\n//With subscript in dictionary\nvar json: JSON =  [\"name\": \"Jack\", \"age\": 25]\njson[\"name\"] = \"Mike\"\njson[\"age\"] = \"25\" //It's OK to set String\njson[\"address\"] = \"L.A.\" // Add the \"address\": \"L.A.\" in json\n```\n```swift\n//Array & Dictionary\nvar json: JSON =  [\"name\": \"Jack\", \"age\": 25, \"list\": [\"a\", \"b\", \"c\", [\"what\": \"this\"]]]\njson[\"list\"][3][\"what\"] = \"that\"\njson[\"list\",3,\"what\"] = \"that\"\nlet path = [\"list\",3,\"what\"]\njson[path] = \"that\"\n```\n##Work with Alamofire\n\nSwiftyJSON nicely wraps the result of the Alamofire JSON response handler:\n```swift\nAlamofire.request(.GET, url).validate().responseJSON { response in\n    switch response.result {\n    case .Success:\n        if let value = response.result.value {\n          let json = JSON(value)\n          print(\"JSON: \\(json)\")\n        }\n    case .Failure(let error):\n        print(error)\n    }\n}\n```\n"
  },
  {
    "path": "Sublime/Pods/SwiftyJSON/Source/SwiftyJSON.swift",
    "content": "//  SwiftyJSON.swift\n//\n//  Copyright (c) 2014 Ruoyu Fu, Pinglin Tang\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\nimport Foundation\n\n// MARK: - Error\n\n///Error domain\npublic let ErrorDomain: String = \"SwiftyJSONErrorDomain\"\n\n///Error code\npublic let ErrorUnsupportedType: Int = 999\npublic let ErrorIndexOutOfBounds: Int = 900\npublic let ErrorWrongType: Int = 901\npublic let ErrorNotExist: Int = 500\npublic let ErrorInvalidJSON: Int = 490\n\n// MARK: - JSON Type\n\n/**\nJSON's type definitions.\n\nSee http://www.json.org\n*/\npublic enum Type :Int{\n\n    case Number\n    case String\n    case Bool\n    case Array\n    case Dictionary\n    case Null\n    case Unknown\n}\n\n// MARK: - JSON Base\n\npublic struct JSON {\n\n    /**\n    Creates a JSON using the data.\n\n    - parameter data:  The NSData used to convert to json.Top level object in data is an NSArray or NSDictionary\n    - parameter opt:   The JSON serialization reading options. `.AllowFragments` by default.\n    - parameter error: error The NSErrorPointer used to return the error. `nil` by default.\n\n    - returns: The created JSON\n    */\n    public init(data:NSData, options opt: NSJSONReadingOptions = .AllowFragments, error: NSErrorPointer = nil) {\n        do {\n            let object: AnyObject = try NSJSONSerialization.JSONObjectWithData(data, options: opt)\n            self.init(object)\n        } catch let aError as NSError {\n            if error != nil {\n                error.memory = aError\n            }\n            self.init(NSNull())\n        }\n    }\n\n    /**\n     Create a JSON from JSON string\n    - parameter string: Normal json string like '{\"a\":\"b\"}'\n\n    - returns: The created JSON\n    */\n    public static func parse(string:String) -> JSON {\n        return string.dataUsingEncoding(NSUTF8StringEncoding)\n            .flatMap({JSON(data: $0)}) ?? JSON(NSNull())\n    }\n\n    /**\n    Creates a JSON using the object.\n\n    - parameter object:  The object must have the following properties: All objects are NSString/String, NSNumber/Int/Float/Double/Bool, NSArray/Array, NSDictionary/Dictionary, or NSNull; All dictionary keys are NSStrings/String; NSNumbers are not NaN or infinity.\n\n    - returns: The created JSON\n    */\n    public init(_ object: AnyObject) {\n        self.object = object\n    }\n\n    /**\n    Creates a JSON from a [JSON]\n\n    - parameter jsonArray: A Swift array of JSON objects\n\n    - returns: The created JSON\n    */\n    public init(_ jsonArray:[JSON]) {\n        self.init(jsonArray.map { $0.object })\n    }\n\n    /**\n    Creates a JSON from a [String: JSON]\n\n    - parameter jsonDictionary: A Swift dictionary of JSON objects\n\n    - returns: The created JSON\n    */\n    public init(_ jsonDictionary:[String: JSON]) {\n        var dictionary = [String: AnyObject]()\n        for (key, json) in jsonDictionary {\n            dictionary[key] = json.object\n        }\n        self.init(dictionary)\n    }\n\n    /// Private object\n    private var rawArray: [AnyObject] = []\n    private var rawDictionary: [String : AnyObject] = [:]\n    private var rawString: String = \"\"\n    private var rawNumber: NSNumber = 0\n    private var rawNull: NSNull = NSNull()\n    /// Private type\n    private var _type: Type = .Null\n    /// prviate error\n    private var _error: NSError? = nil\n\n    /// Object in JSON\n    public var object: AnyObject {\n        get {\n            switch self.type {\n            case .Array:\n                return self.rawArray\n            case .Dictionary:\n                return self.rawDictionary\n            case .String:\n                return self.rawString\n            case .Number:\n                return self.rawNumber\n            case .Bool:\n                return self.rawNumber\n            default:\n                return self.rawNull\n            }\n        }\n        set {\n            _error = nil\n            switch newValue {\n            case let number as NSNumber:\n                if number.isBool {\n                    _type = .Bool\n                } else {\n                    _type = .Number\n                }\n                self.rawNumber = number\n            case  let string as String:\n                _type = .String\n                self.rawString = string\n            case  _ as NSNull:\n                _type = .Null\n            case let array as [AnyObject]:\n                _type = .Array\n                self.rawArray = array\n            case let dictionary as [String : AnyObject]:\n                _type = .Dictionary\n                self.rawDictionary = dictionary\n            default:\n                _type = .Unknown\n                _error = NSError(domain: ErrorDomain, code: ErrorUnsupportedType, userInfo: [NSLocalizedDescriptionKey: \"It is a unsupported type\"])\n            }\n        }\n    }\n\n    /// json type\n    public var type: Type { get { return _type } }\n\n    /// Error in JSON\n    public var error: NSError? { get { return self._error } }\n\n    /// The static null json\n    @available(*, unavailable, renamed=\"null\")\n    public static var nullJSON: JSON { get { return null } }\n    public static var null: JSON { get { return JSON(NSNull()) } }\n}\n\n// MARK: - CollectionType, SequenceType, Indexable\nextension JSON : Swift.CollectionType, Swift.SequenceType, Swift.Indexable {\n\n    public typealias Generator = JSONGenerator\n\n    public typealias Index = JSONIndex\n\n    public var startIndex: JSON.Index {\n        switch self.type {\n        case .Array:\n            return JSONIndex(arrayIndex: self.rawArray.startIndex)\n        case .Dictionary:\n            return JSONIndex(dictionaryIndex: self.rawDictionary.startIndex)\n        default:\n            return JSONIndex()\n        }\n    }\n\n    public var endIndex: JSON.Index {\n        switch self.type {\n        case .Array:\n            return JSONIndex(arrayIndex: self.rawArray.endIndex)\n        case .Dictionary:\n            return JSONIndex(dictionaryIndex: self.rawDictionary.endIndex)\n        default:\n            return JSONIndex()\n        }\n    }\n\n    public subscript (position: JSON.Index) -> JSON.Generator.Element {\n        switch self.type {\n        case .Array:\n            return (String(position.arrayIndex), JSON(self.rawArray[position.arrayIndex!]))\n        case .Dictionary:\n            let (key, value) = self.rawDictionary[position.dictionaryIndex!]\n            return (key, JSON(value))\n        default:\n            return (\"\", JSON.null)\n        }\n    }\n\n    /// If `type` is `.Array` or `.Dictionary`, return `array.empty` or `dictonary.empty` otherwise return `true`.\n    public var isEmpty: Bool {\n        get {\n            switch self.type {\n            case .Array:\n                return self.rawArray.isEmpty\n            case .Dictionary:\n                return self.rawDictionary.isEmpty\n            default:\n                return true\n            }\n        }\n    }\n\n    /// If `type` is `.Array` or `.Dictionary`, return `array.count` or `dictonary.count` otherwise return `0`.\n    public var count: Int {\n        switch self.type {\n        case .Array:\n            return self.rawArray.count\n        case .Dictionary:\n            return self.rawDictionary.count\n        default:\n            return 0\n        }\n    }\n\n    public func underestimateCount() -> Int {\n        switch self.type {\n        case .Array:\n            return self.rawArray.underestimateCount()\n        case .Dictionary:\n            return self.rawDictionary.underestimateCount()\n        default:\n            return 0\n        }\n    }\n\n    /**\n    If `type` is `.Array` or `.Dictionary`, return a generator over the elements like `Array` or `Dictionary`, otherwise return a generator over empty.\n\n    - returns: Return a *generator* over the elements of JSON.\n    */\n    public func generate() -> JSON.Generator {\n        return JSON.Generator(self)\n    }\n}\n\npublic struct JSONIndex: ForwardIndexType, _Incrementable, Equatable, Comparable {\n\n    let arrayIndex: Int?\n    let dictionaryIndex: DictionaryIndex<String, AnyObject>?\n\n    let type: Type\n\n    init(){\n        self.arrayIndex = nil\n        self.dictionaryIndex = nil\n        self.type = .Unknown\n    }\n\n    init(arrayIndex: Int) {\n        self.arrayIndex = arrayIndex\n        self.dictionaryIndex = nil\n        self.type = .Array\n    }\n\n    init(dictionaryIndex: DictionaryIndex<String, AnyObject>) {\n        self.arrayIndex = nil\n        self.dictionaryIndex = dictionaryIndex\n        self.type = .Dictionary\n    }\n\n    public func successor() -> JSONIndex {\n        switch self.type {\n        case .Array:\n            return JSONIndex(arrayIndex: self.arrayIndex!.successor())\n        case .Dictionary:\n            return JSONIndex(dictionaryIndex: self.dictionaryIndex!.successor())\n        default:\n            return JSONIndex()\n        }\n    }\n}\n\npublic func ==(lhs: JSONIndex, rhs: JSONIndex) -> Bool {\n    switch (lhs.type, rhs.type) {\n    case (.Array, .Array):\n        return lhs.arrayIndex == rhs.arrayIndex\n    case (.Dictionary, .Dictionary):\n        return lhs.dictionaryIndex == rhs.dictionaryIndex\n    default:\n        return false\n    }\n}\n\npublic func <(lhs: JSONIndex, rhs: JSONIndex) -> Bool {\n    switch (lhs.type, rhs.type) {\n    case (.Array, .Array):\n        return lhs.arrayIndex < rhs.arrayIndex\n    case (.Dictionary, .Dictionary):\n        return lhs.dictionaryIndex < rhs.dictionaryIndex\n    default:\n        return false\n    }\n}\n\npublic func <=(lhs: JSONIndex, rhs: JSONIndex) -> Bool {\n    switch (lhs.type, rhs.type) {\n    case (.Array, .Array):\n        return lhs.arrayIndex <= rhs.arrayIndex\n    case (.Dictionary, .Dictionary):\n        return lhs.dictionaryIndex <= rhs.dictionaryIndex\n    default:\n        return false\n    }\n}\n\npublic func >=(lhs: JSONIndex, rhs: JSONIndex) -> Bool {\n    switch (lhs.type, rhs.type) {\n    case (.Array, .Array):\n        return lhs.arrayIndex >= rhs.arrayIndex\n    case (.Dictionary, .Dictionary):\n        return lhs.dictionaryIndex >= rhs.dictionaryIndex\n    default:\n        return false\n    }\n}\n\npublic func >(lhs: JSONIndex, rhs: JSONIndex) -> Bool {\n    switch (lhs.type, rhs.type) {\n    case (.Array, .Array):\n        return lhs.arrayIndex > rhs.arrayIndex\n    case (.Dictionary, .Dictionary):\n        return lhs.dictionaryIndex > rhs.dictionaryIndex\n    default:\n        return false\n    }\n}\n\npublic struct JSONGenerator : GeneratorType {\n\n    public typealias Element = (String, JSON)\n\n    private let type: Type\n    private var dictionayGenerate: DictionaryGenerator<String, AnyObject>?\n    private var arrayGenerate: IndexingGenerator<[AnyObject]>?\n    private var arrayIndex: Int = 0\n\n    init(_ json: JSON) {\n        self.type = json.type\n        if type == .Array {\n            self.arrayGenerate = json.rawArray.generate()\n        }else {\n            self.dictionayGenerate = json.rawDictionary.generate()\n        }\n    }\n\n    public mutating func next() -> JSONGenerator.Element? {\n        switch self.type {\n        case .Array:\n            if let o = self.arrayGenerate?.next() {\n                return (String(self.arrayIndex++), JSON(o))\n            } else {\n                return nil\n            }\n        case .Dictionary:\n            if let (k, v): (String, AnyObject) = self.dictionayGenerate?.next() {\n                return (k, JSON(v))\n            } else {\n                return nil\n            }\n        default:\n            return nil\n        }\n    }\n}\n\n// MARK: - Subscript\n\n/**\n*  To mark both String and Int can be used in subscript.\n*/\npublic enum JSONKey {\n    case Index(Int)\n    case Key(String)\n}\n\npublic protocol JSONSubscriptType {\n    var jsonKey:JSONKey { get }\n}\n\nextension Int: JSONSubscriptType {\n    public var jsonKey:JSONKey {\n        return JSONKey.Index(self)\n    }\n}\n\nextension String: JSONSubscriptType {\n    public var jsonKey:JSONKey {\n        return JSONKey.Key(self)\n    }\n}\n\nextension JSON {\n\n    /// If `type` is `.Array`, return json which's object is `array[index]`, otherwise return null json with error.\n    private subscript(index index: Int) -> JSON {\n        get {\n            if self.type != .Array {\n                var r = JSON.null\n                r._error = self._error ?? NSError(domain: ErrorDomain, code: ErrorWrongType, userInfo: [NSLocalizedDescriptionKey: \"Array[\\(index)] failure, It is not an array\"])\n                return r\n            } else if index >= 0 && index < self.rawArray.count {\n                return JSON(self.rawArray[index])\n            } else {\n                var r = JSON.null\n                r._error = NSError(domain: ErrorDomain, code:ErrorIndexOutOfBounds , userInfo: [NSLocalizedDescriptionKey: \"Array[\\(index)] is out of bounds\"])\n                return r\n            }\n        }\n        set {\n            if self.type == .Array {\n                if self.rawArray.count > index && newValue.error == nil {\n                    self.rawArray[index] = newValue.object\n                }\n            }\n        }\n    }\n\n    /// If `type` is `.Dictionary`, return json which's object is `dictionary[key]` , otherwise return null json with error.\n    private subscript(key key: String) -> JSON {\n        get {\n            var r = JSON.null\n            if self.type == .Dictionary {\n                if let o = self.rawDictionary[key] {\n                    r = JSON(o)\n                } else {\n                    r._error = NSError(domain: ErrorDomain, code: ErrorNotExist, userInfo: [NSLocalizedDescriptionKey: \"Dictionary[\\\"\\(key)\\\"] does not exist\"])\n                }\n            } else {\n                r._error = self._error ?? NSError(domain: ErrorDomain, code: ErrorWrongType, userInfo: [NSLocalizedDescriptionKey: \"Dictionary[\\\"\\(key)\\\"] failure, It is not an dictionary\"])\n            }\n            return r\n        }\n        set {\n            if self.type == .Dictionary && newValue.error == nil {\n                self.rawDictionary[key] = newValue.object\n            }\n        }\n    }\n\n    /// If `sub` is `Int`, return `subscript(index:)`; If `sub` is `String`,  return `subscript(key:)`.\n    private subscript(sub sub: JSONSubscriptType) -> JSON {\n        get {\n            switch sub.jsonKey {\n            case .Index(let index): return self[index: index]\n            case .Key(let key): return self[key: key]\n            }\n        }\n        set {\n            switch sub.jsonKey {\n            case .Index(let index): self[index: index] = newValue\n            case .Key(let key): self[key: key] = newValue\n            }\n        }\n    }\n\n    /**\n    Find a json in the complex data structuresby using the Int/String's array.\n\n    - parameter path: The target json's path. Example:\n\n    let json = JSON[data]\n    let path = [9,\"list\",\"person\",\"name\"]\n    let name = json[path]\n\n    The same as: let name = json[9][\"list\"][\"person\"][\"name\"]\n\n    - returns: Return a json found by the path or a null json with error\n    */\n    public subscript(path: [JSONSubscriptType]) -> JSON {\n        get {\n            return path.reduce(self) { $0[sub: $1] }\n        }\n        set {\n            switch path.count {\n            case 0:\n                return\n            case 1:\n                self[sub:path[0]].object = newValue.object\n            default:\n                var aPath = path; aPath.removeAtIndex(0)\n                var nextJSON = self[sub: path[0]]\n                nextJSON[aPath] = newValue\n                self[sub: path[0]] = nextJSON\n            }\n        }\n    }\n\n    /**\n    Find a json in the complex data structuresby using the Int/String's array.\n\n    - parameter path: The target json's path. Example:\n\n    let name = json[9,\"list\",\"person\",\"name\"]\n\n    The same as: let name = json[9][\"list\"][\"person\"][\"name\"]\n\n    - returns: Return a json found by the path or a null json with error\n    */\n    public subscript(path: JSONSubscriptType...) -> JSON {\n        get {\n            return self[path]\n        }\n        set {\n            self[path] = newValue\n        }\n    }\n}\n\n// MARK: - LiteralConvertible\n\nextension JSON: Swift.StringLiteralConvertible {\n\n    public init(stringLiteral value: StringLiteralType) {\n        self.init(value)\n    }\n\n    public init(extendedGraphemeClusterLiteral value: StringLiteralType) {\n        self.init(value)\n    }\n\n    public init(unicodeScalarLiteral value: StringLiteralType) {\n        self.init(value)\n    }\n}\n\nextension JSON: Swift.IntegerLiteralConvertible {\n\n    public init(integerLiteral value: IntegerLiteralType) {\n        self.init(value)\n    }\n}\n\nextension JSON: Swift.BooleanLiteralConvertible {\n\n    public init(booleanLiteral value: BooleanLiteralType) {\n        self.init(value)\n    }\n}\n\nextension JSON: Swift.FloatLiteralConvertible {\n\n    public init(floatLiteral value: FloatLiteralType) {\n        self.init(value)\n    }\n}\n\nextension JSON: Swift.DictionaryLiteralConvertible {\n\n    public init(dictionaryLiteral elements: (String, AnyObject)...) {\n        self.init(elements.reduce([String : AnyObject]()){(dictionary: [String : AnyObject], element:(String, AnyObject)) -> [String : AnyObject] in\n            var d = dictionary\n            d[element.0] = element.1\n            return d\n            })\n    }\n}\n\nextension JSON: Swift.ArrayLiteralConvertible {\n\n    public init(arrayLiteral elements: AnyObject...) {\n        self.init(elements)\n    }\n}\n\nextension JSON: Swift.NilLiteralConvertible {\n\n    public init(nilLiteral: ()) {\n        self.init(NSNull())\n    }\n}\n\n// MARK: - Raw\n\nextension JSON: Swift.RawRepresentable {\n\n    public init?(rawValue: AnyObject) {\n        if JSON(rawValue).type == .Unknown {\n            return nil\n        } else {\n            self.init(rawValue)\n        }\n    }\n\n    public var rawValue: AnyObject {\n        return self.object\n    }\n\n    public func rawData(options opt: NSJSONWritingOptions = NSJSONWritingOptions(rawValue: 0)) throws -> NSData {\n        guard NSJSONSerialization.isValidJSONObject(self.object) else {\n            throw NSError(domain: ErrorDomain, code: ErrorInvalidJSON, userInfo: [NSLocalizedDescriptionKey: \"JSON is invalid\"])\n        }\n\n        return try NSJSONSerialization.dataWithJSONObject(self.object, options: opt)\n    }\n\n    public func rawString(encoding: UInt = NSUTF8StringEncoding, options opt: NSJSONWritingOptions = .PrettyPrinted) -> String? {\n        switch self.type {\n        case .Array, .Dictionary:\n            do {\n                let data = try self.rawData(options: opt)\n                return NSString(data: data, encoding: encoding) as? String\n            } catch _ {\n                return nil\n            }\n        case .String:\n            return self.rawString\n        case .Number:\n            return self.rawNumber.stringValue\n        case .Bool:\n            return self.rawNumber.boolValue.description\n        case .Null:\n            return \"null\"\n        default:\n            return nil\n        }\n    }\n}\n\n// MARK: - Printable, DebugPrintable\n\nextension JSON: Swift.Printable, Swift.DebugPrintable {\n\n    public var description: String {\n        if let string = self.rawString(options:.PrettyPrinted) {\n            return string\n        } else {\n            return \"unknown\"\n        }\n    }\n\n    public var debugDescription: String {\n        return description\n    }\n}\n\n// MARK: - Array\n\nextension JSON {\n\n    //Optional [JSON]\n    public var array: [JSON]? {\n        get {\n            if self.type == .Array {\n                return self.rawArray.map{ JSON($0) }\n            } else {\n                return nil\n            }\n        }\n    }\n\n    //Non-optional [JSON]\n    public var arrayValue: [JSON] {\n        get {\n            return self.array ?? []\n        }\n    }\n\n    //Optional [AnyObject]\n    public var arrayObject: [AnyObject]? {\n        get {\n            switch self.type {\n            case .Array:\n                return self.rawArray\n            default:\n                return nil\n            }\n        }\n        set {\n            if let array = newValue {\n                self.object = array\n            } else {\n                self.object = NSNull()\n            }\n        }\n    }\n}\n\n// MARK: - Dictionary\n\nextension JSON {\n\n    //Optional [String : JSON]\n    public var dictionary: [String : JSON]? {\n        if self.type == .Dictionary {\n            return self.rawDictionary.reduce([String : JSON]()) { (dictionary: [String : JSON], element: (String, AnyObject)) -> [String : JSON] in\n                var d = dictionary\n                d[element.0] = JSON(element.1)\n                return d\n            }\n        } else {\n            return nil\n        }\n    }\n\n    //Non-optional [String : JSON]\n    public var dictionaryValue: [String : JSON] {\n        return self.dictionary ?? [:]\n    }\n\n    //Optional [String : AnyObject]\n    public var dictionaryObject: [String : AnyObject]? {\n        get {\n            switch self.type {\n            case .Dictionary:\n                return self.rawDictionary\n            default:\n                return nil\n            }\n        }\n        set {\n            if let v = newValue {\n                self.object = v\n            } else {\n                self.object = NSNull()\n            }\n        }\n    }\n}\n\n// MARK: - Bool\n\nextension JSON: Swift.BooleanType {\n\n    //Optional bool\n    public var bool: Bool? {\n        get {\n            switch self.type {\n            case .Bool:\n                return self.rawNumber.boolValue\n            default:\n                return nil\n            }\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(bool: newValue)\n            } else {\n                self.object = NSNull()\n            }\n        }\n    }\n\n    //Non-optional bool\n    public var boolValue: Bool {\n        get {\n            switch self.type {\n            case .Bool, .Number, .String:\n                return self.object.boolValue\n            default:\n                return false\n            }\n        }\n        set {\n            self.object = NSNumber(bool: newValue)\n        }\n    }\n}\n\n// MARK: - String\n\nextension JSON {\n\n    //Optional string\n    public var string: String? {\n        get {\n            switch self.type {\n            case .String:\n                return self.object as? String\n            default:\n                return nil\n            }\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSString(string:newValue)\n            } else {\n                self.object = NSNull()\n            }\n        }\n    }\n\n    //Non-optional string\n    public var stringValue: String {\n        get {\n            switch self.type {\n            case .String:\n                return self.object as? String ?? \"\"\n            case .Number:\n                return self.object.stringValue\n            case .Bool:\n                return (self.object as? Bool).map { String($0) } ?? \"\"\n            default:\n                return \"\"\n            }\n        }\n        set {\n            self.object = NSString(string:newValue)\n        }\n    }\n}\n\n// MARK: - Number\nextension JSON {\n\n    //Optional number\n    public var number: NSNumber? {\n        get {\n            switch self.type {\n            case .Number, .Bool:\n                return self.rawNumber\n            default:\n                return nil\n            }\n        }\n        set {\n            self.object = newValue ?? NSNull()\n        }\n    }\n\n    //Non-optional number\n    public var numberValue: NSNumber {\n        get {\n            switch self.type {\n            case .String:\n                let decimal = NSDecimalNumber(string: self.object as? String)\n                if decimal == NSDecimalNumber.notANumber() {  // indicates parse error\n                    return NSDecimalNumber.zero()\n                }\n                return decimal\n            case .Number, .Bool:\n                return self.object as? NSNumber ?? NSNumber(int: 0)\n            default:\n                return NSNumber(double: 0.0)\n            }\n        }\n        set {\n            self.object = newValue\n        }\n    }\n}\n\n//MARK: - Null\nextension JSON {\n\n    public var null: NSNull? {\n        get {\n            switch self.type {\n            case .Null:\n                return self.rawNull\n            default:\n                return nil\n            }\n        }\n        set {\n            self.object = NSNull()\n        }\n    }\n    public func isExists() -> Bool{\n        if let errorValue = error where errorValue.code == ErrorNotExist{\n            return false\n        }\n        return true\n    }\n}\n\n//MARK: - URL\nextension JSON {\n\n    //Optional URL\n    public var URL: NSURL? {\n        get {\n            switch self.type {\n            case .String:\n                if let encodedString_ = self.rawString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet()) {\n                    return NSURL(string: encodedString_)\n                } else {\n                    return nil\n                }\n            default:\n                return nil\n            }\n        }\n        set {\n            self.object = newValue?.absoluteString ?? NSNull()\n        }\n    }\n}\n\n// MARK: - Int, Double, Float, Int8, Int16, Int32, Int64\n\nextension JSON {\n\n    public var double: Double? {\n        get {\n            return self.number?.doubleValue\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(double: newValue)\n            } else {\n                self.object = NSNull()\n            }\n        }\n    }\n\n    public var doubleValue: Double {\n        get {\n            return self.numberValue.doubleValue\n        }\n        set {\n            self.object = NSNumber(double: newValue)\n        }\n    }\n\n    public var float: Float? {\n        get {\n            return self.number?.floatValue\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(float: newValue)\n            } else {\n                self.object = NSNull()\n            }\n        }\n    }\n\n    public var floatValue: Float {\n        get {\n            return self.numberValue.floatValue\n        }\n        set {\n            self.object = NSNumber(float: newValue)\n        }\n    }\n\n    public var int: Int? {\n        get {\n            return self.number?.longValue\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(integer: newValue)\n            } else {\n                self.object = NSNull()\n            }\n        }\n    }\n\n    public var intValue: Int {\n        get {\n            return self.numberValue.integerValue\n        }\n        set {\n            self.object = NSNumber(integer: newValue)\n        }\n    }\n\n    public var uInt: UInt? {\n        get {\n            return self.number?.unsignedLongValue\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(unsignedLong: newValue)\n            } else {\n                self.object = NSNull()\n            }\n        }\n    }\n\n    public var uIntValue: UInt {\n        get {\n            return self.numberValue.unsignedLongValue\n        }\n        set {\n            self.object = NSNumber(unsignedLong: newValue)\n        }\n    }\n\n    public var int8: Int8? {\n        get {\n            return self.number?.charValue\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(char: newValue)\n            } else {\n                self.object =  NSNull()\n            }\n        }\n    }\n\n    public var int8Value: Int8 {\n        get {\n            return self.numberValue.charValue\n        }\n        set {\n            self.object = NSNumber(char: newValue)\n        }\n    }\n\n    public var uInt8: UInt8? {\n        get {\n            return self.number?.unsignedCharValue\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(unsignedChar: newValue)\n            } else {\n                self.object =  NSNull()\n            }\n        }\n    }\n\n    public var uInt8Value: UInt8 {\n        get {\n            return self.numberValue.unsignedCharValue\n        }\n        set {\n            self.object = NSNumber(unsignedChar: newValue)\n        }\n    }\n\n    public var int16: Int16? {\n        get {\n            return self.number?.shortValue\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(short: newValue)\n            } else {\n                self.object =  NSNull()\n            }\n        }\n    }\n\n    public var int16Value: Int16 {\n        get {\n            return self.numberValue.shortValue\n        }\n        set {\n            self.object = NSNumber(short: newValue)\n        }\n    }\n\n    public var uInt16: UInt16? {\n        get {\n            return self.number?.unsignedShortValue\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(unsignedShort: newValue)\n            } else {\n                self.object =  NSNull()\n            }\n        }\n    }\n\n    public var uInt16Value: UInt16 {\n        get {\n            return self.numberValue.unsignedShortValue\n        }\n        set {\n            self.object = NSNumber(unsignedShort: newValue)\n        }\n    }\n\n    public var int32: Int32? {\n        get {\n            return self.number?.intValue\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(int: newValue)\n            } else {\n                self.object =  NSNull()\n            }\n        }\n    }\n\n    public var int32Value: Int32 {\n        get {\n            return self.numberValue.intValue\n        }\n        set {\n            self.object = NSNumber(int: newValue)\n        }\n    }\n\n    public var uInt32: UInt32? {\n        get {\n            return self.number?.unsignedIntValue\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(unsignedInt: newValue)\n            } else {\n                self.object =  NSNull()\n            }\n        }\n    }\n\n    public var uInt32Value: UInt32 {\n        get {\n            return self.numberValue.unsignedIntValue\n        }\n        set {\n            self.object = NSNumber(unsignedInt: newValue)\n        }\n    }\n\n    public var int64: Int64? {\n        get {\n            return self.number?.longLongValue\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(longLong: newValue)\n            } else {\n                self.object =  NSNull()\n            }\n        }\n    }\n\n    public var int64Value: Int64 {\n        get {\n            return self.numberValue.longLongValue\n        }\n        set {\n            self.object = NSNumber(longLong: newValue)\n        }\n    }\n\n    public var uInt64: UInt64? {\n        get {\n            return self.number?.unsignedLongLongValue\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(unsignedLongLong: newValue)\n            } else {\n                self.object =  NSNull()\n            }\n        }\n    }\n\n    public var uInt64Value: UInt64 {\n        get {\n            return self.numberValue.unsignedLongLongValue\n        }\n        set {\n            self.object = NSNumber(unsignedLongLong: newValue)\n        }\n    }\n}\n\n//MARK: - Comparable\nextension JSON : Swift.Comparable {}\n\npublic func ==(lhs: JSON, rhs: JSON) -> Bool {\n\n    switch (lhs.type, rhs.type) {\n    case (.Number, .Number):\n        return lhs.rawNumber == rhs.rawNumber\n    case (.String, .String):\n        return lhs.rawString == rhs.rawString\n    case (.Bool, .Bool):\n        return lhs.rawNumber.boolValue == rhs.rawNumber.boolValue\n    case (.Array, .Array):\n        return lhs.rawArray as NSArray == rhs.rawArray as NSArray\n    case (.Dictionary, .Dictionary):\n        return lhs.rawDictionary as NSDictionary == rhs.rawDictionary as NSDictionary\n    case (.Null, .Null):\n        return true\n    default:\n        return false\n    }\n}\n\npublic func <=(lhs: JSON, rhs: JSON) -> Bool {\n\n    switch (lhs.type, rhs.type) {\n    case (.Number, .Number):\n        return lhs.rawNumber <= rhs.rawNumber\n    case (.String, .String):\n        return lhs.rawString <= rhs.rawString\n    case (.Bool, .Bool):\n        return lhs.rawNumber.boolValue == rhs.rawNumber.boolValue\n    case (.Array, .Array):\n        return lhs.rawArray as NSArray == rhs.rawArray as NSArray\n    case (.Dictionary, .Dictionary):\n        return lhs.rawDictionary as NSDictionary == rhs.rawDictionary as NSDictionary\n    case (.Null, .Null):\n        return true\n    default:\n        return false\n    }\n}\n\npublic func >=(lhs: JSON, rhs: JSON) -> Bool {\n\n    switch (lhs.type, rhs.type) {\n    case (.Number, .Number):\n        return lhs.rawNumber >= rhs.rawNumber\n    case (.String, .String):\n        return lhs.rawString >= rhs.rawString\n    case (.Bool, .Bool):\n        return lhs.rawNumber.boolValue == rhs.rawNumber.boolValue\n    case (.Array, .Array):\n        return lhs.rawArray as NSArray == rhs.rawArray as NSArray\n    case (.Dictionary, .Dictionary):\n        return lhs.rawDictionary as NSDictionary == rhs.rawDictionary as NSDictionary\n    case (.Null, .Null):\n        return true\n    default:\n        return false\n    }\n}\n\npublic func >(lhs: JSON, rhs: JSON) -> Bool {\n\n    switch (lhs.type, rhs.type) {\n    case (.Number, .Number):\n        return lhs.rawNumber > rhs.rawNumber\n    case (.String, .String):\n        return lhs.rawString > rhs.rawString\n    default:\n        return false\n    }\n}\n\npublic func <(lhs: JSON, rhs: JSON) -> Bool {\n\n    switch (lhs.type, rhs.type) {\n    case (.Number, .Number):\n        return lhs.rawNumber < rhs.rawNumber\n    case (.String, .String):\n        return lhs.rawString < rhs.rawString\n    default:\n        return false\n    }\n}\n\nprivate let trueNumber = NSNumber(bool: true)\nprivate let falseNumber = NSNumber(bool: false)\nprivate let trueObjCType = String.fromCString(trueNumber.objCType)\nprivate let falseObjCType = String.fromCString(falseNumber.objCType)\n\n// MARK: - NSNumber: Comparable\n\nextension NSNumber {\n    var isBool:Bool {\n        get {\n            let objCType = String.fromCString(self.objCType)\n            if (self.compare(trueNumber) == NSComparisonResult.OrderedSame && objCType == trueObjCType)\n                || (self.compare(falseNumber) == NSComparisonResult.OrderedSame && objCType == falseObjCType){\n                    return true\n            } else {\n                return false\n            }\n        }\n    }\n}\n\nfunc ==(lhs: NSNumber, rhs: NSNumber) -> Bool {\n    switch (lhs.isBool, rhs.isBool) {\n    case (false, true):\n        return false\n    case (true, false):\n        return false\n    default:\n        return lhs.compare(rhs) == NSComparisonResult.OrderedSame\n    }\n}\n\nfunc !=(lhs: NSNumber, rhs: NSNumber) -> Bool {\n    return !(lhs == rhs)\n}\n\nfunc <(lhs: NSNumber, rhs: NSNumber) -> Bool {\n\n    switch (lhs.isBool, rhs.isBool) {\n    case (false, true):\n        return false\n    case (true, false):\n        return false\n    default:\n        return lhs.compare(rhs) == NSComparisonResult.OrderedAscending\n    }\n}\n\nfunc >(lhs: NSNumber, rhs: NSNumber) -> Bool {\n\n    switch (lhs.isBool, rhs.isBool) {\n    case (false, true):\n        return false\n    case (true, false):\n        return false\n    default:\n        return lhs.compare(rhs) == NSComparisonResult.OrderedDescending\n    }\n}\n\nfunc <=(lhs: NSNumber, rhs: NSNumber) -> Bool {\n\n    switch (lhs.isBool, rhs.isBool) {\n    case (false, true):\n        return false\n    case (true, false):\n        return false\n    default:\n        return lhs.compare(rhs) != NSComparisonResult.OrderedDescending\n    }\n}\n\nfunc >=(lhs: NSNumber, rhs: NSNumber) -> Bool {\n\n    switch (lhs.isBool, rhs.isBool) {\n    case (false, true):\n        return false\n    case (true, false):\n        return false\n    default:\n        return lhs.compare(rhs) != NSComparisonResult.OrderedAscending\n    }\n}\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/AASquaresLoading/AASquaresLoading-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_AASquaresLoading : NSObject\n@end\n@implementation PodsDummy_AASquaresLoading\n@end\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/AASquaresLoading/AASquaresLoading-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#endif\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/AASquaresLoading/AASquaresLoading-umbrella.h",
    "content": "#import <UIKit/UIKit.h>\n\n\nFOUNDATION_EXPORT double AASquaresLoadingVersionNumber;\nFOUNDATION_EXPORT const unsigned char AASquaresLoadingVersionString[];\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/AASquaresLoading/AASquaresLoading.modulemap",
    "content": "framework module AASquaresLoading {\n  umbrella header \"AASquaresLoading-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/AASquaresLoading/AASquaresLoading.xcconfig",
    "content": "GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/AASquaresLoading\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/RongCloudIMKit\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_ROOT = ${SRCROOT}\nSKIP_INSTALL = YES"
  },
  {
    "path": "Sublime/Pods/Target Support Files/AASquaresLoading/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>org.cocoapods.${PRODUCT_NAME:rfc1034identifier}</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>0.3.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": "Sublime/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": "Sublime/Pods/Target Support Files/Alamofire/Alamofire-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#endif\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Alamofire/Alamofire-umbrella.h",
    "content": "#import <UIKit/UIKit.h>\n\n\nFOUNDATION_EXPORT double AlamofireVersionNumber;\nFOUNDATION_EXPORT const unsigned char AlamofireVersionString[];\n\n"
  },
  {
    "path": "Sublime/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": "Sublime/Pods/Target Support Files/Alamofire/Alamofire.xcconfig",
    "content": "GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/Alamofire\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/RongCloudIMKit\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_ROOT = ${SRCROOT}\nSKIP_INSTALL = YES"
  },
  {
    "path": "Sublime/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>org.cocoapods.${PRODUCT_NAME:rfc1034identifier}</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.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": "Sublime/Pods/Target Support Files/AlamofireRSSParser/AlamofireRSSParser-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_AlamofireRSSParser : NSObject\n@end\n@implementation PodsDummy_AlamofireRSSParser\n@end\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/AlamofireRSSParser/AlamofireRSSParser-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#endif\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/AlamofireRSSParser/AlamofireRSSParser-umbrella.h",
    "content": "#import <UIKit/UIKit.h>\n\n#import \"AlamofireRSSParser.h\"\n\nFOUNDATION_EXPORT double AlamofireRSSParserVersionNumber;\nFOUNDATION_EXPORT const unsigned char AlamofireRSSParserVersionString[];\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/AlamofireRSSParser/AlamofireRSSParser.modulemap",
    "content": "framework module AlamofireRSSParser {\n  umbrella header \"AlamofireRSSParser-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/AlamofireRSSParser/AlamofireRSSParser.xcconfig",
    "content": "GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/AlamofireRSSParser\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/RongCloudIMKit\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_ROOT = ${SRCROOT}\nSKIP_INSTALL = YES"
  },
  {
    "path": "Sublime/Pods/Target Support Files/AlamofireRSSParser/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>org.cocoapods.${PRODUCT_NAME:rfc1034identifier}</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.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": "Sublime/Pods/Target Support Files/CYRTextView/CYRTextView-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_CYRTextView : NSObject\n@end\n@implementation PodsDummy_CYRTextView\n@end\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/CYRTextView/CYRTextView-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#endif\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/CYRTextView/CYRTextView-umbrella.h",
    "content": "#import <UIKit/UIKit.h>\n\n#import \"CYRLayoutManager.h\"\n#import \"CYRTextStorage.h\"\n#import \"CYRTextView.h\"\n#import \"CYRToken.h\"\n\nFOUNDATION_EXPORT double CYRTextViewVersionNumber;\nFOUNDATION_EXPORT const unsigned char CYRTextViewVersionString[];\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/CYRTextView/CYRTextView.modulemap",
    "content": "framework module CYRTextView {\n  umbrella header \"CYRTextView-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/CYRTextView/CYRTextView.xcconfig",
    "content": "GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/CYRTextView\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/RongCloudIMKit\"\nOTHER_LDFLAGS = -framework \"CoreText\"\nPODS_ROOT = ${SRCROOT}\nSKIP_INSTALL = YES"
  },
  {
    "path": "Sublime/Pods/Target Support Files/CYRTextView/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>org.cocoapods.${PRODUCT_NAME:rfc1034identifier}</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>0.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": "Sublime/Pods/Target Support Files/Charts/Charts-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Charts : NSObject\n@end\n@implementation PodsDummy_Charts\n@end\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Charts/Charts-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#endif\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Charts/Charts-umbrella.h",
    "content": "#import <UIKit/UIKit.h>\n\n\nFOUNDATION_EXPORT double ChartsVersionNumber;\nFOUNDATION_EXPORT const unsigned char ChartsVersionString[];\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Charts/Charts.modulemap",
    "content": "framework module Charts {\n  umbrella header \"Charts-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Charts/Charts.xcconfig",
    "content": "GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/Charts\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/RongCloudIMKit\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_ROOT = ${SRCROOT}\nSKIP_INSTALL = YES"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Charts/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>org.cocoapods.${PRODUCT_NAME:rfc1034identifier}</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.2.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": "Sublime/Pods/Target Support Files/DGElasticPullToRefresh/DGElasticPullToRefresh-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_DGElasticPullToRefresh : NSObject\n@end\n@implementation PodsDummy_DGElasticPullToRefresh\n@end\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/DGElasticPullToRefresh/DGElasticPullToRefresh-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#endif\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/DGElasticPullToRefresh/DGElasticPullToRefresh-umbrella.h",
    "content": "#import <UIKit/UIKit.h>\n\n\nFOUNDATION_EXPORT double DGElasticPullToRefreshVersionNumber;\nFOUNDATION_EXPORT const unsigned char DGElasticPullToRefreshVersionString[];\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/DGElasticPullToRefresh/DGElasticPullToRefresh.modulemap",
    "content": "framework module DGElasticPullToRefresh {\n  umbrella header \"DGElasticPullToRefresh-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/DGElasticPullToRefresh/DGElasticPullToRefresh.xcconfig",
    "content": "GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/DGElasticPullToRefresh\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/RongCloudIMKit\"\nOTHER_LDFLAGS = -framework \"Foundation\" -framework \"UIKit\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_ROOT = ${SRCROOT}\nSKIP_INSTALL = YES"
  },
  {
    "path": "Sublime/Pods/Target Support Files/DGElasticPullToRefresh/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>org.cocoapods.${PRODUCT_NAME:rfc1034identifier}</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.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": "Sublime/Pods/Target Support Files/EZAudio/EZAudio-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_EZAudio : NSObject\n@end\n@implementation PodsDummy_EZAudio\n@end\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/EZAudio/EZAudio-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#endif\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/EZAudio/EZAudio-umbrella.h",
    "content": "#import <UIKit/UIKit.h>\n\n#import \"AEFloatConverter.h\"\n#import \"EZAudio.h\"\n#import \"EZAudioFile.h\"\n#import \"EZAudioPlayer.h\"\n#import \"EZAudioPlot.h\"\n#import \"EZAudioPlotGL.h\"\n#import \"EZAudioPlotGLKViewController.h\"\n#import \"EZMicrophone.h\"\n#import \"EZOutput.h\"\n#import \"EZPlot.h\"\n#import \"EZRecorder.h\"\n#import \"TPCircularBuffer.h\"\n\nFOUNDATION_EXPORT double EZAudioVersionNumber;\nFOUNDATION_EXPORT const unsigned char EZAudioVersionString[];\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/EZAudio/EZAudio.modulemap",
    "content": "framework module EZAudio {\n  umbrella header \"EZAudio-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/EZAudio/EZAudio.xcconfig",
    "content": "GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/EZAudio\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/RongCloudIMKit\"\nOTHER_LDFLAGS = -framework \"AVFoundation\" -framework \"AudioToolbox\" -framework \"GLKit\"\nPODS_ROOT = ${SRCROOT}\nSKIP_INSTALL = YES"
  },
  {
    "path": "Sublime/Pods/Target Support Files/EZAudio/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>org.cocoapods.${PRODUCT_NAME:rfc1034identifier}</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>0.0.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": "Sublime/Pods/Target Support Files/Gifu/Gifu-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Gifu : NSObject\n@end\n@implementation PodsDummy_Gifu\n@end\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Gifu/Gifu-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#endif\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Gifu/Gifu-umbrella.h",
    "content": "#import <UIKit/UIKit.h>\n\n#import \"Gifu.h\"\n\nFOUNDATION_EXPORT double GifuVersionNumber;\nFOUNDATION_EXPORT const unsigned char GifuVersionString[];\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Gifu/Gifu.modulemap",
    "content": "framework module Gifu {\n  umbrella header \"Gifu-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Gifu/Gifu.xcconfig",
    "content": "GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/Gifu\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/RongCloudIMKit\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_ROOT = ${SRCROOT}\nSKIP_INSTALL = YES"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Gifu/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>org.cocoapods.${PRODUCT_NAME:rfc1034identifier}</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.1</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": "Sublime/Pods/Target Support Files/NMSSH/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>org.cocoapods.${PRODUCT_NAME:rfc1034identifier}</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.2.5</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": "Sublime/Pods/Target Support Files/NMSSH/NMSSH-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_NMSSH : NSObject\n@end\n@implementation PodsDummy_NMSSH\n@end\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/NMSSH/NMSSH-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#endif\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/NMSSH/NMSSH-umbrella.h",
    "content": "#import <UIKit/UIKit.h>\n\n#import \"NMSFTP.h\"\n#import \"NMSFTPFile.h\"\n#import \"NMSSH.h\"\n#import \"NMSSHChannel.h\"\n#import \"NMSSHConfig.h\"\n#import \"NMSSHHostConfig.h\"\n#import \"NMSSHSession.h\"\n#import \"NMSSHChannelDelegate.h\"\n#import \"NMSSHSessionDelegate.h\"\n#import \"NMSSHLogger.h\"\n#import \"libssh2.h\"\n#import \"libssh2_publickey.h\"\n#import \"libssh2_sftp.h\"\n#import \"NMSSH.h\"\n\nFOUNDATION_EXPORT double NMSSHVersionNumber;\nFOUNDATION_EXPORT const unsigned char NMSSHVersionString[];\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/NMSSH/NMSSH.modulemap",
    "content": "framework module NMSSH {\n  umbrella header \"NMSSH-umbrella.h\"\n\n  export *\n  module * { export * }\n\n  private header \"NMSSH+Protected.h\"\n  private header \"socket_helper.h\"\n}\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/NMSSH/NMSSH.xcconfig",
    "content": "GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/NMSSH\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/RongCloudIMKit\"\nLIBRARY_SEARCH_PATHS = $(inherited) \"${PODS_ROOT}/NMSSH/NMSSH-iOS/Libraries/lib\" $(inherited) \"${PODS_ROOT}/NMSSH/NMSSH-iOS/Libraries/lib\" $(inherited) \"${PODS_ROOT}/NMSSH/NMSSH-iOS/Libraries/lib\"\nOTHER_LDFLAGS = -ObjC -l\"crypto\" -l\"ssh2\" -l\"ssl\" -l\"z\" -framework \"CFNetwork\"\nPODS_ROOT = ${SRCROOT}\nSKIP_INSTALL = YES"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Pods/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>org.cocoapods.${PRODUCT_NAME:rfc1034identifier}</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": "Sublime/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown",
    "content": "# Acknowledgements\nThis application makes use of the following third party libraries:\n\n## AASquaresLoading\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Anas AIT ALI\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n\n## Alamofire\n\nCopyright (c) 2014–2016 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## AlamofireRSSParser\n\nCopyright (c) 2016 Don Angelillo <dangelillo@gmail.com>\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## CYRTextView\n\nThe MIT License (MIT)\n\nCopyright (c) 2014 Cyrillian, Inc.\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 of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject 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, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n## Charts\n\nApache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright {yyyy} {name of copyright owner}\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n\n\n## DGElasticPullToRefresh\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Danil Gontovnik\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n\n## EZAudio\n\nThe MIT License (MIT)\n\nEZAudio\nCopyright (c) 2013 Syed Haris Ali\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 of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject 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, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n## Gifu\n\nThe MIT License (MIT)\n\nCopyright (c) 2014 Kaishin & Co.\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 of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject 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, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nThe name and characters used in the demo of this software are property of their\nrespective owners.\n\n\n\n## NMSSH\n\nCopyright (c) 2013 Nine Muses AB\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## RongCloudIMKit\n\nCopyright 2014 Rong Cloud\n\n## SJCSimplePDFView\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Stuart Crook\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n\n## SSZipArchive\n\nCopyright (c) 2010-2015, Sam Soffes, http://soff.es\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n## Swifter\n\nCopyright (c) 2014, Damian Kołakowski\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\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* 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\n* Neither the name of the {organization} nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n## SwiftyJSON\n\nThe MIT License (MIT)\n\nCopyright (c) 2014 Ruoyu Fu\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## ZLMusicFlowWaveView\n\nThe MIT License (MIT)\n\nCopyright (c) 2014 Zhixuan Lai\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n\n## ZLSinusWaveView\n\nCopyright (c) 2013 Raffael Hannemann \nCopyright (c) 2014, Zhixuan Lai\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\nGenerated by CocoaPods - http://cocoapods.org\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Pods/Pods-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 (MIT)\n\nCopyright (c) 2015 Anas AIT ALI\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>AASquaresLoading</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&#8211;2016 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>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) 2016 Don Angelillo &lt;dangelillo@gmail.com&gt;\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>Title</key>\n\t\t\t<string>AlamofireRSSParser</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 (MIT)\n\nCopyright (c) 2014 Cyrillian, Inc.\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 of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject 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, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>CYRTextView</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>Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright {yyyy} {name of copyright owner}\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Charts</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 (MIT)\n\nCopyright (c) 2015 Danil Gontovnik\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>DGElasticPullToRefresh</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 (MIT)\n\nEZAudio\nCopyright (c) 2013 Syed Haris Ali\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 of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject 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, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>EZAudio</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 (MIT)\n\nCopyright (c) 2014 Kaishin &amp; Co.\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 of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject 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, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nThe name and characters used in the demo of this software are property of their\nrespective owners.\n\n</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Gifu</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) 2013 Nine Muses AB\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>Title</key>\n\t\t\t<string>NMSSH</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 2014 Rong Cloud</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>RongCloudIMKit</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 (MIT)\n\nCopyright (c) 2015 Stuart Crook\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>SJCSimplePDFView</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) 2010-2015, Sam Soffes, http://soff.es\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>SSZipArchive</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, Damian Ko&#322;akowski\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\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* 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\n* Neither the name of the {organization} nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Swifter</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 (MIT)\n\nCopyright (c) 2014 Ruoyu Fu\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>Title</key>\n\t\t\t<string>SwiftyJSON</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 (MIT)\n\nCopyright (c) 2014 Zhixuan Lai\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>ZLMusicFlowWaveView</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) 2013 Raffael Hannemann \nCopyright (c) 2014, Zhixuan Lai\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>ZLSinusWaveView</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 - http://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": "Sublime/Pods/Target Support Files/Pods/Pods-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods : NSObject\n@end\n@implementation PodsDummy_Pods\n@end\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Pods/Pods-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\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=\"${CONFIGURATION_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 dont' throw errors\n  echo \"rsync -av --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${source}\\\" \\\"${destination}\\\"\"\n  rsync -av --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# 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    echo \"/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \\\"$1\\\"\"\n    /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \"$1\"\n  fi\n}\n\n# Strip invalid architectures\nstrip_invalid_archs() {\n  binary=\"$1\"\n  # Get architectures for current file\n  archs=\"$(lipo -info \"$binary\" | rev | cut -d ':' -f1 | rev)\"\n  stripped=\"\"\n  for arch in $archs; do\n    if ! [[ \"${VALID_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}\n\n\nif [[ \"$CONFIGURATION\" == \"Debug\" ]]; then\n  install_framework \"Pods/AASquaresLoading.framework\"\n  install_framework \"Pods/Alamofire.framework\"\n  install_framework \"Pods/AlamofireRSSParser.framework\"\n  install_framework \"Pods/CYRTextView.framework\"\n  install_framework \"Pods/Charts.framework\"\n  install_framework \"Pods/DGElasticPullToRefresh.framework\"\n  install_framework \"Pods/EZAudio.framework\"\n  install_framework \"Pods/Gifu.framework\"\n  install_framework \"Pods/NMSSH.framework\"\n  install_framework \"Pods/SJCSimplePDFView.framework\"\n  install_framework \"Pods/SSZipArchive.framework\"\n  install_framework \"Pods/Swifter.framework\"\n  install_framework \"Pods/SwiftyJSON.framework\"\n  install_framework \"Pods/ZLMusicFlowWaveView.framework\"\n  install_framework \"Pods/ZLSinusWaveView.framework\"\nfi\nif [[ \"$CONFIGURATION\" == \"Release\" ]]; then\n  install_framework \"Pods/AASquaresLoading.framework\"\n  install_framework \"Pods/Alamofire.framework\"\n  install_framework \"Pods/AlamofireRSSParser.framework\"\n  install_framework \"Pods/CYRTextView.framework\"\n  install_framework \"Pods/Charts.framework\"\n  install_framework \"Pods/DGElasticPullToRefresh.framework\"\n  install_framework \"Pods/EZAudio.framework\"\n  install_framework \"Pods/Gifu.framework\"\n  install_framework \"Pods/NMSSH.framework\"\n  install_framework \"Pods/SJCSimplePDFView.framework\"\n  install_framework \"Pods/SSZipArchive.framework\"\n  install_framework \"Pods/Swifter.framework\"\n  install_framework \"Pods/SwiftyJSON.framework\"\n  install_framework \"Pods/ZLMusicFlowWaveView.framework\"\n  install_framework \"Pods/ZLSinusWaveView.framework\"\nfi\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Pods/Pods-resources.sh",
    "content": "#!/bin/sh\nset -e\n\nmkdir -p \"${CONFIGURATION_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\nrealpath() {\n  DIRECTORY=\"$(cd \"${1%/*}\" && pwd)\"\n  FILENAME=\"${1##*/}\"\n  echo \"$DIRECTORY/$FILENAME\"\n}\n\ninstall_resource()\n{\n  case $1 in\n    *.storyboard)\n      echo \"ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$1\\\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}\"\n      ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$1\\\" .storyboard`.storyboardc\" \"${PODS_ROOT}/$1\" --sdk \"${SDKROOT}\"\n      ;;\n    *.xib)\n      echo \"ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$1\\\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}\"\n      ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$1\\\" .xib`.nib\" \"${PODS_ROOT}/$1\" --sdk \"${SDKROOT}\"\n      ;;\n    *.framework)\n      echo \"mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      mkdir -p \"${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      echo \"rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      rsync -av \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      ;;\n    *.xcdatamodel)\n      echo \"xcrun momc \\\"${PODS_ROOT}/$1\\\" \\\"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\"`.mom\\\"\"\n      xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xcdatamodel`.mom\"\n      ;;\n    *.xcdatamodeld)\n      echo \"xcrun momc \\\"${PODS_ROOT}/$1\\\" \\\"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xcdatamodeld`.momd\\\"\"\n      xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xcdatamodeld`.momd\"\n      ;;\n    *.xcmappingmodel)\n      echo \"xcrun mapc \\\"${PODS_ROOT}/$1\\\" \\\"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xcmappingmodel`.cdm\\\"\"\n      xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xcmappingmodel`.cdm\"\n      ;;\n    *.xcassets)\n      ABSOLUTE_XCASSET_FILE=$(realpath \"${PODS_ROOT}/$1\")\n      XCASSET_FILES+=(\"$ABSOLUTE_XCASSET_FILE\")\n      ;;\n    /*)\n      echo \"$1\"\n      echo \"$1\" >> \"$RESOURCES_TO_COPY\"\n      ;;\n    *)\n      echo \"${PODS_ROOT}/$1\"\n      echo \"${PODS_ROOT}/$1\" >> \"$RESOURCES_TO_COPY\"\n      ;;\n  esac\n}\nif [[ \"$CONFIGURATION\" == \"Debug\" ]]; then\n  install_resource \"RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongCloud.bundle\"\n  install_resource \"RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/en.lproj\"\n  install_resource \"RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/zh-Hans.lproj\"\n  install_resource \"RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/Emoji.plist\"\nfi\nif [[ \"$CONFIGURATION\" == \"Release\" ]]; then\n  install_resource \"RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/RongCloud.bundle\"\n  install_resource \"RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/en.lproj\"\n  install_resource \"RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/zh-Hans.lproj\"\n  install_resource \"RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev/Emoji.plist\"\nfi\n\nmkdir -p \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nrsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from=\"$RESOURCES_TO_COPY\" / \"${CONFIGURATION_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  case \"${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    *)\n      TARGET_DEVICE_ARGS=\"--target-device mac\"\n      ;;\n  esac\n\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 != \"`realpath $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 \"${IPHONEOS_DEPLOYMENT_TARGET}\" ${TARGET_DEVICE_ARGS} --compress-pngs --compile \"${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nfi\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Pods/Pods-umbrella.h",
    "content": "#import <UIKit/UIKit.h>\n\n\nFOUNDATION_EXPORT double PodsVersionNumber;\nFOUNDATION_EXPORT const unsigned char PodsVersionString[];\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Pods/Pods.debug.xcconfig",
    "content": "EMBEDDED_CONTENT_CONTAINS_SWIFT = YES\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_ROOT}/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev\" \"${PODS_ROOT}/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = $(inherited) \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/RongCloudIMKit\"\nLD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'\nLIBRARY_SEARCH_PATHS = $(inherited) \"${PODS_ROOT}/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev\"\nOTHER_CFLAGS = $(inherited) -iquote \"$CONFIGURATION_BUILD_DIR/AASquaresLoading.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/Alamofire.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/AlamofireRSSParser.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/CYRTextView.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/Charts.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/DGElasticPullToRefresh.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/EZAudio.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/Gifu.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/NMSSH.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/SJCSimplePDFView.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/SSZipArchive.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/Swifter.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/SwiftyJSON.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/ZLMusicFlowWaveView.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/ZLSinusWaveView.framework/Headers\" -isystem \"${PODS_ROOT}/Headers/Public\" -isystem \"${PODS_ROOT}/Headers/Public/RongCloudIMKit\"\nOTHER_LDFLAGS = $(inherited) -ObjC -l\"c++\" -l\"c++abi\" -l\"opencore-amrnb\" -l\"sqlite3\" -l\"stdc++\" -l\"xml2\" -l\"z\" -framework \"AASquaresLoading\" -framework \"AVFoundation\" -framework \"Alamofire\" -framework \"AlamofireRSSParser\" -framework \"AssetsLibrary\" -framework \"AudioToolbox\" -framework \"CFNetwork\" -framework \"CYRTextView\" -framework \"Charts\" -framework \"CoreAudio\" -framework \"CoreGraphics\" -framework \"CoreLocation\" -framework \"CoreMedia\" -framework \"CoreTelephony\" -framework \"CoreVideo\" -framework \"DGElasticPullToRefresh\" -framework \"EZAudio\" -framework \"Gifu\" -framework \"ImageIO\" -framework \"MapKit\" -framework \"NMSSH\" -framework \"OpenGLES\" -framework \"QuartzCore\" -framework \"RongIMKit\" -framework \"RongIMLib\" -framework \"SJCSimplePDFView\" -framework \"SSZipArchive\" -framework \"Swifter\" -framework \"SwiftyJSON\" -framework \"SystemConfiguration\" -framework \"UIKit\" -framework \"ZLMusicFlowWaveView\" -framework \"ZLSinusWaveView\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods\nPODS_ROOT = ${SRCROOT}/Pods"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Pods/Pods.modulemap",
    "content": "framework module Pods {\n  umbrella header \"Pods-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Pods/Pods.release.xcconfig",
    "content": "EMBEDDED_CONTENT_CONTAINS_SWIFT = YES\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_ROOT}/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev\" \"${PODS_ROOT}/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = $(inherited) \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/RongCloudIMKit\"\nLD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'\nLIBRARY_SEARCH_PATHS = $(inherited) \"${PODS_ROOT}/RongCloudIMKit/Rong_Cloud_iOS_IMKit_SDK_v2_4_9_dev\"\nOTHER_CFLAGS = $(inherited) -iquote \"$CONFIGURATION_BUILD_DIR/AASquaresLoading.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/Alamofire.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/AlamofireRSSParser.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/CYRTextView.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/Charts.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/DGElasticPullToRefresh.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/EZAudio.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/Gifu.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/NMSSH.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/SJCSimplePDFView.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/SSZipArchive.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/Swifter.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/SwiftyJSON.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/ZLMusicFlowWaveView.framework/Headers\" -iquote \"$CONFIGURATION_BUILD_DIR/ZLSinusWaveView.framework/Headers\" -isystem \"${PODS_ROOT}/Headers/Public\" -isystem \"${PODS_ROOT}/Headers/Public/RongCloudIMKit\"\nOTHER_LDFLAGS = $(inherited) -ObjC -l\"c++\" -l\"c++abi\" -l\"opencore-amrnb\" -l\"sqlite3\" -l\"stdc++\" -l\"xml2\" -l\"z\" -framework \"AASquaresLoading\" -framework \"AVFoundation\" -framework \"Alamofire\" -framework \"AlamofireRSSParser\" -framework \"AssetsLibrary\" -framework \"AudioToolbox\" -framework \"CFNetwork\" -framework \"CYRTextView\" -framework \"Charts\" -framework \"CoreAudio\" -framework \"CoreGraphics\" -framework \"CoreLocation\" -framework \"CoreMedia\" -framework \"CoreTelephony\" -framework \"CoreVideo\" -framework \"DGElasticPullToRefresh\" -framework \"EZAudio\" -framework \"Gifu\" -framework \"ImageIO\" -framework \"MapKit\" -framework \"NMSSH\" -framework \"OpenGLES\" -framework \"QuartzCore\" -framework \"RongIMKit\" -framework \"RongIMLib\" -framework \"SJCSimplePDFView\" -framework \"SSZipArchive\" -framework \"Swifter\" -framework \"SwiftyJSON\" -framework \"SystemConfiguration\" -framework \"UIKit\" -framework \"ZLMusicFlowWaveView\" -framework \"ZLSinusWaveView\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods\nPODS_ROOT = ${SRCROOT}/Pods"
  },
  {
    "path": "Sublime/Pods/Target Support Files/SJCSimplePDFView/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>org.cocoapods.${PRODUCT_NAME:rfc1034identifier}</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": "Sublime/Pods/Target Support Files/SJCSimplePDFView/SJCSimplePDFView-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_SJCSimplePDFView : NSObject\n@end\n@implementation PodsDummy_SJCSimplePDFView\n@end\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/SJCSimplePDFView/SJCSimplePDFView-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#endif\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/SJCSimplePDFView/SJCSimplePDFView-umbrella.h",
    "content": "#import <UIKit/UIKit.h>\n\n#import \"SJCSimplePDFView.h\"\n\nFOUNDATION_EXPORT double SJCSimplePDFViewVersionNumber;\nFOUNDATION_EXPORT const unsigned char SJCSimplePDFViewVersionString[];\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/SJCSimplePDFView/SJCSimplePDFView.modulemap",
    "content": "framework module SJCSimplePDFView {\n  umbrella header \"SJCSimplePDFView-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/SJCSimplePDFView/SJCSimplePDFView.xcconfig",
    "content": "GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/SJCSimplePDFView\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/RongCloudIMKit\"\nOTHER_LDFLAGS = -framework \"UIKit\"\nPODS_ROOT = ${SRCROOT}\nSKIP_INSTALL = YES"
  },
  {
    "path": "Sublime/Pods/Target Support Files/SSZipArchive/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>org.cocoapods.${PRODUCT_NAME:rfc1034identifier}</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.1</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": "Sublime/Pods/Target Support Files/SSZipArchive/SSZipArchive-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_SSZipArchive : NSObject\n@end\n@implementation PodsDummy_SSZipArchive\n@end\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/SSZipArchive/SSZipArchive-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#endif\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/SSZipArchive/SSZipArchive-umbrella.h",
    "content": "#import <UIKit/UIKit.h>\n\n#import \"Common.h\"\n#import \"SSZipArchive.h\"\n#import \"ZipArchive.h\"\n\nFOUNDATION_EXPORT double SSZipArchiveVersionNumber;\nFOUNDATION_EXPORT const unsigned char SSZipArchiveVersionString[];\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/SSZipArchive/SSZipArchive.modulemap",
    "content": "framework module SSZipArchive {\n  umbrella header \"SSZipArchive-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/SSZipArchive/SSZipArchive.xcconfig",
    "content": "GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/SSZipArchive\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/RongCloudIMKit\"\nOTHER_LDFLAGS = -l\"z\"\nPODS_ROOT = ${SRCROOT}\nSKIP_INSTALL = YES"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Swifter/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>org.cocoapods.${PRODUCT_NAME:rfc1034identifier}</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.1.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": "Sublime/Pods/Target Support Files/Swifter/Swifter-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Swifter : NSObject\n@end\n@implementation PodsDummy_Swifter\n@end\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Swifter/Swifter-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#endif\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Swifter/Swifter-umbrella.h",
    "content": "#import <UIKit/UIKit.h>\n\n\nFOUNDATION_EXPORT double SwifterVersionNumber;\nFOUNDATION_EXPORT const unsigned char SwifterVersionString[];\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Swifter/Swifter.modulemap",
    "content": "framework module Swifter {\n  umbrella header \"Swifter-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/Swifter/Swifter.xcconfig",
    "content": "GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/Swifter\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/RongCloudIMKit\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_ROOT = ${SRCROOT}\nSKIP_INSTALL = YES"
  },
  {
    "path": "Sublime/Pods/Target Support Files/SwiftyJSON/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>org.cocoapods.${PRODUCT_NAME:rfc1034identifier}</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.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": "Sublime/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_SwiftyJSON : NSObject\n@end\n@implementation PodsDummy_SwiftyJSON\n@end\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#endif\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-umbrella.h",
    "content": "#import <UIKit/UIKit.h>\n\n\nFOUNDATION_EXPORT double SwiftyJSONVersionNumber;\nFOUNDATION_EXPORT const unsigned char SwiftyJSONVersionString[];\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/SwiftyJSON/SwiftyJSON.modulemap",
    "content": "framework module SwiftyJSON {\n  umbrella header \"SwiftyJSON-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/SwiftyJSON/SwiftyJSON.xcconfig",
    "content": "GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/SwiftyJSON\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/RongCloudIMKit\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_ROOT = ${SRCROOT}\nSKIP_INSTALL = YES"
  },
  {
    "path": "Sublime/Pods/Target Support Files/ZLMusicFlowWaveView/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>org.cocoapods.${PRODUCT_NAME:rfc1034identifier}</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>0.0.1</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": "Sublime/Pods/Target Support Files/ZLMusicFlowWaveView/ZLMusicFlowWaveView-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_ZLMusicFlowWaveView : NSObject\n@end\n@implementation PodsDummy_ZLMusicFlowWaveView\n@end\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/ZLMusicFlowWaveView/ZLMusicFlowWaveView-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#endif\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/ZLMusicFlowWaveView/ZLMusicFlowWaveView-umbrella.h",
    "content": "#import <UIKit/UIKit.h>\n\n#import \"ZLMusicFlowDecorativeView.h\"\n#import \"ZLMusicFlowWaveView.h\"\n\nFOUNDATION_EXPORT double ZLMusicFlowWaveViewVersionNumber;\nFOUNDATION_EXPORT const unsigned char ZLMusicFlowWaveViewVersionString[];\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/ZLMusicFlowWaveView/ZLMusicFlowWaveView.modulemap",
    "content": "framework module ZLMusicFlowWaveView {\n  umbrella header \"ZLMusicFlowWaveView-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/ZLMusicFlowWaveView/ZLMusicFlowWaveView.xcconfig",
    "content": "GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/ZLMusicFlowWaveView\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/RongCloudIMKit\"\nPODS_ROOT = ${SRCROOT}\nSKIP_INSTALL = YES"
  },
  {
    "path": "Sublime/Pods/Target Support Files/ZLSinusWaveView/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>org.cocoapods.${PRODUCT_NAME:rfc1034identifier}</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>0.0.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": "Sublime/Pods/Target Support Files/ZLSinusWaveView/ZLSinusWaveView-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_ZLSinusWaveView : NSObject\n@end\n@implementation PodsDummy_ZLSinusWaveView\n@end\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/ZLSinusWaveView/ZLSinusWaveView-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#endif\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/ZLSinusWaveView/ZLSinusWaveView-umbrella.h",
    "content": "#import <UIKit/UIKit.h>\n\n#import \"ZLSinusWaveView.h\"\n\nFOUNDATION_EXPORT double ZLSinusWaveViewVersionNumber;\nFOUNDATION_EXPORT const unsigned char ZLSinusWaveViewVersionString[];\n\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/ZLSinusWaveView/ZLSinusWaveView.modulemap",
    "content": "framework module ZLSinusWaveView {\n  umbrella header \"ZLSinusWaveView-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Sublime/Pods/Target Support Files/ZLSinusWaveView/ZLSinusWaveView.xcconfig",
    "content": "GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/ZLSinusWaveView\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/RongCloudIMKit\"\nPODS_ROOT = ${SRCROOT}\nSKIP_INSTALL = YES"
  },
  {
    "path": "Sublime/Pods/ZLMusicFlowWaveView/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Zhixuan Lai\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "Sublime/Pods/ZLMusicFlowWaveView/README.md",
    "content": "ZLMusicFlowWaveView\n===================\n\nA [ZLSinusWaveView](https://github.com/zhxnlai/ZLSinusWaveView) subclass inspired by [乐流/MusicFlow](https://itunes.apple.com/us/app/le-liu/id848206791?mt=8)\n\nPreview\n---\n![preview](Previews/preview.gif)\n\nCocoaPods\n---\nYou can install `ZLMusicFlowWaveView` through CocoaPods adding the following to your Podfile:\n\n    pod 'ZLMusicFlowWaveView'\n\nUsage\n---\nCheck out the [demo app](https://github.com/zhxnlai/ZLMusicFlowWaveView/tree/master/ZLMusicFlowWaveViewDemo) for an example.\n\nDependencies\n---\nZLMusicFlowWaveView is a subclass of `ZLSinusWaveView`. It requires [ZLSinusWaveView](https://github.com/zhxnlai/ZLSinusWaveView) and [EZAudio](https://github.com/syedhali/EZAudio).\n\nLicense\n---\nZLMusicFlowWaveView is available under the MIT license.\n"
  },
  {
    "path": "Sublime/Pods/ZLMusicFlowWaveView/ZLMusicFlowWaveView/ZLMusicFlowDecorativeView.h",
    "content": "//\n//  ZLMusicFlowDecorativeView.h\n//  ZLMusicFlowWaveViewDemo\n//\n//  Created by Zhixuan Lai on 11/17/14.\n//  Copyright (c) 2014 Zhixuan Lai. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface ZLMusicFlowDecorativeView : UIView\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/ZLMusicFlowWaveView/ZLMusicFlowWaveView/ZLMusicFlowDecorativeView.m",
    "content": "//\n//  ZLMusicFlowDecorativeView.m\n//  ZLMusicFlowWaveViewDemo\n//\n//  Created by Zhixuan Lai on 11/17/14.\n//  Copyright (c) 2014 Zhixuan Lai. All rights reserved.\n//\n\n#import \"ZLMusicFlowDecorativeView.h\"\n\n@implementation ZLMusicFlowDecorativeView\n- (instancetype)initWithFrame:(CGRect)frame {\n    self = [super initWithFrame:frame];\n    if (self) {\n        self.backgroundColor = [UIColor clearColor];\n        self.layer.shadowRadius = 5;\n        self.layer.shadowOffset = CGSizeMake(5, 5);\n        \n    }\n    return self;\n}\n- (void)drawRect:(CGRect)rect {\n    [super drawRect:rect];\n    \n    CGContextRef context = UIGraphicsGetCurrentContext();\n    \n    UIColor* color = [UIColor colorWithRed: 1.0 green: 1.0 blue: 1.0 alpha: 1];\n    UIBezierPath* ovalPath = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(0, 0, CGRectGetWidth(rect), CGRectGetHeight(rect))];\n    CGContextSaveGState(context);\n    [color setFill];\n    [ovalPath fill];\n    CGContextRestoreGState(context);\n}\n@end\n"
  },
  {
    "path": "Sublime/Pods/ZLMusicFlowWaveView/ZLMusicFlowWaveView/ZLMusicFlowWaveView.h",
    "content": "//\n//  ZLMusicFlowWaveView.h\n//  ZLMusicFlowWaveViewDemo\n//\n//  Created by Zhixuan Lai on 11/17/14.\n//  Copyright (c) 2014 Zhixuan Lai. All rights reserved.\n//\n\n#import <ZLSinusWaveView/ZLSinusWaveView.h>\n\n@interface ZLMusicFlowWaveView : ZLSinusWaveView\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/ZLMusicFlowWaveView/ZLMusicFlowWaveView/ZLMusicFlowWaveView.m",
    "content": "//\n//  ZLMusicFlowWaveView.m\n//  ZLMusicFlowWaveViewDemo\n//\n//  Created by Zhixuan Lai on 11/17/14.\n//  Copyright (c) 2014 Zhixuan Lai. All rights reserved.\n//\n\n#import \"ZLMusicFlowWaveView.h\"\n#import \"ZLMusicFlowDecorativeView.h\"\n\n@implementation ZLMusicFlowWaveView\n- (instancetype)init {\n    self = [super init];\n    if (self) {\n        [self Setup];\n    }\n    return self;\n}\n- (instancetype)initWithFrame:(CGRect)frame {\n    self = [super initWithFrame:frame];\n    if (self) {\n        [self Setup];\n    }\n    return self;\n}\n\n- (instancetype)initWithCoder:(NSCoder *)aDecoder {\n    self = [super initWithCoder:aDecoder];\n    if (self) {\n        [self Setup];\n    }\n    return self;\n}\n\n- (void)Setup {\n    self.backgroundColor = [UIColor colorWithRed:0.937 green:0.933 blue:0.914 alpha:1.000];\n    // Waveform color\n    self.color           = [UIColor colorWithRed:0.165 green:0.043 blue:0.000 alpha:1.000];\n    // Plot type\n    self.plotType        = EZPlotTypeBuffer;\n    // Fill\n    self.shouldFill      = YES;\n    // Mirror\n    self.shouldMirror    = YES;\n    \n    self.dampingFactor = 0.97;\n    self.phaseShift = -0.25;\n    self.waveWidth = 3;\n    self.waveInsets = UIEdgeInsetsMake(250, 60, 250, 60);\n\n    CGFloat decorativeViewWidth = 20;\n    self.leftDecorativeView = [[ZLMusicFlowDecorativeView alloc] initWithFrame:CGRectMake(0, 0, decorativeViewWidth, decorativeViewWidth)];\n    self.rightDecorativeView = [[ZLMusicFlowDecorativeView alloc] initWithFrame:CGRectMake(0, 0, decorativeViewWidth, decorativeViewWidth)];\n}\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/ZLSinusWaveView/LICENSE",
    "content": "Copyright (c) 2013 Raffael Hannemann \nCopyright (c) 2014, Zhixuan Lai\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "Sublime/Pods/ZLSinusWaveView/README.md",
    "content": "ZLSinusWaveView\n===============\n\nA Siri like voice visualization view using EZAudio. Modified from [SISinusWaveView](https://github.com/raffael/SISinusWaveView) for iOS.\n\nPreview\n---\n![preview](Previews/preview.gif)\n\n![SISinusWaveView](Previews/waveform.gif)\n\nCocoaPods\n---\nYou can install `ZLSinusWaveView` through CocoaPods adding the following to your Podfile:\n\n    pod 'ZLSinusWaveView'\n\nUsage\n---\nCheck out the [demo app](https://github.com/zhxnlai/ZLSinusWaveView/tree/master/EZAudioPlayFileExample) for an example.\n\nDependencies\n---\nZLSinusWaveView is a subclass of `EZAudioPlot`. It requires [EZAudio](https://github.com/syedhali/EZAudio).\n\nLicense\n---\nZLSinusWaveView is available under the BSD license.\n\n- Copyright (c) 2014, Zhixuan Lai\n- Copyright (c) 2013 Raffael Hannemann \n- All rights reserved.\n"
  },
  {
    "path": "Sublime/Pods/ZLSinusWaveView/ZLSinusWaveView/ZLSinusWaveView.h",
    "content": "//\n//  SIAudioPlot.h\n//  EZAudioRecordExample\n//\n//  Created by Zhixuan Lai on 8/2/14.\n//  Copyright (c) 2014 Syed Haris Ali. All rights reserved.\n//\n\n#import \"EZAudio/EZAudioPlot.h\"\n\n@interface ZLSinusWaveView : EZAudioPlot\n\n/// The amplitude that is used when the incoming microphone amplitude is near zero. Setting a value greater 0 provides a more vivid visualization.\n@property (assign,nonatomic) float idleAmplitude;\n\n/// The phase of the sinus wave. Default: 0.\n@property (assign,nonatomic) float phase;\n\n/// The frequency of the sinus wave. The higher the value, the more sinus wave peaks you will have. Default: 1.5\n@property (assign,nonatomic) float frequency;\n\n/// The damping factor that is used to calm the wave down after a sound level peak. Default: 0.86\n@property (assign,nonatomic) float dampingFactor;\n\n/// The number of additional waves in the background. The more waves, to more CPU power is needed. Default: 4.\n@property (assign,nonatomic) float waves;\n\n/// The stroke width of the first wave.\n@property (assign,nonatomic) float waveWidth;\n\n/// The actual amplitude the view is visualizing. This amplitude is based on the microphone's amplitude\n@property (assign,nonatomic,readonly) float amplitude;\n\n/// The damped amplitude.\n@property (assign,nonatomic,readonly) float dampingAmplitude;\n\n/// The lines are joined stepwise, the more dense you draw, the more CPU power is used. Default: 5.\n@property (assign,nonatomic) float density;\n\n/// The phase shift that will be applied with each delivering of the microphone's value. A higher value will make the waves look more nervous. Default: -0.15.\n@property (assign,nonatomic) float phaseShift;\n\n/// The white value of the color to draw the waves with. Default: 1.0 (white).\n@property (assign,nonatomic) float whiteValue;\n\n/// Set to NO, if you want to stop the view to oscillate.\n@property (assign,nonatomic) BOOL oscillating;\n\n/// The maximum amplitude of the waveform in percent of the view height. Default: 0.5 (half).\n@property (assign,nonatomic) float maxAmplitude;\n\n/// The wave inset for each edge.\n@property (assign,nonatomic) UIEdgeInsets waveInsets;\n\n/// The decoritive views to be placed at the left end of the wave.\n@property (strong, nonatomic) UIView *leftDecorativeView;\n\n/// The decoritive views to be placed at the right end of the wave.\n@property (strong, nonatomic) UIView *rightDecorativeView;\n\n@end\n"
  },
  {
    "path": "Sublime/Pods/ZLSinusWaveView/ZLSinusWaveView/ZLSinusWaveView.m",
    "content": "//\n//  SIAudioPlot.m\n//  EZAudioRecordExample\n//\n//  Created by Zhixuan Lai on 8/2/14.\n//  Copyright (c) 2014 Syed Haris Ali. All rights reserved.\n//\n\n#import \"ZLSinusWaveView.h\"\n\n@interface ZLSinusWaveView() {\n    int tick;\n}\n@end\n\n@implementation ZLSinusWaveView\n\n@synthesize backgroundColor = _backgroundColor;\n@synthesize color           = _color;\n@synthesize gain            = _gain;\n@synthesize plotType        = _plotType;\n@synthesize shouldFill      = _shouldFill;\n@synthesize shouldMirror    = _shouldMirror;\n\n- (id)initWithFrame:(CGRect)frame\n{\n    self = [super initWithFrame:frame];\n    if (self) {\n        [self setup];\n    }\n    return self;\n}\n\n- (id)initWithCoder:(NSCoder *)aDecoder {\n    self = [super initWithCoder:aDecoder];\n    if (self) {\n        [self setup];\n    }\n    return self;\n}\n\n-(void)setup {\n    _frequency = 1.5;\n    _phase = 0;\n    _amplitude = 1.0;\n    _whiteValue = 1.0;\n    _idleAmplitude = 0.1;\n    _dampingFactor = 0.86;\n    _waves = 5;\n    _waveWidth = 2;\n    _phaseShift = -0.15;\n    _density = 5.0;\n    _maxAmplitude = 0.5;\n    _waveInsets = UIEdgeInsetsZero;\n}\n\n-(void)_refreshDisplay {\n#if TARGET_OS_IPHONE\n    [self setNeedsDisplay];\n#elif TARGET_OS_MAC\n    [self setNeedsDisplay:YES];\n#endif\n}\n\n- (void)setLeftDecorativeView:(UIView *)leftDecorativeView {\n    if (leftDecorativeView) {\n        [self addSubview:leftDecorativeView];\n    } else {\n        [leftDecorativeView removeFromSuperview];\n    }\n    _leftDecorativeView = leftDecorativeView;\n    [self setNeedsLayout];\n}\n\n- (void)setRightDecorativeView:(UIView *)rightDecorativeView {\n    if (rightDecorativeView) {\n        [self addSubview:rightDecorativeView];\n    } else {\n        [rightDecorativeView removeFromSuperview];\n    }\n    _rightDecorativeView = rightDecorativeView;\n    [self setNeedsLayout];\n}\n\n-(void)setSampleData:(float *)data\n              length:(int)length {\n    \n    int requiredTickes = 1; // Alter this to draw more or less often\n    tick = (tick+1)%requiredTickes;\n    \n    // Let's use the buffer's first float value to determine the current sound level.\n    float value = fabsf(data[0]);\n    \n    /// If we defined the current sound level as the amplitude of the wave, the wave would jitter very nervously.\n    /// To avoid this, we use an inert amplitude that lifts slowly if the value is currently high, and damps itself\n    /// if the value decreases.\n    if (value > _dampingAmplitude) _dampingAmplitude += (fmin(value,1.0)-_dampingAmplitude)/4.0;\n    else if (value<0.01) _dampingAmplitude *= _dampingFactor;\n    \n    _phase += _phaseShift;\n    _amplitude = fmax( fmin(_dampingAmplitude*20, 1.0), _idleAmplitude);\n    \n    if (tick==0) {\n        if( plotData != nil ){\n            free(plotData);\n        }\n        \n        plotData   = (CGPoint *)calloc(sizeof(CGPoint),length);\n        plotLength = length;\n        \n        for(int i = 0; i < length; i++) {\n            data[i]     = i == 0 ? 0 : data[i];\n            plotData[i] = CGPointMake(i,data[i] * _gain);\n        }\n        \n        [self _refreshDisplay];\n    }\n}\n\n- (void)drawRect:(CGRect)rect\n{\n    CGContextRef ctx = UIGraphicsGetCurrentContext();\n    CGContextSaveGState(ctx);\n    CGRect frame = self.bounds;\n\n    // Set the background color\n    [(UIColor*)self.backgroundColor set];\n    UIRectFill(frame);\n    // Set the waveform line color\n    [(UIColor*)self.color set];\n    \n    frame = UIEdgeInsetsInsetRect(self.bounds, self.waveInsets);\n    \n    // We draw multiple sinus waves, with equal phases but altered amplitudes, multiplied by a parable function.\n    for(int i=0;i<_waves+1;i++) {\n        \n        // [[NSGraphicsContext currentContext] saveGraphicsState];\n        CGContextRef context = UIGraphicsGetCurrentContext();\n        // CGContextSaveGState(context);\n        // CGContextRef context = (CGContextRef) [nsGraphicsContext graphicsPort];\n        \n        // The first wave is drawn with a waveWidth stroke width, all others a with 1px stroke width.\n        CGContextSetLineWidth(context, (i==0)? self.waveWidth:1 );\n        \n        CGFloat halfHeight = CGRectGetHeight(frame)/2;\n        CGFloat width = CGRectGetWidth(frame);\n        CGFloat mid = width /2.0;\n        \n        const CGFloat maxAmplitude = halfHeight*_maxAmplitude-4; // 4 corresponds to twice the stroke width\n        \n        // Progress is a value between 1.0 and -0.5, determined by the current wave idx, which is used to alter the wave's amplitude.\n        CGFloat progress = 1.0-(CGFloat)i/_waves;\n        CGFloat normedAmplitude = (1.5*progress-0.5)*_amplitude;\n        \n        // Choose the color based on the progress (that is, based on the wave idx)\n        // [[NSColor colorWithCalibratedWhite:_whiteValue alpha:progress/3.0*2+1.0/3.0] set];\n        // [[UIColor colorWithWhite:_whiteValue alpha:progress/3.0*2+1.0/3.0] set];\n        \n        CGFloat multiplier = MIN(1.0, (progress / 3.0f * 2.0f) + (1.0f / 3.0f));\n        [[self.color colorWithAlphaComponent:multiplier * CGColorGetAlpha([UIColor whiteColor].CGColor)] set];\n        \n        for(CGFloat x = 0; x<width+_density; x+=_density) {\n            // We use a parable to scale the sinus wave, that has its peak in the middle of the view.\n            CGFloat scaling = -pow(1/mid*(x-mid),2)+1;\n            CGFloat y = scaling *maxAmplitude *normedAmplitude *sinf(2 *M_PI *(x / width) *_frequency +_phase) + halfHeight;\n            \n            CGFloat pointX = CGRectGetMinX(frame)+x; if (pointX != pointX) {pointX = 0;}\n            CGFloat pointY = CGRectGetMinY(frame)+y; if (pointY != pointY) {pointY = 0;}\n            \n            if (x==0) {\n                CGContextMoveToPoint(context, pointX, pointY);\n            }\n            else {\n                CGContextAddLineToPoint(context, pointX, pointY);\n            }\n        }\n        CGContextStrokePath(context);\n    }\n    CGContextRestoreGState(ctx);\n}\n\n- (void)layoutSubviews {\n    [super layoutSubviews];\n    \n    CGRect frame = UIEdgeInsetsInsetRect(self.bounds, self.waveInsets);\n    \n    if (self.leftDecorativeView) {\n        self.leftDecorativeView.center = CGPointMake(CGRectGetMinX(frame), CGRectGetMidY(frame));\n    }\n    \n    if (self.rightDecorativeView) {\n        self.rightDecorativeView.center = CGPointMake(CGRectGetMaxX(frame), CGRectGetMidY(frame));\n    }\n}\n\n@end\n"
  },
  {
    "path": "Sublime/Sublime/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  Sublime\n//\n//  Created by Eular on 2/10/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate, WXApiDelegate, RCIMUserInfoDataSource, RCIMReceiveMessageDelegate {\n\n    var window: UIWindow?\n\n\n    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {\n        \n        window?.backgroundColor = Constant.CapeCod\n        \n        UIApplication.sharedApplication().statusBarStyle = .LightContent\n        \n        UINavigationBar.appearance().barStyle = UIBarStyle.Black\n        UINavigationBar.appearance().tintColor = UIColor.whiteColor()\n        UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]\n        \n        // Remove navigationBar border\n        UINavigationBar.appearance().translucent = false\n        UINavigationBar.appearance().shadowImage = UIImage()\n        UINavigationBar.appearance().setBackgroundImage(Constant.NavigationBarColor.toImage(), forBarMetrics: UIBarMetrics.Default)\n        \n        UITabBar.appearance().barTintColor = Constant.NavigationBarAndTabBarColor\n        UITabBar.appearance().tintColor = UIColor.whiteColor()\n        UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.whiteColor()], forState: UIControlState.Selected)\n        UITabBarItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.grayColor()], forState: UIControlState.Normal)\n        \n        // Remove tabBar border\n        UITabBar.appearance().translucent = false\n        UITabBar.appearance().shadowImage = UIImage()\n        UITabBar.appearance().backgroundImage = UIImage()\n        \n        // 微信\n        WXApi.registerApp(Constant.weixinAppID)\n        \n        // 融云\n        RCIM.sharedRCIM().showUnkownMessageNotificaiton = true\n        RCIM.sharedRCIM().enableTypingStatus = true\n        RCIM.sharedRCIM().initWithAppKey(Constant.RongCloudAppKey)\n        RCIM.sharedRCIM().userInfoDataSource = self\n        RCIM.sharedRCIM().receiveMessageDelegate = self\n        \n        // 推送处理\n        application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes:[.Alert, .Badge, .Sound], categories: nil))\n        \n        RCIM.sharedRCIM().Login()\n        \n        // Cycript\n        if Config.CycriptStartListen { CYListenServer(8888) }\n        \n        return true\n    }\n    \n    func getUserInfoWithUserId(userId: String!, completion: ((RCUserInfo!) -> Void)!) {\n        RCIM.sharedRCIM().getInfo(userId) { (name, portrait) in\n            var username = name\n            if (userId == Constant.RongCloudAuthorUserID) {\n                username = Constant.RongCloudAuthorUserName\n            }\n            completion(RCUserInfo(userId: userId, name: username, portrait: portrait))\n        }\n    }\n    \n    func onRCIMReceiveMessage(message: RCMessage!, left: Int32) {\n        Global.UnreadMessageCount += 1\n        if left == 0 {\n            Global.Notifi.postNotificationName(Constant.RongCloudUnreadMessageNotifi, object: nil)\n        }\n    }\n\n    func applicationWillResignActive(application: UIApplication) {\n        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.\n        // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.\n    }\n\n    func applicationDidEnterBackground(application: UIApplication) {\n        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.\n        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.\n    }\n\n    func applicationWillEnterForeground(application: UIApplication) {\n        // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.\n    }\n\n    func applicationDidBecomeActive(application: UIApplication) {\n        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.\n    }\n\n    func applicationWillTerminate(application: UIApplication) {\n        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.\n    }\n    \n    \n    func application(application: UIApplication, handleOpenURL url: NSURL) -> Bool {\n        return WXApi.handleOpenURL(url, delegate: self)\n    }\n    \n    func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {\n        // 处理 github token 跳转的链接\n        GitHubAPIManager.handleURL(url)\n        \n        // 处理接收到的文件\n        if url.fileURL {\n            let app = options[UIApplicationOpenURLOptionsSourceApplicationKey] ?? \"AirDrop\"\n            Log(\"Receive a file from \\(app!), url: \\(url)\")\n        }\n        \n        // 微信\n        return WXApi.handleOpenURL(url, delegate: self)\n    }\n\n}\n\n"
  },
  {
    "path": "Sublime/Sublime/AppInfoViewController.swift",
    "content": "//\n//  AppInfoViewController.swift\n//  Sublime\n//\n//  Created by Eular on 2/24/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nclass AppInfoViewController: UIViewController {\n    \n    let popupMenu = PopupMenu()\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        title = \"Sublime\"\n        view.backgroundColor = Constant.CapeCod\n        \n        if let logo = UIView.loadFromNibNamed(\"LogoView\") {\n            logo.frame = view.frame\n            logo.height -= Constant.NavigationBarOffset\n            view.addSubview(logo)\n        }\n        \n        let version = UILabel()\n        view.addSubview(version)\n        version.text = \"Version 1.0\"\n        version.font = version.font.fontWithSize(13)\n        version.width = 100\n        version.height = 20\n        version.autoLayout(left: 12, bottom: -9)\n        version.textColor = UIColor.lightGrayColor()\n        \n        let btn = UIButton()\n        view.addSubview(btn)\n        btn.setTitle(\"Github\", forState: .Normal)\n        btn.setTitleColor(UIColor.lightGrayColor(), forState: .Normal)\n        btn.titleLabel?.adjustsFontSizeToFitWidth = true\n        btn.width = 50\n        btn.height = 20\n        btn.autoLayout(right: -10, bottom: -10)\n        btn.addTarget(self, action: #selector(self.goToAppGithub), forControlEvents: .TouchUpInside)\n        \n        // 设置分享菜单\n        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Action, target: popupMenu, action: #selector(popupMenu.showUp))\n        popupMenu.controller = self\n        \n        // 摇一摇\n        UIApplication.sharedApplication().applicationSupportsShakeToEdit = true\n        self.becomeFirstResponder()\n    }\n    \n    override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?) {\n        if motion == .MotionShake {\n            AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) // 震动\n            var mySound: SystemSoundID = 0\n            if let url = NSBundle.mainBundle().URLForResource(\"shake\", withExtension: \"wav\") {\n                AudioServicesCreateSystemSoundID(url, &mySound)\n                AudioServicesPlaySystemSound(mySound)\n            }\n            \n            let go = GomokuViewController()\n            self.presentViewController(go, animated: true, completion: nil)\n        }\n    }\n\n    func goToAppGithub() {\n        let svc = SublimeSafari(URL: NSURL(string: Constant.AppGithubUrl)!)\n        svc.title = \"Urinx\"\n        navigationController?.pushViewController(svc, animated: true)\n    }\n    \n}\n"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"appIcon29@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"appIcon29@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"appIcon40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"appIcon40@3x copy.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"appIcon60@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"appIcon60@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/Repositories.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Repositories.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/Share_douban_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Share_douban_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/Share_facebook_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Share_facebook_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/Share_instagram.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Share_instagram@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/Share_line_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Share_line_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/Share_more_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Share_more_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/Share_pinterest_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Share_pinterest_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/Share_qq_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Share_qq_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/Share_qzone_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Share_qzone_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/Share_sina_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Share_sina_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/Share_twitter_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Share_twitter_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/Share_wechat_session_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Share_wechat_session_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/Share_wechat_timeline_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Share_wechat_timeline_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/Stars.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Stars.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/add_friend_icon_addfriend.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"plugins_FriendNotify@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"plugins_FriendNotify@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/add_friend_icon_group.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"add_friend_icon_addgroup@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"add_friend_icon_addgroup@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/add_friend_icon_offical.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"add_friend_icon_offical@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"add_friend_icon_offical@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/app_small_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"app_small_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/code_share_btn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"code_share_btn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/comment.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"comment@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/config_cycript.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"config_cycript@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/config_full_screen_code_reading.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"config_full_screen_code_reading@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/config_show_hidden_file.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"config_show_hidden_file@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/donate.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"donate.jpeg\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/donate1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"donate1.jpg\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/donate2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"donate2.jpg\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/donate3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"donate3.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/donate4.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"donate4.jpg\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/donate5.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"donate2.jpeg\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/donate_weixin.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"donate_weixin.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/explore_codezZ.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"explore_codezZ@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_3fr.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_3fr.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_7z.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_7z.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_aac.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_aac.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_ai.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_ai.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_asc.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_asc.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_asp.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_asp.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_avi.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_avi.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_bas.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_bas.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_cls.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_cls.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_code_share.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_code_share1.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_cpp.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_cpp.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_cr2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_cr2.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_cs.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_cs.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_css.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_css.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_csv.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_csv.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_dll.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_dll.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_dmg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_dmg.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_dng.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_dng.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_eps.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_eps.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_exe.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_exe.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_fff.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_fff.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_flv.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_flv.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_gif.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_gif.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_gis.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_gis.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_gpx.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_gpx.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_html.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_html.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_j2k.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_j2k.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_jp2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_jp2.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_jpg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_jpg.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_js.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_js.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_jsp.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_jsp.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_kml.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_kml.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_kmz.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_kmz.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_mov.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_mov.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_mp3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_mp3.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_mp4.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_mp4.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_mpg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_mpg.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_nef.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_nef.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_nmea.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_nmea.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_ogg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_ogg.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_osm.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_osm.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_otf.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_otf.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_pdf.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_pdf.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_png.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_png.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_ppt.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_ppt.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_pptx.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_pptx.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_ps.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_ps.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_psd.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_psd.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_py.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_py.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_rar.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_rar.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_raw.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_raw.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_svg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_svg.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_tar.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_tar.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_tif.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_tif.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_ttf.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_ttf.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_txt.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_txt.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_unknown.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_unknown.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_vb.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_vb.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_vbs.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_vbs.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_wav.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_wav.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_wma.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_wma.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_woff.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_woff.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_word.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_word.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_wsh.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_wsh.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_xaml.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_xaml.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_xls.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_xls.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_xml.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_xml.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/file_zip.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"file_zip.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/folder.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"folder.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/function_rss.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"function_rss@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/function_scan.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"function_scan@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/gist_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"11953427,2560,1600.jpg\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/github_avatar.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"github_avatar@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/github_folder.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"github_folder@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/github_fork.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"github-fork@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/github_login.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Github-Login@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/github_star.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"github-star@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/github_watcher.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"github_watcher@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/open_safari.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"open_safari@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/pdf_continuous.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pdf_continuous@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/pdf_horizontal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pdf_horizontal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/pdf_vertical.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pdf_vertical@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/repo_download.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"repo_download@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/right_arrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"right_arrow.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/setting_cache.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_cache@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/setting_configure.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_configure@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/setting_donate.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_donate@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/setting_feedback.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_feedback@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/setting_github.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_github@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/setting_license.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_license@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/setting_reading.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_reading@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/setting_server.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_server@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/setting_ssh.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_server@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/setting_storage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_storage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/setting_sublime.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_sublime@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/setting_themes.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_themes@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/ssh_done.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ssh_done@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/ssh_keyboard.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ssh_keyboard@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/ssh_password.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ssh_password@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/ssh_port.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ssh_port@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/ssh_server.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ssh_server@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/ssh_user.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ssh_user@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/tab_icon_explore.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tab_icon_explore.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/tab_icon_files.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tab_icon_files.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/tab_icon_setting.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tab_icon_setting.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/user_author.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"head0.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/user_info.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_info@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Assets.xcassets/user_robot.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"IMG_1683.jpg\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Sublime/Sublime/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"10116\" systemVersion=\"15F31a\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"10085\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Llm-lL-Icb\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"xb3-aO-Qok\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <stackView opaque=\"NO\" contentMode=\"scaleToFill\" axis=\"vertical\" alignment=\"center\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"P8N-mS-NiM\">\n                                <rect key=\"frame\" x=\"223\" y=\"200.5\" width=\"155\" height=\"139\"/>\n                                <subviews>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"S\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"OXm-ez-PO3\">\n                                        <rect key=\"frame\" x=\"47\" y=\"0.0\" width=\"61\" height=\"108\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"61\" id=\"TOt-If-azC\"/>\n                                        </constraints>\n                                        <fontDescription key=\"fontDescription\" name=\"ArialRoundedMTBold\" family=\"Arial Rounded MT Bold\" pointSize=\"90\"/>\n                                        <color key=\"textColor\" red=\"1\" green=\"0.58039215690000001\" blue=\"0.12549019610000001\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                        <color key=\"shadowColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                        <size key=\"shadowOffset\" width=\"0.0\" height=\"3\"/>\n                                    </label>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Sublime Code\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"e98-sq-m6C\">\n                                        <rect key=\"frame\" x=\"0.5\" y=\"108\" width=\"154.5\" height=\"31\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"31\" id=\"iVC-uB-qzx\"/>\n                                        </constraints>\n                                        <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"23\"/>\n                                        <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                        <color key=\"shadowColor\" white=\"0.33333333333333331\" alpha=\"0.54413006756756754\" colorSpace=\"calibratedWhite\"/>\n                                        <size key=\"shadowOffset\" width=\"1\" height=\"1\"/>\n                                    </label>\n                                </subviews>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"139\" id=\"InK-CJ-wkb\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"155\" id=\"r5e-jq-uIf\"/>\n                                </constraints>\n                            </stackView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"0.40000000000000002\" green=\"0.40000000000000002\" blue=\"0.40000000000000002\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <rect key=\"contentStretch\" x=\"0.0\" y=\"0.0\" width=\"0.0\" height=\"1\"/>\n                        <constraints>\n                            <constraint firstItem=\"P8N-mS-NiM\" firstAttribute=\"centerY\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerY\" constant=\"-30\" id=\"5qJ-Ih-VM3\"/>\n                            <constraint firstItem=\"P8N-mS-NiM\" firstAttribute=\"centerX\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerX\" id=\"woy-PJ-OND\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Sublime/Sublime/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"10116\" systemVersion=\"15F31a\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" initialViewController=\"49e-Tb-3d3\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"10085\"/>\n        <capability name=\"Aspect ratio constraints\" minToolsVersion=\"5.1\"/>\n        <capability name=\"Constraints to layout margins\" minToolsVersion=\"6.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Repos Table View Controller-->\n        <scene sceneID=\"zSW-zx-2JD\">\n            <objects>\n                <tableViewController storyboardIdentifier=\"ReposTableView\" id=\"KV0-4d-QPn\" customClass=\"ReposTableViewController\" customModule=\"Sublime\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"static\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"28\" sectionFooterHeight=\"28\" id=\"bUh-fV-rVW\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <color key=\"separatorColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <color key=\"sectionIndexBackgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <color key=\"sectionIndexTrackingBackgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <sections>\n                            <tableViewSection headerTitle=\"Urinx / Sublime\" id=\"ELi-GY-a6p\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"none\" indentationWidth=\"10\" id=\"1iZ-1F-8jy\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"28\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"1iZ-1F-8jy\" id=\"DFO-Bx-tP6\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <stackView opaque=\"NO\" contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"qip-s8-LyW\">\n                                                    <rect key=\"frame\" x=\"23\" y=\"12\" width=\"554\" height=\"20\"/>\n                                                    <subviews>\n                                                        <stackView opaque=\"NO\" contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"bSQ-09-3cx\">\n                                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"185\" height=\"20\"/>\n                                                            <subviews>\n                                                                <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"github_watcher\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"apW-LJ-gl0\">\n                                                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"20\" height=\"20\"/>\n                                                                    <constraints>\n                                                                        <constraint firstAttribute=\"height\" constant=\"20\" id=\"afI-gr-uoU\"/>\n                                                                        <constraint firstAttribute=\"width\" constant=\"20\" id=\"dtY-0u-vKV\"/>\n                                                                    </constraints>\n                                                                </imageView>\n                                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"0\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"2W9-uP-FAJ\">\n                                                                    <rect key=\"frame\" x=\"20\" y=\"0.0\" width=\"165\" height=\"20\"/>\n                                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"15\"/>\n                                                                    <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                                    <nil key=\"highlightedColor\"/>\n                                                                </label>\n                                                            </subviews>\n                                                        </stackView>\n                                                        <stackView opaque=\"NO\" contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"A6h-Mk-Jz3\">\n                                                            <rect key=\"frame\" x=\"185\" y=\"0.0\" width=\"185\" height=\"20\"/>\n                                                            <subviews>\n                                                                <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"github_star\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"jdd-p1-pbo\">\n                                                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"20\" height=\"20\"/>\n                                                                    <constraints>\n                                                                        <constraint firstAttribute=\"height\" constant=\"20\" id=\"67u-4m-cTl\"/>\n                                                                        <constraint firstAttribute=\"width\" constant=\"20\" id=\"fEg-Ie-WiZ\"/>\n                                                                    </constraints>\n                                                                </imageView>\n                                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"0\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"odz-bD-FvH\">\n                                                                    <rect key=\"frame\" x=\"20\" y=\"0.0\" width=\"165\" height=\"20\"/>\n                                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"15\"/>\n                                                                    <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                                    <nil key=\"highlightedColor\"/>\n                                                                </label>\n                                                            </subviews>\n                                                        </stackView>\n                                                        <stackView opaque=\"NO\" contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"IGR-On-Y67\">\n                                                            <rect key=\"frame\" x=\"370\" y=\"0.0\" width=\"185\" height=\"20\"/>\n                                                            <subviews>\n                                                                <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"github_fork\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"NAm-Ru-Z7z\">\n                                                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"20\" height=\"20\"/>\n                                                                    <constraints>\n                                                                        <constraint firstAttribute=\"height\" constant=\"20\" id=\"Eaz-HT-En8\"/>\n                                                                        <constraint firstAttribute=\"width\" constant=\"20\" id=\"TTP-Fc-xBO\"/>\n                                                                    </constraints>\n                                                                </imageView>\n                                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"0\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"QmW-r2-ObC\">\n                                                                    <rect key=\"frame\" x=\"20\" y=\"0.0\" width=\"165\" height=\"20\"/>\n                                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"15\"/>\n                                                                    <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                                    <nil key=\"highlightedColor\"/>\n                                                                </label>\n                                                            </subviews>\n                                                        </stackView>\n                                                    </subviews>\n                                                    <constraints>\n                                                        <constraint firstItem=\"bSQ-09-3cx\" firstAttribute=\"height\" secondItem=\"A6h-Mk-Jz3\" secondAttribute=\"height\" id=\"8lM-25-ZD2\"/>\n                                                        <constraint firstItem=\"IGR-On-Y67\" firstAttribute=\"width\" secondItem=\"A6h-Mk-Jz3\" secondAttribute=\"width\" id=\"GKI-MJ-DVi\"/>\n                                                        <constraint firstItem=\"bSQ-09-3cx\" firstAttribute=\"width\" secondItem=\"A6h-Mk-Jz3\" secondAttribute=\"width\" id=\"pru-27-PLK\"/>\n                                                    </constraints>\n                                                </stackView>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"qip-s8-LyW\" firstAttribute=\"centerX\" secondItem=\"DFO-Bx-tP6\" secondAttribute=\"centerX\" id=\"Oo4-GD-Zoj\"/>\n                                                <constraint firstItem=\"qip-s8-LyW\" firstAttribute=\"centerY\" secondItem=\"DFO-Bx-tP6\" secondAttribute=\"centerY\" id=\"fkj-go-gd9\"/>\n                                                <constraint firstItem=\"qip-s8-LyW\" firstAttribute=\"leading\" secondItem=\"DFO-Bx-tP6\" secondAttribute=\"leadingMargin\" constant=\"15\" id=\"wIU-BR-2z8\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"qip-s8-LyW\" secondAttribute=\"trailing\" constant=\"15\" id=\"yEU-5G-C7x\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"none\" indentationWidth=\"10\" id=\"84g-tY-Kc6\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"72\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"84g-tY-Kc6\" id=\"tdc-OT-PqK\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Latest commit by Urinx 3 days ago\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"KMo-rK-Apc\">\n                                                    <rect key=\"frame\" x=\"20\" y=\"14\" width=\"572\" height=\"17\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                                    <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"KMo-rK-Apc\" firstAttribute=\"leading\" secondItem=\"tdc-OT-PqK\" secondAttribute=\"leadingMargin\" constant=\"12\" id=\"Kzg-qt-REn\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"KMo-rK-Apc\" secondAttribute=\"trailing\" id=\"XjP-FX-wJC\"/>\n                                                <constraint firstItem=\"KMo-rK-Apc\" firstAttribute=\"centerY\" secondItem=\"tdc-OT-PqK\" secondAttribute=\"centerY\" id=\"eqF-r1-kd2\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"none\" indentationWidth=\"10\" id=\"oaJ-Lb-Vgz\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"116\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"oaJ-Lb-Vgz\" id=\"gah-tK-8lr\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"No description\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"7gH-1p-iR6\">\n                                                    <rect key=\"frame\" x=\"20\" y=\"14\" width=\"572\" height=\"17\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                                    <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"7gH-1p-iR6\" firstAttribute=\"leading\" secondItem=\"gah-tK-8lr\" secondAttribute=\"leadingMargin\" constant=\"12\" id=\"NJJ-J6-z98\"/>\n                                                <constraint firstItem=\"7gH-1p-iR6\" firstAttribute=\"centerY\" secondItem=\"gah-tK-8lr\" secondAttribute=\"centerY\" id=\"fOn-aY-uE0\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"7gH-1p-iR6\" secondAttribute=\"trailing\" id=\"frF-VF-vyp\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                            <tableViewSection headerTitle=\"master\" id=\"Q1Y-Vu-z2f\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" id=\"BC4-kI-dXn\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"188\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"BC4-kI-dXn\" id=\"cuz-an-XTd\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"View code\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"jpn-aZ-Ex4\">\n                                                    <rect key=\"frame\" x=\"52\" y=\"12\" width=\"80\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"80\" id=\"jXf-VR-rIl\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"20.5\" id=\"n45-YH-xvq\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"16\"/>\n                                                    <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"102\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"right_arrow\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"M3u-vy-wVa\">\n                                                    <rect key=\"frame\" x=\"585\" y=\"17\" width=\"7\" height=\"11\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"11\" id=\"RSk-5Y-XTs\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"7\" id=\"lkl-Cu-aVF\"/>\n                                                    </constraints>\n                                                </imageView>\n                                                <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"github_folder\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"RFu-sM-jRZ\">\n                                                    <rect key=\"frame\" x=\"20\" y=\"11\" width=\"22\" height=\"22\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"22\" id=\"6nE-nH-oB2\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"22\" id=\"tV0-CM-p3C\"/>\n                                                    </constraints>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"[0M]\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"qLM-nm-iMx\">\n                                                    <rect key=\"frame\" x=\"140\" y=\"12\" width=\"437\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"r63-RD-pNX\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"RFu-sM-jRZ\" firstAttribute=\"leading\" secondItem=\"cuz-an-XTd\" secondAttribute=\"leadingMargin\" constant=\"12\" id=\"BIN-ee-t5v\"/>\n                                                <constraint firstItem=\"M3u-vy-wVa\" firstAttribute=\"centerY\" secondItem=\"cuz-an-XTd\" secondAttribute=\"centerY\" id=\"CyD-r1-tuG\"/>\n                                                <constraint firstItem=\"M3u-vy-wVa\" firstAttribute=\"leading\" secondItem=\"qLM-nm-iMx\" secondAttribute=\"trailing\" constant=\"8\" id=\"OMH-ft-2G6\"/>\n                                                <constraint firstItem=\"RFu-sM-jRZ\" firstAttribute=\"centerY\" secondItem=\"cuz-an-XTd\" secondAttribute=\"centerY\" id=\"QiG-Th-e1h\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"M3u-vy-wVa\" secondAttribute=\"trailing\" id=\"eTN-oK-l3P\"/>\n                                                <constraint firstItem=\"jpn-aZ-Ex4\" firstAttribute=\"leading\" secondItem=\"RFu-sM-jRZ\" secondAttribute=\"trailing\" constant=\"10\" id=\"g1I-ny-0eH\"/>\n                                                <constraint firstItem=\"qLM-nm-iMx\" firstAttribute=\"leading\" secondItem=\"jpn-aZ-Ex4\" secondAttribute=\"trailing\" constant=\"8\" id=\"heD-dA-GZd\"/>\n                                                <constraint firstItem=\"qLM-nm-iMx\" firstAttribute=\"centerY\" secondItem=\"cuz-an-XTd\" secondAttribute=\"centerY\" id=\"wYb-qb-Zwd\"/>\n                                                <constraint firstItem=\"jpn-aZ-Ex4\" firstAttribute=\"centerY\" secondItem=\"cuz-an-XTd\" secondAttribute=\"centerY\" id=\"zOm-nG-ITy\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705882352939\" green=\"0.31764705882352939\" blue=\"0.31764705882352939\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                            <tableViewSection headerTitle=\"README.md\" id=\"4rc-YI-dA3\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" rowHeight=\"341\" id=\"T7C-sN-IGS\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"260\" width=\"600\" height=\"341\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"T7C-sN-IGS\" id=\"agM-8G-Dt8\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"340.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <webView opaque=\"NO\" contentMode=\"scaleToFill\" keyboardDisplayRequiresUserAction=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"QSA-AF-rxM\">\n                                                    <rect key=\"frame\" x=\"-2\" y=\"-1\" width=\"604\" height=\"342.5\"/>\n                                                    <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                                </webView>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"QSA-AF-rxM\" secondAttribute=\"trailing\" constant=\"-10\" id=\"8qd-3c-bsY\"/>\n                                                <constraint firstItem=\"QSA-AF-rxM\" firstAttribute=\"top\" secondItem=\"agM-8G-Dt8\" secondAttribute=\"topMargin\" constant=\"-9\" id=\"Old-h6-Y5j\"/>\n                                                <constraint firstAttribute=\"bottomMargin\" secondItem=\"QSA-AF-rxM\" secondAttribute=\"bottom\" constant=\"-9\" id=\"lF5-L3-iPG\"/>\n                                                <constraint firstItem=\"QSA-AF-rxM\" firstAttribute=\"leading\" secondItem=\"agM-8G-Dt8\" secondAttribute=\"leadingMargin\" constant=\"-10\" id=\"xEo-Ve-oUv\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705882352939\" green=\"0.31764705882352939\" blue=\"0.31764705882352939\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                        </sections>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"KV0-4d-QPn\" id=\"s1e-fG-Mb7\"/>\n                            <outlet property=\"delegate\" destination=\"KV0-4d-QPn\" id=\"dQr-ps-gGO\"/>\n                        </connections>\n                    </tableView>\n                    <connections>\n                        <outlet property=\"commitTimeLB\" destination=\"KMo-rK-Apc\" id=\"JwW-R9-4Zx\"/>\n                        <outlet property=\"descriptionLB\" destination=\"7gH-1p-iR6\" id=\"flH-gu-tJt\"/>\n                        <outlet property=\"forkLB\" destination=\"QmW-r2-ObC\" id=\"ZOr-iu-Kf4\"/>\n                        <outlet property=\"sizeLB\" destination=\"qLM-nm-iMx\" id=\"bPN-23-A3k\"/>\n                        <outlet property=\"starLB\" destination=\"odz-bD-FvH\" id=\"aFd-ZW-3Ki\"/>\n                        <outlet property=\"watcherLB\" destination=\"2W9-uP-FAJ\" id=\"T2M-gk-mVb\"/>\n                        <outlet property=\"webView\" destination=\"QSA-AF-rxM\" id=\"OJw-2L-QgR\"/>\n                    </connections>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"DcR-9s-FRp\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2290\" y=\"-1088\"/>\n        </scene>\n        <!--Sublime-->\n        <scene sceneID=\"Fb0-Eq-So0\">\n            <objects>\n                <tableViewController id=\"eKe-tq-2GY\" customClass=\"MainTableViewController\" customModule=\"Sublime\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" rowHeight=\"44\" sectionHeaderHeight=\"28\" sectionFooterHeight=\"28\" id=\"BKK-HO-02r\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <color key=\"separatorColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <color key=\"sectionIndexBackgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <color key=\"sectionIndexTrackingBackgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <prototypes>\n                            <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"gray\" indentationWidth=\"10\" reuseIdentifier=\"FileTableCellIdentifier\" id=\"tjq-fR-c1U\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"92\" width=\"600\" height=\"44\"/>\n                                <autoresizingMask key=\"autoresizingMask\"/>\n                                <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"tjq-fR-c1U\" id=\"mkX-V5-i0o\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                </tableViewCellContentView>\n                                <color key=\"backgroundColor\" white=\"0.34798108552631579\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            </tableViewCell>\n                        </prototypes>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"eKe-tq-2GY\" id=\"q4L-jH-kgG\"/>\n                            <outlet property=\"delegate\" destination=\"eKe-tq-2GY\" id=\"VTI-2G-KbL\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Sublime\" id=\"ngZ-gL-D6V\">\n                        <barButtonItem key=\"rightBarButtonItem\" systemItem=\"add\" id=\"kTm-pE-QcG\"/>\n                    </navigationItem>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"aim-ZM-z1Z\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1562\" y=\"-1088\"/>\n        </scene>\n        <!--Setting-->\n        <scene sceneID=\"2pq-X7-LTM\">\n            <objects>\n                <tableViewController id=\"P4t-er-mhO\" customClass=\"SettingTableViewController\" customModule=\"Sublime\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"static\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"28\" sectionFooterHeight=\"28\" id=\"tcU-Cx-9MK\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <color key=\"separatorColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <color key=\"sectionIndexBackgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <color key=\"sectionIndexTrackingBackgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <sections>\n                            <tableViewSection headerTitle=\"General\" id=\"ywN-0z-rio\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"SettingTableCellIdentifier\" id=\"Hq1-eO-0PG\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"92\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"Hq1-eO-0PG\" id=\"iuf-fK-lRc\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"100\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"setting_github\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"JRR-MD-zWV\">\n                                                    <rect key=\"frame\" x=\"14\" y=\"8\" width=\"28\" height=\"28\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"28\" id=\"6iR-ia-e4f\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"28\" id=\"fih-sZ-skH\"/>\n                                                    </constraints>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"101\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Github\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"EJ1-Yj-AX7\">\n                                                    <rect key=\"frame\" x=\"53\" y=\"12\" width=\"520\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"iCe-5u-kDT\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"102\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"right_arrow\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"l7T-N1-BMh\">\n                                                    <rect key=\"frame\" x=\"581\" y=\"16\" width=\"7\" height=\"11\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"7\" id=\"F13-2b-HZc\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"11\" id=\"O6X-M3-4hP\"/>\n                                                    </constraints>\n                                                </imageView>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"EJ1-Yj-AX7\" firstAttribute=\"leading\" secondItem=\"JRR-MD-zWV\" secondAttribute=\"trailing\" constant=\"11\" id=\"5jD-ew-b8W\"/>\n                                                <constraint firstItem=\"JRR-MD-zWV\" firstAttribute=\"centerY\" secondItem=\"iuf-fK-lRc\" secondAttribute=\"centerY\" id=\"8fl-Ni-ONo\"/>\n                                                <constraint firstItem=\"l7T-N1-BMh\" firstAttribute=\"leading\" secondItem=\"EJ1-Yj-AX7\" secondAttribute=\"trailing\" constant=\"8\" id=\"DYH-xz-X11\"/>\n                                                <constraint firstItem=\"l7T-N1-BMh\" firstAttribute=\"centerY\" secondItem=\"iuf-fK-lRc\" secondAttribute=\"centerY\" id=\"QWp-Th-Ku9\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"l7T-N1-BMh\" secondAttribute=\"trailing\" constant=\"4\" id=\"stK-bb-kOW\"/>\n                                                <constraint firstItem=\"EJ1-Yj-AX7\" firstAttribute=\"centerY\" secondItem=\"iuf-fK-lRc\" secondAttribute=\"centerY\" id=\"uN0-Sa-aIj\"/>\n                                                <constraint firstItem=\"JRR-MD-zWV\" firstAttribute=\"leading\" secondItem=\"iuf-fK-lRc\" secondAttribute=\"leadingMargin\" constant=\"6\" id=\"ys9-Cr-WHl\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                        <connections>\n                                            <segue destination=\"1xa-CC-QiM\" kind=\"show\" id=\"JJZ-m5-8rO\"/>\n                                        </connections>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"SettingTableCellIdentifier\" id=\"iiO-Or-KeS\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"136\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"iiO-Or-KeS\" id=\"gUX-Ou-wcz\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"100\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"setting_themes\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"sjy-Jm-AAR\">\n                                                    <rect key=\"frame\" x=\"14\" y=\"8\" width=\"28\" height=\"28\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"28\" id=\"3Gf-Uk-f6L\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"28\" id=\"LK2-PO-ZaC\"/>\n                                                    </constraints>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"101\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Themes\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"7Pn-UM-EbZ\">\n                                                    <rect key=\"frame\" x=\"53\" y=\"12\" width=\"520\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"gU3-3H-t7z\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"102\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"right_arrow\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"6CK-Nm-rKG\">\n                                                    <rect key=\"frame\" x=\"581\" y=\"16\" width=\"7\" height=\"11\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"7\" id=\"Hwn-ng-ouh\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"11\" id=\"QQw-Zb-3re\"/>\n                                                    </constraints>\n                                                </imageView>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"7Pn-UM-EbZ\" firstAttribute=\"centerY\" secondItem=\"gUX-Ou-wcz\" secondAttribute=\"centerY\" id=\"2By-aH-JYE\"/>\n                                                <constraint firstItem=\"sjy-Jm-AAR\" firstAttribute=\"leading\" secondItem=\"gUX-Ou-wcz\" secondAttribute=\"leadingMargin\" constant=\"6\" id=\"7WV-1X-bQt\"/>\n                                                <constraint firstItem=\"7Pn-UM-EbZ\" firstAttribute=\"leading\" secondItem=\"sjy-Jm-AAR\" secondAttribute=\"trailing\" constant=\"11\" id=\"CCp-2b-54w\"/>\n                                                <constraint firstItem=\"6CK-Nm-rKG\" firstAttribute=\"centerY\" secondItem=\"gUX-Ou-wcz\" secondAttribute=\"centerY\" id=\"L2T-Zs-PJ0\"/>\n                                                <constraint firstItem=\"sjy-Jm-AAR\" firstAttribute=\"centerY\" secondItem=\"gUX-Ou-wcz\" secondAttribute=\"centerY\" id=\"RjM-UB-T3H\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"6CK-Nm-rKG\" secondAttribute=\"trailing\" constant=\"4\" id=\"gqt-q7-nO3\"/>\n                                                <constraint firstItem=\"6CK-Nm-rKG\" firstAttribute=\"leading\" secondItem=\"7Pn-UM-EbZ\" secondAttribute=\"trailing\" constant=\"8\" id=\"tw2-KG-AFU\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"SettingTableCellIdentifier\" id=\"YnR-hw-uL9\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"180\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"YnR-hw-uL9\" id=\"cfr-2G-S2Z\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"100\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"setting_configure\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"mC6-f2-X8F\">\n                                                    <rect key=\"frame\" x=\"14\" y=\"8\" width=\"28\" height=\"28\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"28\" id=\"YY0-Rv-BW7\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"28\" id=\"pON-kp-dbW\"/>\n                                                    </constraints>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"101\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Config\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"hL7-5d-e2A\">\n                                                    <rect key=\"frame\" x=\"53\" y=\"12\" width=\"520\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"JGt-py-M0k\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"102\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"right_arrow\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8jB-f7-LKQ\">\n                                                    <rect key=\"frame\" x=\"581\" y=\"16\" width=\"7\" height=\"11\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"11\" id=\"IEj-rD-Z9R\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"7\" id=\"dae-yg-vLA\"/>\n                                                    </constraints>\n                                                </imageView>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"hL7-5d-e2A\" firstAttribute=\"leading\" secondItem=\"mC6-f2-X8F\" secondAttribute=\"trailing\" constant=\"11\" id=\"9Xr-Sk-n3e\"/>\n                                                <constraint firstItem=\"8jB-f7-LKQ\" firstAttribute=\"centerY\" secondItem=\"cfr-2G-S2Z\" secondAttribute=\"centerY\" id=\"FqH-97-2jP\"/>\n                                                <constraint firstItem=\"hL7-5d-e2A\" firstAttribute=\"centerY\" secondItem=\"cfr-2G-S2Z\" secondAttribute=\"centerY\" id=\"WnL-lN-TKg\"/>\n                                                <constraint firstItem=\"mC6-f2-X8F\" firstAttribute=\"leading\" secondItem=\"cfr-2G-S2Z\" secondAttribute=\"leadingMargin\" constant=\"6\" id=\"XaL-NQ-kLI\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"8jB-f7-LKQ\" secondAttribute=\"trailing\" constant=\"4\" id=\"aXj-uP-rP9\"/>\n                                                <constraint firstItem=\"8jB-f7-LKQ\" firstAttribute=\"leading\" secondItem=\"hL7-5d-e2A\" secondAttribute=\"trailing\" constant=\"8\" id=\"fZE-73-9SH\"/>\n                                                <constraint firstItem=\"mC6-f2-X8F\" firstAttribute=\"centerY\" secondItem=\"cfr-2G-S2Z\" secondAttribute=\"centerY\" id=\"xjk-rZ-iqB\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                        <connections>\n                                            <segue destination=\"crz-sS-uZB\" kind=\"show\" id=\"d7d-Aw-hCA\"/>\n                                        </connections>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                            <tableViewSection headerTitle=\"Other\" id=\"jeV-tf-Gl5\" userLabel=\"Function\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"SettingTableCellIdentifier\" id=\"G2K-lI-ZsO\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"252\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"G2K-lI-ZsO\" id=\"XiI-yW-dXB\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"100\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"setting_reading\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3np-DC-ouT\">\n                                                    <rect key=\"frame\" x=\"14\" y=\"8\" width=\"28\" height=\"28\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"28\" id=\"79O-mQ-KDO\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"28\" id=\"UAr-ZW-NEG\"/>\n                                                    </constraints>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"101\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Reading\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"FM9-xe-7gr\">\n                                                    <rect key=\"frame\" x=\"53\" y=\"12\" width=\"520\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"Wh2-54-acJ\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"102\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"right_arrow\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"t9b-15-Vax\">\n                                                    <rect key=\"frame\" x=\"581\" y=\"16\" width=\"7\" height=\"11\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"11\" id=\"8Fl-um-EYW\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"7\" id=\"Kby-0V-u21\"/>\n                                                    </constraints>\n                                                </imageView>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"FM9-xe-7gr\" firstAttribute=\"leading\" secondItem=\"3np-DC-ouT\" secondAttribute=\"trailing\" constant=\"11\" id=\"AoJ-t9-acH\"/>\n                                                <constraint firstItem=\"FM9-xe-7gr\" firstAttribute=\"centerY\" secondItem=\"XiI-yW-dXB\" secondAttribute=\"centerY\" id=\"R1u-qt-ge0\"/>\n                                                <constraint firstItem=\"t9b-15-Vax\" firstAttribute=\"centerY\" secondItem=\"XiI-yW-dXB\" secondAttribute=\"centerY\" id=\"hOu-CT-gNl\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"t9b-15-Vax\" secondAttribute=\"trailing\" constant=\"4\" id=\"jT2-im-aVs\"/>\n                                                <constraint firstItem=\"3np-DC-ouT\" firstAttribute=\"centerY\" secondItem=\"XiI-yW-dXB\" secondAttribute=\"centerY\" id=\"kJx-cN-trh\"/>\n                                                <constraint firstItem=\"3np-DC-ouT\" firstAttribute=\"leading\" secondItem=\"XiI-yW-dXB\" secondAttribute=\"leadingMargin\" constant=\"6\" id=\"ov0-GE-GD4\"/>\n                                                <constraint firstItem=\"t9b-15-Vax\" firstAttribute=\"leading\" secondItem=\"FM9-xe-7gr\" secondAttribute=\"trailing\" constant=\"8\" id=\"tLX-XR-GOY\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"SettingTableCellIdentifier\" id=\"LQY-T9-vod\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"296\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"LQY-T9-vod\" id=\"8Hu-oT-oF4\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"100\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"setting_storage\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0t8-wk-UY5\">\n                                                    <rect key=\"frame\" x=\"14\" y=\"8\" width=\"28\" height=\"28\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"28\" id=\"QQN-I8-qyW\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"28\" id=\"sbw-kH-Pzq\"/>\n                                                    </constraints>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"101\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Storage\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"n39-k9-WhH\">\n                                                    <rect key=\"frame\" x=\"53\" y=\"12\" width=\"520\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"hvS-pZ-JTi\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"102\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"right_arrow\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Alx-eE-kOq\">\n                                                    <rect key=\"frame\" x=\"581\" y=\"16\" width=\"7\" height=\"11\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"11\" id=\"8yL-f6-rM5\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"7\" id=\"AFk-Wv-apT\"/>\n                                                    </constraints>\n                                                </imageView>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"Alx-eE-kOq\" firstAttribute=\"centerY\" secondItem=\"8Hu-oT-oF4\" secondAttribute=\"centerY\" id=\"3Km-QG-q6D\"/>\n                                                <constraint firstItem=\"Alx-eE-kOq\" firstAttribute=\"leading\" secondItem=\"n39-k9-WhH\" secondAttribute=\"trailing\" constant=\"8\" id=\"8CS-nk-4tB\"/>\n                                                <constraint firstItem=\"0t8-wk-UY5\" firstAttribute=\"leading\" secondItem=\"8Hu-oT-oF4\" secondAttribute=\"leadingMargin\" constant=\"6\" id=\"Dwm-2N-d64\"/>\n                                                <constraint firstItem=\"0t8-wk-UY5\" firstAttribute=\"centerY\" secondItem=\"8Hu-oT-oF4\" secondAttribute=\"centerY\" id=\"IEf-sV-5U5\"/>\n                                                <constraint firstItem=\"n39-k9-WhH\" firstAttribute=\"leading\" secondItem=\"0t8-wk-UY5\" secondAttribute=\"trailing\" constant=\"11\" id=\"Yw2-sN-lrb\"/>\n                                                <constraint firstItem=\"n39-k9-WhH\" firstAttribute=\"centerY\" secondItem=\"8Hu-oT-oF4\" secondAttribute=\"centerY\" id=\"Zzi-jN-P0A\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"Alx-eE-kOq\" secondAttribute=\"trailing\" constant=\"4\" id=\"hz8-vg-Ko1\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                            <tableViewSection headerTitle=\"About\" id=\"zdO-pP-3cS\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"SettingTableCellIdentifier\" id=\"IF5-MM-SAj\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"368\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"IF5-MM-SAj\" id=\"tS3-vd-QCn\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"100\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"setting_sublime\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"NUs-6X-8zd\">\n                                                    <rect key=\"frame\" x=\"14\" y=\"8\" width=\"28\" height=\"28\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"28\" id=\"oO8-T1-PmS\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"28\" id=\"pKv-wO-80E\"/>\n                                                    </constraints>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"101\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Sublime\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"KcI-le-fb4\">\n                                                    <rect key=\"frame\" x=\"53\" y=\"12\" width=\"520\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"LtJ-LM-O12\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"102\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"right_arrow\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4lu-1G-XE1\">\n                                                    <rect key=\"frame\" x=\"581\" y=\"16\" width=\"7\" height=\"11\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"7\" id=\"hlK-xQ-fHM\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"11\" id=\"pgs-Vr-6se\"/>\n                                                    </constraints>\n                                                </imageView>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"4lu-1G-XE1\" firstAttribute=\"leading\" secondItem=\"KcI-le-fb4\" secondAttribute=\"trailing\" constant=\"8\" id=\"23J-44-zLH\"/>\n                                                <constraint firstItem=\"4lu-1G-XE1\" firstAttribute=\"centerY\" secondItem=\"tS3-vd-QCn\" secondAttribute=\"centerY\" id=\"Nyz-3U-f1l\"/>\n                                                <constraint firstItem=\"KcI-le-fb4\" firstAttribute=\"centerY\" secondItem=\"tS3-vd-QCn\" secondAttribute=\"centerY\" id=\"erk-nj-cPk\"/>\n                                                <constraint firstItem=\"KcI-le-fb4\" firstAttribute=\"leading\" secondItem=\"NUs-6X-8zd\" secondAttribute=\"trailing\" constant=\"11\" id=\"k0Q-eE-0Jb\"/>\n                                                <constraint firstItem=\"NUs-6X-8zd\" firstAttribute=\"leading\" secondItem=\"tS3-vd-QCn\" secondAttribute=\"leadingMargin\" constant=\"6\" id=\"kaz-d4-OzN\"/>\n                                                <constraint firstItem=\"NUs-6X-8zd\" firstAttribute=\"centerY\" secondItem=\"tS3-vd-QCn\" secondAttribute=\"centerY\" id=\"ssF-Zg-YAK\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"4lu-1G-XE1\" secondAttribute=\"trailing\" constant=\"4\" id=\"yXd-9i-Z7j\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"SettingTableCellIdentifier\" id=\"F9a-zr-qmI\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"412\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"F9a-zr-qmI\" id=\"Wyg-q2-L0N\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"100\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"setting_donate\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"bPd-cN-gJT\">\n                                                    <rect key=\"frame\" x=\"14\" y=\"8\" width=\"28\" height=\"28\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"28\" id=\"KdX-Au-PR3\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"28\" id=\"Olz-zc-d5i\"/>\n                                                    </constraints>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"101\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Donate\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"jml-Na-iCZ\">\n                                                    <rect key=\"frame\" x=\"53\" y=\"12\" width=\"520\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"Awv-xf-LUc\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"102\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"right_arrow\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"P60-Fd-l1e\">\n                                                    <rect key=\"frame\" x=\"581\" y=\"16\" width=\"7\" height=\"11\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"11\" id=\"Kji-gB-bEh\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"7\" id=\"OAN-EF-zSN\"/>\n                                                    </constraints>\n                                                </imageView>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"P60-Fd-l1e\" firstAttribute=\"centerY\" secondItem=\"Wyg-q2-L0N\" secondAttribute=\"centerY\" id=\"AAH-SM-37P\"/>\n                                                <constraint firstItem=\"bPd-cN-gJT\" firstAttribute=\"leading\" secondItem=\"Wyg-q2-L0N\" secondAttribute=\"leadingMargin\" constant=\"6\" id=\"E9r-rX-xz8\"/>\n                                                <constraint firstItem=\"jml-Na-iCZ\" firstAttribute=\"leading\" secondItem=\"bPd-cN-gJT\" secondAttribute=\"trailing\" constant=\"11\" id=\"Pmo-rA-3sS\"/>\n                                                <constraint firstItem=\"jml-Na-iCZ\" firstAttribute=\"centerY\" secondItem=\"Wyg-q2-L0N\" secondAttribute=\"centerY\" id=\"Y6q-DB-5Jh\"/>\n                                                <constraint firstItem=\"P60-Fd-l1e\" firstAttribute=\"leading\" secondItem=\"jml-Na-iCZ\" secondAttribute=\"trailing\" constant=\"8\" id=\"dGJ-NI-TcB\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"P60-Fd-l1e\" secondAttribute=\"trailing\" constant=\"4\" id=\"tM7-8j-jgB\"/>\n                                                <constraint firstItem=\"bPd-cN-gJT\" firstAttribute=\"centerY\" secondItem=\"Wyg-q2-L0N\" secondAttribute=\"centerY\" id=\"zaB-Vl-bqJ\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"SettingTableCellIdentifier\" id=\"FWv-JY-EUl\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"456\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"FWv-JY-EUl\" id=\"8TU-hZ-eAF\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"100\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"setting_license\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3dH-bF-z8p\">\n                                                    <rect key=\"frame\" x=\"14\" y=\"8\" width=\"28\" height=\"28\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"28\" id=\"wIx-of-ZiE\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"28\" id=\"wci-RX-meq\"/>\n                                                    </constraints>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"101\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"License\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Zb8-dE-j5k\">\n                                                    <rect key=\"frame\" x=\"53\" y=\"12\" width=\"520\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"rB7-RE-W1v\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"102\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"right_arrow\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"nFJ-Jv-GrF\">\n                                                    <rect key=\"frame\" x=\"581\" y=\"16\" width=\"7\" height=\"11\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"11\" id=\"bMn-Yl-q6q\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"7\" id=\"dsT-zf-AaG\"/>\n                                                    </constraints>\n                                                </imageView>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"nFJ-Jv-GrF\" secondAttribute=\"trailing\" constant=\"4\" id=\"3n8-aw-iy2\"/>\n                                                <constraint firstItem=\"3dH-bF-z8p\" firstAttribute=\"leading\" secondItem=\"8TU-hZ-eAF\" secondAttribute=\"leadingMargin\" constant=\"6\" id=\"7cV-Lq-uDF\"/>\n                                                <constraint firstItem=\"nFJ-Jv-GrF\" firstAttribute=\"leading\" secondItem=\"Zb8-dE-j5k\" secondAttribute=\"trailing\" constant=\"8\" id=\"GdI-qK-hbu\"/>\n                                                <constraint firstItem=\"3dH-bF-z8p\" firstAttribute=\"centerY\" secondItem=\"8TU-hZ-eAF\" secondAttribute=\"centerY\" id=\"UYi-HP-lEd\"/>\n                                                <constraint firstItem=\"Zb8-dE-j5k\" firstAttribute=\"centerY\" secondItem=\"8TU-hZ-eAF\" secondAttribute=\"centerY\" id=\"fPm-SA-i8H\"/>\n                                                <constraint firstItem=\"nFJ-Jv-GrF\" firstAttribute=\"centerY\" secondItem=\"8TU-hZ-eAF\" secondAttribute=\"centerY\" id=\"fsE-3c-zQl\"/>\n                                                <constraint firstItem=\"Zb8-dE-j5k\" firstAttribute=\"leading\" secondItem=\"3dH-bF-z8p\" secondAttribute=\"trailing\" constant=\"11\" id=\"uhB-85-OGs\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                        </sections>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"P4t-er-mhO\" id=\"wwb-6F-FwU\"/>\n                            <outlet property=\"delegate\" destination=\"P4t-er-mhO\" id=\"qsE-6g-7cI\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Setting\" id=\"WAb-bu-6di\"/>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"1Jv-xO-PYL\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1562\" y=\"346\"/>\n        </scene>\n        <!--Server Table View Controller-->\n        <scene sceneID=\"yng-XE-1vR\">\n            <objects>\n                <tableViewController hidesBottomBarWhenPushed=\"YES\" id=\"Yk7-ZO-Lem\" customClass=\"HTTPServerTableViewController\" customModule=\"Sublime\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"static\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"28\" sectionFooterHeight=\"28\" id=\"pjd-63-Tv6\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <color key=\"separatorColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <color key=\"sectionIndexBackgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <color key=\"sectionIndexTrackingBackgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <sections>\n                            <tableViewSection headerTitle=\"HTTP\" id=\"eAP-TN-wbj\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"none\" indentationWidth=\"10\" id=\"SQN-qv-yeD\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"92\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"SQN-qv-yeD\" id=\"RTN-jS-QOj\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Web Server\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"oIC-Me-OiQ\">\n                                                    <rect key=\"frame\" x=\"11\" y=\"11\" width=\"89\" height=\"21\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <switch opaque=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"i9T-PC-p4S\">\n                                                    <rect key=\"frame\" x=\"539\" y=\"6.5\" width=\"51\" height=\"31\"/>\n                                                    <color key=\"onTintColor\" red=\"0.43529411759999997\" green=\"0.4431372549\" blue=\"0.47450980390000003\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                                    <connections>\n                                                        <action selector=\"serverStatusChanged:\" destination=\"Yk7-ZO-Lem\" eventType=\"valueChanged\" id=\"ACk-Wm-xP0\"/>\n                                                    </connections>\n                                                </switch>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"i9T-PC-p4S\" secondAttribute=\"trailing\" constant=\"4\" id=\"GXj-WC-2rl\"/>\n                                                <constraint firstItem=\"oIC-Me-OiQ\" firstAttribute=\"centerY\" secondItem=\"RTN-jS-QOj\" secondAttribute=\"centerY\" id=\"XsD-I4-9lU\"/>\n                                                <constraint firstItem=\"oIC-Me-OiQ\" firstAttribute=\"leading\" secondItem=\"RTN-jS-QOj\" secondAttribute=\"leadingMargin\" constant=\"3\" id=\"a45-vz-tEr\"/>\n                                                <constraint firstItem=\"i9T-PC-p4S\" firstAttribute=\"centerY\" secondItem=\"RTN-jS-QOj\" secondAttribute=\"centerY\" id=\"jQU-yP-isW\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705882352939\" green=\"0.31764705882352939\" blue=\"0.31764705882352939\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"none\" indentationWidth=\"10\" id=\"wLa-y5-PnS\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"136\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"wLa-y5-PnS\" id=\"Gcv-za-qfH\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"IP\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"o1D-Et-Af5\">\n                                                    <rect key=\"frame\" x=\"11\" y=\"11.5\" width=\"15\" height=\"20.5\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"192.168.23.142\" textAlignment=\"right\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"RhH-Rt-xU2\">\n                                                    <rect key=\"frame\" x=\"435\" y=\"11\" width=\"153\" height=\"20.5\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"153\" id=\"CYP-fv-QAp\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"o1D-Et-Af5\" firstAttribute=\"centerY\" secondItem=\"Gcv-za-qfH\" secondAttribute=\"centerY\" id=\"4e0-Dc-pGb\"/>\n                                                <constraint firstItem=\"RhH-Rt-xU2\" firstAttribute=\"centerY\" secondItem=\"Gcv-za-qfH\" secondAttribute=\"centerY\" id=\"LEL-N4-yee\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"RhH-Rt-xU2\" secondAttribute=\"trailing\" constant=\"4\" id=\"nNm-ad-Vjp\"/>\n                                                <constraint firstItem=\"o1D-Et-Af5\" firstAttribute=\"leading\" secondItem=\"Gcv-za-qfH\" secondAttribute=\"leadingMargin\" constant=\"3\" id=\"xGT-qt-dQH\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705882352939\" green=\"0.31764705882352939\" blue=\"0.31764705882352939\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"none\" indentationWidth=\"10\" id=\"yHV-Pv-FLU\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"180\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"yHV-Pv-FLU\" id=\"eUH-lH-TE7\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Port\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0SC-U4-pD5\">\n                                                    <rect key=\"frame\" x=\"11\" y=\"11\" width=\"33\" height=\"21\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <textField opaque=\"NO\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" placeholder=\"8080\" textAlignment=\"right\" minimumFontSize=\"17\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"SNh-cg-19I\">\n                                                    <rect key=\"frame\" x=\"508\" y=\"9.5\" width=\"80\" height=\"25\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"25\" id=\"ROs-V1-hm7\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"80\" id=\"f7t-48-aE5\"/>\n                                                    </constraints>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <textInputTraits key=\"textInputTraits\" keyboardType=\"numberPad\" keyboardAppearance=\"alert\" returnKeyType=\"done\" enablesReturnKeyAutomatically=\"YES\"/>\n                                                </textField>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"SNh-cg-19I\" firstAttribute=\"centerY\" secondItem=\"eUH-lH-TE7\" secondAttribute=\"centerY\" id=\"1Zq-1j-YjA\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"SNh-cg-19I\" secondAttribute=\"trailing\" constant=\"4\" id=\"4kA-2Y-xY6\"/>\n                                                <constraint firstItem=\"0SC-U4-pD5\" firstAttribute=\"leading\" secondItem=\"eUH-lH-TE7\" secondAttribute=\"leadingMargin\" constant=\"3\" id=\"Q6r-vi-2Pi\"/>\n                                                <constraint firstItem=\"0SC-U4-pD5\" firstAttribute=\"centerY\" secondItem=\"eUH-lH-TE7\" secondAttribute=\"centerY\" id=\"gj6-1o-pyM\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705882352939\" green=\"0.31764705882352939\" blue=\"0.31764705882352939\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"none\" indentationWidth=\"10\" id=\"nCa-rG-MLH\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"224\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"nCa-rG-MLH\" id=\"OVh-ef-vBh\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Server Root Path: /var/www\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"S0q-jU-ufe\">\n                                                    <rect key=\"frame\" x=\"11\" y=\"11\" width=\"211\" height=\"21\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <switch opaque=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" enabled=\"NO\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"agr-Qp-9EH\">\n                                                    <rect key=\"frame\" x=\"539\" y=\"6\" width=\"51\" height=\"31\"/>\n                                                    <color key=\"onTintColor\" red=\"0.43529411759999997\" green=\"0.4431372549\" blue=\"0.47450980390000003\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                                    <connections>\n                                                        <action selector=\"pathEnableStatusChanged:\" destination=\"Yk7-ZO-Lem\" eventType=\"valueChanged\" id=\"RVe-8T-BJL\"/>\n                                                    </connections>\n                                                </switch>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"S0q-jU-ufe\" firstAttribute=\"leading\" secondItem=\"OVh-ef-vBh\" secondAttribute=\"leadingMargin\" constant=\"3\" id=\"2Di-Vi-VBk\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"agr-Qp-9EH\" secondAttribute=\"trailing\" constant=\"4\" id=\"Sdw-cP-4xk\"/>\n                                                <constraint firstItem=\"S0q-jU-ufe\" firstAttribute=\"centerY\" secondItem=\"OVh-ef-vBh\" secondAttribute=\"centerY\" id=\"ngv-88-po4\"/>\n                                                <constraint firstItem=\"agr-Qp-9EH\" firstAttribute=\"centerY\" secondItem=\"OVh-ef-vBh\" secondAttribute=\"centerY\" id=\"z2g-44-fkj\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705882352939\" green=\"0.31764705882352939\" blue=\"0.31764705882352939\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                            <tableViewSection headerTitle=\"Log\" id=\"EAX-Ah-V5s\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"none\" indentationWidth=\"10\" rowHeight=\"280\" id=\"g7K-TL-LR3\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"296\" width=\"600\" height=\"280\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"g7K-TL-LR3\" id=\"oqA-Wy-o40\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"279.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <textView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" editable=\"NO\" textAlignment=\"natural\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"dKI-Kf-Msj\">\n                                                    <rect key=\"frame\" x=\"8\" y=\"1\" width=\"584\" height=\"277.5\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                                    <textInputTraits key=\"textInputTraits\" autocapitalizationType=\"sentences\"/>\n                                                </textView>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"dKI-Kf-Msj\" firstAttribute=\"top\" secondItem=\"oqA-Wy-o40\" secondAttribute=\"topMargin\" constant=\"-7\" id=\"F7h-sN-TnY\"/>\n                                                <constraint firstItem=\"dKI-Kf-Msj\" firstAttribute=\"leading\" secondItem=\"oqA-Wy-o40\" secondAttribute=\"leadingMargin\" id=\"FUV-Yz-JVh\"/>\n                                                <constraint firstItem=\"dKI-Kf-Msj\" firstAttribute=\"centerY\" secondItem=\"oqA-Wy-o40\" secondAttribute=\"centerY\" id=\"MhE-Jk-eLx\"/>\n                                                <constraint firstItem=\"dKI-Kf-Msj\" firstAttribute=\"centerX\" secondItem=\"oqA-Wy-o40\" secondAttribute=\"centerX\" id=\"Qnf-lx-vGM\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"dKI-Kf-Msj\" secondAttribute=\"trailing\" constant=\"17\" id=\"XG7-Wj-Ksp\"/>\n                                                <constraint firstItem=\"dKI-Kf-Msj\" firstAttribute=\"leading\" secondItem=\"oqA-Wy-o40\" secondAttribute=\"leadingMargin\" constant=\"17\" id=\"kMd-je-Ds8\"/>\n                                            </constraints>\n                                            <variation key=\"default\">\n                                                <mask key=\"constraints\">\n                                                    <exclude reference=\"XG7-Wj-Ksp\"/>\n                                                    <exclude reference=\"kMd-je-Ds8\"/>\n                                                </mask>\n                                            </variation>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705882352939\" green=\"0.31764705882352939\" blue=\"0.31764705882352939\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                        </sections>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"Yk7-ZO-Lem\" id=\"BVh-mk-JQv\"/>\n                            <outlet property=\"delegate\" destination=\"Yk7-ZO-Lem\" id=\"raf-iu-EFN\"/>\n                        </connections>\n                    </tableView>\n                    <nil key=\"simulatedBottomBarMetrics\"/>\n                    <connections>\n                        <outlet property=\"ipLB\" destination=\"RhH-Rt-xU2\" id=\"GXx-gW-e1d\"/>\n                        <outlet property=\"logTV\" destination=\"dKI-Kf-Msj\" id=\"RVz-YF-2Xs\"/>\n                        <outlet property=\"pathSW\" destination=\"agr-Qp-9EH\" id=\"vrd-F5-Pk1\"/>\n                        <outlet property=\"portTF\" destination=\"SNh-cg-19I\" id=\"pK2-Ln-cjO\"/>\n                        <outlet property=\"serverSW\" destination=\"i9T-PC-p4S\" id=\"KkJ-M8-1Zy\"/>\n                    </connections>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dNV-Ya-t7x\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2290\" y=\"-360\"/>\n        </scene>\n        <!--Gist Table-->\n        <scene sceneID=\"aoc-4u-eiP\">\n            <objects>\n                <tableViewController hidesBottomBarWhenPushed=\"YES\" id=\"N8o-ue-gAt\" customClass=\"GistTable\" customModule=\"Sublime\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"28\" sectionFooterHeight=\"28\" id=\"Jfq-ah-d9t\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                        <prototypes>\n                            <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"gistCell\" rowHeight=\"250\" id=\"jb7-Tn-iST\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"92\" width=\"600\" height=\"250\"/>\n                                <autoresizingMask key=\"autoresizingMask\"/>\n                                <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" tag=\"1\" contentMode=\"center\" tableViewCell=\"jb7-Tn-iST\" id=\"wKX-Xs-HDW\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"249.5\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                    <subviews>\n                                        <imageView userInteractionEnabled=\"NO\" tag=\"6\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"github_avatar\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"luJ-mH-pVy\">\n                                            <rect key=\"frame\" x=\"8\" y=\"8\" width=\"40\" height=\"40\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"width\" constant=\"40\" id=\"Zdy-7Q-fgt\"/>\n                                                <constraint firstAttribute=\"height\" constant=\"40\" id=\"jf8-hF-1Ic\"/>\n                                            </constraints>\n                                        </imageView>\n                                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"3\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"project / file\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"sCJ-jx-pWH\">\n                                            <rect key=\"frame\" x=\"54\" y=\"8\" width=\"523\" height=\"15\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"15\" id=\"pid-kF-avx\"/>\n                                            </constraints>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                            <color key=\"textColor\" red=\"0.45098039220000002\" green=\"0.50196078430000002\" blue=\"0.62745098040000002\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"4\" contentMode=\"left\" text=\"loading ...\" lineBreakMode=\"characterWrap\" numberOfLines=\"0\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"aPw-7J-46f\">\n                                            <rect key=\"frame\" x=\"54\" y=\"28\" width=\"523\" height=\"28\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" relation=\"greaterThanOrEqual\" constant=\"15\" id=\"duq-pd-IT5\"/>\n                                                <constraint firstAttribute=\"width\" constant=\"200\" id=\"gym-90-EXQ\"/>\n                                            </constraints>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                            <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                            <variation key=\"default\">\n                                                <mask key=\"constraints\">\n                                                    <exclude reference=\"gym-90-EXQ\"/>\n                                                </mask>\n                                            </variation>\n                                        </label>\n                                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"5\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"n days ago\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"l65-qg-R6w\">\n                                            <rect key=\"frame\" x=\"54\" y=\"220\" width=\"200\" height=\"21\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"21\" id=\"FCm-dG-UA1\"/>\n                                                <constraint firstAttribute=\"width\" constant=\"200\" id=\"cTs-7c-Rgb\"/>\n                                            </constraints>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                            <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                        <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"comment\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"bqn-cR-xE4\">\n                                            <rect key=\"frame\" x=\"566\" y=\"218\" width=\"26\" height=\"24\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"24\" id=\"n82-yu-3Vr\"/>\n                                                <constraint firstAttribute=\"width\" constant=\"26\" id=\"yGn-nz-EAu\"/>\n                                            </constraints>\n                                        </imageView>\n                                        <view tag=\"2\" contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Jwj-iF-geR\">\n                                            <rect key=\"frame\" x=\"54\" y=\"63\" width=\"523\" height=\"150\"/>\n                                            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"width\" secondItem=\"Jwj-iF-geR\" secondAttribute=\"height\" multiplier=\"523:361\" id=\"q0o-vO-bhA\"/>\n                                                <constraint firstAttribute=\"height\" constant=\"150\" id=\"rvf-7Q-il4\"/>\n                                            </constraints>\n                                            <variation key=\"default\">\n                                                <mask key=\"constraints\">\n                                                    <exclude reference=\"q0o-vO-bhA\"/>\n                                                </mask>\n                                            </variation>\n                                        </view>\n                                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"7\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"0\" textAlignment=\"right\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"m5T-gy-Fgt\">\n                                            <rect key=\"frame\" x=\"519\" y=\"222\" width=\"42\" height=\"17\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"height\" constant=\"17\" id=\"AvS-vQ-EK5\"/>\n                                                <constraint firstAttribute=\"width\" constant=\"42\" id=\"qBE-SK-dbx\"/>\n                                            </constraints>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                            <color key=\"textColor\" red=\"0.45098039215686275\" green=\"0.50196078431372548\" blue=\"0.62745098039215685\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                    </subviews>\n                                    <constraints>\n                                        <constraint firstItem=\"sCJ-jx-pWH\" firstAttribute=\"leading\" secondItem=\"luJ-mH-pVy\" secondAttribute=\"trailing\" constant=\"6\" id=\"6Gz-TY-rk2\"/>\n                                        <constraint firstItem=\"luJ-mH-pVy\" firstAttribute=\"leading\" secondItem=\"wKX-Xs-HDW\" secondAttribute=\"leadingMargin\" constant=\"5\" id=\"8wF-MB-1Dw\"/>\n                                        <constraint firstAttribute=\"trailingMargin\" secondItem=\"aPw-7J-46f\" secondAttribute=\"trailing\" constant=\"15\" id=\"9SW-zj-OoT\"/>\n                                        <constraint firstAttribute=\"trailingMargin\" secondItem=\"bqn-cR-xE4\" secondAttribute=\"trailing\" id=\"ADS-zs-dot\"/>\n                                        <constraint firstItem=\"Jwj-iF-geR\" firstAttribute=\"top\" secondItem=\"aPw-7J-46f\" secondAttribute=\"bottom\" constant=\"7\" id=\"Afe-l9-lG5\"/>\n                                        <constraint firstAttribute=\"topMargin\" secondItem=\"luJ-mH-pVy\" secondAttribute=\"top\" id=\"G3Q-Ve-hTS\"/>\n                                        <constraint firstItem=\"Jwj-iF-geR\" firstAttribute=\"leading\" secondItem=\"aPw-7J-46f\" secondAttribute=\"leading\" id=\"KaZ-X0-b8W\"/>\n                                        <constraint firstItem=\"aPw-7J-46f\" firstAttribute=\"trailing\" secondItem=\"sCJ-jx-pWH\" secondAttribute=\"trailing\" id=\"NYj-6X-odh\"/>\n                                        <constraint firstAttribute=\"bottomMargin\" secondItem=\"bqn-cR-xE4\" secondAttribute=\"bottom\" constant=\"-0.5\" id=\"NsJ-4D-uRt\"/>\n                                        <constraint firstItem=\"aPw-7J-46f\" firstAttribute=\"leading\" secondItem=\"luJ-mH-pVy\" secondAttribute=\"trailing\" constant=\"12\" id=\"URM-QO-lf4\"/>\n                                        <constraint firstItem=\"aPw-7J-46f\" firstAttribute=\"top\" secondItem=\"sCJ-jx-pWH\" secondAttribute=\"bottom\" id=\"Xvm-dR-Xqt\"/>\n                                        <constraint firstAttribute=\"leadingMargin\" secondItem=\"luJ-mH-pVy\" secondAttribute=\"leading\" id=\"cAw-c0-qan\"/>\n                                        <constraint firstItem=\"l65-qg-R6w\" firstAttribute=\"leading\" secondItem=\"Jwj-iF-geR\" secondAttribute=\"leading\" id=\"e1F-Sv-Q48\"/>\n                                        <constraint firstItem=\"aPw-7J-46f\" firstAttribute=\"top\" secondItem=\"sCJ-jx-pWH\" secondAttribute=\"bottom\" constant=\"5\" id=\"gzK-lj-QKM\"/>\n                                        <constraint firstItem=\"m5T-gy-Fgt\" firstAttribute=\"centerY\" secondItem=\"bqn-cR-xE4\" secondAttribute=\"centerY\" id=\"iAh-wo-Heh\"/>\n                                        <constraint firstItem=\"bqn-cR-xE4\" firstAttribute=\"leading\" secondItem=\"m5T-gy-Fgt\" secondAttribute=\"trailing\" constant=\"5\" id=\"jb2-Zg-xBG\"/>\n                                        <constraint firstAttribute=\"bottomMargin\" secondItem=\"l65-qg-R6w\" secondAttribute=\"bottom\" constant=\"0.5\" id=\"lK7-Mv-b6o\"/>\n                                        <constraint firstAttribute=\"bottomMargin\" secondItem=\"Jwj-iF-geR\" secondAttribute=\"bottom\" constant=\"28.5\" id=\"p4i-hS-8Sf\"/>\n                                        <constraint firstAttribute=\"topMargin\" secondItem=\"sCJ-jx-pWH\" secondAttribute=\"top\" id=\"qKq-ow-S8x\"/>\n                                        <constraint firstItem=\"aPw-7J-46f\" firstAttribute=\"leading\" secondItem=\"sCJ-jx-pWH\" secondAttribute=\"leading\" id=\"u4d-8T-wjS\"/>\n                                        <constraint firstAttribute=\"trailingMargin\" secondItem=\"sCJ-jx-pWH\" secondAttribute=\"trailing\" constant=\"15\" id=\"xJo-ZN-xmy\"/>\n                                        <constraint firstItem=\"Jwj-iF-geR\" firstAttribute=\"trailing\" secondItem=\"aPw-7J-46f\" secondAttribute=\"trailing\" id=\"zAs-fY-kzH\"/>\n                                    </constraints>\n                                    <variation key=\"default\">\n                                        <mask key=\"constraints\">\n                                            <exclude reference=\"8wF-MB-1Dw\"/>\n                                            <exclude reference=\"9SW-zj-OoT\"/>\n                                            <exclude reference=\"URM-QO-lf4\"/>\n                                            <exclude reference=\"Xvm-dR-Xqt\"/>\n                                        </mask>\n                                    </variation>\n                                </tableViewCellContentView>\n                            </tableViewCell>\n                        </prototypes>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"N8o-ue-gAt\" id=\"RGu-ey-bbZ\"/>\n                            <outlet property=\"delegate\" destination=\"N8o-ue-gAt\" id=\"4yx-J9-3Ya\"/>\n                        </connections>\n                    </tableView>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"X64-gx-eWR\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"3012\" y=\"-360\"/>\n        </scene>\n        <!--Github Account Table View Controller-->\n        <scene sceneID=\"b2V-Qj-WpY\">\n            <objects>\n                <tableViewController hidesBottomBarWhenPushed=\"YES\" id=\"1xa-CC-QiM\" customClass=\"GithubAccountTableViewController\" customModule=\"Sublime\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"static\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"28\" sectionFooterHeight=\"28\" id=\"B7k-J8-JNs\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <color key=\"separatorColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <color key=\"sectionIndexBackgroundColor\" white=\"0.34798108550000001\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                        <color key=\"sectionIndexTrackingBackgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <sections>\n                            <tableViewSection headerTitle=\" \" id=\"XQe-3F-SBO\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"none\" indentationWidth=\"10\" rowHeight=\"89\" id=\"6db-Gs-R7A\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"92\" width=\"600\" height=\"89\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"6db-Gs-R7A\" id=\"p4g-aI-UpD\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"88.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"100\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"github_avatar\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"5Ic-hC-nT4\">\n                                                    <rect key=\"frame\" x=\"18\" y=\"10\" width=\"70\" height=\"70\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"70\" id=\"kgy-sa-MdQ\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"70\" id=\"mwk-om-HyZ\"/>\n                                                    </constraints>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"101\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Name\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"5fT-qk-gPQ\">\n                                                    <rect key=\"frame\" x=\"98\" y=\"20\" width=\"494\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"tLj-Sq-jG5\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"102\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"ID\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"rC1-c7-K2w\">\n                                                    <rect key=\"frame\" x=\"98\" y=\"52\" width=\"494\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"mWS-3c-xCd\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"5Ic-hC-nT4\" firstAttribute=\"centerY\" secondItem=\"p4g-aI-UpD\" secondAttribute=\"centerY\" id=\"95w-Fb-ftN\"/>\n                                                <constraint firstAttribute=\"bottomMargin\" secondItem=\"rC1-c7-K2w\" secondAttribute=\"bottom\" constant=\"7.5\" id=\"9da-Q5-TdH\"/>\n                                                <constraint firstItem=\"5Ic-hC-nT4\" firstAttribute=\"leading\" secondItem=\"p4g-aI-UpD\" secondAttribute=\"leadingMargin\" constant=\"10\" id=\"M0b-bA-4IF\"/>\n                                                <constraint firstItem=\"5fT-qk-gPQ\" firstAttribute=\"top\" secondItem=\"p4g-aI-UpD\" secondAttribute=\"topMargin\" constant=\"12\" id=\"Ngx-ld-jFk\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"rC1-c7-K2w\" secondAttribute=\"trailing\" id=\"Oir-Us-B7G\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"5fT-qk-gPQ\" secondAttribute=\"trailing\" id=\"OpS-K7-vFy\"/>\n                                                <constraint firstItem=\"rC1-c7-K2w\" firstAttribute=\"leading\" secondItem=\"5Ic-hC-nT4\" secondAttribute=\"trailing\" constant=\"10\" id=\"uuZ-PU-m0d\"/>\n                                                <constraint firstItem=\"5fT-qk-gPQ\" firstAttribute=\"leading\" secondItem=\"5Ic-hC-nT4\" secondAttribute=\"trailing\" constant=\"10\" id=\"yXo-To-BG4\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705882352939\" green=\"0.31764705882352939\" blue=\"0.31764705882352939\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"none\" indentationWidth=\"10\" rowHeight=\"44\" id=\"78u-gC-o6G\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"181\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"78u-gC-o6G\" id=\"M47-K2-fsx\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Company:\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"5WA-An-MYO\">\n                                                    <rect key=\"frame\" x=\"17\" y=\"11.5\" width=\"78\" height=\"20.5\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"78\" id=\"iOS-7z-fqg\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"103\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"2aA-0O-y9B\">\n                                                    <rect key=\"frame\" x=\"103\" y=\"11.5\" width=\"489\" height=\"20.5\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"20.5\" id=\"MMK-rk-2qh\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"ytE-Kc-pze\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                    <variation key=\"default\">\n                                                        <mask key=\"constraints\">\n                                                            <exclude reference=\"ytE-Kc-pze\"/>\n                                                        </mask>\n                                                    </variation>\n                                                </label>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"2aA-0O-y9B\" firstAttribute=\"leading\" secondItem=\"5WA-An-MYO\" secondAttribute=\"trailing\" constant=\"8\" id=\"WID-Br-E5U\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"2aA-0O-y9B\" secondAttribute=\"trailing\" id=\"YMg-po-BmL\"/>\n                                                <constraint firstItem=\"5WA-An-MYO\" firstAttribute=\"leading\" secondItem=\"M47-K2-fsx\" secondAttribute=\"leadingMargin\" constant=\"9\" id=\"dfq-eH-5Lr\"/>\n                                                <constraint firstItem=\"2aA-0O-y9B\" firstAttribute=\"centerY\" secondItem=\"M47-K2-fsx\" secondAttribute=\"centerY\" id=\"hz9-cj-mLX\"/>\n                                                <constraint firstItem=\"5WA-An-MYO\" firstAttribute=\"centerY\" secondItem=\"M47-K2-fsx\" secondAttribute=\"centerY\" id=\"s5e-N9-oWC\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705882352939\" green=\"0.31764705882352939\" blue=\"0.31764705882352939\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"none\" indentationWidth=\"10\" rowHeight=\"44\" id=\"GZv-wt-tNo\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"225\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"GZv-wt-tNo\" id=\"IDF-HZ-Hom\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Location:\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"WHq-EY-gwF\">\n                                                    <rect key=\"frame\" x=\"18\" y=\"11.5\" width=\"71\" height=\"20.5\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"71\" id=\"pe4-4J-RLU\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"104\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4lp-s9-qhZ\">\n                                                    <rect key=\"frame\" x=\"97\" y=\"11.5\" width=\"495\" height=\"20.5\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"20.5\" id=\"81P-3a-jqE\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"nVJ-de-VpM\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                    <variation key=\"default\">\n                                                        <mask key=\"constraints\">\n                                                            <exclude reference=\"nVJ-de-VpM\"/>\n                                                        </mask>\n                                                    </variation>\n                                                </label>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"4lp-s9-qhZ\" secondAttribute=\"trailing\" id=\"L57-D6-iko\"/>\n                                                <constraint firstItem=\"WHq-EY-gwF\" firstAttribute=\"centerY\" secondItem=\"IDF-HZ-Hom\" secondAttribute=\"centerY\" id=\"Lz5-ED-BEc\"/>\n                                                <constraint firstItem=\"WHq-EY-gwF\" firstAttribute=\"leading\" secondItem=\"IDF-HZ-Hom\" secondAttribute=\"leadingMargin\" constant=\"10\" id=\"ZjI-GB-dvB\"/>\n                                                <constraint firstItem=\"4lp-s9-qhZ\" firstAttribute=\"leading\" secondItem=\"WHq-EY-gwF\" secondAttribute=\"trailing\" constant=\"8\" id=\"bqg-ei-j7u\"/>\n                                                <constraint firstItem=\"4lp-s9-qhZ\" firstAttribute=\"centerY\" secondItem=\"IDF-HZ-Hom\" secondAttribute=\"centerY\" id=\"vCX-eG-QHD\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"none\" indentationWidth=\"10\" rowHeight=\"44\" id=\"ALE-Ra-Y3Z\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"269\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"ALE-Ra-Y3Z\" id=\"W1F-zA-FVu\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Email:\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ss3-BQ-CVo\">\n                                                    <rect key=\"frame\" x=\"18\" y=\"11\" width=\"46\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"46\" id=\"JWg-ex-Vez\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"105\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"zTz-yw-9jp\">\n                                                    <rect key=\"frame\" x=\"72\" y=\"11\" width=\"520\" height=\"20.5\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"20.5\" id=\"9BE-6h-wmw\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"K2F-a3-FiO\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                    <variation key=\"default\">\n                                                        <mask key=\"constraints\">\n                                                            <exclude reference=\"K2F-a3-FiO\"/>\n                                                        </mask>\n                                                    </variation>\n                                                </label>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"ss3-BQ-CVo\" firstAttribute=\"leading\" secondItem=\"W1F-zA-FVu\" secondAttribute=\"leadingMargin\" constant=\"10\" id=\"CGl-Zg-zvl\"/>\n                                                <constraint firstItem=\"zTz-yw-9jp\" firstAttribute=\"centerY\" secondItem=\"W1F-zA-FVu\" secondAttribute=\"centerY\" id=\"HN7-Uf-8GT\"/>\n                                                <constraint firstItem=\"ss3-BQ-CVo\" firstAttribute=\"centerY\" secondItem=\"W1F-zA-FVu\" secondAttribute=\"centerY\" id=\"pLk-DC-8co\"/>\n                                                <constraint firstItem=\"zTz-yw-9jp\" firstAttribute=\"leading\" secondItem=\"ss3-BQ-CVo\" secondAttribute=\"trailing\" constant=\"8\" id=\"q8w-QC-TfT\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"zTz-yw-9jp\" secondAttribute=\"trailing\" id=\"vre-1j-QKq\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"none\" indentationWidth=\"10\" rowHeight=\"44\" id=\"tTS-lg-YAX\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"313\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"tTS-lg-YAX\" id=\"r0T-ql-UZM\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Blog:\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"7IE-bm-Byv\">\n                                                    <rect key=\"frame\" x=\"18\" y=\"11.5\" width=\"39\" height=\"20.5\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"39\" id=\"q7G-L2-8Wk\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"106\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"DPF-L1-hYn\">\n                                                    <rect key=\"frame\" x=\"65\" y=\"11\" width=\"527\" height=\"20.5\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"20.5\" id=\"lpw-FE-P1V\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"vxU-1e-87D\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                    <variation key=\"default\">\n                                                        <mask key=\"constraints\">\n                                                            <exclude reference=\"vxU-1e-87D\"/>\n                                                        </mask>\n                                                    </variation>\n                                                </label>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"DPF-L1-hYn\" secondAttribute=\"trailing\" id=\"6x4-bf-hIE\"/>\n                                                <constraint firstItem=\"DPF-L1-hYn\" firstAttribute=\"centerY\" secondItem=\"r0T-ql-UZM\" secondAttribute=\"centerY\" id=\"WvU-g4-IOY\"/>\n                                                <constraint firstItem=\"7IE-bm-Byv\" firstAttribute=\"centerY\" secondItem=\"r0T-ql-UZM\" secondAttribute=\"centerY\" id=\"dOZ-c3-uN0\"/>\n                                                <constraint firstItem=\"7IE-bm-Byv\" firstAttribute=\"leading\" secondItem=\"r0T-ql-UZM\" secondAttribute=\"leadingMargin\" constant=\"10\" id=\"s7i-Js-TXy\"/>\n                                                <constraint firstItem=\"DPF-L1-hYn\" firstAttribute=\"leading\" secondItem=\"7IE-bm-Byv\" secondAttribute=\"trailing\" constant=\"8\" id=\"sOF-LH-bMA\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"none\" indentationWidth=\"10\" rowHeight=\"44\" id=\"D39-qU-WsP\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"357\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"D39-qU-WsP\" id=\"D0L-IA-Uwr\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Disk Usage:\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"bz9-17-31M\">\n                                                    <rect key=\"frame\" x=\"18\" y=\"11\" width=\"92\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"92\" id=\"lW0-68-Elh\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"107\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"FRv-qX-imq\">\n                                                    <rect key=\"frame\" x=\"118\" y=\"11\" width=\"474\" height=\"20.5\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"rGP-Tp-0ks\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"20.5\" id=\"rXJ-Qg-Hkb\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                    <variation key=\"default\">\n                                                        <mask key=\"constraints\">\n                                                            <exclude reference=\"rGP-Tp-0ks\"/>\n                                                        </mask>\n                                                    </variation>\n                                                </label>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"FRv-qX-imq\" firstAttribute=\"centerY\" secondItem=\"D0L-IA-Uwr\" secondAttribute=\"centerY\" id=\"G5j-Hc-FfP\"/>\n                                                <constraint firstItem=\"bz9-17-31M\" firstAttribute=\"leading\" secondItem=\"D0L-IA-Uwr\" secondAttribute=\"leadingMargin\" constant=\"10\" id=\"SMk-S1-yJv\"/>\n                                                <constraint firstItem=\"bz9-17-31M\" firstAttribute=\"centerY\" secondItem=\"D0L-IA-Uwr\" secondAttribute=\"centerY\" id=\"VhW-s9-Udk\"/>\n                                                <constraint firstItem=\"FRv-qX-imq\" firstAttribute=\"leading\" secondItem=\"bz9-17-31M\" secondAttribute=\"trailing\" constant=\"8\" id=\"hVL-fY-hU0\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"FRv-qX-imq\" secondAttribute=\"trailing\" id=\"xfj-vR-gmt\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                            <tableViewSection headerTitle=\" \" id=\"Q9C-bx-i7A\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"none\" indentationWidth=\"10\" rowHeight=\"71\" id=\"KP5-uv-y62\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"429\" width=\"600\" height=\"71\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"KP5-uv-y62\" id=\"CCg-zp-yjP\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"70.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <stackView opaque=\"NO\" contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"p97-xv-ofq\">\n                                                    <rect key=\"frame\" x=\"8\" y=\"8\" width=\"584\" height=\"55\"/>\n                                                    <subviews>\n                                                        <stackView opaque=\"NO\" contentMode=\"scaleToFill\" axis=\"vertical\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"TSV-60-8Pn\">\n                                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"194.5\" height=\"55\"/>\n                                                            <subviews>\n                                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"20\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"B9x-BB-Gth\">\n                                                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"194.5\" height=\"31\"/>\n                                                                    <constraints>\n                                                                        <constraint firstAttribute=\"height\" constant=\"31\" id=\"xdh-8D-H1p\"/>\n                                                                    </constraints>\n                                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"26\"/>\n                                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                                    <nil key=\"highlightedColor\"/>\n                                                                </label>\n                                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Followers\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"I9K-KJ-V1w\">\n                                                                    <rect key=\"frame\" x=\"0.0\" y=\"31\" width=\"194.5\" height=\"24\"/>\n                                                                    <constraints>\n                                                                        <constraint firstAttribute=\"height\" constant=\"24\" id=\"xWf-of-SoK\"/>\n                                                                    </constraints>\n                                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                                    <nil key=\"highlightedColor\"/>\n                                                                </label>\n                                                            </subviews>\n                                                            <constraints>\n                                                                <constraint firstAttribute=\"height\" constant=\"55\" id=\"9tt-gO-Bvc\"/>\n                                                                <constraint firstItem=\"B9x-BB-Gth\" firstAttribute=\"width\" secondItem=\"TSV-60-8Pn\" secondAttribute=\"width\" id=\"ihb-ED-YE1\"/>\n                                                                <constraint firstItem=\"I9K-KJ-V1w\" firstAttribute=\"width\" secondItem=\"TSV-60-8Pn\" secondAttribute=\"width\" id=\"z2f-fO-bay\"/>\n                                                            </constraints>\n                                                        </stackView>\n                                                        <stackView opaque=\"NO\" contentMode=\"scaleToFill\" axis=\"vertical\" alignment=\"center\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Kec-fq-1PH\">\n                                                            <rect key=\"frame\" x=\"194.5\" y=\"0.0\" width=\"195\" height=\"55\"/>\n                                                            <subviews>\n                                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"20\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"LoQ-XF-LRl\">\n                                                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"195\" height=\"34\"/>\n                                                                    <constraints>\n                                                                        <constraint firstAttribute=\"height\" constant=\"34\" id=\"hpS-wa-sX1\"/>\n                                                                    </constraints>\n                                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"26\"/>\n                                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                                    <nil key=\"highlightedColor\"/>\n                                                                </label>\n                                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Repos\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"auz-mi-I7H\">\n                                                                    <rect key=\"frame\" x=\"0.0\" y=\"34\" width=\"195\" height=\"21\"/>\n                                                                    <constraints>\n                                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"VYt-GD-p5y\"/>\n                                                                    </constraints>\n                                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                                    <nil key=\"highlightedColor\"/>\n                                                                </label>\n                                                            </subviews>\n                                                            <constraints>\n                                                                <constraint firstAttribute=\"height\" constant=\"55\" id=\"I2k-k6-jY2\"/>\n                                                                <constraint firstItem=\"auz-mi-I7H\" firstAttribute=\"width\" secondItem=\"Kec-fq-1PH\" secondAttribute=\"width\" id=\"MY3-vC-xVZ\"/>\n                                                                <constraint firstItem=\"LoQ-XF-LRl\" firstAttribute=\"width\" secondItem=\"Kec-fq-1PH\" secondAttribute=\"width\" id=\"k0F-tW-Llg\"/>\n                                                            </constraints>\n                                                        </stackView>\n                                                        <stackView opaque=\"NO\" contentMode=\"scaleToFill\" axis=\"vertical\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"WUb-8E-aJT\">\n                                                            <rect key=\"frame\" x=\"389.5\" y=\"0.0\" width=\"194.5\" height=\"55\"/>\n                                                            <subviews>\n                                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"20\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"h22-kq-CuF\">\n                                                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"194.5\" height=\"32\"/>\n                                                                    <constraints>\n                                                                        <constraint firstAttribute=\"height\" constant=\"32\" id=\"c2E-m8-3k8\"/>\n                                                                    </constraints>\n                                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"26\"/>\n                                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                                    <nil key=\"highlightedColor\"/>\n                                                                </label>\n                                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Following\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"en1-0Q-eDb\">\n                                                                    <rect key=\"frame\" x=\"0.0\" y=\"32\" width=\"194.5\" height=\"23\"/>\n                                                                    <constraints>\n                                                                        <constraint firstAttribute=\"height\" constant=\"23\" id=\"leh-se-oeC\"/>\n                                                                    </constraints>\n                                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                                    <nil key=\"highlightedColor\"/>\n                                                                </label>\n                                                            </subviews>\n                                                            <constraints>\n                                                                <constraint firstItem=\"h22-kq-CuF\" firstAttribute=\"width\" secondItem=\"WUb-8E-aJT\" secondAttribute=\"width\" id=\"SQd-L7-MXN\"/>\n                                                                <constraint firstAttribute=\"height\" constant=\"55\" id=\"azK-N2-n8j\"/>\n                                                                <constraint firstItem=\"en1-0Q-eDb\" firstAttribute=\"width\" secondItem=\"WUb-8E-aJT\" secondAttribute=\"width\" id=\"oEh-NE-hnG\"/>\n                                                            </constraints>\n                                                        </stackView>\n                                                    </subviews>\n                                                    <constraints>\n                                                        <constraint firstItem=\"WUb-8E-aJT\" firstAttribute=\"width\" secondItem=\"TSV-60-8Pn\" secondAttribute=\"width\" id=\"Dbc-9L-74v\"/>\n                                                        <constraint firstItem=\"Kec-fq-1PH\" firstAttribute=\"width\" secondItem=\"WUb-8E-aJT\" secondAttribute=\"width\" id=\"Lbu-KS-urG\"/>\n                                                        <constraint firstItem=\"Kec-fq-1PH\" firstAttribute=\"width\" secondItem=\"TSV-60-8Pn\" secondAttribute=\"width\" id=\"UIW-qh-ZvJ\"/>\n                                                        <constraint firstItem=\"WUb-8E-aJT\" firstAttribute=\"width\" secondItem=\"TSV-60-8Pn\" secondAttribute=\"width\" id=\"rws-zd-QYS\"/>\n                                                    </constraints>\n                                                    <variation key=\"default\">\n                                                        <mask key=\"constraints\">\n                                                            <exclude reference=\"Lbu-KS-urG\"/>\n                                                            <exclude reference=\"rws-zd-QYS\"/>\n                                                        </mask>\n                                                    </variation>\n                                                </stackView>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstAttribute=\"bottomMargin\" secondItem=\"p97-xv-ofq\" secondAttribute=\"bottom\" id=\"DYx-U9-AHV\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"p97-xv-ofq\" secondAttribute=\"trailing\" id=\"PIk-te-t2Q\"/>\n                                                <constraint firstItem=\"p97-xv-ofq\" firstAttribute=\"leading\" secondItem=\"CCg-zp-yjP\" secondAttribute=\"leadingMargin\" id=\"WTZ-of-WXY\"/>\n                                                <constraint firstItem=\"p97-xv-ofq\" firstAttribute=\"top\" secondItem=\"CCg-zp-yjP\" secondAttribute=\"topMargin\" id=\"iQN-Gp-cPf\"/>\n                                            </constraints>\n                                            <variation key=\"default\">\n                                                <mask key=\"constraints\">\n                                                    <exclude reference=\"DYx-U9-AHV\"/>\n                                                </mask>\n                                            </variation>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                            <tableViewSection headerTitle=\" \" id=\"F89-Aq-Jz3\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" rowHeight=\"44\" id=\"PXW-bD-sQy\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"528\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"PXW-bD-sQy\" id=\"QiE-yD-POU\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Log out\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kwA-Uj-951\">\n                                                    <rect key=\"frame\" x=\"205\" y=\"8\" width=\"191\" height=\"27.5\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"27.5\" id=\"CT7-fI-WKP\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"191\" id=\"VEW-Ge-W6r\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"kwA-Uj-951\" firstAttribute=\"centerX\" secondItem=\"QiE-yD-POU\" secondAttribute=\"centerX\" id=\"O1q-Ty-PDu\"/>\n                                                <constraint firstItem=\"kwA-Uj-951\" firstAttribute=\"centerY\" secondItem=\"QiE-yD-POU\" secondAttribute=\"centerY\" id=\"mic-QM-OE5\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                        </sections>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"1xa-CC-QiM\" id=\"oYV-PX-OfZ\"/>\n                            <outlet property=\"delegate\" destination=\"1xa-CC-QiM\" id=\"Cef-CK-VT7\"/>\n                        </connections>\n                    </tableView>\n                    <nil key=\"simulatedBottomBarMetrics\"/>\n                    <connections>\n                        <outlet property=\"avatarView\" destination=\"5Ic-hC-nT4\" id=\"5AJ-m1-ast\"/>\n                        <outlet property=\"blogLB\" destination=\"DPF-L1-hYn\" id=\"dJJ-l5-tPL\"/>\n                        <outlet property=\"companyLB\" destination=\"2aA-0O-y9B\" id=\"m9e-m6-5vB\"/>\n                        <outlet property=\"emailLB\" destination=\"zTz-yw-9jp\" id=\"23I-1Y-1kP\"/>\n                        <outlet property=\"followerLB\" destination=\"B9x-BB-Gth\" id=\"dq8-XA-dtM\"/>\n                        <outlet property=\"followingLB\" destination=\"h22-kq-CuF\" id=\"OJo-bh-2jA\"/>\n                        <outlet property=\"idLB\" destination=\"rC1-c7-K2w\" id=\"Naj-58-NEa\"/>\n                        <outlet property=\"locationLB\" destination=\"4lp-s9-qhZ\" id=\"ZiM-4V-Fuv\"/>\n                        <outlet property=\"nameLB\" destination=\"5fT-qk-gPQ\" id=\"jzo-dJ-rV2\"/>\n                        <outlet property=\"repoLB\" destination=\"LoQ-XF-LRl\" id=\"GZd-KZ-526\"/>\n                        <outlet property=\"usageLB\" destination=\"FRv-qX-imq\" id=\"eZj-9r-Ale\"/>\n                    </connections>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"zQ0-JX-qrG\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2290\" y=\"346\"/>\n        </scene>\n        <!--Tab Bar Controller-->\n        <scene sceneID=\"yl2-sM-qoP\">\n            <objects>\n                <tabBarController id=\"49e-Tb-3d3\" sceneMemberID=\"viewController\">\n                    <nil key=\"simulatedBottomBarMetrics\"/>\n                    <tabBar key=\"tabBar\" contentMode=\"scaleToFill\" id=\"W28-zg-YXA\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"975\" width=\"768\" height=\"49\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" flexibleMinY=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"calibratedWhite\"/>\n                    </tabBar>\n                    <connections>\n                        <segue destination=\"uNO-pp-eSv\" kind=\"relationship\" relationship=\"viewControllers\" id=\"u7Y-xg-7CH\"/>\n                        <segue destination=\"cjt-uh-CfW\" kind=\"relationship\" relationship=\"viewControllers\" id=\"nR4-Vw-N7Z\"/>\n                        <segue destination=\"r8F-sT-6fz\" kind=\"relationship\" relationship=\"viewControllers\" id=\"lzU-1b-eKA\"/>\n                    </connections>\n                </tabBarController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"HuB-VB-40B\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"32\" y=\"-84\"/>\n        </scene>\n        <!--Explore-->\n        <scene sceneID=\"EOH-xY-Z2e\">\n            <objects>\n                <tableViewController id=\"3yT-kD-4Nb\" customClass=\"ExploreTableViewController\" customModule=\"Sublime\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"static\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"28\" sectionFooterHeight=\"28\" id=\"W74-me-Df1\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"0.31764705882352939\" green=\"0.31764705882352939\" blue=\"0.31764705882352939\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <color key=\"separatorColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <color key=\"sectionIndexBackgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <color key=\"sectionIndexTrackingBackgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <sections>\n                            <tableViewSection headerTitle=\"Explore\" id=\"tuo-Ju-UTP\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"SettingTableCellIdentifier\" id=\"Wgm-jQ-HYS\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"92\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"Wgm-jQ-HYS\" id=\"IeT-MS-cF6\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"100\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"explore_codezZ\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"QJg-9O-IkK\">\n                                                    <rect key=\"frame\" x=\"14\" y=\"8\" width=\"28\" height=\"28\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"28\" id=\"nEP-lf-5yt\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"28\" id=\"uO2-gy-5Qb\"/>\n                                                    </constraints>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"101\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Gist\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"1zL-cj-684\">\n                                                    <rect key=\"frame\" x=\"53\" y=\"12\" width=\"520\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"cgt-XA-HOj\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"102\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"right_arrow\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"SW5-dQ-1me\">\n                                                    <rect key=\"frame\" x=\"581\" y=\"16\" width=\"7\" height=\"11\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"11\" id=\"HWI-Bn-1Fp\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"7\" id=\"sb3-fI-NX0\"/>\n                                                    </constraints>\n                                                </imageView>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"SW5-dQ-1me\" firstAttribute=\"centerY\" secondItem=\"IeT-MS-cF6\" secondAttribute=\"centerY\" id=\"19C-Vz-FGE\"/>\n                                                <constraint firstItem=\"1zL-cj-684\" firstAttribute=\"leading\" secondItem=\"QJg-9O-IkK\" secondAttribute=\"trailing\" constant=\"11\" id=\"53W-Sl-9BO\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"SW5-dQ-1me\" secondAttribute=\"trailing\" constant=\"4\" id=\"94a-u4-yEB\"/>\n                                                <constraint firstItem=\"1zL-cj-684\" firstAttribute=\"centerY\" secondItem=\"IeT-MS-cF6\" secondAttribute=\"centerY\" id=\"NgE-kc-ZVP\"/>\n                                                <constraint firstItem=\"SW5-dQ-1me\" firstAttribute=\"leading\" secondItem=\"1zL-cj-684\" secondAttribute=\"trailing\" constant=\"8\" id=\"TLz-CC-CtB\"/>\n                                                <constraint firstItem=\"QJg-9O-IkK\" firstAttribute=\"centerY\" secondItem=\"IeT-MS-cF6\" secondAttribute=\"centerY\" id=\"dWD-Wq-r4P\"/>\n                                                <constraint firstItem=\"QJg-9O-IkK\" firstAttribute=\"leading\" secondItem=\"IeT-MS-cF6\" secondAttribute=\"leadingMargin\" constant=\"6\" id=\"lpB-Zz-Mb2\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                        <connections>\n                                            <segue destination=\"N8o-ue-gAt\" kind=\"show\" id=\"gzx-mS-3QT\"/>\n                                        </connections>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                            <tableViewSection headerTitle=\"Function\" id=\"iI1-Dj-TC6\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"SettingTableCellIdentifier\" id=\"bfY-mY-mQA\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"164\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"bfY-mY-mQA\" id=\"58e-Ib-yGW\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"100\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"setting_server\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"m2E-is-zon\">\n                                                    <rect key=\"frame\" x=\"14\" y=\"8\" width=\"28\" height=\"28\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"28\" id=\"Dbb-Ew-UyG\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"28\" id=\"nXp-Eh-ufc\"/>\n                                                    </constraints>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"101\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"HTTP\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Ogi-UA-eb2\">\n                                                    <rect key=\"frame\" x=\"53\" y=\"12\" width=\"520\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"HoK-Id-tau\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"102\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"right_arrow\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"GUQ-5p-0wj\">\n                                                    <rect key=\"frame\" x=\"581\" y=\"16\" width=\"7\" height=\"11\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"7\" id=\"Guw-lK-HbV\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"11\" id=\"Wdd-2P-NMe\"/>\n                                                    </constraints>\n                                                </imageView>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"GUQ-5p-0wj\" firstAttribute=\"leading\" secondItem=\"Ogi-UA-eb2\" secondAttribute=\"trailing\" constant=\"8\" id=\"2gy-U6-6SG\"/>\n                                                <constraint firstItem=\"m2E-is-zon\" firstAttribute=\"centerY\" secondItem=\"58e-Ib-yGW\" secondAttribute=\"centerY\" id=\"5io-ky-dlp\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"GUQ-5p-0wj\" secondAttribute=\"trailing\" constant=\"4\" id=\"Do2-JJ-07M\"/>\n                                                <constraint firstItem=\"Ogi-UA-eb2\" firstAttribute=\"centerY\" secondItem=\"58e-Ib-yGW\" secondAttribute=\"centerY\" id=\"Eh2-kY-67c\"/>\n                                                <constraint firstItem=\"GUQ-5p-0wj\" firstAttribute=\"centerY\" secondItem=\"58e-Ib-yGW\" secondAttribute=\"centerY\" id=\"LGZ-ZV-TOS\"/>\n                                                <constraint firstItem=\"m2E-is-zon\" firstAttribute=\"leading\" secondItem=\"58e-Ib-yGW\" secondAttribute=\"leadingMargin\" constant=\"6\" id=\"Udn-eG-Isf\"/>\n                                                <constraint firstItem=\"Ogi-UA-eb2\" firstAttribute=\"leading\" secondItem=\"m2E-is-zon\" secondAttribute=\"trailing\" constant=\"11\" id=\"Vpq-6M-GGf\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                        <connections>\n                                            <segue destination=\"Yk7-ZO-Lem\" kind=\"show\" id=\"3gw-Uy-ebg\"/>\n                                        </connections>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"SettingTableCellIdentifier\" id=\"PPp-Bb-zeF\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"208\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"PPp-Bb-zeF\" id=\"T6m-Hh-Guh\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"100\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"setting_ssh\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"s0O-fq-OyV\">\n                                                    <rect key=\"frame\" x=\"14\" y=\"8\" width=\"28\" height=\"28\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"28\" id=\"4Vc-az-nSd\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"28\" id=\"iCO-lH-SMg\"/>\n                                                    </constraints>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"101\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"SSH\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ziQ-wW-pa5\">\n                                                    <rect key=\"frame\" x=\"53\" y=\"12\" width=\"520\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"nS7-Nb-GFw\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"102\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"right_arrow\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"lli-OU-Mgi\">\n                                                    <rect key=\"frame\" x=\"581\" y=\"16\" width=\"7\" height=\"11\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"7\" id=\"8am-Sl-Ric\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"11\" id=\"gzE-o3-bcS\"/>\n                                                    </constraints>\n                                                </imageView>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"ziQ-wW-pa5\" firstAttribute=\"centerY\" secondItem=\"T6m-Hh-Guh\" secondAttribute=\"centerY\" id=\"HUN-1O-T59\"/>\n                                                <constraint firstItem=\"lli-OU-Mgi\" firstAttribute=\"leading\" secondItem=\"ziQ-wW-pa5\" secondAttribute=\"trailing\" constant=\"8\" id=\"PaT-9c-hE7\"/>\n                                                <constraint firstItem=\"lli-OU-Mgi\" firstAttribute=\"centerY\" secondItem=\"T6m-Hh-Guh\" secondAttribute=\"centerY\" id=\"Sgl-9h-L96\"/>\n                                                <constraint firstItem=\"ziQ-wW-pa5\" firstAttribute=\"leading\" secondItem=\"s0O-fq-OyV\" secondAttribute=\"trailing\" constant=\"11\" id=\"aeO-8M-R45\"/>\n                                                <constraint firstItem=\"s0O-fq-OyV\" firstAttribute=\"leading\" secondItem=\"T6m-Hh-Guh\" secondAttribute=\"leadingMargin\" constant=\"6\" id=\"iKK-Mu-qif\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"lli-OU-Mgi\" secondAttribute=\"trailing\" constant=\"4\" id=\"kSc-eT-grk\"/>\n                                                <constraint firstItem=\"s0O-fq-OyV\" firstAttribute=\"centerY\" secondItem=\"T6m-Hh-Guh\" secondAttribute=\"centerY\" id=\"oIs-6o-eLc\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"SettingTableCellIdentifier\" id=\"ssS-Nd-Raa\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"252\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"ssS-Nd-Raa\" id=\"Omg-cR-Pug\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"100\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"setting_feedback\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"mSI-sO-yOB\">\n                                                    <rect key=\"frame\" x=\"14\" y=\"8\" width=\"28\" height=\"28\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"28\" id=\"fgt-YN-56H\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"28\" id=\"lsW-0H-bD8\"/>\n                                                    </constraints>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"101\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Messages\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ylz-Nq-DWa\">\n                                                    <rect key=\"frame\" x=\"53\" y=\"12\" width=\"468\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"90D-fs-bmN\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"102\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"right_arrow\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"xbW-vd-eAP\">\n                                                    <rect key=\"frame\" x=\"581\" y=\"16\" width=\"7\" height=\"11\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"7\" id=\"Omq-Yp-20e\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"11\" id=\"oWM-3k-cnt\"/>\n                                                    </constraints>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"0\" textAlignment=\"right\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"o6L-Bp-G5s\">\n                                                    <rect key=\"frame\" x=\"531\" y=\"11\" width=\"42\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"3jX-ra-5Cv\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"42\" id=\"hLR-sI-mfm\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" red=\"1\" green=\"0.5\" blue=\"0.0\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"xbW-vd-eAP\" secondAttribute=\"trailing\" constant=\"4\" id=\"4TG-qn-Nkl\"/>\n                                                <constraint firstItem=\"xbW-vd-eAP\" firstAttribute=\"leading\" secondItem=\"o6L-Bp-G5s\" secondAttribute=\"trailing\" constant=\"8\" id=\"AAm-4o-giJ\"/>\n                                                <constraint firstItem=\"xbW-vd-eAP\" firstAttribute=\"centerY\" secondItem=\"Omg-cR-Pug\" secondAttribute=\"centerY\" id=\"DBd-W1-cQa\"/>\n                                                <constraint firstItem=\"o6L-Bp-G5s\" firstAttribute=\"centerY\" secondItem=\"Omg-cR-Pug\" secondAttribute=\"centerY\" id=\"VpU-tm-Mn6\"/>\n                                                <constraint firstItem=\"mSI-sO-yOB\" firstAttribute=\"centerY\" secondItem=\"Omg-cR-Pug\" secondAttribute=\"centerY\" id=\"cBu-Rr-FdC\"/>\n                                                <constraint firstItem=\"xbW-vd-eAP\" firstAttribute=\"leading\" secondItem=\"ylz-Nq-DWa\" secondAttribute=\"trailing\" constant=\"60\" id=\"iEt-XR-qXF\"/>\n                                                <constraint firstItem=\"ylz-Nq-DWa\" firstAttribute=\"centerY\" secondItem=\"Omg-cR-Pug\" secondAttribute=\"centerY\" id=\"iam-ux-Wkb\"/>\n                                                <constraint firstItem=\"ylz-Nq-DWa\" firstAttribute=\"leading\" secondItem=\"mSI-sO-yOB\" secondAttribute=\"trailing\" constant=\"11\" id=\"lA3-xa-q2x\"/>\n                                                <constraint firstItem=\"o6L-Bp-G5s\" firstAttribute=\"leading\" secondItem=\"ylz-Nq-DWa\" secondAttribute=\"trailing\" constant=\"10\" id=\"sdl-7v-bEZ\"/>\n                                                <constraint firstItem=\"mSI-sO-yOB\" firstAttribute=\"leading\" secondItem=\"Omg-cR-Pug\" secondAttribute=\"leadingMargin\" constant=\"6\" id=\"uEU-KA-VLX\"/>\n                                            </constraints>\n                                            <variation key=\"default\">\n                                                <mask key=\"constraints\">\n                                                    <exclude reference=\"iEt-XR-qXF\"/>\n                                                </mask>\n                                            </variation>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"SettingTableCellIdentifier\" id=\"jys-Tr-kdl\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"296\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"jys-Tr-kdl\" id=\"CZE-Zd-DK2\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"100\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"function_rss\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"bXb-Oy-Srr\">\n                                                    <rect key=\"frame\" x=\"14\" y=\"8\" width=\"28\" height=\"28\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"28\" id=\"7Hs-qJ-0MS\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"28\" id=\"JtA-yl-cAd\"/>\n                                                    </constraints>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"101\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"RSS\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Qem-n8-yJb\">\n                                                    <rect key=\"frame\" x=\"53\" y=\"12\" width=\"520\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"RBV-Cl-IB3\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"102\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"right_arrow\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"qcZ-at-cYr\">\n                                                    <rect key=\"frame\" x=\"581\" y=\"16\" width=\"7\" height=\"11\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"11\" id=\"9ks-7t-P1H\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"7\" id=\"G4h-i7-7Ay\"/>\n                                                    </constraints>\n                                                </imageView>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"Qem-n8-yJb\" firstAttribute=\"leading\" secondItem=\"bXb-Oy-Srr\" secondAttribute=\"trailing\" constant=\"11\" id=\"4vI-a1-3oA\"/>\n                                                <constraint firstItem=\"bXb-Oy-Srr\" firstAttribute=\"leading\" secondItem=\"CZE-Zd-DK2\" secondAttribute=\"leadingMargin\" constant=\"6\" id=\"Bzh-hp-rxx\"/>\n                                                <constraint firstItem=\"bXb-Oy-Srr\" firstAttribute=\"centerY\" secondItem=\"CZE-Zd-DK2\" secondAttribute=\"centerY\" id=\"Ffz-jS-fDl\"/>\n                                                <constraint firstItem=\"Qem-n8-yJb\" firstAttribute=\"centerY\" secondItem=\"CZE-Zd-DK2\" secondAttribute=\"centerY\" id=\"WR8-Kc-2XZ\"/>\n                                                <constraint firstItem=\"qcZ-at-cYr\" firstAttribute=\"centerY\" secondItem=\"CZE-Zd-DK2\" secondAttribute=\"centerY\" id=\"jzH-bY-Hwg\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"qcZ-at-cYr\" secondAttribute=\"trailing\" constant=\"4\" id=\"qQp-5s-cXg\"/>\n                                                <constraint firstItem=\"qcZ-at-cYr\" firstAttribute=\"leading\" secondItem=\"Qem-n8-yJb\" secondAttribute=\"trailing\" constant=\"8\" id=\"rxE-2Z-QTx\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"SettingTableCellIdentifier\" id=\"xaF-W0-gjX\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"340\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"xaF-W0-gjX\" id=\"5Of-11-fPs\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"100\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"function_scan\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Hqv-MQ-dIg\">\n                                                    <rect key=\"frame\" x=\"14\" y=\"8\" width=\"28\" height=\"28\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"28\" id=\"fTk-T5-eco\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"28\" id=\"vsj-mT-C2J\"/>\n                                                    </constraints>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"101\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Scan\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"I9b-b0-wmQ\">\n                                                    <rect key=\"frame\" x=\"53\" y=\"12\" width=\"520\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"toG-rS-oJl\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"102\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"right_arrow\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Z9g-QM-j4X\">\n                                                    <rect key=\"frame\" x=\"581\" y=\"16\" width=\"7\" height=\"11\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"11\" id=\"FP2-3s-iIP\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"7\" id=\"rrR-18-3Ja\"/>\n                                                    </constraints>\n                                                </imageView>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"Hqv-MQ-dIg\" firstAttribute=\"centerY\" secondItem=\"5Of-11-fPs\" secondAttribute=\"centerY\" id=\"4QJ-Jj-Yy5\"/>\n                                                <constraint firstItem=\"I9b-b0-wmQ\" firstAttribute=\"leading\" secondItem=\"Hqv-MQ-dIg\" secondAttribute=\"trailing\" constant=\"11\" id=\"M9e-vs-7GA\"/>\n                                                <constraint firstItem=\"Z9g-QM-j4X\" firstAttribute=\"centerY\" secondItem=\"5Of-11-fPs\" secondAttribute=\"centerY\" id=\"V4o-3w-9uf\"/>\n                                                <constraint firstItem=\"I9b-b0-wmQ\" firstAttribute=\"centerY\" secondItem=\"5Of-11-fPs\" secondAttribute=\"centerY\" id=\"c0J-om-nxL\"/>\n                                                <constraint firstItem=\"Hqv-MQ-dIg\" firstAttribute=\"leading\" secondItem=\"5Of-11-fPs\" secondAttribute=\"leadingMargin\" constant=\"6\" id=\"fy9-Va-e3T\"/>\n                                                <constraint firstItem=\"Z9g-QM-j4X\" firstAttribute=\"leading\" secondItem=\"I9b-b0-wmQ\" secondAttribute=\"trailing\" constant=\"8\" id=\"h4P-lN-ig8\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"Z9g-QM-j4X\" secondAttribute=\"trailing\" constant=\"4\" id=\"xfn-rU-Zlw\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                        </sections>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"3yT-kD-4Nb\" id=\"3lj-fm-uRC\"/>\n                            <outlet property=\"delegate\" destination=\"3yT-kD-4Nb\" id=\"5Gh-c7-hMd\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Explore\" id=\"ZHA-1z-fIJ\"/>\n                    <connections>\n                        <outlet property=\"msgCountLB\" destination=\"o6L-Bp-G5s\" id=\"1f7-zp-hW1\"/>\n                    </connections>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"vmn-YD-Ipz\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1562\" y=\"-360\"/>\n        </scene>\n        <!--Files-->\n        <scene sceneID=\"uMc-Tz-yV5\">\n            <objects>\n                <navigationController automaticallyAdjustsScrollViewInsets=\"NO\" id=\"uNO-pp-eSv\" sceneMemberID=\"viewController\">\n                    <tabBarItem key=\"tabBarItem\" title=\"Files\" image=\"tab_icon_files\" id=\"acW-dT-cKf\"/>\n                    <toolbarItems/>\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" id=\"CdJ-tZ-nZX\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"44\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <nil name=\"viewControllers\"/>\n                    <connections>\n                        <segue destination=\"eKe-tq-2GY\" kind=\"relationship\" relationship=\"rootViewController\" id=\"sbb-Bl-UBO\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"UvC-At-Yve\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"750\" y=\"-1088\"/>\n        </scene>\n        <!--Setting-->\n        <scene sceneID=\"YMg-UO-M6T\">\n            <objects>\n                <navigationController automaticallyAdjustsScrollViewInsets=\"NO\" id=\"r8F-sT-6fz\" sceneMemberID=\"viewController\">\n                    <tabBarItem key=\"tabBarItem\" title=\"Setting\" image=\"tab_icon_setting\" id=\"cPa-gy-q4n\"/>\n                    <toolbarItems/>\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" id=\"stf-nU-zr8\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"44\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <nil name=\"viewControllers\"/>\n                    <connections>\n                        <segue destination=\"P4t-er-mhO\" kind=\"relationship\" relationship=\"rootViewController\" id=\"A1E-hq-nYQ\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"pU0-ny-Ae3\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"750\" y=\"346\"/>\n        </scene>\n        <!--Explore-->\n        <scene sceneID=\"cLY-3A-gXM\">\n            <objects>\n                <navigationController automaticallyAdjustsScrollViewInsets=\"NO\" id=\"cjt-uh-CfW\" sceneMemberID=\"viewController\">\n                    <tabBarItem key=\"tabBarItem\" title=\"Explore\" image=\"tab_icon_explore\" id=\"G6v-Qn-6L2\"/>\n                    <toolbarItems/>\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" id=\"SgV-CC-prY\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"44\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <nil name=\"viewControllers\"/>\n                    <connections>\n                        <segue destination=\"3yT-kD-4Nb\" kind=\"relationship\" relationship=\"rootViewController\" id=\"tw4-JU-o2R\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"Ebc-3c-Ddp\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"750\" y=\"-360\"/>\n        </scene>\n        <!--Config-->\n        <scene sceneID=\"wR4-gM-QV8\">\n            <objects>\n                <tableViewController id=\"crz-sS-uZB\" customClass=\"ConfigTableViewController\" customModule=\"Sublime\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"static\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"28\" sectionFooterHeight=\"28\" id=\"4BK-6A-gi9\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"0.31764705882352939\" green=\"0.31764705882352939\" blue=\"0.31764705882352939\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <color key=\"separatorColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <sections>\n                            <tableViewSection headerTitle=\"Debug\" id=\"sry-y7-QuK\" userLabel=\"Function\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"SettingTableCellIdentifier\" id=\"NI9-Jt-W8G\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"92\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"NI9-Jt-W8G\" id=\"XwN-JR-QwB\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"100\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"config_cycript\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"R77-0o-LML\">\n                                                    <rect key=\"frame\" x=\"14\" y=\"8\" width=\"28\" height=\"28\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"28\" id=\"GXQ-SB-N5H\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"28\" id=\"u6V-E3-HxW\"/>\n                                                    </constraints>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"101\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Cycript\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"zsK-V6-vRv\">\n                                                    <rect key=\"frame\" x=\"53\" y=\"3\" width=\"55.5\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"iaI-X4-H3t\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <switch opaque=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YNE-N4-RM3\">\n                                                    <rect key=\"frame\" x=\"535\" y=\"6\" width=\"51\" height=\"31\"/>\n                                                    <color key=\"onTintColor\" red=\"0.31764705882352939\" green=\"0.31764705882352939\" blue=\"0.31764705882352939\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                                    <connections>\n                                                        <action selector=\"cycriptChangeStatus:\" destination=\"crz-sS-uZB\" eventType=\"valueChanged\" id=\"acg-yU-bTu\"/>\n                                                    </connections>\n                                                </switch>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"101\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"127.0.0.1:8888\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"eWf-kX-bJA\">\n                                                    <rect key=\"frame\" x=\"53\" y=\"24\" width=\"82\" height=\"14.5\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"5nh-wr-9lc\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"12\"/>\n                                                    <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                    <variation key=\"default\">\n                                                        <mask key=\"constraints\">\n                                                            <exclude reference=\"5nh-wr-9lc\"/>\n                                                        </mask>\n                                                    </variation>\n                                                </label>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"R77-0o-LML\" firstAttribute=\"centerY\" secondItem=\"XwN-JR-QwB\" secondAttribute=\"centerY\" id=\"01k-gY-07D\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"YNE-N4-RM3\" secondAttribute=\"trailing\" constant=\"8\" id=\"BRq-JV-TWy\"/>\n                                                <constraint firstItem=\"eWf-kX-bJA\" firstAttribute=\"leading\" secondItem=\"R77-0o-LML\" secondAttribute=\"trailing\" constant=\"11\" id=\"SIt-ZA-ltP\"/>\n                                                <constraint firstItem=\"eWf-kX-bJA\" firstAttribute=\"top\" secondItem=\"zsK-V6-vRv\" secondAttribute=\"bottom\" id=\"WiU-p1-gj6\"/>\n                                                <constraint firstItem=\"zsK-V6-vRv\" firstAttribute=\"top\" secondItem=\"XwN-JR-QwB\" secondAttribute=\"topMargin\" constant=\"-5\" id=\"g0Q-TJ-N1Z\"/>\n                                                <constraint firstItem=\"zsK-V6-vRv\" firstAttribute=\"leading\" secondItem=\"R77-0o-LML\" secondAttribute=\"trailing\" constant=\"11\" id=\"gU5-gC-LXN\"/>\n                                                <constraint firstItem=\"YNE-N4-RM3\" firstAttribute=\"centerY\" secondItem=\"XwN-JR-QwB\" secondAttribute=\"centerY\" id=\"xUy-6X-YuY\"/>\n                                                <constraint firstItem=\"zsK-V6-vRv\" firstAttribute=\"centerY\" secondItem=\"XwN-JR-QwB\" secondAttribute=\"centerY\" id=\"zrN-f9-F1h\"/>\n                                                <constraint firstItem=\"R77-0o-LML\" firstAttribute=\"leading\" secondItem=\"XwN-JR-QwB\" secondAttribute=\"leadingMargin\" constant=\"6\" id=\"zsx-yP-bCg\"/>\n                                            </constraints>\n                                            <variation key=\"default\">\n                                                <mask key=\"constraints\">\n                                                    <exclude reference=\"zrN-f9-F1h\"/>\n                                                </mask>\n                                            </variation>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                            <tableViewSection headerTitle=\"System\" id=\"QER-5n-BFt\" userLabel=\"Function\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"SettingTableCellIdentifier\" id=\"uhJ-Zz-AXm\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"164\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"uhJ-Zz-AXm\" id=\"3tZ-Rf-meT\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"100\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"config_full_screen_code_reading\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"c5r-Rm-K4e\">\n                                                    <rect key=\"frame\" x=\"14\" y=\"8\" width=\"28\" height=\"28\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"28\" id=\"QKO-FH-3a3\"/>\n                                                        <constraint firstAttribute=\"width\" constant=\"28\" id=\"es1-hz-zxY\"/>\n                                                    </constraints>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"101\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Full Screen Code Reading\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Z79-AZ-WcW\">\n                                                    <rect key=\"frame\" x=\"53\" y=\"12\" width=\"186.5\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"kaR-5N-fmg\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"16\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <switch opaque=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"y2n-Nt-d0Z\">\n                                                    <rect key=\"frame\" x=\"535\" y=\"6\" width=\"51\" height=\"31\"/>\n                                                    <color key=\"onTintColor\" red=\"0.31764705882352939\" green=\"0.31764705882352939\" blue=\"0.31764705882352939\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                                    <connections>\n                                                        <action selector=\"codeReadingChangeStatus:\" destination=\"crz-sS-uZB\" eventType=\"valueChanged\" id=\"k9Q-f7-GxA\"/>\n                                                    </connections>\n                                                </switch>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"Z79-AZ-WcW\" firstAttribute=\"centerY\" secondItem=\"3tZ-Rf-meT\" secondAttribute=\"centerY\" id=\"9o6-hQ-lwN\"/>\n                                                <constraint firstItem=\"y2n-Nt-d0Z\" firstAttribute=\"centerY\" secondItem=\"3tZ-Rf-meT\" secondAttribute=\"centerY\" id=\"APU-MZ-t07\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"y2n-Nt-d0Z\" secondAttribute=\"trailing\" constant=\"8\" id=\"Cer-DT-8pb\"/>\n                                                <constraint firstItem=\"Z79-AZ-WcW\" firstAttribute=\"leading\" secondItem=\"c5r-Rm-K4e\" secondAttribute=\"trailing\" constant=\"11\" id=\"OMn-a2-oam\"/>\n                                                <constraint firstItem=\"c5r-Rm-K4e\" firstAttribute=\"centerY\" secondItem=\"3tZ-Rf-meT\" secondAttribute=\"centerY\" id=\"OmR-yZ-OS4\"/>\n                                                <constraint firstItem=\"c5r-Rm-K4e\" firstAttribute=\"leading\" secondItem=\"3tZ-Rf-meT\" secondAttribute=\"leadingMargin\" constant=\"6\" id=\"jq7-hr-ewK\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"SettingTableCellIdentifier\" id=\"3UM-VM-GOF\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"208\" width=\"600\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"3UM-VM-GOF\" id=\"6CK-EI-kEZ\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <imageView userInteractionEnabled=\"NO\" tag=\"100\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"config_show_hidden_file\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"zYc-rA-gEX\">\n                                                    <rect key=\"frame\" x=\"14\" y=\"8\" width=\"28\" height=\"28\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"width\" constant=\"28\" id=\"8ax-z5-81V\"/>\n                                                        <constraint firstAttribute=\"height\" constant=\"28\" id=\"JHy-yE-nRp\"/>\n                                                    </constraints>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" tag=\"101\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Show Hidden Files\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"r7U-iT-ePP\">\n                                                    <rect key=\"frame\" x=\"53\" y=\"12\" width=\"134\" height=\"21\"/>\n                                                    <constraints>\n                                                        <constraint firstAttribute=\"height\" constant=\"21\" id=\"Wwl-tf-I9U\"/>\n                                                    </constraints>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"16\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <switch opaque=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Lbn-qr-YuY\">\n                                                    <rect key=\"frame\" x=\"535\" y=\"6\" width=\"51\" height=\"31\"/>\n                                                    <color key=\"onTintColor\" red=\"0.31764705882352939\" green=\"0.31764705882352939\" blue=\"0.31764705882352939\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                                    <connections>\n                                                        <action selector=\"showHiddenChangeStatus:\" destination=\"crz-sS-uZB\" eventType=\"valueChanged\" id=\"nAp-By-0uH\"/>\n                                                    </connections>\n                                                </switch>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"r7U-iT-ePP\" firstAttribute=\"centerY\" secondItem=\"6CK-EI-kEZ\" secondAttribute=\"centerY\" id=\"866-S0-GnZ\"/>\n                                                <constraint firstAttribute=\"trailingMargin\" secondItem=\"Lbn-qr-YuY\" secondAttribute=\"trailing\" constant=\"8\" id=\"N0v-yr-fxH\"/>\n                                                <constraint firstItem=\"Lbn-qr-YuY\" firstAttribute=\"centerY\" secondItem=\"6CK-EI-kEZ\" secondAttribute=\"centerY\" id=\"czr-Wj-QJY\"/>\n                                                <constraint firstItem=\"zYc-rA-gEX\" firstAttribute=\"leading\" secondItem=\"6CK-EI-kEZ\" secondAttribute=\"leadingMargin\" constant=\"6\" id=\"e15-hk-Ok3\"/>\n                                                <constraint firstItem=\"zYc-rA-gEX\" firstAttribute=\"centerY\" secondItem=\"6CK-EI-kEZ\" secondAttribute=\"centerY\" id=\"rL6-rO-Kct\"/>\n                                                <constraint firstItem=\"r7U-iT-ePP\" firstAttribute=\"leading\" secondItem=\"zYc-rA-gEX\" secondAttribute=\"trailing\" constant=\"11\" id=\"xI8-wG-kco\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                        <color key=\"backgroundColor\" red=\"0.31764705879999999\" green=\"0.31764705879999999\" blue=\"0.31764705879999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                        </sections>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"crz-sS-uZB\" id=\"kKz-3F-9Pw\"/>\n                            <outlet property=\"delegate\" destination=\"crz-sS-uZB\" id=\"jrG-R4-eUS\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Config\" id=\"bt5-AV-yPf\"/>\n                    <connections>\n                        <outlet property=\"codeReadingSwitch\" destination=\"y2n-Nt-d0Z\" id=\"09y-Bo-Gow\"/>\n                        <outlet property=\"cycriptLabel\" destination=\"eWf-kX-bJA\" id=\"WAc-d4-DFH\"/>\n                        <outlet property=\"cycriptSwitch\" destination=\"YNE-N4-RM3\" id=\"bfe-lb-3bZ\"/>\n                        <outlet property=\"showHiddenFilesSwitch\" destination=\"Lbn-qr-YuY\" id=\"Bs5-OL-jSY\"/>\n                    </connections>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"k31-8b-RDk\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1563\" y=\"1085\"/>\n        </scene>\n        <!--Contact-->\n        <scene sceneID=\"UJK-2J-Qij\">\n            <objects>\n                <tableViewController storyboardIdentifier=\"ContactTableVC\" id=\"yaY-gg-6JE\" customClass=\"ContactTableViewController\" customModule=\"Sublime\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"static\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"60\" sectionHeaderHeight=\"28\" sectionFooterHeight=\"1\" id=\"06M-8B-1kL\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                        <searchBar key=\"tableHeaderView\" contentMode=\"redraw\" searchBarStyle=\"minimal\" text=\"\" placeholder=\"Search\" id=\"N0s-vn-hCD\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"64\" width=\"600\" height=\"44\"/>\n                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" flexibleMaxY=\"YES\"/>\n                            <textInputTraits key=\"textInputTraits\"/>\n                        </searchBar>\n                        <sections>\n                            <tableViewSection id=\"z7w-HM-qpv\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" accessoryType=\"disclosureIndicator\" indentationWidth=\"10\" id=\"Av8-rZ-k2o\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"108\" width=\"600\" height=\"60\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"Av8-rZ-k2o\" id=\"CJS-Sd-5YJ\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"567\" height=\"59.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" image=\"add_friend_icon_addfriend\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"cAQ-PI-DwB\">\n                                                    <rect key=\"frame\" x=\"17\" y=\"10\" width=\"39\" height=\"39\"/>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" text=\"New Friend\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"SnF-tN-3uO\">\n                                                    <rect key=\"frame\" x=\"69\" y=\"19\" width=\"222\" height=\"21\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" accessoryType=\"disclosureIndicator\" indentationWidth=\"10\" id=\"dge-7y-Bzu\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"168\" width=\"600\" height=\"60\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"dge-7y-Bzu\" id=\"jlo-sD-JAa\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"567\" height=\"59.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" image=\"add_friend_icon_group\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"5fT-Pc-gSm\">\n                                                    <rect key=\"frame\" x=\"17\" y=\"10\" width=\"39\" height=\"39\"/>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" text=\"Group\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"TeQ-MT-DV4\">\n                                                    <rect key=\"frame\" x=\"69\" y=\"19\" width=\"139\" height=\"21\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" accessoryType=\"disclosureIndicator\" indentationWidth=\"10\" id=\"wH7-NT-u8s\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"228\" width=\"600\" height=\"60\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"wH7-NT-u8s\" id=\"6TI-HU-7qE\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"567\" height=\"59.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" image=\"add_friend_icon_offical\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YA4-ZX-Nad\">\n                                                    <rect key=\"frame\" x=\"17\" y=\"10\" width=\"39\" height=\"39\"/>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" text=\"Official\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"JX2-6O-0Xa\">\n                                                    <rect key=\"frame\" x=\"69\" y=\"19\" width=\"115\" height=\"21\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                            <tableViewSection headerTitle=\"K\" footerTitle=\" \" id=\"zF8-9a-4SK\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" id=\"Y3S-jI-0hO\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"316\" width=\"600\" height=\"60\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"Y3S-jI-0hO\" id=\"2iH-gr-iiQ\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"59.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" text=\"客服机器人\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"cLB-Sx-yx9\">\n                                                    <rect key=\"frame\" x=\"69\" y=\"8\" width=\"90\" height=\"21\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" image=\"user_robot\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"WZ5-hQ-8sg\">\n                                                    <rect key=\"frame\" x=\"17\" y=\"10\" width=\"39\" height=\"39\"/>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" text=\"github: null\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"cuE-4s-893\">\n                                                    <rect key=\"frame\" x=\"69\" y=\"31\" width=\"119\" height=\"19\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                                    <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                            <tableViewSection headerTitle=\"U\" footerTitle=\" \" id=\"7r7-wD-M5J\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" id=\"Hdt-QJ-s5r\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"405\" width=\"600\" height=\"60\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"Hdt-QJ-s5r\" id=\"BU6-5T-1a2\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"59.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" text=\"Uri\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"dbi-cb-YOX\">\n                                                    <rect key=\"frame\" x=\"69\" y=\"8\" width=\"40\" height=\"21\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" image=\"user_author\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Y58-OI-xQl\">\n                                                    <rect key=\"frame\" x=\"17\" y=\"10\" width=\"39\" height=\"39\"/>\n                                                </imageView>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" text=\"github: Urinx\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"tMi-Iq-BCU\">\n                                                    <rect key=\"frame\" x=\"69\" y=\"31\" width=\"119\" height=\"19\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                                    <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                        </sections>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"yaY-gg-6JE\" id=\"vaY-J3-XAf\"/>\n                            <outlet property=\"delegate\" destination=\"yaY-gg-6JE\" id=\"cZR-yd-56t\"/>\n                        </connections>\n                    </tableView>\n                    <toolbarItems/>\n                    <navigationItem key=\"navigationItem\" title=\"Contact\" id=\"g3s-bk-IQY\"/>\n                    <simulatedNavigationBarMetrics key=\"simulatedTopBarMetrics\" prompted=\"NO\"/>\n                    <simulatedToolbarMetrics key=\"simulatedBottomBarMetrics\"/>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"qzt-NI-goK\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2290\" y=\"1085\"/>\n        </scene>\n        <!--Contact Info-->\n        <scene sceneID=\"6ev-13-Ts1\">\n            <objects>\n                <viewController storyboardIdentifier=\"ContactInfoVC\" id=\"BIc-b3-69R\" userLabel=\"Contact Info\" customClass=\"ContactInfoViewController\" customModule=\"Sublime\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"S91-5W-wFS\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"vn8-wb-48u\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"jTN-5z-2zf\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"yk4-Vh-VEp\">\n                                <rect key=\"frame\" x=\"175\" y=\"125\" width=\"250\" height=\"350\"/>\n                                <subviews>\n                                    <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"tky-UO-cUW\">\n                                        <rect key=\"frame\" x=\"25\" y=\"101\" width=\"200\" height=\"200\"/>\n                                    </imageView>\n                                    <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" image=\"github_avatar\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ec9-tU-q7Z\">\n                                        <rect key=\"frame\" x=\"25\" y=\"29\" width=\"50\" height=\"50\"/>\n                                    </imageView>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" text=\"name\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"fjj-kv-8mF\">\n                                        <rect key=\"frame\" x=\"88\" y=\"32\" width=\"137\" height=\"21\"/>\n                                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                        <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" text=\"github:\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"U0G-mD-sSu\">\n                                        <rect key=\"frame\" x=\"88\" y=\"58\" width=\"137\" height=\"21\"/>\n                                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                        <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" text=\"扫一扫，出奇迹\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"yKL-0J-ZTw\">\n                                        <rect key=\"frame\" x=\"56\" y=\"317\" width=\"136\" height=\"21\"/>\n                                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                        <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                </subviews>\n                                <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"350\" id=\"IMw-nf-kgi\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"250\" id=\"Scc-5S-ZKW\"/>\n                                </constraints>\n                                <userDefinedRuntimeAttributes>\n                                    <userDefinedRuntimeAttribute type=\"number\" keyPath=\"layer.cornerRadius\">\n                                        <integer key=\"value\" value=\"6\"/>\n                                    </userDefinedRuntimeAttribute>\n                                </userDefinedRuntimeAttributes>\n                            </view>\n                            <stackView opaque=\"NO\" contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"gHR-2U-GYQ\">\n                                <rect key=\"frame\" x=\"258\" y=\"515\" width=\"85\" height=\"15\"/>\n                                <subviews>\n                                    <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"app_small_icon\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"BVR-fa-Lpz\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"15\" height=\"15\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"15\" id=\"4w5-nw-d3C\"/>\n                                            <constraint firstAttribute=\"width\" constant=\"15\" id=\"A30-Mc-YBV\"/>\n                                        </constraints>\n                                    </imageView>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Sublime\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"u4p-yU-jdJ\">\n                                        <rect key=\"frame\" x=\"15\" y=\"0.0\" width=\"70\" height=\"15\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" constant=\"70\" id=\"ix2-RY-KX1\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"15\" id=\"xSI-u7-GY3\"/>\n                                        </constraints>\n                                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"15\"/>\n                                        <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                </subviews>\n                                <constraints>\n                                    <constraint firstItem=\"BVR-fa-Lpz\" firstAttribute=\"centerY\" secondItem=\"gHR-2U-GYQ\" secondAttribute=\"centerY\" id=\"1Kr-sQ-bMj\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"100\" id=\"3Sb-Hx-NDp\"/>\n                                    <constraint firstItem=\"BVR-fa-Lpz\" firstAttribute=\"centerY\" secondItem=\"u4p-yU-jdJ\" secondAttribute=\"centerY\" id=\"SPP-k8-qrQ\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"29\" id=\"taz-99-BCo\"/>\n                                    <constraint firstItem=\"u4p-yU-jdJ\" firstAttribute=\"centerY\" secondItem=\"gHR-2U-GYQ\" secondAttribute=\"centerY\" id=\"vN8-TA-ndu\"/>\n                                </constraints>\n                                <variation key=\"default\">\n                                    <mask key=\"constraints\">\n                                        <exclude reference=\"3Sb-Hx-NDp\"/>\n                                        <exclude reference=\"taz-99-BCo\"/>\n                                        <exclude reference=\"1Kr-sQ-bMj\"/>\n                                        <exclude reference=\"SPP-k8-qrQ\"/>\n                                        <exclude reference=\"vN8-TA-ndu\"/>\n                                    </mask>\n                                </variation>\n                            </stackView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"0.1215686275\" green=\"0.12941176469999999\" blue=\"0.14117647059999999\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"yk4-Vh-VEp\" firstAttribute=\"centerX\" secondItem=\"jTN-5z-2zf\" secondAttribute=\"centerX\" id=\"BK1-jM-Edz\"/>\n                            <constraint firstItem=\"yk4-Vh-VEp\" firstAttribute=\"centerY\" secondItem=\"jTN-5z-2zf\" secondAttribute=\"centerY\" id=\"hhO-ag-lGO\"/>\n                            <constraint firstItem=\"gHR-2U-GYQ\" firstAttribute=\"centerX\" secondItem=\"jTN-5z-2zf\" secondAttribute=\"centerX\" id=\"huK-1Z-rtP\"/>\n                            <constraint firstItem=\"gHR-2U-GYQ\" firstAttribute=\"top\" secondItem=\"yk4-Vh-VEp\" secondAttribute=\"bottom\" constant=\"40\" id=\"xsI-75-neN\"/>\n                        </constraints>\n                    </view>\n                    <navigationItem key=\"navigationItem\" title=\"Name Card\" id=\"h74-tJ-d17\"/>\n                    <simulatedNavigationBarMetrics key=\"simulatedTopBarMetrics\" prompted=\"NO\"/>\n                    <nil key=\"simulatedBottomBarMetrics\"/>\n                    <connections>\n                        <outlet property=\"QRImageView\" destination=\"tky-UO-cUW\" id=\"xAQ-qs-lod\"/>\n                        <outlet property=\"githubLabel\" destination=\"U0G-mD-sSu\" id=\"Exx-fh-K4l\"/>\n                        <outlet property=\"headImageView\" destination=\"ec9-tU-q7Z\" id=\"d9f-qY-e6h\"/>\n                        <outlet property=\"nameLabel\" destination=\"fjj-kv-8mF\" id=\"usn-Fz-1qw\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"CtI-Bf-Fsl\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2290\" y=\"1794\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"add_friend_icon_addfriend\" width=\"36\" height=\"36\"/>\n        <image name=\"add_friend_icon_group\" width=\"36\" height=\"36\"/>\n        <image name=\"add_friend_icon_offical\" width=\"36\" height=\"36\"/>\n        <image name=\"app_small_icon\" width=\"14\" height=\"14\"/>\n        <image name=\"comment\" width=\"105\" height=\"104\"/>\n        <image name=\"config_cycript\" width=\"39\" height=\"39\"/>\n        <image name=\"config_full_screen_code_reading\" width=\"39\" height=\"39\"/>\n        <image name=\"config_show_hidden_file\" width=\"39\" height=\"39\"/>\n        <image name=\"explore_codezZ\" width=\"39\" height=\"39\"/>\n        <image name=\"function_rss\" width=\"39\" height=\"39\"/>\n        <image name=\"function_scan\" width=\"39\" height=\"39\"/>\n        <image name=\"github_avatar\" width=\"210\" height=\"210\"/>\n        <image name=\"github_folder\" width=\"40\" height=\"40\"/>\n        <image name=\"github_fork\" width=\"40\" height=\"40\"/>\n        <image name=\"github_star\" width=\"40\" height=\"40\"/>\n        <image name=\"github_watcher\" width=\"40\" height=\"40\"/>\n        <image name=\"right_arrow\" width=\"23\" height=\"45\"/>\n        <image name=\"setting_configure\" width=\"39\" height=\"39\"/>\n        <image name=\"setting_donate\" width=\"39\" height=\"39\"/>\n        <image name=\"setting_feedback\" width=\"39\" height=\"39\"/>\n        <image name=\"setting_github\" width=\"39\" height=\"39\"/>\n        <image name=\"setting_license\" width=\"39\" height=\"39\"/>\n        <image name=\"setting_reading\" width=\"39\" height=\"39\"/>\n        <image name=\"setting_server\" width=\"39\" height=\"39\"/>\n        <image name=\"setting_ssh\" width=\"39\" height=\"39\"/>\n        <image name=\"setting_storage\" width=\"39\" height=\"39\"/>\n        <image name=\"setting_sublime\" width=\"39\" height=\"39\"/>\n        <image name=\"setting_themes\" width=\"39\" height=\"39\"/>\n        <image name=\"tab_icon_explore\" width=\"26\" height=\"24\"/>\n        <image name=\"tab_icon_files\" width=\"22\" height=\"28\"/>\n        <image name=\"tab_icon_setting\" width=\"28\" height=\"28\"/>\n        <image name=\"user_author\" width=\"460\" height=\"460\"/>\n        <image name=\"user_robot\" width=\"403\" height=\"378\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "Sublime/Sublime/BoardModel.swift",
    "content": "//\n//  GoBoardModel.swift\n//  Sublime\n//\n//  Created by Eular on 4/15/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\nstruct Stone {\n    enum StoneType: Int {\n        case White = 2\n        case Black = 1\n        case Void = 0\n    }\n    \n    var type: StoneType\n    var value: Int {\n        get {\n            return type.rawValue\n        }\n        set {\n            switch newValue {\n            case 2:\n                type = .White\n            case 1:\n                type = .Black\n            default:\n                type = .Void\n            }\n        }\n    }\n    \n    init() {\n        self.type = .Void\n    }\n    \n    init(type: StoneType) {\n        self.type = type\n    }\n}\n\n\nclass GoBoardModel {\n    \n    enum GameResult {\n        case Win\n        case Lose\n        case None\n    }\n    \n    let dimension: Int\n    var winStone: [(Int, Int)] = []\n    \n    private var board: Array<Array<Stone>>\n    \n    init(dimension d: Int) {\n        dimension = d\n        board = Array(count: d, repeatedValue: Array(count: d, repeatedValue: Stone()))\n        reset()\n    }\n    \n    // 清空棋盘\n    func reset() {\n        for i in range(dimension) {\n            for j in range(dimension) {\n                board[i][j] = Stone()\n            }\n        }\n    }\n    \n    // 判断输赢\n    func check() -> GameResult {\n        // 四个方向遍历: 右，右上，右下，下\n        let dirs = [(1, 0), (1, -1), (1, 1), (0, 1)]\n        \n        for i in range(dimension) {\n            for j in range(dimension) {\n                \n                let t = self[i,j].type\n                if t == .Void { continue }\n                \n                for d in dirs {\n                    var x = i\n                    var y = j\n                    var count = 0\n                    \n                    for _ in range(5) {\n                        if self[x,y].type != t {\n                            winStone = []\n                            break\n                        }\n                        winStone.append((x,y))\n                        x += d.0\n                        y += d.1\n                        count += 1\n                    }\n                    \n                    if count == 5 {\n                        if t == .Black {\n                            return .Win\n                        }\n                        if t == .White {\n                            return .Lose\n                        }\n                    }\n                }\n                \n            }\n        }\n        \n        return .None\n    }\n    \n    // 输出棋盘\n    func log() {\n        print(\"-\" * (2 * dimension + 3))\n        for i in range(dimension) {\n            let symbol = [\".\", \"x\", \"o\"]\n            var row = [String]()\n            for j in range(dimension) {\n                row.append(symbol[board[j][i].value])\n            }\n            print(\"| \" + \" \".join(row) + \" |\")\n        }\n        print(\"-\" * (2 * dimension + 3))\n    }\n    \n    // 索引\n    subscript(row: Int, column: Int) -> Stone {\n        get {\n            if row < 0 || row >= 15 || column < 0 || column >= 15 {\n                return Stone()\n            }\n            return board[row][column]\n        }\n        set {\n            board[row][column] = newValue\n        }\n    }\n    \n    subscript(row: Int) -> Array<Stone> {\n        get {\n            return board[row]\n        }\n        set {\n            board[row] = newValue\n        }\n    }\n}\n\nclass GomokuBoardModel: GoBoardModel {\n    init() {\n        super.init(dimension: 15)\n    }\n}\n"
  },
  {
    "path": "Sublime/Sublime/BoardView.swift",
    "content": "//\n//  GoBoard.swift\n//  Sublime\n//\n//  Created by Eular on 4/14/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\n\nclass GoBoardView: UIView {\n    \n    let padding: CGFloat = 10\n    var dimension: Int\n    var gridWidth: CGFloat\n    var stoneWidth: CGFloat = 9\n    var isEnd: Bool = false\n    let board: GoBoardModel\n    \n    init(board: GoBoardModel, gridWidth: CGFloat) {\n        self.gridWidth = gridWidth\n        self.board = board\n        self.dimension = board.dimension\n        \n        let width = gridWidth * (dimension - 1) + 2 * padding\n        super.init(frame: CGRectMake(0, 0, width, width))\n        self.backgroundColor = UIColor.clearColor()\n        self.layer.borderWidth = 1\n        self.layer.borderColor = UIColor.grayColor().CGColor\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    override func drawRect(rect: CGRect) {\n        let d = dimension\n        for i in 0..<d {\n            drawLine((i, 0), (i, d - 1)) // col\n            drawLine((0, i), (d - 1, i)) // row\n        }\n        \n        for i in 0..<d {\n            for j in 0..<d {\n                let s = board[i,j]\n                if s.type != .Void { drawStone(i, j, CGFloat(s.value - 1)) }\n            }\n        }\n    }\n    \n    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {\n        super.touchesEnded(touches, withEvent: event)\n        if !isEnd {\n            if let touch = touches.first {\n                let location = touch.locationInView(self)\n                let x = Int(round((location.x - padding) / gridWidth))\n                let y = Int(round((location.y - padding) / gridWidth))\n                onStoneDropDown(x, y)\n            }\n        }\n    }\n    \n    func onStoneDropDown(x: Int, _ y: Int) {\n        print(\"Stone: [\\(x), \\(y)]\")\n    }\n    \n    private func drawStone(x: Int, _ y: Int, _ c: CGFloat) {\n        let g = gridWidth\n        let r = stoneWidth\n        let pos = (g * x + padding, g * y + padding)\n        \n        let context = UIGraphicsGetCurrentContext()\n        CGContextAddArc(context, pos.0, pos.1, r - c / 2, 0, 3.1415926*2, 0)\n        CGContextSetRGBFillColor(context, c, c, c, 1)\n        CGContextFillPath(context)\n    }\n    \n    private func drawLine(p1: (Int, Int), _ p2: (Int, Int)) {\n        let g = gridWidth\n        let context = UIGraphicsGetCurrentContext()\n        CGContextMoveToPoint(context, g * p1.0 + padding, g * p1.1 + padding)\n        CGContextAddLineToPoint(context, g * p2.0 + padding, g * p2.1 + padding)\n        CGContextSetRGBStrokeColor(context, 0.5, 0.5, 0.5, 1)\n        CGContextStrokePath(context)\n    }\n    \n    func reset() {\n        isEnd = false\n        board.reset()\n        setNeedsDisplay()\n    }\n}\n\nclass GomokuBoardView: GoBoardView {\n    let depth = 1 // 目前只能用 1 层，2 的计算量太大，耗时太长，有待后续优化\n    let AI: GomokuAI\n    var onWin: (() -> Void)?\n    var onLose: (() -> Void)?\n    \n    init() {\n        let gomokuBoard = GomokuBoardModel()\n        self.AI = GomokuAI(board: gomokuBoard)\n        super.init(board: gomokuBoard, gridWidth: 20)\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    override func onStoneDropDown(x: Int, _ y: Int) {\n        if board[x,y].type == .Void {\n            // 黑棋落子\n            board[x,y].type = .Black\n            setNeedsDisplay()\n            \n            // 检查输赢\n            let r = board.check()\n            if r == .Win {\n                isEnd = true\n                onWin?()\n            } else {\n                let queue = dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0)\n                \n                dispatch_async(queue) {\n                    \n                    let AIMove = self.AI.search(2, depth: self.depth)\n                    self.board[AIMove[1], AIMove[2]].type = .White\n                    \n                    dispatch_async(dispatch_get_main_queue()) {\n                        self.setNeedsDisplay()\n                        // 再次检查输赢\n                        if self.board.check() == .Lose {\n                            self.isEnd = true\n                            self.onLose?()\n                        }\n                    }\n                }\n                \n            }\n        }\n    }\n}"
  },
  {
    "path": "Sublime/Sublime/Code.swift",
    "content": "//\n//  Code.swift\n//  Sublime\n//\n//  Created by Eular on 5/10/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\nclass Code: File {\n    \n    let language: String\n    \n    var id: String {\n        return self.read().md5\n    }\n    \n    var lastReadPosition: Double {\n        get {\n            return Global.Database.doubleForKey(\"Code-\\(id)\")\n        }\n        set {\n            Global.Database.setDouble(newValue, forKey: \"Code-\\(id)\")\n        }\n    }\n    \n    init(path: String, language: String) {\n        self.language = language\n        super.init(path: path)\n    }\n    \n}"
  },
  {
    "path": "Sublime/Sublime/CodeEngine.swift",
    "content": "//\n//  CodeTextView.swift\n//  Sublime\n//\n//  Created by Eular on 5/9/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\nimport CYRTextView\n\nextension CYRTextView {\n    public override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {\n        if action == #selector(copy(_:)) {\n            return true\n        }\n        return false\n    }\n}\n\nclass CodeEngine {\n    \n    let textView = CYRTextView()\n    \n    init() {\n        textView.editable = false\n        textView.lineCursorEnabled = false\n        textView.backgroundColor = Constant.CodeBackgroudColor\n        textView.gutterBackgroundColor = Constant.CodeLineNumberBackgroudColor\n        textView.gutterLineColor = Constant.CodeLineNumberBackgroudColor\n        textView.textColor = UIColor.whiteColor()\n        textView.font = textView.font?.fontWithSize(12)\n        textView.setLineBreakMode(.ByCharWrapping)\n        \n        textView.contentInset.top = -7\n        textView.scrollIndicatorInsets.top = -7\n        \n        setupTokens()\n    }\n    \n    @objc func shareCodeInPicture() {\n        print(123)\n    }\n    \n    func setupTokens() {\n        textView.tokens = [\n            CYRToken(name: \"Parameter\", expression: \"(?<=\\\\()[^\\\\)]*(?=\\\\))\", attributes: [NSForegroundColorAttributeName : \"#FD9720\".color!]),\n            CYRToken(name: \"Parameter-fixbug\", expression: \"\\\\)+(?=\\\\))|\\\\)[^\\\\(]+(?=\\\\))\", attributes: [NSForegroundColorAttributeName : \"#FD9720\".color!]),\n            CYRToken(name: \"Number\", expression: \"\\\\b(0[xX][0-9a-fA-F]+|\\\\d+(?:\\\\.\\\\d+)?(?:[eE][+-]?\\\\d+)?|\\\\.\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\b\", attributes: [NSForegroundColorAttributeName : \"#AE81FF\".color!]),\n            CYRToken(name: \"Boolean\", expression: \"\\\\b(true|false|True|False|None|nil|null|undefined|NaN)\\\\b\", attributes: [NSForegroundColorAttributeName : \"#FF3C50\".color!]),\n            CYRToken(name: \"Operator\", expression: \"[/\\\\*\\\\;:=<>\\\\+\\\\-\\\\^!·≤≥\\\\?|%]\", attributes: [NSForegroundColorAttributeName : \"#F92772\".color!]),\n            CYRToken(name: \"ReservedWords-js\", expression: \"\\\\b(break|continue|do|for|in|function|if|else|return|switch|default|this|throw|try|catch|finally|var|while|with|case|new|typeof|instance|delete|void|Object|Array|String|Number|Boolean|Function|RegExp|Date|Math|JSON|console|window|document|navigator|location)\\\\b\", attributes: [NSForegroundColorAttributeName : \"#66D9EF\".color!]),\n            CYRToken(name: \"ReservedWords-css\", expression: \"\\\\b(px|em|pt|s|ms|deg|%)\\\\b\", attributes: [NSForegroundColorAttributeName : \"#66D9EF\".color!]),\n            CYRToken(name: \"ReservedWords-php\", expression: \"\\\\b(print_r|exception|array|break|case|class|const|continue|declare|default|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|foreach|for|function|global|if|include|include_once|isset|list|new|print|require|require_once|return|static|switch|unset|use|var|while|final|interface|implements|extends|public|private|protected|abstract|clone|try|catch|throw|and|or|xor|as|die|do|echo|else|this)\\\\b\", attributes: [NSForegroundColorAttributeName : \"#66D9EF\".color!]),\n            CYRToken(name: \"ReservedWords-c\", expression: \"\\\\b(asm|do|if|return|typedef|inline|typeid|bool|dynamic_cast|signed|typename|break|else|sizeof|union|case|enum|mutable|static|unsigned|catch|explicit|namespace|static_cast|using|export|new|struct|virtual|class|extern|operator|switch|void|const|private|template|volatile|const_cast|protected|this|wchar_t|continue|for|public|throw|while|default|friend|register|delete|goto|reinterpret_cast|try)\\\\b\", attributes: [NSForegroundColorAttributeName : \"#66D9EF\".color!]),\n            CYRToken(name: \"ReservedWords-mysql\", expression: \"\\\\b(select|from|where|order|like|group|by|left|right|join|desc|asc|insert|into|values|and|or|sum|count|length|on|duplicate|key|update|limit|union|add|alter|delete|regexp|as|find_in_set|create|drop|table|exists|value|function|begin|declare|default|while|do|end|if|else|then|set|substr|return|repeat|returns|locate|int|float|varchar|char|bool|text|double|trigger|for|each|row|timestamp|primary|after|now)\\\\b\", attributes: [NSForegroundColorAttributeName : \"#66D9EF\".color!]),\n            CYRToken(name: \"ReservedWords-python\", expression: \"\\\\b(class|finally|is|return|continue|for|lambda|try|def|from|nonlocal|while|and|del|global|not|with|as|elif|if|or|yield|assert|else|import|pass|break|except|in|raise)\\\\b\", attributes: [NSForegroundColorAttributeName : \"#66D9EF\".color!]),\n            CYRToken(name: \"ReservedWords-swift\", expression: \"\\\\b(class|deinit|enum|extension|func|import|init|let|protocol|static|struct|subscript|typealias|var|break|case|continue|default|do|else|fallthrough|if|in|for|return|switch|where|while|as|dynamicType|is|new|super|self|__COLUMN__|__FILE__|__FUNCTION__|__LINE__|didSet|get|inout|mutating|override|set|unowned|weak|willSet)\\\\b\", attributes: [NSForegroundColorAttributeName : \"#66D9EF\".color!]),\n            CYRToken(name: \"String\", expression: \"\\\"(?:[^\\\"\\\\\\\\]|\\\\\\\\[\\\\s\\\\S])*\\\"|'(?:[^'\\\\\\\\]|\\\\\\\\[\\\\s\\\\S])*'\", attributes: [NSForegroundColorAttributeName : \"#E6DB74\".color!]),\n            CYRToken(name: \"Comment\", expression: \"^//.*|\\\\s//.*|/\\\\*[\\\\s\\\\S]*?\\\\*/|#.*|<!--.*-->\", attributes: [NSForegroundColorAttributeName : \"#75715E\".color!]),\n        ]\n    }\n    \n}"
  },
  {
    "path": "Sublime/Sublime/CodeViewController.swift",
    "content": "//\n//  FileViewController.swift\n//  Sublime\n//\n//  Created by Eular on 2/14/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\nimport CYRTextView\n\nclass CodeViewController: UIViewController, UIScrollViewDelegate, PopupMenuDelegate {\n    \n    var curFile: Code?\n    var codeShareImage: UIImage?\n    var codeCardView: UIView?\n    var blackMaskView: UIView?\n    var hideStatusBar = false\n    \n    let codeText = CodeEngine().textView\n    let popupMenu = PopupMenu()\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        title = curFile!.name\n        view.backgroundColor = Constant.CodeBackgroudColor\n        self.automaticallyAdjustsScrollViewInsets = false\n        \n        let bottom = Constant.NavigationBarOffset\n        codeText.frame = view.frame\n        codeText.contentInset.bottom = bottom\n        codeText.scrollIndicatorInsets.bottom = bottom\n        \n        codeText.text = curFile!.read()+\"\\n\"\n        codeText.setLineBreakMode(.ByCharWrapping)\n        \n        view.addSubview(codeText)\n\n        \n        \n        // 设置分享菜单\n        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Action, target: popupMenu, action: #selector(popupMenu.showUp))\n        popupMenu.controller = self\n        popupMenu.delegate = self\n        popupMenu.itemsToShare = [curFile!.url]\n        \n        // Add a selected menu item\n        let shareCodeItem = UIMenuItem(title: NSLocalizedString(\"SHARE_IN_PICTURE\", comment: \"Share in picture\"), action: #selector(self.shareCodeInPicture))\n        UIMenuController.sharedMenuController().menuItems = [shareCodeItem]\n        \n        // 保持屏幕常亮\n        UIApplication.sharedApplication().idleTimerDisabled = true\n        \n        // 下滑显示导航栏+状态栏，上滑收起导航栏+状态栏\n        (codeText as UIScrollView).delegate = self\n        \n        // 点击屏幕显示或隐藏导航栏+状态栏\n        if Config.FullScreenCodeReadingMode {\n            codeText.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.hideOrShowStatusBar)))\n        }\n    }\n    \n    // 下滑显示导航栏+状态栏，上滑收起导航栏+状态栏\n    func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {\n        if Config.FullScreenCodeReadingMode {\n            if velocity.y < 0 { hideStatusBar = false }\n            else if velocity.y > 0 { hideStatusBar = true }\n            \n            let bottom = hideStatusBar ? 0 : Constant.NavigationBarOffset\n            codeText.contentInset.bottom = bottom\n            codeText.scrollIndicatorInsets.bottom = bottom\n            \n            navigationController?.setNavigationBarHidden(hideStatusBar, animated: true)\n            self.setNeedsStatusBarAppearanceUpdate()\n        }\n    }\n    \n    func hideOrShowStatusBar() {\n        hideStatusBar = !hideStatusBar\n\n        let bottom = hideStatusBar ? 0 : Constant.NavigationBarOffset\n        codeText.contentInset.bottom = bottom\n        codeText.scrollIndicatorInsets.bottom = bottom\n        \n        navigationController?.setNavigationBarHidden(hideStatusBar, animated: true)\n        self.setNeedsStatusBarAppearanceUpdate()\n    }\n    \n    override func prefersStatusBarHidden() -> Bool {\n        return hideStatusBar\n    }\n    \n    override func viewDidDisappear(animated: Bool) {\n        // 取消屏幕常亮\n        UIApplication.sharedApplication().idleTimerDisabled = false\n        // 记录位置\n        curFile?.lastReadPosition = Double(codeText.contentOffset.y)\n    }\n    \n    // Generate a picture to share code\n    func shareCodeInPicture() {\n        let rects = codeText.selectionRectsForRange(codeText.selectedTextRange!)\n        codeText.selectable = false\n        codeText.setLineBreakMode(.ByCharWrapping)\n        \n        let minR = rects.minElement { (a, b) -> Bool in\n            return a.rect.origin.y < b.rect.origin.y\n        }\n        let maxR = rects.maxElement { (a, b) -> Bool in\n            return a.rect.origin.y < b.rect.origin.y\n        }\n        let frame = CGRectMake(0, minR!.rect.origin.y, codeText.width, maxR!.rect.origin.y - minR!.rect.origin.y + 16)\n        \n        makeShareCodePicture(codeText.snapshot(frame))\n        \n        codeText.selectable = true\n    }\n    \n    func makeShareCodePicture(codeImg: UIImage) -> UIImage {\n        \n        let w = codeImg.size.width\n        let h = codeImg.size.height\n        let sideMargin: CGFloat = 15\n        let topMargin: CGFloat = 100\n        let buttomMargin: CGFloat = 60\n        \n        let headImg = UIImageView(frame: CGRectMake(sideMargin, 20, 60, 60))\n        headImg.image = UIImage(named: \"setting_sublime\")\n        \n        let nameLB = UILabel()\n        nameLB.frame = CGRectMake(sideMargin + headImg.width + 10, 25, w - headImg.width - 10, 15)\n        nameLB.text = \"Sublime\"\n        nameLB.textColor = UIColor.grayColor()\n        nameLB.font = nameLB.font.fontWithSize(14)\n        \n        if GitHubAPIManager.isLogin {\n            nameLB.text = GitHubAPIManager.sharedInstance.user[\"name\"].string\n            if let avatar_url = GitHubAPIManager.sharedInstance.user[\"avatar_url\"].string {\n                headImg.imageFromUrl(avatar_url)\n                headImg.layer.cornerRadius = headImg.width / 2\n                headImg.clipsToBounds = true\n                headImg.layer.borderWidth = 1\n                headImg.layer.borderColor = UIColor.whiteColor().CGColor\n            }\n        }\n        \n        let textInput = UITextView()\n        textInput.frame = CGRectMake(sideMargin + headImg.width + 5, nameLB.y + nameLB.height, w - headImg.width - 5, 50)\n        textInput.text = \"What’s amazing, this code save me from hair pulling!\"\n        textInput.textColor = UIColor.whiteColor()\n        textInput.textContainer.maximumNumberOfLines = 2\n        textInput.backgroundColor = UIColor.clearColor()\n        textInput.font = textInput.font?.fontWithSize(16)\n        textInput.setLineBreakMode(.ByWordWrapping)\n        textInput.tag = 211\n        \n        let doneBtn = UIButton()\n        doneBtn.frame = CGRectMake(2 * sideMargin + w - 50, 10, 40, 30)\n        doneBtn.setImage(UIImage(named: \"code_share_btn\"), forState: .Normal)\n        doneBtn.addTarget(self, action: #selector(self._tapOnShareCodeSendButton), forControlEvents: .TouchUpInside)\n        doneBtn.tag = 212\n        \n        let codeImgView = UIImageView(frame: CGRectMake(sideMargin, topMargin, w, h))\n        codeImgView.image = codeImg\n        // set shadow\n        codeImgView.layer.shadowOffset = CGSizeMake(0, 2)\n        codeImgView.layer.shadowRadius = 2\n        codeImgView.layer.shadowColor = UIColor.blackColor().CGColor\n        codeImgView.layer.shadowOpacity = 0.5\n        \n        let fileLB = UILabel()\n        fileLB.frame = CGRectMake(sideMargin, topMargin + h + 20, w, 20)\n        fileLB.text = \"—— \\(curFile!.name)\"\n        fileLB.textColor = UIColor.grayColor()\n        fileLB.textAlignment = .Right\n        fileLB.font = fileLB.font.fontWithSize(14)\n        \n        let codeCard = UIView()\n        codeCard.backgroundColor = Constant.CodeLineNumberBackgroudColor\n        codeCard.frame = CGRectMake(0, 0, w + 2 * sideMargin, topMargin + h + buttomMargin)\n        // set shadow\n        codeCard.layer.shadowOffset = CGSizeMake(0, 2)\n        codeCard.layer.shadowRadius = 2\n        codeCard.layer.shadowColor = UIColor.blackColor().CGColor\n        codeCard.layer.shadowOpacity = 0.5\n        codeCard.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self._tapOnShareCodeBlackMaskView)))\n        \n        let blackView = UIView()\n        blackView.frame = view.window!.frame\n        blackView.backgroundColor = RGB(0, 0, 0, alpha: 0.8)\n        blackView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self._tapOnShareCodeBlackMaskView)))\n        \n        codeCard.addSubview(headImg)\n        codeCard.addSubview(nameLB)\n        codeCard.addSubview(textInput)\n        codeCard.addSubview(doneBtn)\n        codeCard.addSubview(codeImgView)\n        codeCard.addSubview(fileLB)\n        \n        codeCard.transform = CGAffineTransformMakeScale(0, 0)\n        \n        view.window?.addSubview(blackView)\n        view.window?.addSubview(codeCard)\n        codeCard.atCenter()\n        \n        UIView.animateWithDuration(0.5) { \n            codeCard.transform = CGAffineTransformMakeScale(0.85, 0.85)\n        }\n        \n        blackMaskView = blackView\n        codeCardView = codeCard\n        \n        return codeImg\n    }\n    \n    func _tapOnShareCodeBlackMaskView() {\n        _removeShareCode(completion: nil)\n    }\n    \n    func _removeShareCode(completion completion: ((codeCard: UIView) -> Void)?) {\n        if let blackView = blackMaskView, let codeCard = codeCardView {\n            let input = codeCard.viewWithTag(211) as! UITextView\n            if !input.resignFirstResponder() {\n                UIView.animateWithDuration(0.5, animations: {\n                    codeCard.y += self.view.height\n                    }, completion: { (_) in\n                        codeCard.removeFromSuperview()\n                        blackView.removeFromSuperview()\n                        completion?(codeCard: codeCard)\n                })\n            }\n        }\n    }\n    \n    func _tapOnShareCodeSendButton() {\n        _removeShareCode { (codeCard) in\n            codeCard.transform = CGAffineTransformMakeScale(1, 1)\n            codeCard.viewWithTag(212)?.removeFromSuperview()\n            self.codeShareImage = codeCard.snapshot()\n            self.popupMenu.showUp()\n        }\n    }\n    \n    override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {\n        if action == #selector(self.shareCodeInPicture) {\n            return true\n        }\n        return super.canPerformAction(action, withSender: sender)\n    }\n    \n    // 旋转屏幕\n    override func didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation) {\n        let bottom = Constant.NavigationBarOffset\n        codeText.frame = CGRectMake(0, 0, view.width, view.height + bottom)\n        codeText.contentInset.bottom = bottom\n        codeText.scrollIndicatorInsets.bottom = bottom\n    }\n    \n    func tapOnPopupMenuItem(itemIndex i: Int) {\n        switch i {\n        case 2: // 微信\n            if let codeImg = codeShareImage {\n                codeShareImage = nil\n                WXShareImage(codeImg)\n            } else {\n                getGhostbinUrl(curFile!.codeLang, text: curFile!.read(), target: self) {\n                    url in\n                    self.WXShareLink(self.curFile!.name, desc: \"给你分享一个神奇的代码\", img: \"file_code_share\", link: url)\n                }\n            }\n        case 3: // 朋友圈\n            if let codeImg = codeShareImage {\n                codeShareImage = nil\n                WXShareImage(codeImg, isTimeline: true)\n            } else {\n                getGhostbinUrl(curFile!.codeLang, text: curFile!.read(), target: self) {\n                    url in\n                    self.WXShareLink(\"这是一份神奇的代码: \\(self.curFile!.name)\", desc: \"\", img: \"file_code_share\", link: url, isTimeline: true)\n                }\n            }\n        default: return\n        }\n    }\n}\n"
  },
  {
    "path": "Sublime/Sublime/ConfigTableViewController.swift",
    "content": "//\n//  ConfigTableViewController.swift\n//  Sublime\n//\n//  Created by Eular on 4/7/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nclass ConfigTableViewController: UITableViewController {\n    \n    @IBOutlet weak var cycriptLabel: UILabel!\n    @IBOutlet weak var cycriptSwitch: UISwitch!\n    @IBOutlet weak var codeReadingSwitch: UISwitch!\n    @IBOutlet weak var showHiddenFilesSwitch: UISwitch!\n    \n    let secTitle = [\"   Debug\", \"   System\"]\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        tableView.allowsSelection = false\n        \n        if Network.isConnectedToNetwork() {\n            let ip = Network.getIFAddresses()[0]\n            cycriptLabel.text = \"\\(ip):8888\"\n        }\n        \n        cycriptSwitch.on = Config.CycriptStartListen\n        codeReadingSwitch.on = Config.FullScreenCodeReadingMode\n        showHiddenFilesSwitch.on = Config.ShowHiddenFiles\n        \n    }\n\n    override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {\n        let title = UILabel(frame: CGRectMake(0, 0, view.width, Constant.FilesTableSectionHight))\n        title.backgroundColor = Constant.CapeCod\n        title.text = secTitle[section]\n        title.textColor = UIColor.whiteColor()\n        title.font = title.font.fontWithSize(12)\n        title.textAlignment = .Natural\n        let headerView = UIView()\n        headerView.addSubview(title)\n        return headerView\n    }\n    \n    override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {\n        return Constant.FilesTableSectionHight\n    }\n    \n    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {\n        tableView.deselectRowAtIndexPath(indexPath, animated: true)\n    }\n    \n    @IBAction func cycriptChangeStatus(sender: UISwitch) {\n        Config.CycriptStartListen = sender.on\n        if sender.on {\n            CYListenServer(8888)\n        } else {\n            view.Toast(message: \"Restart the app to stop Cycript\")\n        }\n    }\n    \n    @IBAction func codeReadingChangeStatus(sender: UISwitch) {\n        Config.FullScreenCodeReadingMode = sender.on\n    }\n    \n    @IBAction func showHiddenChangeStatus(sender: UISwitch) {\n        Config.ShowHiddenFiles = sender.on\n    }\n    \n}\n"
  },
  {
    "path": "Sublime/Sublime/Configure.swift",
    "content": "//\n//  Configure.swift\n//  Sublime\n//\n//  Created by Eular on 4/26/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\nstruct Config {\n    // Cycript开启监听\n    static var CycriptStartListen: Bool {\n        get {\n            return Global.Database.boolForKey(\"Config-CycriptStartListen\")\n        }\n        set {\n            Global.Database.setBool(newValue, forKey: \"Config-CycriptStartListen\")\n        }\n    }\n    \n    // 下滑全屏\n    static var FullScreenCodeReadingMode: Bool {\n        get {\n            return Global.Database.boolForKey(\"Config-FullScreenCodeReadingMode\")\n        }\n        set {\n            Global.Database.setBool(newValue, forKey: \"Config-FullScreenCodeReadingMode\")\n        }\n    }\n    \n    // 显示隐藏文件\n    static var ShowHiddenFiles: Bool {\n        get {\n            return Global.Database.boolForKey(\"Config-ShowHiddenFiles\")\n        }\n        set {\n            Global.Database.setBool(newValue, forKey: \"Config-ShowHiddenFiles\")\n        }\n    }\n    \n    // 是否为本项目点赞\n    static var Starred: Bool {\n        get {\n            return Global.Database.boolForKey(\"Donate-Starred\")\n        }\n        set {\n            Global.Database.setBool(newValue, forKey: \"Donate-Starred\")\n        }\n    }\n    \n    // 是否关注作者\n    static var FollowedAuthor: Bool {\n        get {\n            return Global.Database.boolForKey(\"Donate-FollowedAuthor\")\n        }\n        set {\n            Global.Database.setBool(newValue, forKey: \"Donate-FollowedAuthor\")\n        }\n    }\n    \n    static var WeixinDonated: Bool {\n        get {\n            return Global.Database.boolForKey(\"Donate-WeixinDonated\")\n        }\n        set {\n            Global.Database.setBool(newValue, forKey: \"Donate-WeixinDonated\")\n        }\n    }\n    \n    static var AlipayDonated: Bool {\n        get {\n            return Global.Database.boolForKey(\"Donate-AlipayDonated\")\n        }\n        set {\n            Global.Database.setBool(newValue, forKey: \"Donate-AlipayDonated\")\n        }\n    }\n}"
  },
  {
    "path": "Sublime/Sublime/Constant.swift",
    "content": "//\n//  Constant.swift\n//  Sublime\n//\n//  Created by Eular on 4/26/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\nstruct Constant {\n    // Color\n    static let TableCellColor = \"#515151\".color\n    static let TableCellSeparatorColor = \"#515151\".color\n    static let TableCellSelectedColor = RGB(60, 60, 60)\n    static let ActionSheetColor = UIColor.whiteColor()\n    static let ActionSheetTextColor = UIColor.blackColor()\n    static let ActionSheetLineColor = RGB(200, 200, 200, alpha: 0.5)\n    static let BlackMaskViewColor = RGB(0, 0, 0, alpha: 0.5)\n    \n    static let CapeCod = RGB(81, 81, 81)\n    static let CodeBackgroudColor = RGB(52, 53, 46)\n    static let CodeLineNumberBackgroudColor = RGB(39, 40, 34)\n    static let TableLoadingCircleColor = RGB(78, 221, 200)\n    static let GithubTableShowMsgLabelTextColor = UIColor.grayColor()\n    static let GithubTableShowMsgLabelTextShadowColor = RGB(40, 40, 40)\n    static let TabBatItemBadgeColor = RGB(256, 0, 0, alpha: 0.8)\n    static let PopupMenuColor = UIColor.whiteColor()\n    \n    static let NavigationBarColor = RGB(81, 81, 81)\n    static let NavigationBarAndTabBarColor = RGB(81, 81, 81)\n    \n    // Identifies\n    static let GithubTableCellIdentifier = \"GithubTableCellIdentifier\"\n    static let SettingTableCellIdentifier = \"SettingTableCellIdentifier\"\n    static let GithubSegue = \"githubSegue\"\n    static let FolderStoryboardID = \"FolderStoryboard\"\n    static let ContactTableStoryboardID = \"ContactTableVC\"\n    static let ContactInfoStoryboardID = \"ContactInfoVC\"\n    \n    static let AppGithubUrl = \"https://github.com/urinx\"\n    \n    // Number\n    static let TabBarHeight: CGFloat = 49\n    static let FilesTableSectionHight: CGFloat = 22\n    static let SSHServerListCellHeight: CGFloat = 60\n    static var NavigationBarOffset: CGFloat {\n        guard let navBar = UIApplication.topViewController()?.navigationController?.navigationBar else { return 64 }\n        return navBar.y + navBar.height\n    }\n    \n    // License\n    static let License = [\n        \"AASquaresLoading\", \"Alamofire\", \"AlamofireRSSParser\", \"Charts\",\n        \"CYRTextView\", \"DGElasticPullToRefresh\", \"EZAudio\",\n        \"Gifu\", \"NMSSH\", \"MobileVLCKit\", \"RongCloudIMKit\", \"SJCSimplePDFView\", \"SSZipArchive\",\n        \"Swifter\", \"SwiftyJSON\", \"ZLMusicFlowWaveView\", \"ZLSinusWaveView\"\n    ]\n    \n    // Github Application\n    static let githubClientID = \"5b2b9bdf9c689989240c\"\n    static let githubClientSecret = \"538fb1ae3b29ff7a5c86dea3b2605870a3d9e146\"\n    \n    // Weixin Application\n    static let weixinAppID = \"wxb597aecde6aadd28\"\n    // static let weixinAppID = \"wxeb7ec651dd0aefa9\" //微信网页版ID\n    \n    // 融云\n    static let RongCloudAppKey = \"m7ua80gbu9itm\"\n    static let RongCloudAppSecret = \"n36KioPk7esTtR\"\n    \n    static let RongCloudAuthorUserID = \"Urinx\"\n    static let RongCloudAuthorUserName = \"Uri\"\n    static let RongCloudDefaultUserPortrait = \"http://cdn.duitang.com/uploads/item/201509/27/20150927191624_2tnMS.thumb.700_0.jpeg\"\n    static let RongCloudRobotID = \"KEFU145857181547734\"\n    static let RongCloudRobotName = \"客服机器人\"\n    \n    static let RongCloudUnreadMessageNotifi = \"hasUnreadMessagesNotifi\"\n    \n    // Share Items\n    static let PopupMenuDefaultShareItems = [\n        [\"title\":\"QQ\", \"image\":\"Share_qq_icon\"],\n        [\"title\":\"新浪微博\", \"image\":\"Share_sina_icon\"],\n        [\"title\":\"微信\", \"image\":\"Share_wechat_session_icon\"],\n        [\"title\":\"朋友圈\", \"image\":\"Share_wechat_timeline_icon\"],\n        [\"title\":\"Facebook\", \"image\":\"Share_facebook_icon\"],\n        [\"title\":\"Line\", \"image\":\"Share_line_icon\"],\n        [\"title\":\"Instagram\", \"image\":\"Share_instagram\"],\n        [\"title\":\"Twitter\", \"image\":\"Share_twitter_icon\"],\n        [\"title\":\"QQ空间\", \"image\":\"Share_qzone_icon\"],\n        [\"title\":\"Pinterest\", \"image\":\"Share_pinterest_icon\"],\n        [\"title\":\"豆瓣\", \"image\":\"Share_douban_icon\"]\n    ]\n    \n    static var SublimeRoot: String {\n        return NSHomeDirectory() + \"/Documents/.Sublime\"\n    }\n    \n    static var CachePath: String {\n        return NSHomeDirectory() + \"/Library/Caches/\"\n    }\n    \n    static let AppGithubLink = \"https://github.com/Urinx/Sublime\"\n}\n"
  },
  {
    "path": "Sublime/Sublime/ContactInfoViewController.swift",
    "content": "//\n//  ContactInfoViewController.swift\n//  Sublime\n//\n//  Created by Eular on 4/1/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\n\nclass ContactInfoViewController: UIViewController, PopupMenuDelegate {\n    @IBOutlet weak var headImageView: UIImageView!\n    @IBOutlet weak var nameLabel: UILabel!\n    @IBOutlet weak var githubLabel: UILabel!\n    @IBOutlet weak var QRImageView: UIImageView!\n    \n    let popupMenu = PopupMenu()\n    \n    var id = \"\"\n    var nameCardImage: UIImage {\n        get {\n            return view.snapshot(CGRectMake(0, Constant.NavigationBarOffset, view.width, view.height - 100))\n        }\n    }\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        if id.isEmpty {\n            githubLabel.text = \"github: null\"\n            headImageView.image = UIImage(named: \"user_robot\")\n            nameLabel.text = Constant.RongCloudRobotName\n            QRImageView.image = QRCode().makeWithColor(Constant.AppGithubLink)\n        } else {\n            githubLabel.text = \"github: \\(id)\"\n            \n            RCIM.sharedRCIM().getInfo(id) { (name, portrait) in\n                dispatch_async(dispatch_get_main_queue()) {\n                    self.headImageView.imageFromUrl(portrait)\n                    self.nameLabel.text = name\n                }\n            }\n            \n            QRImageView.image = QRCode().makeWithColor(\"https://github.com/\\(id)\")\n        }\n        \n        // set shadow\n        QRImageView.layer.shadowOffset = CGSizeMake(0, 2)\n        QRImageView.layer.shadowRadius = 2\n        QRImageView.layer.shadowColor = UIColor.blackColor().CGColor\n        QRImageView.layer.shadowOpacity = 0.5\n        \n        // recognize qrcode\n        QRImageView.recognizeQRCodeEnabled = true\n        \n        // 设置分享菜单\n        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Action, target: popupMenu, action: #selector(popupMenu.showUp))\n        popupMenu.controller = self\n        popupMenu.delegate = self\n    }\n    \n    override func viewDidAppear(animated: Bool) {\n        popupMenu.itemsToShare = [nameCardImage]\n    }\n    \n    func tapOnPopupMenuItem(itemIndex i: Int) {\n        switch i {\n        case 2:\n            WXShareImage(nameCardImage)\n        case 3:\n            WXShareImage(nameCardImage, isTimeline: true)\n        default:\n            return\n        }\n    }\n\n}\n"
  },
  {
    "path": "Sublime/Sublime/ContactTableViewController.swift",
    "content": "//\n//  ContactTableViewController.swift\n//  Sublime\n//\n//  Created by Eular on 3/21/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\n\nclass ContactTableViewController: UITableViewController {\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        let infoBtn = UIBarButtonItem(image: UIImage(named: \"user_info\"), style: UIBarButtonItemStyle.Plain, target: self, action: #selector(self.lookUserInfo))\n        navigationItem.rightBarButtonItem = infoBtn\n        \n        let lb = UILabel()\n        lb.text = \"2 位联系人\"\n        lb.font = lb.font.fontWithSize(13)\n        lb.textAlignment = .Center\n        lb.textColor = UIColor.grayColor()\n        lb.frame = CGRectMake(0, 0, view.bounds.width, 60)\n        tableView.tableFooterView = lb\n    }\n    \n    func lookUserInfo() {\n        let contactInfoVC = UIStoryboard(name: \"Main\", bundle: nil).instantiateViewControllerWithIdentifier(Constant.ContactInfoStoryboardID) as! ContactInfoViewController\n        contactInfoVC.id = RCIM.sharedRCIM().currentUserInfo.userId\n        navigationController?.pushViewController(contactInfoVC, animated: true)\n    }\n    \n    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {\n        tableView.deselectRowAtIndexPath(indexPath, animated: true)\n        \n        let chat = RCChatViewController()\n        \n        switch indexPath.section {\n        case 1:\n            chat.conversationType = .ConversationType_APPSERVICE\n            chat.title = Constant.RongCloudRobotName\n            chat.targetId = Constant.RongCloudRobotID\n        case 2:\n            chat.conversationType = .ConversationType_PRIVATE\n            chat.title = Constant.RongCloudAuthorUserName\n            chat.targetId = Constant.RongCloudAuthorUserID\n        default:\n            return\n        }\n        \n        navigationController?.pushViewController(chat, animated: true)\n    }\n}\n"
  },
  {
    "path": "Sublime/Sublime/CustomServer.swift",
    "content": "//\n//  CustomServer.swift\n//  Sublime\n//\n//  Created by Eular on 3/10/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\nimport Swifter\n\nextension HttpHandlers {\n    public class func shareFilesFromDirectory(directoryPath: String, serverLog: WebServerLog?) -> (HttpRequest -> HttpResponse) {\n        return { r in\n            guard let fileRelativePath = r.params.first else {\n                serverLog?.log(r, statusCode: 404)\n                return Page404()\n            }\n            let absolutePath = directoryPath + \"/\" + fileRelativePath.1\n            guard let file = try? Swifter.File.openForReading(absolutePath) else {\n                serverLog?.log(r, statusCode: 404)\n                serverLog?.log(\"Error: Read file failed\", isError: true)\n                return Page404()\n            }\n            serverLog?.log(r, statusCode: 200)\n            return .RAW(200, \"OK\", [:], { writer in\n                var buffer = [UInt8](count: 64, repeatedValue: 0)\n                while let count = try? file.read(&buffer) where count > 0 {\n                    writer.write(buffer[0..<count])\n                }\n                file.close()\n            })\n        }\n    }\n    \n    public class func Page404() -> HttpResponse {\n        let html = NSData(contentsOfFile: NSBundle.mainBundle().pathForResource(\"Web/404\", ofType: \"html\")!)!\n        var array = [UInt8](count: html.length, repeatedValue: 0)\n        html.getBytes(&array, length: html.length)\n        return .RAW(200, \"OK\", nil, { $0.write(array) })\n    }\n}\n\npublic func CustomServer(serverLog: WebServerLog?) -> HttpServer {\n    let server = HttpServer()\n    let publicDir = Folder(path: Constant.SublimeRoot+\"/var/www\")\n    \n    server[\"/:path\"] = HttpHandlers.shareFilesFromDirectory(publicDir.path, serverLog: serverLog)\n    \n    server[\"/\"] = { r in\n        if let html = NSData(contentsOfFile:\"\\(publicDir.path)/index.html\") {\n            serverLog?.log(r)\n            var array = [UInt8](count: html.length, repeatedValue: 0)\n            html.getBytes(&array, length: html.length)\n            return HttpResponse.RAW(200, \"OK\", nil, { $0.write(array) })\n        } else {\n            serverLog?.log(r, statusCode: 404)\n            return HttpHandlers.Page404()\n        }\n    }\n    \n    return server\n}\n"
  },
  {
    "path": "Sublime/Sublime/DonateViewController.swift",
    "content": "//\n//  DonateViewController.swift\n//  Sublime\n//\n//  Created by Eular on 5/6/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nclass DonateViewController: UITableViewController {\n\n    let secTitle = [\n        \"Never doubt a little star can make a difference\",\n        \"Because of you guys, I'm not alone anymore\",\n        \"Money is devil, but devil push me to make this better\",\n        \"2016.5 夏日小记\"\n    ]\n    let cellText = [\n        [\"└─ Star Project:\\(Config.Starred)\"],\n        [\"└─ Follow Author:\\(Config.FollowedAuthor)\"],\n        [\"├─ Weixin Donate:\\(Config.WeixinDonated)\",\n         \"└─ AliPay Donate:\\(Config.AlipayDonated)\"],\n        [\n        \"从2012年那个秋季踏入这个校园开始，没想到，四年就这样过去了，山河仍在，心境已改。说快不快，也不是那么的让人缓慢，倒有点像暴雨前夕般让人闷热难耐。\",\n        \"大学四年，尽管都是从相同的起点走到相同的终点，可是在这样一个不满足柯西公式的世界里，路径不同，风景不同，结果总会让人相视无言。\",\n        \"img:donate1\",\n        \"此时我处于图书馆六楼一个坐在靠窗座位上的场景下，早上的图书馆人来的较少，之前复习的学生也随着刚过去的考试周而退潮，周围只有零星几个看书的少年。这个时候再回过头来看看自己大学这段时期，讲真，也没啥可回忆的。那个你曾经憧憬的大学生活，等你真正体验过，才明白原来不过如此。大学里让你映像最深刻的一件事是什么是一个很难回答的问题，至少，我给不出答案。\",\n        \"有时候我不得不承认，自己确实是一个失败的人。每天浑浑噩噩，虚度光阴，三点一线的穿梭在校园，就像一部黑白默片，悄无声息的放映着，直到最后，才发现什么都没做，才发现自己是多么的一无是处。就像太宰治所说，生而为人，我很抱歉。\",\n        \"img:donate2\",\n        \"当我第一次注意到《咒怨》里的佐佐木希，我就发现我喜欢上她了，她在《天使之恋》里的表现也让人激动。我还记得有一个场景里，她那45度角仰望青空，若有所思的样子让人沉迷。不过让人遗憾的是，我的佐佐木希并没有在大学四年里出现在我的身边，尽管我也曾多么希望有那么一位能一起共享这段时光。好吧，诸事难遂人意，强争无益。\",\n        \"img:donate3\",\n        \"为什么做这个，也许是自己闲的蛋疼，也许是给自己这四年最后的一个交代。记得是那天晚上，我又一次的失眠了，与外界的安逸不同，内心的躁动让我辗转反侧。掏出手机，微信上各种小红点以及庞大的信息流让人无所适从，夜深人静的时候，有时你会发现，莫名的，自己突然想看看代码了。\",\n        \"在手机上阅读源码，就是这么简单的一件事，在App store上搜索了半天，代码阅读的应用没几个，也没有一个令人满意的：Codeanywhere的代码是存在云端要联网；CodeMate支持多种代码，但功能单一；Pythonista最强大，能够在手机上本地运行python脚本无所不能，具有多种主题，不过价格较贵，且主要是针对python代码。在现实面前，这是我唯一能做到的不妥协和不将就。所以，那就自己做了，就这样。\",\n        \"img:donate4\",\n        \"安迪·安德鲁斯说过，人的一生中至少有两次冲动，一次奋不顾身的爱情，一次说走就走的旅行。世界那么大，说实话，还真没怎么看过，我想去看看。\",\n        \"img:donate5\",\n        \"（完） ——  2016.5.31  K.K M\"\n        ]\n    ]\n    let headerHeight: CGFloat = 300\n    let headerImage = UIImageView()\n    var player: AVAudioPlayer!\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        title = \"Donate\"\n        view.backgroundColor = Constant.CapeCod\n        tableView.separatorColor = Constant.TableCellSeparatorColor\n        tableView.estimatedRowHeight = 44\n        tableView.rowHeight = UITableViewAutomaticDimension\n        \n        tableView.contentInset = UIEdgeInsets(top: headerHeight, left: 0, bottom: 0, right: 0)\n        headerImage.frame = CGRectMake(0, -headerHeight, view.width, headerHeight)\n        headerImage.image = UIImage(named: \"donate\")\n        headerImage.contentMode = .ScaleAspectFill\n        tableView.addSubview(headerImage)\n        tableView.sendSubviewToBack(headerImage)\n        \n        do {\n            player = try AVAudioPlayer(contentsOfURL: NSBundle.mainBundle().URLForResource(\"山外小楼夜听雨.m4a\", withExtension: nil)!)\n            player.numberOfLoops = -1\n            player.play()\n        } catch {}\n    }\n    \n    override func scrollViewDidScroll(scrollView: UIScrollView) {\n        let point = scrollView.contentOffset\n        headerImage.frame = CGRectMake(0, point.y, view.width, -point.y)\n        \n        if point.y > -headerHeight && point.y <= 0 {\n            tableView.contentInset = UIEdgeInsets(top: abs(point.y), left: 0, bottom: 0, right: 0)\n        } else if point.y > 0 {\n            tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)\n        }\n    }\n    \n    override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {\n        let title = UILabel(frame: CGRectMake(0, 0, view.width, Constant.FilesTableSectionHight))\n        title.backgroundColor = Constant.CapeCod\n        title.text = \"   \"+secTitle[section]\n        title.textColor = UIColor.whiteColor()\n        title.font = title.font.fontWithSize(12)\n        title.textAlignment = .Natural\n        let headerView = UIView()\n        headerView.addSubview(title)\n        return headerView\n    }\n    \n    override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {\n        return Constant.FilesTableSectionHight\n    }\n    \n    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {\n        return secTitle.count\n    }\n    \n    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return cellText[section].count\n    }\n    \n    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {\n        let cell = UITableViewCell(style: .Default, reuseIdentifier: nil)\n        cell.backgroundColor = Constant.TableCellColor\n        cell.selectedBackgroundView = UIView(frame: cell.frame)\n        cell.textLabel?.textColor = UIColor.whiteColor()\n        cell.tintColor = UIColor.whiteColor()\n        \n        let text = cellText[indexPath.section][indexPath.row]\n        if indexPath.section == secTitle.count - 1 {\n            cell.selectedBackgroundView?.backgroundColor = Constant.TableCellColor\n            cell.textLabel?.numberOfLines = 0\n\n            if text.hasPrefix(\"img:\") {\n                let name = text.split(\":\")[1]\n                let width = view.width - 17 * 2\n                cell.imageView?.image = UIImage(named: name)?.rescaleImageByWidth(width)\n            } else {\n                cell.textLabel?.text = text\n                cell.textLabel?.lineBreakMode = .ByCharWrapping\n                cell.textLabel?.font = cell.textLabel?.font.fontWithSize(15)\n            }\n        } else {\n            cell.textLabel?.text = text.split(\":\")[0]\n            cell.accessoryType = text.split(\":\")[1] == \"true\" ? .Checkmark : .DisclosureIndicator\n            cell.selectedBackgroundView?.backgroundColor = Constant.TableCellSelectedColor\n        }\n        \n        return cell\n    }\n    \n    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {\n        tableView.deselectRowAtIndexPath(indexPath, animated: true)\n        \n        switch (indexPath.section, indexPath.row) {\n        case (0,0):\n            if !Config.Starred {\n                if GitHubAPIManager.isLogin {\n                    if Network.isConnectedToNetwork() {\n                        let github = GitHubAPIManager()\n                        github.star(\"Urinx\", repo: \"WeixinBot\", success: {\n                            let cell = tableView.cellForRowAtIndexPath(indexPath)\n                            cell?.accessoryType = .Checkmark\n                            Config.Starred = true\n                        }, fail: {\n                            self.view.window?.Toast(message: \"The network is not well, please try again\")\n                        })\n                    } else {\n                        view.window?.Toast(message: \"Error: No network\")\n                    }\n                } else {\n                    let alert = UIAlertController(title: \"(*´ڡ`●)\", message: \"Ops! This function requires that Github account is logined.\", preferredStyle: .Alert)\n                    alert.addAction(UIAlertAction(title: \"OK\", style: .Default, handler: nil))\n                    presentViewController(alert, animated: true, completion: nil)\n                }\n            }\n        case (1,0):\n            if !Config.FollowedAuthor {\n                if GitHubAPIManager.isLogin {\n                    if Network.isConnectedToNetwork() {\n                        let github = GitHubAPIManager()\n                        github.follow(\"Urinx\", success: {\n                            let cell = tableView.cellForRowAtIndexPath(indexPath)\n                            cell?.accessoryType = .Checkmark\n                            Config.FollowedAuthor = true\n                        }, fail: {\n                                self.view.window?.Toast(message: \"The network is not well, please try again\")\n                        })\n                    } else {\n                        view.window?.Toast(message: \"Error: No network\")\n                    }\n                } else {\n                    let alert = UIAlertController(title: \"(*´ڡ`●)\", message: \"Ops! This function requires that Github account is logined.\", preferredStyle: .Alert)\n                    alert.addAction(UIAlertAction(title: \"OK\", style: .Default, handler: nil))\n                    presentViewController(alert, animated: true, completion: nil)\n                }\n            }\n        case (2,0):\n            // https://wx.tenpay.com/f2f?t=AQAAAAKUGF%2BtHt037N4rgTLUV54%3D\n            Config.WeixinDonated = true\n            let cell = tableView.cellForRowAtIndexPath(indexPath)\n            cell?.accessoryType = .Checkmark\n            WXShareImage(UIImage(named: \"donate_weixin\")!)\n        case (2,1):\n            // #吱口令#gSstPA146v\n            let pasteBoard = UIPasteboard.generalPasteboard()\n            pasteBoard.string = \"#吱口令#gSstPA146v\"\n            Config.AlipayDonated = true\n            let cell = tableView.cellForRowAtIndexPath(indexPath)\n            cell?.accessoryType = .Checkmark\n            UIApplication.sharedApplication().openURL(NSURL(string: \"alipay://\")!)\n        default:\n            break\n        }\n    }\n\n}\n"
  },
  {
    "path": "Sublime/Sublime/ExploreTableViewController.swift",
    "content": "//\n//  ExploreTableViewController.swift\n//  Sublime\n//\n//  Created by Eular on 4/6/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nclass ExploreTableViewController: UITableViewController {\n    @IBOutlet weak var msgCountLB: UILabel!\n\n    let secTitle = [\"   Explore\", \"   Function\"]\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n    }\n    \n    override func viewWillAppear(animated: Bool) {\n        msgCountLB.hidden = true\n        if Global.UnreadMessageCount != 0 {\n            msgCountLB.text = \"\\(Global.UnreadMessageCount)\"\n            msgCountLB.hidden = false\n        }\n        tabBarController?.tabBar.hideRedBadgeOnItem(1)\n    }\n    \n    override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {\n        let title = UILabel(frame: CGRectMake(0, 0, view.width, Constant.FilesTableSectionHight))\n        title.backgroundColor = Constant.CapeCod\n        title.text = secTitle[section]\n        title.textColor = UIColor.whiteColor()\n        title.font = title.font.fontWithSize(12)\n        title.textAlignment = .Natural\n        let headerView = UIView()\n        headerView.addSubview(title)\n        return headerView\n    }\n    \n    override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {\n        return Constant.FilesTableSectionHight\n    }\n    \n    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {\n        tableView.deselectRowAtIndexPath(indexPath, animated: true)\n        \n        // Functions\n        switch (indexPath.section, indexPath.row) {\n//        case (0,0):\n//            let gvc = GistTable()\n//            gvc.hidesBottomBarWhenPushed = true\n//            navigationController?.pushViewController(gvc, animated: true)\n        case (1,1):\n            let svc = SSHServerListTableViewController()\n            svc.hidesBottomBarWhenPushed = true\n            navigationController?.pushViewController(svc, animated: true)\n        case (1,2):\n            if GitHubAPIManager.isLogin {\n                let messageList = MessageListViewController()\n                messageList.hidesBottomBarWhenPushed = true\n                navigationController?.pushViewController(messageList, animated: true)\n            } else {\n                let alert = UIAlertController(title: \"(*´ڡ`●)\", message: \"Ops! This function requires that Github account is logined.\", preferredStyle: .Alert)\n                alert.addAction(UIAlertAction(title: \"OK\", style: .Default, handler: nil))\n                presentViewController(alert, animated: true, completion: nil)\n            }\n        case (1,3):\n            let rss = RSSListTableViewController()\n            rss.hidesBottomBarWhenPushed = true\n            navigationController?.pushViewController(rss, animated: true)\n        case (1,4):\n            let qrReader = QRCodeReaderViewController()\n            qrReader.hidesBottomBarWhenPushed = true\n            navigationController?.pushViewController(qrReader, animated: true)\n        default: return\n        }\n    }\n\n}\n"
  },
  {
    "path": "Sublime/Sublime/FolderTableViewController.swift",
    "content": "//\n//  FolderTableViewController.swift\n//  Sublime\n//\n//  Created by Eular on 2/14/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\n\nclass FolderTableViewController: UITableViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, ActionSheetDelegate {\n    \n    var curFolder: Folder = Folder(path: NSHomeDirectory()+\"/Documents\")\n    var mainViewFlag: Int = 1\n    var fileList: [File] = []\n    var actionSheet: ActionSheet!\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        title = curFolder.name\n        tableView.backgroundColor = Constant.CapeCod\n        tableView.separatorColor = Constant.TableCellSeparatorColor\n        \n        self.clearsSelectionOnViewWillAppear = true\n        tableView.tintColor = UIColor.whiteColor()\n\n        // Dropdown Menu\n        actionSheet = ActionSheet(rowWidth: view.width, rowHight: 50)\n        actionSheet.items = [\"File\", \"Folder\", \"Image\"]\n        actionSheet.controller = self\n        actionSheet.delegate = self\n        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Add, target: actionSheet, action: #selector(actionSheet.showUp))\n    }\n    \n    override func viewWillAppear(animated: Bool) {\n        updateFileListData()\n    }\n    \n    override func viewDidAppear(animated: Bool) {\n        updateFileListData()\n    }\n    \n    func updateFileListData() {\n        fileList = curFolder.listFiles()\n        \n        // 隐藏文件\n        if !Config.ShowHiddenFiles {\n            fileList = fileList.filter { !$0.name.hasPrefix(\".\") }\n        }\n        \n        // 按目录在最上面规则排序\n        fileList.sortInPlace {\n            if $0.0.isDir && $0.1.isDir {\n                return false\n            } else {\n                return $0.0.isDir\n            }\n        }\n        \n        tableView.reloadData()\n    }\n    \n    func tapOnActionSheetItem(itemAtRow row: Int) {\n        switch row {\n        case 0, 1:\n            let nvc = NewFileViewController()\n            nvc.tag = row\n            nvc.curFolder = curFolder\n            navigationController?.pushViewController(nvc, animated: true)\n        case 2:\n            let imgPicker = UIImagePickerController()\n            imgPicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary\n            imgPicker.delegate = self\n            self.presentViewController(imgPicker, animated: true, completion: nil)\n        default: return\n        }\n    }\n    \n    // 保存图片\n    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {\n        let image = info[\"UIImagePickerControllerOriginalImage\"] as! UIImage\n        let url = info[\"UIImagePickerControllerReferenceURL\"] as! NSURL\n        curFolder.saveImage(image, name: \"IMG_\\(random(1000)).\\(url.pathExtension!.lower)\", url: url)\n        picker.dismissViewControllerAnimated(true, completion: nil)\n    }\n\n    // MARK: - Table view data source\n    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {\n        return 1\n    }\n\n    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return fileList.count\n    }\n    \n    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {\n        let cell = UITableViewCell(style: .Default, reuseIdentifier: nil)\n        let f = fileList[indexPath.row]\n        setFileTableCell(cell, name: f.name, imgname: f.img, isDir: f.isDir)\n        return cell\n    }\n    \n    func setFileTableCell(cell: UITableViewCell, name: String, imgname: String, isDir: Bool) {\n        cell.backgroundColor = Constant.TableCellColor\n        cell.selectedBackgroundView = UIView(frame: cell.frame)\n        cell.selectedBackgroundView?.backgroundColor = Constant.TableCellSelectedColor\n        \n        cell.accessoryType = isDir ? .DisclosureIndicator : .None\n        cell.textLabel?.text = name\n        cell.textLabel?.textColor = UIColor.whiteColor()\n        \n        let img = UIImageView()\n        img.frame = CGRectMake(14, 8, 28, 28)\n        img.image = UIImage(named: imgname)\n        cell.imageView?.contentMode = .ScaleAspectFit\n        cell.addSubview(img)\n        \n        // 占位用\n        cell.imageView?.image = UIImage(named: \"tab_icon_files\")\n        cell.imageView?.hidden = true\n    }\n    \n    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {\n        tableView.deselectRowAtIndexPath(indexPath, animated: true)\n        switch indexPath.section + mainViewFlag {\n            case 0:\n                let gvc = GithubTableViewController()\n                gvc.tag = indexPath.row\n                gvc.hidesBottomBarWhenPushed = true\n                navigationController?.pushViewController(gvc, animated: true)\n            case 1:\n                let file = fileList[indexPath.row]\n                if file.isDir {\n                    let fvc = FolderTableViewController()\n                    fvc.hidesBottomBarWhenPushed = true\n                    fvc.curFolder = file as! Folder\n                    navigationController?.pushViewController(fvc, animated: true)\n                } else if file.isImg {\n                    let ivc = ImagePageViewController()\n                    let imgList = fileList.filter { $0.isImg }\n                    ivc.index = (imgList as NSArray).indexOfObject(file)\n                    ivc.imgList = imgList\n                    ivc.hidesBottomBarWhenPushed = true\n                    navigationController?.pushViewController(ivc, animated: true)\n                } else if file.isAudio {\n                    let mvc = MusicViewController()\n                    mvc.curFile = file\n                    mvc.hidesBottomBarWhenPushed = true\n                    navigationController?.pushViewController(mvc, animated: true)\n                } else if file.isVideo {\n                    let vvc = VideoViewController()\n                    vvc.curFile = file\n                    vvc.hidesBottomBarWhenPushed = true\n                    navigationController?.pushViewController(vvc, animated: true)\n                } else if file.ext == \"pdf\" {\n                    let pvc = PDFViewController()\n                    pvc.curFile = file\n                    pvc.hidesBottomBarWhenPushed = true\n                    navigationController?.pushViewController(pvc, animated: true)\n                } else if file.ext == \"zip\" {\n                    //...\n                } else {\n                    let fvc = CodeViewController()\n                    fvc.curFile = Code(path: file.path, language: file.codeLang)\n                    fvc.hidesBottomBarWhenPushed = true\n                    navigationController?.pushViewController(fvc, animated: true)\n                }\n            default: return\n        }\n    }\n    \n    override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {\n        return indexPath.section + mainViewFlag == 1\n    }\n    \n    override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {\n        if editingStyle == .Delete {\n            let f = fileList.removeAtIndex(indexPath.row)\n            f.delete()\n            tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)\n        }\n    }\n\n}\n"
  },
  {
    "path": "Sublime/Sublime/Gist.swift",
    "content": "//\n//  Gist.swift\n//  Sublime\n//\n//  Created by Eular on 5/9/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\nimport SwiftyJSON\nimport Alamofire\n\nstruct Gist {\n    var url: String\n    var ownerLogin: String\n    var description: String\n    var avatar_url: String\n    var comments: Int\n    var created_at: String\n    var files: [[String: String]] = []\n    \n    init(json: JSON) {\n        self.url = json[\"url\"].string ?? \"\"\n        self.description = json[\"description\"].string ?? \"\"\n        self.ownerLogin = json[\"owner\"][\"login\"].string  ?? \"\"\n        self.avatar_url = json[\"owner\"][\"avatar_url\"].string  ?? \"\"\n        self.comments = json[\"comments\"].int ?? 0\n        \n        let time = json[\"created_at\"].string?.replace(\"T\", \" \").replace(\"Z\", \"\") ?? \"\"\n        self.created_at = time\n        \n        for (key, value) in json[\"files\"] {\n            var t: [String: String] = [:]\n            t[\"raw_url\"] = value[\"raw_url\"].string\n            t[\"size\"] = value[\"size\"].string\n            t[\"language\"] = value[\"language\"].string\n            t[\"filename\"] = key\n            self.files << t\n        }\n    }\n    \n    func getRawData(completion: ((content: String) -> Void)? = nil) {\n        let url = self.files[0][\"raw_url\"]!\n        Alamofire.request(.GET, url).responseString { response in\n            guard let content = response.result.value else { return }\n            completion?(content: content)\n        }\n    }\n}"
  },
  {
    "path": "Sublime/Sublime/GistTable.swift",
    "content": "//\n//  GistTable.swift\n//  Sublime\n//\n//  Created by Eular on 5/9/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\nclass GistTable: UITableViewController {\n    \n    let github = GitHubAPIManager()\n    let refreshController = UIRefreshControl()\n    var gistData: [Gist] = []\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        title = \"Gist\"\n        view.backgroundColor = Constant.CapeCod\n        tableView.separatorColor = UIColor.clearColor()\n        tableView.estimatedRowHeight = 216\n        tableView.rowHeight = UITableViewAutomaticDimension\n        tableView.allowsSelection = false\n        \n        makeTableHeader()\n        \n        // add pull-to-refresh\n        refreshController.addTarget(self, action: #selector(self.refreshData), forControlEvents: UIControlEvents.ValueChanged)\n        refreshController.tintColor = UIColor.whiteColor()\n        tableView.addSubview(refreshController)\n        \n        // right bar item\n        let downloadBtn = UIBarButtonItem(barButtonSystemItem: .Camera, target: self, action: nil)\n        navigationItem.rightBarButtonItem = downloadBtn\n        \n        refreshData()\n    }\n    \n    func makeTableHeader() {\n        let headerView = UIView()\n        let bgImgView = UIImageView()\n        let headImgView = UIImageView()\n        let nameLabel = UILabel()\n        \n        let headerWidth = self.view.bounds.size.width\n        let headerHeight = headerWidth - 30\n        let imgOffset = CGFloat(-60)\n        let headImgWidth = CGFloat(70)\n        let labelWidth = headerWidth - headImgWidth - 25\n        let labelHeight = CGFloat(30)\n        \n        headerView.frame = CGRectMake(0, 0, headerWidth, headerHeight)\n        headerView.backgroundColor = UIColor.whiteColor()\n        bgImgView.frame = CGRectMake(0, imgOffset, headerWidth + 5, headerWidth)\n        bgImgView.image = UIImage(named: \"gist_bg\")\n        bgImgView.contentMode = .ScaleAspectFill\n        headerView.addSubview(bgImgView)\n        \n        headImgView.frame = CGRectMake(headerWidth - headImgWidth - 10, headerHeight - headImgWidth - 10, headImgWidth, headImgWidth)\n        headImgView.layer.borderWidth = 1\n        headImgView.layer.borderColor = UIColor.whiteColor().CGColor\n        if let avatar_url = github.user[\"avatar_url\"].string {\n            headImgView.imageFromUrl(avatar_url)\n        }\n        headerView.addSubview(headImgView)\n        \n        nameLabel.frame = CGRectMake(0, headerHeight - labelHeight - 35, labelWidth, labelHeight)\n        nameLabel.text = github.user[\"name\"].string\n        nameLabel.textColor = UIColor.whiteColor()\n        nameLabel.textAlignment = .Right\n        nameLabel.font = UIFont(name: nameLabel.font.fontName, size: 19)\n        headerView.addSubview(nameLabel)\n        \n        tableView.tableHeaderView = headerView\n    }\n    \n    func refreshData() {\n        github.listGists { gists in\n            self.gistData = gists\n            self.tableView.reloadData()\n            self.refreshController.endRefreshing()\n        }\n    }\n    \n    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {\n        return 1\n    }\n    \n    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return gistData.count == 0 ? 1:gistData.count\n    }\n    \n    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {\n        let cell = tableView.dequeueReusableCellWithIdentifier(\"gistCell\", forIndexPath: indexPath)\n        if gistData.count != 0 {\n            let gist = gistData[indexPath.row]\n            \n            let header = cell.viewWithTag(6) as! UIImageView\n            let title = cell.viewWithTag(3) as! UILabel\n            let description = cell.viewWithTag(4) as! UILabel\n            let comment = cell.viewWithTag(7) as! UILabel\n            let time = cell.viewWithTag(5) as! UILabel\n            let codeView = cell.viewWithTag(2)!\n            let codeText = CodeEngine().textView\n            codeView.addSubview(codeText)\n            codeText.autoLayout(top: 0, left: 0, bottom: 0, right: 0)\n            \n            header.imageFromUrl(gist.avatar_url)\n            title.text = \"\\(gist.ownerLogin) / \\(gist.files[0][\"filename\"]!)\"\n            description.text = gist.description\n            comment.text = \"\\(gist.comments)\"\n            \n            let now = NSDate()\n            let diff = now - gist.created_at.toGMTDate(\"yyyy-MM-dd HH:mm:ss\")!\n            time.text = \"\\(diff.minute) minutes ago\"\n            \n            gist.getRawData { content in\n                codeText.text = content\n            }\n        }\n        return cell\n    }\n    \n    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {\n        tableView.deselectRowAtIndexPath(indexPath, animated: true)\n    }\n}\n"
  },
  {
    "path": "Sublime/Sublime/GithubAccountTableViewController.swift",
    "content": "//\n//  GithubAccountTableViewController.swift\n//  Sublime\n//\n//  Created by Eular on 2/24/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\nimport AASquaresLoading\n\nclass GithubAccountTableViewController: UITableViewController, GithubAPIManagerDelegate {\n    \n    @IBOutlet weak var avatarView: UIImageView!\n    @IBOutlet weak var nameLB: UILabel!\n    @IBOutlet weak var idLB: UILabel!\n    @IBOutlet weak var companyLB: UILabel!\n    @IBOutlet weak var locationLB: UILabel!\n    @IBOutlet weak var emailLB: UILabel!\n    @IBOutlet weak var blogLB: UILabel!\n    @IBOutlet weak var usageLB: UILabel!\n    @IBOutlet weak var followerLB: UILabel!\n    @IBOutlet weak var repoLB: UILabel!\n    @IBOutlet weak var followingLB: UILabel!\n    \n    let github = GitHubAPIManager()\n    var loadingSquare: AASquaresLoading?\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        view.backgroundColor = Constant.CapeCod\n        title = \"Github\"\n        \n        if GitHubAPIManager.isLogin {\n            updateUserInfo()\n        } else {\n            loadingSquare = AASquaresLoading(target: self.view, size: 40)\n            loadingSquare?.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.3)\n            loadingSquare?.color = UIColor.whiteColor()\n            \n            showLoginView()\n        }\n        \n        navigationController?.navigationBar.translucent = false\n    }\n    \n    func updateUserInfo() {\n        nameLB.text = github.user[\"name\"].string\n        idLB.text = github.user[\"login\"].string\n        companyLB.text = github.user[\"company\"].string\n        locationLB.text = github.user[\"location\"].string\n        emailLB.text = github.user[\"email\"].string\n        blogLB.text = github.user[\"blog\"].string\n        \n        if let avatar_url = github.user[\"avatar_url\"].string {\n            avatarView.imageFromUrl(avatar_url)\n        }\n        \n        followerLB.text = \"\\(github.user[\"followers\"].int ?? 0)\"\n        repoLB.text = \"\\(github.user[\"public_repos\"].int ?? 0)\"\n        followingLB.text = \"\\(github.user[\"following\"].int ?? 0)\"\n        \n        let used = (github.user[\"disk_usage\"].double ?? 0) * 1024\n        let total = (github.user[\"plan\"][\"space\"].double ?? 0) * 1024\n        usageLB.text = \"\\(used.GB.afterPoint(2))GB / \\(total.GB.afterPoint(2))GB\"\n    }\n    \n    func showLoginView() {\n        tableView.separatorColor = UIColor.blackColor().colorWithAlphaComponent(0)\n        \n        let loginView = UIView()\n        loginView.tag = 1008611\n        loginView.frame = view.frame\n        loginView.y = view.height\n        loginView.backgroundColor = Constant.CapeCod\n        let img = UIImageView()\n        let imgH: CGFloat = 290\n        let imgW: CGFloat = 300\n        let imgOffsetH: CGFloat = (view.height - imgH - Constant.NavigationBarOffset) / 2\n        let imgOffsetW: CGFloat = (view.width - imgW) / 2\n        img.frame = CGRectMake(imgOffsetW, imgOffsetH, imgW, imgH)\n        img.image = UIImage(named: \"github_login\")\n        let btn = UIButton()\n        btn.frame = CGRectMake(imgOffsetW + 105, imgOffsetH + 165, 100, 50)\n        //btn.layer.borderWidth = 1\n        btn.addTarget(self, action: #selector(self.githubLogin), forControlEvents: .TouchUpInside)\n        loginView.addSubview(img)\n        loginView.addSubview(btn)\n        view.addSubview(loginView)\n        \n        UIView.animateWithDuration(1) {\n            loginView.y = 0\n        }\n    }\n    \n    func githubLogin() {\n        github.delegate = self\n        github.OAuth2()\n    }\n    \n    func githubOAuthCode(notification: NSNotification) {\n        github.handleOAuthCode(notification)\n        loadingSquare?.start()\n    }\n    \n    func githubGetUserInfoCompleted() {\n        loadingSquare?.stop()\n        updateUserInfo()\n        tableView.reloadData()\n        tableView.separatorColor = Constant.CapeCod\n        \n        if let loginView = view.viewWithTag(1008611) {\n            UIView.animateWithDuration(1, animations: {\n                loginView.alpha = 0\n            }) { (_) -> Void in\n                loginView.removeFromSuperview()\n            }\n        }\n    }\n\n    // MARK: - Table view data source\n    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {\n        return GitHubAPIManager.isLogin ? 3 : 0\n    }\n\n    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return section == 0 ? 6 : 1\n    }\n    \n    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {\n        tableView.deselectRowAtIndexPath(indexPath, animated: true)\n        \n        if indexPath.section == 2 {\n            github.logout()\n            showLoginView()\n        }\n    }\n    \n    override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {\n        return Constant.FilesTableSectionHight\n    }\n    \n    override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {\n        let headerView = UIView()\n        headerView.backgroundColor = Constant.CapeCod\n        return headerView\n    }\n\n}\n"
  },
  {
    "path": "Sublime/Sublime/GithubTableViewController.swift",
    "content": "//\n//  GithubTableViewController.swift\n//  Sublime\n//\n//  Created by Eular on 2/14/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\nimport AASquaresLoading\nimport DGElasticPullToRefresh\n\nclass GithubTableViewController: UITableViewController {\n    \n    let github = GitHubAPIManager()\n    var accuntBtn: UIBarButtonItem?\n    var tag = 0\n    var repoData = [Repo]()\n    var loadingSquare: AASquaresLoading!\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        title = [\"Stars\", \"Repositories\"][tag]\n        view.backgroundColor = Constant.CapeCod\n        tableView.separatorColor = Constant.CapeCod\n        tableView.tableFooterView = UIView()\n        \n        accuntBtn = UIBarButtonItem(title: \"0\", style: .Plain, target: self, action: nil)\n        self.navigationItem.rightBarButtonItem = accuntBtn\n        \n        if Network.isConnectedToNetwork() {\n            if GitHubAPIManager.isLogin {\n                loadingSquare = AASquaresLoading(target: self.view, size: 40)\n                loadingSquare.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.3)\n                loadingSquare.color = UIColor.whiteColor()\n                loadingSquare.start()\n                tableView.scrollEnabled = false\n                \n                // Table push Loading Circle\n                let loadingView = DGElasticPullToRefreshLoadingViewCircle()\n                loadingView.tintColor = Constant.TableLoadingCircleColor\n                tableView.dg_addPullToRefreshWithActionHandler({ [weak self] () -> Void in\n                    self?.updateDataList()\n                    self?.tableView.dg_stopLoading()\n                    }, loadingView: loadingView)\n                tableView.dg_setPullToRefreshFillColor(Constant.CodeBackgroudColor)\n                tableView.dg_setPullToRefreshBackgroundColor(Constant.NavigationBarAndTabBarColor)\n                \n                updateDataList()\n            } else {\n                showMsgLabel(\"Not Login\")\n            }\n        } else {\n            showMsgLabel(\"No Network\")\n        }\n        \n    }\n    \n    deinit {\n        tableView.dg_removePullToRefresh()\n    }\n    \n    func showMsgLabel(text: String) {\n        let lb = UILabel()\n        lb.frame = view.frame\n        lb.frame.origin.y -= Constant.NavigationBarOffset\n        lb.text = text\n        lb.textAlignment = .Center\n        lb.textColor = Constant.GithubTableShowMsgLabelTextColor\n        lb.shadowColor = Constant.GithubTableShowMsgLabelTextShadowColor\n        lb.shadowOffset = CGSizeMake(1, 1)\n        view.addSubview(lb)\n        tableView.scrollEnabled = false;\n    }\n    \n    func updateDataList() {\n        switch tag {\n        case 0:\n            github.listStarred(handleRepos)\n        case 1:\n            github.listRepositories(handleRepos)\n        default: break\n        }\n    }\n    \n    func handleRepos(repos: [Repo]) {\n        repoData = repos\n        accuntBtn?.title = \"\\(repos.count)\"\n        tableView.separatorColor = Constant.CapeCod\n        tableView.reloadData()\n        loadingSquare.stop()\n        tableView.scrollEnabled = true\n    }\n\n    // MARK: - Table view data source\n    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {\n        return 1\n    }\n\n    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return repoData.count\n    }\n    \n    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {\n        let cell = UITableViewCell(style: .Subtitle, reuseIdentifier: nil)\n        cell.backgroundColor = Constant.NavigationBarAndTabBarColor\n        cell.selectedBackgroundView = UIView(frame: cell.frame)\n        cell.selectedBackgroundView?.backgroundColor = Constant.TableCellSelectedColor\n        cell.accessoryType = .DisclosureIndicator\n        \n        cell.textLabel?.text = repoData[indexPath.row].name\n        cell.detailTextLabel?.text = repoData[indexPath.row].description\n        cell.textLabel?.textColor = UIColor.whiteColor()\n        cell.detailTextLabel?.textColor = UIColor.grayColor()\n        \n        return cell\n    }\n\n    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {\n        tableView.deselectRowAtIndexPath(indexPath, animated: true)\n        \n        let rvc = UIStoryboard(name: \"Main\", bundle: nil).instantiateViewControllerWithIdentifier(\"ReposTableView\") as! ReposTableViewController\n        rvc.repo = repoData[indexPath.row]\n        rvc.repo.downloadFolder = Folder(path: github.githubFolder.path.stringByAppendingPathComponent(title!.lower))\n        navigationController?.pushViewController(rvc, animated: true)\n    }\n}\n"
  },
  {
    "path": "Sublime/Sublime/Global.swift",
    "content": "//\n//  Constant.swift\n//  Sublime\n//\n//  Created by Eular on 2/14/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\nstruct Global {\n    static var UnreadMessageCount = 0\n    \n    static let Database = NSUserDefaults.standardUserDefaults()\n    static let Notifi = NSNotificationCenter.defaultCenter()\n}\n"
  },
  {
    "path": "Sublime/Sublime/GomokuAI.swift",
    "content": "//\n//  GoAI.swift\n//  Sublime\n//\n//  Created by Eular on 4/15/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\n/*\n The origin gomoku AI algorithm codes is writen by Linwei in python,\n here is the project: https://github.com/skywind3000/gobang .\n And I rewrite in Swift for my game ^_^\n*/\n\n// 棋盘评估类，给当前棋盘打分用\nclass GomokuEvaluation {\n    let Dimension = 15\n    let STWO = 1\t\t// 冲二\n    let STHREE = 2\t\t// 冲三\n    let SFOUR = 3\t\t// 冲四\n    let TWO = 4         // 活二\n    let THREE = 5\t\t// 活三\n    let FOUR = 6\t\t// 活四\n    let FIVE = 7        // 活五\n    let DFOUR = 8\t\t// 双四\n    let FOURT = 9\t\t// 四三\n    let DTHREE = 10     // 双三\n    let NOTYPE = 11\n    let ANALYSED = 255\t// 已经分析过\n    let TODO = 0\t\t// 没有分析过\n    let POS = [\n        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n        [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],\n        [0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0],\n        [0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 0],\n        [0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 3, 2, 1, 0],\n        [0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 4, 3, 2, 1, 0],\n        [0, 1, 2, 3, 4, 5, 6, 6, 6, 5, 4, 3, 2, 1, 0],\n        [0, 1, 2, 3, 4, 5, 6, 7, 6, 5, 4, 3, 2, 1, 0],\n        [0, 1, 2, 3, 4, 5, 6, 6, 6, 5, 4, 3, 2, 1, 0],\n        [0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 4, 3, 2, 1, 0],\n        [0, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 3, 2, 1, 0],\n        [0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 0],\n        [0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0],\n        [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],\n        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n    ]\n    var RESULT = Array(count: 30, repeatedValue: 0) // 保存当前直线分析值\n    var LINE = Array(count: 30, repeatedValue: 0) // 当前直线数据\n    // 全盘分析结果 [row][col][方向]\n    var RECORD = Array(count: 15, repeatedValue: Array(count: 15, repeatedValue: Array(count: 4, repeatedValue: 0)))\n    // 每种棋局的个数：count[黑棋/白棋][模式]\n    var COUNT = Array(count: 3, repeatedValue: Array(count: 20, repeatedValue: 0))\n    \n    init() {\n        reset()\n    }\n    \n    // 复位数据\n    func reset() {\n        RECORD = Array(count: Dimension, repeatedValue: Array(count: Dimension, repeatedValue: Array(count: 4, repeatedValue: TODO)))\n        COUNT = Array(count: 3, repeatedValue: Array(count: 20, repeatedValue: 0))\n    }\n    \n    // 四个方向（水平，垂直，左斜，右斜）分析评估棋盘，然后根据分析结果打分\n    func evaluate(board: GomokuBoardModel, _ turn: Int) -> Int {\n        var score = _evaluate(board, turn)\n        if score < -9000 {\n            for i in range(20) {\n                let stone = turn == 1 ? 2:1\n                if COUNT[stone][i] > 0 {\n                    score -= i\n                }\n            }\n        } else if score > 9000 {\n            for i in range(20) {\n                if COUNT[turn][i] > 0 {\n                    score += i\n                }\n            }\n        }\n        return score\n    }\n    \n    // 四个方向（水平，垂直，左斜，右斜）分析评估棋盘，然后根据分析结果打分\n    private func _evaluate(board: GomokuBoardModel, _ turn: Int) -> Int {\n        reset()\n        // 四个方向分析\n        for i in range(Dimension) {\n            for j in range(Dimension) {\n                if board[i,j].type != .Void {\n                    if RECORD[i][j][0] == TODO { // 水平没有分析过?\n                        _analysis_horizon(board, i, j)\n                    }\n                    \n                    if RECORD[i][j][1] == TODO { // 垂直没有分析过?\n                        _analysis_vertical(board, i, j)\n                    }\n                    \n                    if RECORD[i][j][2] == TODO { // 左斜没有分析过?\n                        _analysis_left(board, i, j)\n                    }\n                    \n                    if RECORD[i][j][3] == TODO { // 右斜没有分析过?\n                        _analysis_right(board, i, j)\n                    }\n                }\n            }\n        }\n        \n        // 分别对白棋黑棋计算：FIVE, FOUR, THREE, TWO等出现的次数\n        let check = [FIVE, FOUR, SFOUR, THREE, STHREE, TWO, STWO]\n        for i in range(Dimension) {\n            for j in range(Dimension) {\n                let stone = board[i,j]\n                if stone.type != .Void {\n                    for k in range(4) {\n                        let ch = RECORD[i][j][k]\n                        if check.indexOf(ch) != nil {\n                            COUNT[stone.value][ch] += 1\n                        }\n                    }\n                }\n            }\n        }\n        \n        // 如果有五连则马上返回分数\n        let BLACK = 1\n        let WHITE = 2\n        if turn == WHITE { // 当前是白棋\n            if COUNT[BLACK][FIVE] > 0 { return -9999 }\n            if COUNT[WHITE][FIVE] > 0 { return 9999 }\n        } else { // 当前是黑棋\n            if COUNT[WHITE][FIVE] > 0 { return -9999 }\n            if COUNT[BLACK][FIVE] > 0 { return 9999 }\n        }\n        \n        // 如果存在两个冲四，则相当于有一个活四\n        if COUNT[WHITE][SFOUR] >= 2 {\n            COUNT[WHITE][FOUR] += 1\n        }\n        if COUNT[BLACK][SFOUR] >= 2 {\n            COUNT[BLACK][FOUR] += 1\n        }\n        \n        // 具体打分\n        var wvalue = 0\n        var bvalue = 0\n        if turn == WHITE {\n            if COUNT[WHITE][FOUR] > 0 { return 9990 }\n            if COUNT[WHITE][SFOUR] > 0 { return 9980 }\n            if COUNT[BLACK][FOUR] > 0 { return -9970 }\n            if COUNT[BLACK][SFOUR] > 0 && COUNT[BLACK][THREE] > 0 { return -9960 }\n            if COUNT[WHITE][THREE] > 0 && COUNT[BLACK][SFOUR] == 0 { return 9950 }\n            if\tCOUNT[BLACK][THREE] > 1 && COUNT[WHITE][SFOUR] == 0 && COUNT[WHITE][THREE] == 0 && COUNT[WHITE][STHREE] == 0 { return -9940 }\n            \n            if COUNT[WHITE][THREE] > 1 { wvalue += 2000 }\n            else if COUNT[WHITE][THREE] > 0 { wvalue += 200 }\n            if COUNT[BLACK][THREE] > 1 { bvalue += 500 }\n            else if COUNT[BLACK][THREE] > 0 { bvalue += 100 }\n            \n            if COUNT[WHITE][STHREE] > 0 { wvalue += COUNT[WHITE][STHREE] * 10 }\n            if COUNT[BLACK][STHREE] > 0 { bvalue += COUNT[BLACK][STHREE] * 10 }\n            if COUNT[WHITE][TWO] > 0 { wvalue += COUNT[WHITE][TWO] * 4 }\n            if COUNT[BLACK][TWO] > 0 { bvalue += COUNT[BLACK][TWO] * 4 }\n            if COUNT[WHITE][STWO] > 0 { wvalue += COUNT[WHITE][STWO] }\n            if COUNT[BLACK][STWO] > 0 { bvalue += COUNT[BLACK][STWO] }\n        } else {\n            if COUNT[BLACK][FOUR] > 0 { return 9990 }\n            if COUNT[BLACK][SFOUR] > 0 { return 9980 }\n            if COUNT[WHITE][FOUR] > 0 { return -9970 }\n            if COUNT[WHITE][SFOUR] > 0 && COUNT[WHITE][THREE] > 0 { return -9960 }\n            if COUNT[BLACK][THREE] > 0 && COUNT[WHITE][SFOUR] == 0 { return 9950 }\n            if\tCOUNT[WHITE][THREE] > 1 && COUNT[BLACK][SFOUR] == 0 && COUNT[BLACK][THREE] == 0 && COUNT[BLACK][STHREE] == 0 { return -9940 }\n            \n            if COUNT[BLACK][THREE] > 1 { bvalue += 2000 }\n            else if COUNT[BLACK][THREE] > 0 { bvalue += 200 }\n            if COUNT[WHITE][THREE] > 1 { wvalue += 500 }\n            else if COUNT[WHITE][THREE] > 0 { wvalue += 100 }\n            \n            if COUNT[BLACK][STHREE] > 0 { bvalue += COUNT[BLACK][STHREE] * 10 }\n            if COUNT[WHITE][STHREE] > 0 { wvalue += COUNT[WHITE][STHREE] * 10 }\n            if COUNT[BLACK][TWO] > 0 { bvalue += COUNT[BLACK][TWO] * 4 }\n            if COUNT[WHITE][TWO] > 0 { wvalue += COUNT[WHITE][TWO] * 4 }\n            if COUNT[BLACK][STWO] > 0 { bvalue += COUNT[BLACK][STWO] }\n            if COUNT[WHITE][STWO] > 0 { wvalue += COUNT[WHITE][STWO] }\n        }\n        \n        // 加上位置权值，棋盘最中心点权值是7，往外一格-1，最外圈是0\n        var wc = 0\n        var bc = 0\n        for i in  range(Dimension) {\n            for j in range(Dimension) {\n                let stone = board[i,j]\n                if stone.type != .Void {\n                    if stone.type == .White {\n                        wc += POS[i][j]\n                    } else {\n                        bc += POS[i][j]\n                    }\n                }\n            }\n        }\n        wvalue += wc\n        bvalue += bc\n        \n        if turn == WHITE {\n            return wvalue - bvalue\n        }\n        return bvalue - wvalue\n    }\n    \n    // 分析横向\n    private func _analysis_horizon(board: GomokuBoardModel, _ i: Int, _ j: Int) -> Int {\n        for x in range(Dimension) {\n            LINE[x] = board[i,x].value\n        }\n        analysis_line(Dimension, j)\n        for x in range(Dimension) {\n            if RESULT[x] != TODO {\n                RECORD[i][x][0] = RESULT[x]\n            }\n        }\n        return RECORD[i][j][0]\n    }\n    \n    // 分析纵向\n    private func _analysis_vertical(board: GomokuBoardModel, _ i: Int, _ j: Int) -> Int {\n        for x in range(Dimension) {\n            LINE[x] = board[x,j].value\n        }\n        analysis_line(Dimension, i)\n        for x in range(Dimension) {\n            if RESULT[x] != TODO {\n                RECORD[x][j][1] = RESULT[x]\n            }\n        }\n        return RECORD[i][j][1]\n    }\n    \n    // 分析左斜\n    private func _analysis_left(board: GomokuBoardModel, _ i: Int, _ j: Int) -> Int {\n        var x: Int\n        var y: Int\n        if i < j {\n            x = j - i\n            y = 0\n        } else {\n            x = 0\n            y = i - j\n        }\n        var k = 0\n        while k < 15 {\n            if x + k > 14 || y + k > 14 { break }\n            LINE[k] = board[y+k, x+k].value\n            k += 1\n        }\n        analysis_line(k, j - x)\n        for s in range(k) {\n            if RESULT[s] != TODO {\n                RECORD[y + s][x + s][2] = RESULT[s]\n            }\n        }\n        return RECORD[i][j][2]\n    }\n    \n    // 分析右斜\n    private func _analysis_right(board: GomokuBoardModel, _ i: Int, _ j: Int) -> Int {\n        var x: Int\n        var y: Int\n        if 14 - i < j {\n            x = j - 14 + i\n            y = 14\n        } else {\n            x = 0\n            y = i + j\n        }\n        var k = 0\n        while k < 15 {\n            if x + k > 14 || y - k < 0 { break }\n            LINE[k] = board[y - k, x + k].value\n            k += 1\n        }\n        analysis_line(k, j - x)\n        for s in  range(k) {\n            if RESULT[s] != TODO {\n                RECORD[y - s][x + s][3] = RESULT[s]\n            }\n        }\n        return RECORD[i][j][3]\n    }\n    \n    // 分析一条线：五四三二等棋型\n    private func analysis_line(num: Int, _ pos: Int) -> Int{\n        for i in range(num, 30) {\n            LINE[i] = 0xf\n        }\n        for i in range(num) {\n            RESULT[i] = TODO\n        }\n        \n        if num < 5 {\n            for i in range(num) {\n                RESULT[i] = ANALYSED\n            }\n            return 0\n        }\n        \n        let stone = LINE[pos] <= 2 ? LINE[pos]:0\n        let inverse = [0, 2, 1][stone]\n        \n        var xl = pos\n        var xr = pos\n        while xl > 0 { // 探索左边界\n            if LINE[xl - 1] != stone { break }\n            xl -= 1\n        }\n        \n        while xr < num - 1 { // 探索右边界\n            if LINE[xr + 1] != stone { break }\n            xr += 1\n        }\n        \n        var left_range = xl\n        var right_range = xr\n        while left_range > 0 { // 探索左边范围（非对方棋子的格子坐标）\n            if LINE[left_range - 1] == inverse { break }\n            left_range -= 1\n        }\n        while right_range < num - 1 { // 探索右边范围（非对方棋子的格子坐标）\n            if LINE[right_range + 1] == inverse { break }\n            right_range += 1\n        }\n        \n        // 如果该直线范围小于 5，则直接返回\n        if right_range - left_range < 4 {\n            for k in range(left_range, right_range + 1) {\n                RESULT[k] = ANALYSED\n            }\n            return 0\n        }\n        \n        // 设置已经分析过\n        for k in range(xl, xr + 1) {\n            RESULT[k] = ANALYSED\n        }\n        \n        let srange = xr - xl\n        // 如果是 5连\n        if srange >= 4 {\n            RESULT[pos] = FIVE\n            return FIVE\n        }\n        // 如果是 4连\n        if srange == 3 {\n            var leftfour = false\t// 是否左边是空格\n            if xl > 0 {\n                if LINE[xl - 1] == 0 {\t\t// 活四\n                    leftfour = true\n                }\n            }\n            if xr < num - 1 {\n                if LINE[xr + 1] == 0 {\n                    if leftfour {\n                        RESULT[pos] = FOUR\t// 活四\n                    } else {\n                        RESULT[pos] = SFOUR\t// 冲四\n                    }\n                } else {\n                    if leftfour {\n                        RESULT[pos] = SFOUR\t// 冲四\n                    }\n                }\n            } else {\n                if leftfour {\n                    RESULT[pos] = SFOUR     // 冲四\n                }\n            }\n            return RESULT[pos]\n        }\n        // 如果是 3连\n        if srange == 2 { // 三连\n            var left3 = false\t// 是否左边是空格\n            if xl > 0 {\n                if LINE[xl - 1] == 0 {\t// 左边有气\n                    if xl > 1 && LINE[xl - 2] == stone {\n                        RESULT[xl] = SFOUR\n                        RESULT[xl - 2] = ANALYSED\n                    } else {\n                        left3 = true\n                    }\n                } else if xr == num - 1 || LINE[xr + 1] != 0 {\n                    return 0\n                }\n            }\n            if xr < num - 1 {\n                if LINE[xr + 1] == 0 {\t// 右边有气\n                    if xr < num - 2 && LINE[xr + 2] == stone {\n                        RESULT[xr] = SFOUR\t// XXX-X 相当于冲四\n                        RESULT[xr + 2] = ANALYSED\n                    } else if left3 {\n                        RESULT[xr] = THREE\n                    } else {\n                        RESULT[xr] = STHREE\n                    }\n                }\n            }\n            else {\n                if RESULT[xl] == SFOUR {\n                    return RESULT[xl]\n                }\n                if left3 {\n                    RESULT[pos] = STHREE\n                }\n            }\n            return RESULT[pos]\n        }\n        // 如果是 2连\n        if srange == 1 {\n            var left2 = false\n            if xl > 2 {\n                if LINE[xl - 1] == 0 {\t\t// 左边有气\n                    if LINE[xl - 2] == stone {\n                        if LINE[xl - 3] == stone {\n                            RESULT[xl - 3] = ANALYSED\n                            RESULT[xl - 2] = ANALYSED\n                            RESULT[xl] = SFOUR\n                        } else if LINE[xl - 3] == 0 {\n                            RESULT[xl - 2] = ANALYSED\n                            RESULT[xl] = STHREE\n                        }\n                    } else {\n                        left2 = true\n                    }\n                }\n            }\n            if xr < num - 1 {\n                if LINE[xr + 1] == 0 {\t// 左边有气\n                    if xr < num - 3 && LINE[xr + 2] == stone {\n                        if LINE[xr + 3] == stone {\n                            RESULT[xr + 3] = ANALYSED\n                            RESULT[xr + 2] = ANALYSED\n                            RESULT[xr] = SFOUR\n                        } else if LINE[xr + 3] == 0 {\n                            RESULT[xr + 2] = ANALYSED\n                            RESULT[xr] = left2 ? THREE : STHREE\n                        }\n                    } else {\n                        if RESULT[xl] == SFOUR {\n                            return RESULT[xl]\n                        }\n                        if RESULT[xl] == STHREE {\n                            RESULT[xl] = THREE\n                            return RESULT[xl]\n                        }\n                        if left2 {\n                            RESULT[pos] = TWO\n                        }\n                        else {\n                            RESULT[pos] = STWO\n                        }\n                    }\n                } else {\n                    if RESULT[xl] == SFOUR {\n                        return RESULT[xl]\n                    }\n                    if left2 {\n                        RESULT[pos] = STWO\n                    }\n                }\n            }\n            return RESULT[pos]\n        }\n        return 0\n    }\n    \n}\n\n// DFS: 博弈树搜索\nclass GomokuAI {\n    let evaluator = GomokuEvaluation()\n    var maxdepth = 3\n    var bestMove = [Int]()\n    var dimension = 15\n    private var board: GomokuBoardModel\n    \n    init(board: GomokuBoardModel) {\n        self.board = board\n        self.dimension = board.dimension\n    }\n    \n    // 产生当前棋局的走法\n    private func genmove(turn: Int) -> Array<Array<Int>> {\n        var moves = Array<Array<Int>>()\n        let POSES = evaluator.POS\n        for i in range(dimension) {\n            for j in range(dimension) {\n                if board[i,j].type == .Void {\n                    let score = POSES[i][j]\n                    moves.append([score, i, j])\n                }\n            }\n        }\n        moves = moves.sort() { $0[0] > $1[0] }\n        return moves\n    }\n    \n    // 递归搜索：返回最佳分数\n    private func _search (turn: Int, _ depth: Int, _ alpha: Int = -0x7fffffff, _ beta: Int = 0x7fffffff) -> Int {\n        // 深度为零则评估棋盘并返回\n        if depth <= 0 {\n            let score = evaluator.evaluate(board, turn)\n            return score\n        }\n        \n        // 如果游戏结束则立马返回\n        let s = evaluator.evaluate(board, turn)\n        if abs(s) >= 9999 && depth < maxdepth {\n            return s\n        }\n        \n        // 产生新的走法\n        let moves = genmove(turn)\n        var bestmove = [Int]()\n        \n        // 枚举当前所有走法\n        var a = alpha\n        for m in moves {\n            let row = m[1]\n            let col = m[2]\n        \n            // 标记当前走法到棋盘\n            board[row, col].value = turn\n        \n            // 计算下一回合该谁走\n            let nturn = turn == 1 ? 2:1\n            \n            // 深度优先搜索，返回评分，走的行和走的列\n            let score = -self._search(nturn, depth - 1, -beta, -alpha)\n            \n            // 棋盘上清除当前走法\n            board[row, col].value = 0\n            \n            // 计算最好分值的走法\n            // alpha/beta 剪枝\n            if score > a {\n                a = score\n                bestmove = [row, col]\n                if a >= beta { break }\n            }\n        }\n        \n        // 如果是第一层则记录最好的走法\n        if depth == maxdepth && bestmove.count != 0 { self.bestMove = bestmove }\n        \n        // 返回当前最好的分数，和该分数的对应走法\n        return a\n    }\n    \n    // 具体搜索：传入当前是该谁走(turn=1黑/2白)，以及搜索深度(depth)\n    func search(turn: Int, depth: Int = 3) -> [Int] {\n        maxdepth = depth\n        bestMove = []\n        var score = _search(turn, depth)\n        if abs(score) > 8000 {\n            maxdepth = depth\n            score = _search(turn, 1)\n        }\n        let row = bestMove[0]\n        let col = bestMove[1]\n        return [score, row, col]\n    }\n}\n"
  },
  {
    "path": "Sublime/Sublime/GomokuViewController.swift",
    "content": "//\n//  GameOfGoViewController.swift\n//  Sublime\n//\n//  Created by Eular on 4/14/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\n\nclass GomokuViewController: UIViewController {\n    \n    let board = GomokuBoardView()\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        view.backgroundColor = Constant.CapeCod\n        \n        board.onWin = {\n            self.view.Toast(message: \"黑棋赢\")\n        }\n        board.onLose = {\n            self.view.Toast(message: \"白棋赢\")\n        }\n        view.addSubview(board)\n        board.atCenter()\n        \n        addCloseBtn()\n        addNewBtn()\n    }\n    \n    func close() {\n        self.dismissViewControllerAnimated(true, completion: nil)\n    }\n    \n    func addCloseBtn() {\n        let closeBtn = UIButton()\n        closeBtn.setTitle(\"<-\", forState: .Normal)\n        closeBtn.setTitleColor(UIColor.grayColor(), forState: .Normal)\n        closeBtn.frame = CGRectMake(10, view.height - 20, 20, 10)\n        closeBtn.addTarget(self, action: #selector(self.close), forControlEvents: .TouchUpInside)\n        view.addSubview(closeBtn)\n    }\n    \n    func addNewBtn() {\n        let newBtn = UIButton()\n        newBtn.setTitle(\"new\", forState: .Normal)\n        newBtn.setTitleColor(UIColor.grayColor(), forState: .Normal)\n        newBtn.titleLabel?.font = newBtn.titleLabel?.font.fontWithSize(13)\n        newBtn.frame = CGRectMake(view.width - 40, view.height - 22, 30, 15)\n        newBtn.addTarget(self, action: #selector(board.reset), forControlEvents: .TouchUpInside)\n        view.addSubview(newBtn)\n    }\n\n    override func preferredStatusBarStyle() -> UIStatusBarStyle {\n        return UIStatusBarStyle.LightContent\n    }\n}\n"
  },
  {
    "path": "Sublime/Sublime/HTTPServerTableViewController.swift",
    "content": "//\n//  HTTPServerTableViewController.swift\n//  Sublime\n//\n//  Created by Eular on 2/23/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\nimport Swifter\nimport SafariServices\n\nclass HTTPServerTableViewController: UITableViewController {\n    \n    @IBOutlet weak var portTF: UITextField!\n    @IBOutlet weak var ipLB: UILabel!\n    @IBOutlet weak var serverSW: UISwitch!\n    @IBOutlet weak var pathSW: UISwitch!\n    @IBOutlet weak var logTV: UITextView!\n    \n    private var server: HttpServer?\n    private var serverLog: WebServerLog?\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        title = \"HTTP\"\n        \n        let safariBtn = UIBarButtonItem(image: UIImage(named: \"open_safari\"), style: UIBarButtonItemStyle.Plain, target: self, action: #selector(self.openSafari))\n        navigationItem.rightBarButtonItem = safariBtn\n        \n        if Network.isConnectedToNetwork() {\n            let ip = Network.getIFAddresses()[0]\n            ipLB.text = ip\n        } else {\n            ipLB.text = \"localhost\"\n        }\n        \n        // Here is a bug: if first start SublimeServer then CustomServer doesn't work.\n        // Idk why, so just add the following useless code.\n        // ----- Don't forget move it to isConnectedToNetwork satuation ------\n        let server = HttpServer()\n        try! server.start()\n        server.stop()\n        \n        serverLog = WebServerLog(output: logTV)\n    }\n    \n    deinit {\n        self.server?.stop()\n        serverLog?.saveInLogFile(self.logTV.text)\n    }\n    \n    @IBAction func serverStatusChanged(sender: UISwitch) {\n        if sender.on {\n            startServer(SublimeServer(serverLog))\n        } else {\n            self.server?.stop()\n            serverLog?.log(\"Server has stopped.\")\n        }\n        portTF.enabled = !sender.on\n        pathSW.on = false\n        pathSW.enabled = sender.on\n    }\n    \n    @IBAction func pathEnableStatusChanged(sender: UISwitch) {\n        startServer(sender.on ? CustomServer(serverLog) : SublimeServer(serverLog))\n    }\n    \n    func startServer(server: HttpServer) {\n        self.server?.stop()\n        guard let port = portTF.text!.isEmpty ? 8080 : UInt16(portTF.text!) else {\n            serverLog?.log(\"Error: please set valid port.\", isError: true)\n            return\n        }\n        do {\n            try server.start(port)\n            self.server = server\n            serverLog?.log(\"Server has started: http://\\(ipLB.text!):\\(port).\")\n        } catch {\n            serverLog?.log(\"Error: \\(error)\", isError: true)\n        }\n    }\n    \n    func openSafari() {\n        guard let port = portTF.text!.isEmpty ? 8080 : UInt16(portTF.text!) else {return}\n        let svc = SFSafariViewController(URL: NSURL(string: \"http://localhost:\\(port)\")!)\n        svc.modalPresentationStyle = .OverCurrentContext\n        self.presentViewController(svc, animated: true, completion: nil)\n    }\n    \n    // MARK: - Table view data source\n    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {\n        return 2\n    }\n\n    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return [4, 1][section]\n    }\n    \n    override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {\n        let secTitle = [\"   HTTP\", \"   Log\"]\n        let title = UILabel(frame: CGRectMake(0, 0, view.width, Constant.FilesTableSectionHight))\n        title.backgroundColor = Constant.CapeCod\n        title.text = secTitle[section]\n        title.textColor = UIColor.whiteColor()\n        title.font = title.font.fontWithSize(12)\n        title.textAlignment = .Natural\n        let headerView = UIView()\n        headerView.addSubview(title)\n        return headerView\n    }\n    \n    override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {\n        return Constant.FilesTableSectionHight\n    }\n    \n    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {\n        portTF.resignFirstResponder()\n    }\n\n}\n"
  },
  {
    "path": "Sublime/Sublime/ImageFileViewController.swift",
    "content": "//\n//  ImageFileViewController.swift\n//  Sublime\n//\n//  Created by Eular on 2/15/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\nimport Gifu\n\nclass ImageFileViewController: UIViewController {\n    \n    var curFile: File!\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        view.backgroundColor = Constant.CapeCod\n        \n        let imgView: UIImageView\n        let imgData = NSData(contentsOfURL: curFile.url)!\n        \n        if curFile.ext == \"gif\" {\n            imgView = AnimatableImageView()\n            (imgView as! AnimatableImageView).animateWithImageData(imgData)\n            (imgView as! AnimatableImageView).startAnimatingGIF()\n        } else {\n            imgView = UIImageView(image: UIImage(data: imgData))\n            imgView.recognizeQRCodeEnabled = true\n        }\n        \n        imgView.frame = CGRectMake(0, 10, view.width, view.height - 140 )\n        imgView.contentMode = .ScaleAspectFit\n        view.addSubview(imgView)\n        \n    }\n\n}\n"
  },
  {
    "path": "Sublime/Sublime/ImagePageViewController.swift",
    "content": "//\n//  ImagePageViewController.swift\n//  Sublime\n//\n//  Created by Eular on 2/15/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\n\nclass ImagePageViewController: UIPageViewController, UIPageViewControllerDataSource, PopupMenuDelegate {\n\n    let popupMenu = PopupMenu()\n    var index: Int = 0\n    var imgList: [File]!\n    var curImage: UIImage?\n    \n    override init(transitionStyle style: UIPageViewControllerTransitionStyle, navigationOrientation: UIPageViewControllerNavigationOrientation, options: [String : AnyObject]?) {\n        super.init(transitionStyle: .Scroll, navigationOrientation: .Horizontal, options: options)\n    }\n\n    required init?(coder aDecoder: NSCoder) {\n        super.init(coder: aDecoder)\n    }\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        dataSource = self\n        view.backgroundColor = Constant.CapeCod\n        \n        if let startingViewController = self.viewControllerByOffset(0) {\n            setViewControllers([startingViewController], direction: .Forward, animated: true, completion: nil)\n        }\n        \n        // 设置分享菜单\n        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Action, target: popupMenu, action: #selector(popupMenu.showUp))\n        popupMenu.controller = self\n        popupMenu.delegate = self\n    }\n    \n    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {\n        return viewControllerByOffset(1)\n    }\n    \n    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {\n        return viewControllerByOffset(-1)\n    }\n    \n    /* Page Control*/\n    func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {\n        return imgList.count\n    }\n\n    func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {\n        return index\n    }\n    \n    func viewControllerByOffset(offset: Int) -> ImageFileViewController? {\n        index += offset\n        if index < 0 || index >= imgList.count {\n            index -= offset\n            return nil\n        }\n        title = imgList[index].name\n        self.curImage = UIImage(contentsOfFile: imgList[index].path)\n        popupMenu.itemsToShare = [self.curImage!]\n        \n        let imageView = ImageFileViewController()\n        imageView.curFile = imgList[index]\n        return imageView\n    }\n    \n    func tapOnPopupMenuItem(itemIndex i: Int) {\n        let curFile = imgList[index]\n        switch i {\n        case 2:\n            if curFile.ext == \"gif\" {\n                WXShareEmoticon(curFile.path)\n            } else {\n                WXShareImage(self.curImage!)\n            }\n        case 3:\n            WXShareImage(self.curImage!, isTimeline: true)\n        default: return\n        }\n    }\n\n}\n"
  },
  {
    "path": "Sublime/Sublime/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>CFBundleDocumentTypes</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>LSHandlerRank</key>\n\t\t\t<string>Owner</string>\n\t\t\t<key>CFBundleTypeIconFiles</key>\n\t\t\t<array/>\n\t\t\t<key>CFBundleTypeName</key>\n\t\t\t<string>public.file</string>\n\t\t\t<key>LSItemContentTypes</key>\n\t\t\t<array>\n\t\t\t\t<string>public.image</string>\n\t\t\t\t<string>public.content</string>\n\t\t\t\t<string>public.data</string>\n\t\t\t</array>\n\t\t</dict>\n\t</array>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleURLTypes</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CFBundleTypeRole</key>\n\t\t\t<string>Editor</string>\n\t\t\t<key>CFBundleURLName</key>\n\t\t\t<string>weixin</string>\n\t\t\t<key>CFBundleURLSchemes</key>\n\t\t\t<array>\n\t\t\t\t<string>wxb597aecde6aadd28</string>\n\t\t\t</array>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CFBundleTypeRole</key>\n\t\t\t<string>Editor</string>\n\t\t\t<key>CFBundleURLName</key>\n\t\t\t<string>sublime</string>\n\t\t\t<key>CFBundleURLSchemes</key>\n\t\t\t<array>\n\t\t\t\t<string>sublime</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>LSApplicationQueriesSchemes</key>\n\t<array>\n\t\t<string>wechat</string>\n\t\t<string>weixin</string>\n\t\t<string>sinaweibohd</string>\n\t\t<string>sinaweibo</string>\n\t\t<string>sinaweibosso</string>\n\t\t<string>weibosdk</string>\n\t\t<string>weibosdk2.5</string>\n\t\t<string>mqqapi</string>\n\t\t<string>mqq</string>\n\t\t<string>mqqOpensdkSSoLogin</string>\n\t\t<string>mqqconnect</string>\n\t\t<string>mqqopensdkdataline</string>\n\t\t<string>mqqopensdkgrouptribeshare</string>\n\t\t<string>mqqopensdkfriend</string>\n\t\t<string>mqqopensdkapi</string>\n\t\t<string>mqqopensdkapiV2</string>\n\t\t<string>mqqopensdkapiV3</string>\n\t\t<string>mqzoneopensdk</string>\n\t\t<string>wtloginmqq</string>\n\t\t<string>wtloginmqq2</string>\n\t\t<string>mqqwpa</string>\n\t\t<string>mqzone</string>\n\t\t<string>mqzonev2</string>\n\t\t<string>mqzoneshare</string>\n\t\t<string>wtloginqzone</string>\n\t\t<string>mqzonewx</string>\n\t\t<string>mqzoneopensdkapiV2</string>\n\t\t<string>mqzoneopensdkapi19</string>\n\t\t<string>mqzoneopensdkapi</string>\n\t\t<string>mqqbrowser</string>\n\t\t<string>mttbrowser</string>\n\t\t<string>renrenios</string>\n\t\t<string>renrenapi</string>\n\t\t<string>renren</string>\n\t\t<string>renreniphone</string>\n\t\t<string>laiwangsso</string>\n\t\t<string>yixin</string>\n\t\t<string>yixinopenapi</string>\n\t\t<string>instagram</string>\n\t\t<string>whatsapp</string>\n\t\t<string>line</string>\n\t\t<string>fbapi</string>\n\t\t<string>fb-messenger-api</string>\n\t\t<string>fbauth2</string>\n\t\t<string>fbshareextension</string>\n\t\t<string>alipay</string>\n\t</array>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>NSAppTransportSecurity</key>\n\t<dict>\n\t\t<key>NSAllowsArbitraryLoads</key>\n\t\t<true/>\n\t</dict>\n\t<key>UIFileSharingEnabled</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UIStatusBarHidden</key>\n\t<true/>\n\t<key>UIStatusBarTintParameters</key>\n\t<dict>\n\t\t<key>UINavigationBar</key>\n\t\t<dict>\n\t\t\t<key>Style</key>\n\t\t\t<string>UIBarStyleDefault</string>\n\t\t\t<key>Translucent</key>\n\t\t\t<false/>\n\t\t</dict>\n\t</dict>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sublime/Sublime/LICENSE/AASquaresLoading.LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Anas AIT ALI\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "Sublime/Sublime/LICENSE/Alamofire.LICENSE",
    "content": "Copyright (c) 2014–2016 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": "Sublime/Sublime/LICENSE/AlamofireRSSParser.LICENSE",
    "content": "Copyright (c) 2016 Don Angelillo <dangelillo@gmail.com>\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": "Sublime/Sublime/LICENSE/CYRTextView.LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Cyrillian, Inc.\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 of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject 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, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Sublime/Sublime/LICENSE/Charts.LICENSE",
    "content": "Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright {yyyy} {name of copyright owner}\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n"
  },
  {
    "path": "Sublime/Sublime/LICENSE/DGElasticPullToRefresh.LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Danil Gontovnik\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "Sublime/Sublime/LICENSE/EZAudio.LICENSE",
    "content": "The MIT License (MIT)\n\nEZAudio\nCopyright (c) 2013 Syed Haris Ali\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 of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject 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, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Sublime/Sublime/LICENSE/Gifu.LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Kaishin & Co.\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 of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject 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, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nThe name and characters used in the demo of this software are property of their\nrespective owners.\n\n"
  },
  {
    "path": "Sublime/Sublime/LICENSE/MobileVLCKit.LICENSE",
    "content": "                  GNU LESSER GENERAL PUBLIC LICENSE\n                       Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Foundation, Inc.\n 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n[This is the first released version of the Lesser GPL.  It also counts\n as the successor of the GNU Library Public License, version 2, hence\n the version number 2.1.]\n\n                            Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicenses are intended to guarantee your freedom to share and change\nfree software--to make sure the software is free for all its users.\n\n  This license, the Lesser General Public License, applies to some\nspecially designated software packages--typically libraries--of the\nFree Software Foundation and other authors who decide to use it.  You\ncan use it too, but we suggest you first think carefully about whether\nthis license or the ordinary General Public License is the better\nstrategy to use in any particular case, based on the explanations below.\n\n  When we speak of free software, we are referring to freedom of use,\nnot price.  Our General Public Licenses are designed to make sure that\nyou have the freedom to distribute copies of free software (and charge\nfor this service if you wish); that you receive source code or can get\nit if you want it; that you can change the software and use pieces of\nit in new free programs; and that you are informed that you can do\nthese things.\n\n  To protect your rights, we need to make restrictions that forbid\ndistributors to deny you these rights or to ask you to surrender these\nrights.  These restrictions translate to certain responsibilities for\nyou if you distribute copies of the library or if you modify it.\n\n  For example, if you distribute copies of the library, whether gratis\nor for a fee, you must give the recipients all the rights that we gave\nyou.  You must make sure that they, too, receive or can get the source\ncode.  If you link other code with the library, you must provide\ncomplete object files to the recipients, so that they can relink them\nwith the library after making changes to the library and recompiling\nit.  And you must show them these terms so they know their rights.\n\n  We protect your rights with a two-step method: (1) we copyright the\nlibrary, and (2) we offer you this license, which gives you legal\npermission to copy, distribute and/or modify the library.\n\n  To protect each distributor, we want to make it very clear that\nthere is no warranty for the free library.  Also, if the library is\nmodified by someone else and passed on, the recipients should know\nthat what they have is not the original version, so that the original\nauthor's reputation will not be affected by problems that might be\nintroduced by others.\n\f\n  Finally, software patents pose a constant threat to the existence of\nany free program.  We wish to make sure that a company cannot\neffectively restrict the users of a free program by obtaining a\nrestrictive license from a patent holder.  Therefore, we insist that\nany patent license obtained for a version of the library must be\nconsistent with the full freedom of use specified in this license.\n\n  Most GNU software, including some libraries, is covered by the\nordinary GNU General Public License.  This license, the GNU Lesser\nGeneral Public License, applies to certain designated libraries, and\nis quite different from the ordinary General Public License.  We use\nthis license for certain libraries in order to permit linking those\nlibraries into non-free programs.\n\n  When a program is linked with a library, whether statically or using\na shared library, the combination of the two is legally speaking a\ncombined work, a derivative of the original library.  The ordinary\nGeneral Public License therefore permits such linking only if the\nentire combination fits its criteria of freedom.  The Lesser General\nPublic License permits more lax criteria for linking other code with\nthe library.\n\n  We call this license the \"Lesser\" General Public License because it\ndoes Less to protect the user's freedom than the ordinary General\nPublic License.  It also provides other free software developers Less\nof an advantage over competing non-free programs.  These disadvantages\nare the reason we use the ordinary General Public License for many\nlibraries.  However, the Lesser license provides advantages in certain\nspecial circumstances.\n\n  For example, on rare occasions, there may be a special need to\nencourage the widest possible use of a certain library, so that it becomes\na de-facto standard.  To achieve this, non-free programs must be\nallowed to use the library.  A more frequent case is that a free\nlibrary does the same job as widely used non-free libraries.  In this\ncase, there is little to gain by limiting the free library to free\nsoftware only, so we use the Lesser General Public License.\n\n  In other cases, permission to use a particular library in non-free\nprograms enables a greater number of people to use a large body of\nfree software.  For example, permission to use the GNU C Library in\nnon-free programs enables many more people to use the whole GNU\noperating system, as well as its variant, the GNU/Linux operating\nsystem.\n\n  Although the Lesser General Public License is Less protective of the\nusers' freedom, it does ensure that the user of a program that is\nlinked with the Library has the freedom and the wherewithal to run\nthat program using a modified version of the Library.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.  Pay close attention to the difference between a\n\"work based on the library\" and a \"work that uses the library\".  The\nformer contains code derived from the library, whereas the latter must\nbe combined with the library in order to run.\n\f\n                  GNU LESSER GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License Agreement applies to any software library or other\nprogram which contains a notice placed by the copyright holder or\nother authorized party saying it may be distributed under the terms of\nthis Lesser General Public License (also called \"this License\").\nEach licensee is addressed as \"you\".\n\n  A \"library\" means a collection of software functions and/or data\nprepared so as to be conveniently linked with application programs\n(which use some of those functions and data) to form executables.\n\n  The \"Library\", below, refers to any such software library or work\nwhich has been distributed under these terms.  A \"work based on the\nLibrary\" means either the Library or any derivative work under\ncopyright law: that is to say, a work containing the Library or a\nportion of it, either verbatim or with modifications and/or translated\nstraightforwardly into another language.  (Hereinafter, translation is\nincluded without limitation in the term \"modification\".)\n\n  \"Source code\" for a work means the preferred form of the work for\nmaking modifications to it.  For a library, complete source code means\nall the source code for all modules it contains, plus any associated\ninterface definition files, plus the scripts used to control compilation\nand installation of the library.\n\n  Activities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning a program using the Library is not restricted, and output from\nsuch a program is covered only if its contents constitute a work based\non the Library (independent of the use of the Library in a tool for\nwriting it).  Whether that is true depends on what the Library does\nand what the program that uses the Library does.\n\n  1. You may copy and distribute verbatim copies of the Library's\ncomplete source code as you receive it, in any medium, provided that\nyou conspicuously and appropriately publish on each copy an\nappropriate copyright notice and disclaimer of warranty; keep intact\nall the notices that refer to this License and to the absence of any\nwarranty; and distribute a copy of this License along with the\nLibrary.\n\n  You may charge a fee for the physical act of transferring a copy,\nand you may at your option offer warranty protection in exchange for a\nfee.\n\f\n  2. You may modify your copy or copies of the Library or any portion\nof it, thus forming a work based on the Library, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) The modified work must itself be a software library.\n\n    b) You must cause the files modified to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    c) You must cause the whole of the work to be licensed at no\n    charge to all third parties under the terms of this License.\n\n    d) If a facility in the modified Library refers to a function or a\n    table of data to be supplied by an application program that uses\n    the facility, other than as an argument passed when the facility\n    is invoked, then you must make a good faith effort to ensure that,\n    in the event an application does not supply such function or\n    table, the facility still operates, and performs whatever part of\n    its purpose remains meaningful.\n\n    (For example, a function in a library to compute square roots has\n    a purpose that is entirely well-defined independent of the\n    application.  Therefore, Subsection 2d requires that any\n    application-supplied function or table used by this function must\n    be optional: if the application does not supply it, the square\n    root function must still compute square roots.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Library,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Library, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote\nit.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Library.\n\nIn addition, mere aggregation of another work not based on the Library\nwith the Library (or with a work based on the Library) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may opt to apply the terms of the ordinary GNU General Public\nLicense instead of this License to a given copy of the Library.  To do\nthis, you must alter all the notices that refer to this License, so\nthat they refer to the ordinary GNU General Public License, version 2,\ninstead of to this License.  (If a newer version than version 2 of the\nordinary GNU General Public License has appeared, then you can specify\nthat version instead if you wish.)  Do not make any other change in\nthese notices.\n\f\n  Once this change is made in a given copy, it is irreversible for\nthat copy, so the ordinary GNU General Public License applies to all\nsubsequent copies and derivative works made from that copy.\n\n  This option is useful when you wish to copy part of the code of\nthe Library into a program that is not a library.\n\n  4. You may copy and distribute the Library (or a portion or\nderivative of it, under Section 2) in object code or executable form\nunder the terms of Sections 1 and 2 above provided that you accompany\nit with the complete corresponding machine-readable source code, which\nmust be distributed under the terms of Sections 1 and 2 above on a\nmedium customarily used for software interchange.\n\n  If distribution of object code is made by offering access to copy\nfrom a designated place, then offering equivalent access to copy the\nsource code from the same place satisfies the requirement to\ndistribute the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  5. A program that contains no derivative of any portion of the\nLibrary, but is designed to work with the Library by being compiled or\nlinked with it, is called a \"work that uses the Library\".  Such a\nwork, in isolation, is not a derivative work of the Library, and\ntherefore falls outside the scope of this License.\n\n  However, linking a \"work that uses the Library\" with the Library\ncreates an executable that is a derivative of the Library (because it\ncontains portions of the Library), rather than a \"work that uses the\nlibrary\".  The executable is therefore covered by this License.\nSection 6 states terms for distribution of such executables.\n\n  When a \"work that uses the Library\" uses material from a header file\nthat is part of the Library, the object code for the work may be a\nderivative work of the Library even though the source code is not.\nWhether this is true is especially significant if the work can be\nlinked without the Library, or if the work is itself a library.  The\nthreshold for this to be true is not precisely defined by law.\n\n  If such an object file uses only numerical parameters, data\nstructure layouts and accessors, and small macros and small inline\nfunctions (ten lines or less in length), then the use of the object\nfile is unrestricted, regardless of whether it is legally a derivative\nwork.  (Executables containing this object code plus portions of the\nLibrary will still fall under Section 6.)\n\n  Otherwise, if the work is a derivative of the Library, you may\ndistribute the object code for the work under the terms of Section 6.\nAny executables containing that work also fall under Section 6,\nwhether or not they are linked directly with the Library itself.\n\f\n  6. As an exception to the Sections above, you may also combine or\nlink a \"work that uses the Library\" with the Library to produce a\nwork containing portions of the Library, and distribute that work\nunder terms of your choice, provided that the terms permit\nmodification of the work for the customer's own use and reverse\nengineering for debugging such modifications.\n\n  You must give prominent notice with each copy of the work that the\nLibrary is used in it and that the Library and its use are covered by\nthis License.  You must supply a copy of this License.  If the work\nduring execution displays copyright notices, you must include the\ncopyright notice for the Library among them, as well as a reference\ndirecting the user to the copy of this License.  Also, you must do one\nof these things:\n\n    a) Accompany the work with the complete corresponding\n    machine-readable source code for the Library including whatever\n    changes were used in the work (which must be distributed under\n    Sections 1 and 2 above); and, if the work is an executable linked\n    with the Library, with the complete machine-readable \"work that\n    uses the Library\", as object code and/or source code, so that the\n    user can modify the Library and then relink to produce a modified\n    executable containing the modified Library.  (It is understood\n    that the user who changes the contents of definitions files in the\n    Library will not necessarily be able to recompile the application\n    to use the modified definitions.)\n\n    b) Use a suitable shared library mechanism for linking with the\n    Library.  A suitable mechanism is one that (1) uses at run time a\n    copy of the library already present on the user's computer system,\n    rather than copying library functions into the executable, and (2)\n    will operate properly with a modified version of the library, if\n    the user installs one, as long as the modified version is\n    interface-compatible with the version that the work was made with.\n\n    c) Accompany the work with a written offer, valid for at\n    least three years, to give the same user the materials\n    specified in Subsection 6a, above, for a charge no more\n    than the cost of performing this distribution.\n\n    d) If distribution of the work is made by offering access to copy\n    from a designated place, offer equivalent access to copy the above\n    specified materials from the same place.\n\n    e) Verify that the user has already received a copy of these\n    materials or that you have already sent this user a copy.\n\n  For an executable, the required form of the \"work that uses the\nLibrary\" must include any data and utility programs needed for\nreproducing the executable from it.  However, as a special exception,\nthe materials to be distributed need not include anything that is\nnormally distributed (in either source or binary form) with the major\ncomponents (compiler, kernel, and so on) of the operating system on\nwhich the executable runs, unless that component itself accompanies\nthe executable.\n\n  It may happen that this requirement contradicts the license\nrestrictions of other proprietary libraries that do not normally\naccompany the operating system.  Such a contradiction means you cannot\nuse both them and the Library together in an executable that you\ndistribute.\n\f\n  7. You may place library facilities that are a work based on the\nLibrary side-by-side in a single library together with other library\nfacilities not covered by this License, and distribute such a combined\nlibrary, provided that the separate distribution of the work based on\nthe Library and of the other library facilities is otherwise\npermitted, and provided that you do these two things:\n\n    a) Accompany the combined library with a copy of the same work\n    based on the Library, uncombined with any other library\n    facilities.  This must be distributed under the terms of the\n    Sections above.\n\n    b) Give prominent notice with the combined library of the fact\n    that part of it is a work based on the Library, and explaining\n    where to find the accompanying uncombined form of the same work.\n\n  8. You may not copy, modify, sublicense, link with, or distribute\nthe Library except as expressly provided under this License.  Any\nattempt otherwise to copy, modify, sublicense, link with, or\ndistribute the Library is void, and will automatically terminate your\nrights under this License.  However, parties who have received copies,\nor rights, from you under this License will not have their licenses\nterminated so long as such parties remain in full compliance.\n\n  9. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Library or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Library (or any work based on the\nLibrary), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Library or works based on it.\n\n  10. Each time you redistribute the Library (or any work based on the\nLibrary), the recipient automatically receives a license from the\noriginal licensor to copy, distribute, link with or modify the Library\nsubject to these terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties with\nthis License.\n\f\n  11. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions 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\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Library at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Library by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Library.\n\nIf any portion of this section is held invalid or unenforceable under any\nparticular circumstance, the balance of the section is intended to apply,\nand the section as a whole is intended to apply in other circumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  12. If the distribution and/or use of the Library is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Library under this License may add\nan explicit geographical distribution limitation excluding those countries,\nso that distribution is permitted only in or among countries not thus\nexcluded.  In such case, this License incorporates the limitation as if\nwritten in the body of this License.\n\n  13. The Free Software Foundation may publish revised and/or new\nversions of the Lesser General Public License from time to time.\nSuch new versions will be similar in spirit to the present version,\nbut may differ in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Library\nspecifies a version number of this License which applies to it and\n\"any later version\", you have the option of following the terms and\nconditions either of that version or of any later version published by\nthe Free Software Foundation.  If the Library does not specify a\nlicense version number, you may choose any version ever published by\nthe Free Software Foundation.\n\f\n  14. If you wish to incorporate parts of the Library into other free\nprograms whose distribution conditions are incompatible with these,\nwrite to the author to ask for permission.  For software which is\ncopyrighted by the Free Software Foundation, write to the Free\nSoftware Foundation; we sometimes make exceptions for this.  Our\ndecision will be guided by the two goals of preserving the free status\nof all derivatives of our free software and of promoting the sharing\nand reuse of software generally.\n\n                            NO WARRANTY\n\n  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\nWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\nEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\nOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\nKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\nLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\nTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\nWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\nAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\nFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\nCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\nLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\nRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\nFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\nSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGES.\n\n                     END OF TERMS AND CONDITIONS\n\f\n           How to Apply These Terms to Your New Libraries\n\n  If you develop a new library, and you want it to be of the greatest\npossible use to the public, we recommend making it free software that\neveryone can redistribute and change.  You can do so by permitting\nredistribution under these terms (or, alternatively, under the terms of the\nordinary General Public License).\n\n  To apply these terms, attach the following notices to the library.  It is\nsafest to attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least the\n\"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the library's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This library is free software; you can redistribute it and/or\n    modify it under the terms of the GNU Lesser General Public\n    License as published by the Free Software Foundation; either\n    version 2.1 of the License, or (at your option) any later version.\n\n    This library 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 GNU\n    Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public\n    License along with this library; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n\nAlso add information on how to contact you by electronic and paper mail.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the library, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the\n  library `Frob' (a library for tweaking knobs) written by James Random Hacker.\n\n  <signature of Ty Coon>, 1 April 1990\n  Ty Coon, President of Vice\n\nThat's all there is to it!\n"
  },
  {
    "path": "Sublime/Sublime/LICENSE/NMSSH.LICENSE",
    "content": "Copyright (c) 2013 Nine Muses AB\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": "Sublime/Sublime/LICENSE/RongCloudIMKit.LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 融云 RongCloud\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "Sublime/Sublime/LICENSE/SJCSimplePDFView.LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Stuart Crook\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "Sublime/Sublime/LICENSE/SSZipArchive.LICENSE",
    "content": "Copyright (c) 2010-2015, Sam Soffes, http://soff.es\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Sublime/Sublime/LICENSE/Swifter.LICENSE",
    "content": "Copyright (c) 2014, Damian Kołakowski\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\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* 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\n* Neither the name of the {organization} nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "Sublime/Sublime/LICENSE/SwiftyJSON.LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Ruoyu Fu\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": "Sublime/Sublime/LICENSE/ZLMusicFlowWaveView.LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Zhixuan Lai\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "Sublime/Sublime/LICENSE/ZLSinusWaveView.LICENSE",
    "content": "Copyright (c) 2013 Raffael Hannemann \nCopyright (c) 2014, Zhixuan Lai\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "Sublime/Sublime/LicenseTableViewController.swift",
    "content": "//\n//  LicenseTableViewController.swift\n//  Sublime\n//\n//  Created by Eular on 2/24/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nclass LicenseTableViewController: UITableViewController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        title = \"License\"\n        tableView.backgroundColor = Constant.CapeCod\n        tableView.separatorColor = Constant.CapeCod\n    }\n\n    // MARK: - Table view data source\n    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {\n        return 1\n    }\n\n    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return Constant.License.count\n    }\n\n    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {\n        let cell = UITableViewCell(style: .Default, reuseIdentifier: nil)\n        cell.backgroundColor = Constant.TableCellColor\n        cell.selectedBackgroundView = UIView(frame: cell.frame)\n        cell.selectedBackgroundView?.backgroundColor = Constant.TableCellSelectedColor\n        cell.accessoryType = .DisclosureIndicator\n        \n        cell.textLabel?.text = Constant.License[indexPath.row]\n        cell.textLabel?.textColor = UIColor.whiteColor()\n\n        return cell\n    }\n    \n    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {\n        tableView.deselectRowAtIndexPath(indexPath, animated: true)\n        \n        let vc = UIViewController()\n        vc.title = Constant.License[indexPath.row]\n        vc.view.backgroundColor = Constant.CapeCod\n        vc.automaticallyAdjustsScrollViewInsets = false\n        let tv = UITextView()\n        tv.frame = CGRectMake(0, 0, vc.view.width, vc.view.height - Constant.NavigationBarOffset)\n        vc.view.addSubview(tv)\n        tv.backgroundColor = Constant.CapeCod\n        tv.textColor = UIColor.whiteColor()\n        tv.editable = false\n        tv.text = File(path: NSBundle.mainBundle().pathForResource(Constant.License[indexPath.row], ofType: \"LICENSE\")!).read()\n        \n        navigationController?.pushViewController(vc, animated: true)\n    }\n}\n"
  },
  {
    "path": "Sublime/Sublime/LogoView.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"10116\" systemVersion=\"15F31a\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"10085\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view contentMode=\"scaleToFill\" id=\"iN0-l3-epB\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <stackView opaque=\"NO\" contentMode=\"scaleToFill\" axis=\"vertical\" alignment=\"center\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"KBO-RW-k6e\">\n                    <rect key=\"frame\" x=\"243\" y=\"236\" width=\"114\" height=\"128\"/>\n                    <subviews>\n                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"S\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Sts-s3-UJa\">\n                            <rect key=\"frame\" x=\"26\" y=\"0.0\" width=\"61\" height=\"108\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"width\" constant=\"61\" id=\"DFm-cQ-mil\"/>\n                                <constraint firstAttribute=\"height\" constant=\"108\" id=\"LCM-tT-Pd6\"/>\n                            </constraints>\n                            <fontDescription key=\"fontDescription\" name=\"ArialRoundedMTBold\" family=\"Arial Rounded MT Bold\" pointSize=\"90\"/>\n                            <color key=\"textColor\" red=\"1\" green=\"0.58039215690000001\" blue=\"0.12549019610000001\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                            <nil key=\"highlightedColor\"/>\n                            <color key=\"shadowColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <size key=\"shadowOffset\" width=\"0.0\" height=\"3\"/>\n                        </label>\n                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"urinx.github.io\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"pw4-tp-mX5\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"108\" width=\"114\" height=\"20\"/>\n                            <fontDescription key=\"fontDescription\" name=\"TrebuchetMS\" family=\"Trebuchet MS\" pointSize=\"17\"/>\n                            <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <nil key=\"highlightedColor\"/>\n                        </label>\n                    </subviews>\n                    <constraints>\n                        <constraint firstAttribute=\"width\" constant=\"114\" id=\"FWS-XR-fUs\"/>\n                        <constraint firstAttribute=\"height\" constant=\"128\" id=\"TNC-1e-mWf\"/>\n                    </constraints>\n                    <variation key=\"heightClass=compact-widthClass=compact\" ambiguous=\"YES\" misplaced=\"YES\">\n                        <rect key=\"frame\" x=\"143\" y=\"136\" width=\"114\" height=\"128\"/>\n                    </variation>\n                </stackView>\n            </subviews>\n            <constraints>\n                <constraint firstItem=\"KBO-RW-k6e\" firstAttribute=\"height\" secondItem=\"iN0-l3-epB\" secondAttribute=\"height\" id=\"2mC-VA-Mvf\"/>\n                <constraint firstItem=\"KBO-RW-k6e\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" id=\"7Tu-Po-LmS\"/>\n                <constraint firstItem=\"KBO-RW-k6e\" firstAttribute=\"top\" secondItem=\"iN0-l3-epB\" secondAttribute=\"top\" constant=\"100\" id=\"f0a-GW-CHn\"/>\n                <constraint firstItem=\"KBO-RW-k6e\" firstAttribute=\"centerY\" secondItem=\"iN0-l3-epB\" secondAttribute=\"centerY\" id=\"gUX-PW-GdW\"/>\n                <constraint firstItem=\"KBO-RW-k6e\" firstAttribute=\"width\" secondItem=\"iN0-l3-epB\" secondAttribute=\"width\" id=\"hTa-nu-giA\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"KBO-RW-k6e\" secondAttribute=\"trailing\" constant=\"486\" id=\"qVz-oe-wdb\"/>\n                <constraint firstItem=\"KBO-RW-k6e\" firstAttribute=\"centerX\" secondItem=\"iN0-l3-epB\" secondAttribute=\"centerX\" id=\"xYR-ad-jij\"/>\n            </constraints>\n            <variation key=\"default\">\n                <mask key=\"constraints\">\n                    <exclude reference=\"2mC-VA-Mvf\"/>\n                    <exclude reference=\"7Tu-Po-LmS\"/>\n                    <exclude reference=\"f0a-GW-CHn\"/>\n                    <exclude reference=\"hTa-nu-giA\"/>\n                    <exclude reference=\"qVz-oe-wdb\"/>\n                </mask>\n            </variation>\n        </view>\n    </objects>\n</document>\n"
  },
  {
    "path": "Sublime/Sublime/MainTableViewController.swift",
    "content": "//\n//  FilesTableViewController.swift\n//  Sublime\n//\n//  Created by Eular on 2/12/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nclass MainTableViewController: FolderTableViewController {\n        \n    var gitList = [File(path: \"Stars\"), File(path: \"Repositories\")]\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        title = \"Sublime\"\n        mainViewFlag = 0\n        \n        Global.Notifi.addObserver(self, selector: #selector(self.hasUnreadMessages), name: Constant.RongCloudUnreadMessageNotifi, object: nil)\n    }\n    \n    deinit {\n        Global.Notifi.removeObserver(self)\n    }\n    \n    func hasUnreadMessages() {\n        dispatch_async(dispatch_get_main_queue()) {\n            self.tabBarController?.tabBar.showRedBadgeOnItem(1, totalItemNums: 3)\n        }\n    }\n\n    // MARK: - Table view data source\n    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {\n        return 2\n    }\n\n    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        switch section {\n            case 0: return gitList.count\n            case 1: return fileList.count\n            default: return 0\n        }\n    }\n\n    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {\n        let cell = UITableViewCell(style: .Default, reuseIdentifier: nil)\n        if indexPath.section == 0 {\n            let f = gitList[indexPath.row]\n            setFileTableCell(cell, name: f.name, imgname: f.name, isDir: true)\n        } else {\n            let f = fileList[indexPath.row]\n            setFileTableCell(cell, name: f.name, imgname: f.img, isDir: f.isDir)\n        }\n        return cell\n    }\n    \n    override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {\n        let secTitle = [\"   Github\", \"   Local\"]\n        let title = UILabel(frame: CGRectMake(0, 0, view.width, Constant.FilesTableSectionHight))\n        title.backgroundColor = Constant.CapeCod\n        title.text = secTitle[section]\n        title.textColor = UIColor.whiteColor()\n        title.font = title.font.fontWithSize(12)\n        title.textAlignment = .Natural\n        let headerView = UIView()\n        headerView.addSubview(title)\n        return headerView\n    }\n    \n    override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {\n        return Constant.FilesTableSectionHight\n    }\n\n}\n"
  },
  {
    "path": "Sublime/Sublime/MessageListViewController.swift",
    "content": "//\n//  MessageListViewController.swift\n//  Sublime\n//\n//  Created by Eular on 3/21/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\n\nclass MessageListViewController: RCConversationListViewController {\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        title = \"Messages\"\n        showConnectingStatusOnNavigatorBar = true\n        emptyConversationView.atCenter()\n        \n        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: #selector(self.newChat))\n        \n        //设置需要显示哪些类型的会话\n        self.setDisplayConversationTypes([\n            RCConversationType.ConversationType_PRIVATE.rawValue,\n            RCConversationType.ConversationType_DISCUSSION.rawValue,\n            RCConversationType.ConversationType_CHATROOM.rawValue,\n            RCConversationType.ConversationType_GROUP.rawValue,\n            RCConversationType.ConversationType_APPSERVICE.rawValue,\n            RCConversationType.ConversationType_SYSTEM.rawValue])\n        //设置需要将哪些类型的会话在会话列表中聚合显示\n        self.setCollectionConversationType([\n            RCConversationType.ConversationType_DISCUSSION.rawValue,\n            RCConversationType.ConversationType_GROUP.rawValue])\n        \n        if RCIM.sharedRCIM().getConnectionStatus() == .ConnectionStatus_Unconnected {\n            RCIM.sharedRCIM().getTokenAndLogin()\n        }\n        \n    }\n    \n    override func viewWillDisappear(animated: Bool) {\n        Global.UnreadMessageCount = 0\n        tabBarController?.tabBar.hideRedBadgeOnItem(2)\n    }\n    \n    override func onSelectedTableRow(conversationModelType: RCConversationModelType, conversationModel model: RCConversationModel!, atIndexPath indexPath: NSIndexPath!) {\n        let chat = RCChatViewController(conversationType: model.conversationType, targetId: model.targetId)\n        chat.title = model.conversationTitle\n        navigationController?.pushViewController(chat, animated: true)\n    }\n    \n    override func didTapCellPortrait(model: RCConversationModel!) {\n        let contactInfoVC = UIStoryboard(name: \"Main\", bundle: nil).instantiateViewControllerWithIdentifier(Constant.ContactInfoStoryboardID) as! ContactInfoViewController\n        contactInfoVC.id = model.targetId == Constant.RongCloudRobotID ? \"\" : model.targetId\n        navigationController?.pushViewController(contactInfoVC, animated: true)\n    }\n    \n    func newChat() {\n        let contactVC = UIStoryboard(name: \"Main\", bundle: nil).instantiateViewControllerWithIdentifier(Constant.ContactTableStoryboardID) as! ContactTableViewController\n        navigationController?.pushViewController(contactVC, animated: true)\n    }\n}\n\n"
  },
  {
    "path": "Sublime/Sublime/MusicViewController.swift",
    "content": "//\n//  MusicViewController.swift\n//  Sublime\n//\n//  Created by Eular on 2/21/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\nimport AVFoundation\n\nclass MusicViewController: MusicWave {\n    \n    let popupMenu = PopupMenu()\n    var curFile: File!\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        title = curFile.name\n        \n        // 设置分享菜单\n        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Action, target: popupMenu, action: #selector(popupMenu.showUp))\n        popupMenu.controller = self\n        popupMenu.itemsToShare = [curFile.url]\n        \n        self.audioUrl = curFile.url\n        self.start()\n    }\n    \n    override func viewWillDisappear(animated: Bool) {\n        self.audioPlayer.stop()\n    }\n    \n    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {\n        if self.audioPlayer.isPlaying() {\n            self.audioPlayer.pause()\n        } else {\n            self.audioPlayer.play()\n        }\n    }\n\n}\n"
  },
  {
    "path": "Sublime/Sublime/NewFileViewController.swift",
    "content": "//\n//  NewFileViewController.swift\n//  Sublime\n//\n//  Created by Eular on 2/14/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\n\nclass NewFileViewController: UIViewController {\n\n    var fileImg: UIImageView!\n    var filenameText: UITextField!\n    var warningLabel: UILabel!\n    \n    let keywords = [\n        [\"file_unknown\", \"New File\", \"File Name\"],\n        [\"folder\", \"New Folder\", \"Folder Name\"]\n    ]\n    var tag = 0\n    var curFolder: Folder!\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        view.backgroundColor = Constant.CapeCod\n        title = keywords[tag][1]\n        \n        let inputView = UIView()\n        inputView.frame = CGRectMake(0, Constant.NavigationBarOffset + 43, view.width, 44)\n        inputView.backgroundColor = RGB(140, 140, 140, alpha: 0.4)\n        view.addSubview(inputView)\n        \n        fileImg = UIImageView()\n        fileImg.frame = CGRectMake(10, 8, 28, 28)\n        fileImg.image = UIImage(named: keywords[tag][0])\n        inputView.addSubview(fileImg)\n        \n        filenameText = UITextField()\n        filenameText.frame = CGRectMake(48, 0, view.width - 52, 44)\n        filenameText.textColor = UIColor.whiteColor()\n        filenameText.placeholder = keywords[tag][2]\n        filenameText.autocorrectionType = .No\n        filenameText.autocapitalizationType = .None\n        filenameText.keyboardType = .ASCIICapable\n        filenameText.spellCheckingType = .No\n        filenameText.becomeFirstResponder()\n        inputView.addSubview(filenameText)\n        \n        warningLabel = UILabel()\n        warningLabel.frame = CGRectMake(0, inputView.y + inputView.height + 12, view.width, 18)\n        warningLabel.font = warningLabel.font.fontWithSize(12)\n        warningLabel.textAlignment = .Center\n        warningLabel.textColor = UIColor.whiteColor()\n        warningLabel.alpha = 0\n        view.insertSubview(warningLabel, belowSubview: inputView)\n        \n        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Done, target: self, action: #selector(self.createNew))\n    }\n    \n    func createNew() {\n        let text = filenameText.text!.strip()\n        if text.isEmpty {\n            showWarningMsg(\"Name can't be empty\")\n        } else if curFolder.checkFileExist(text) {\n            showWarningMsg(\"The file already existed\")\n        } else {\n            switch tag {\n            case 0:\n                if curFolder.newFile(text) {\n                    navigationController?.popViewControllerAnimated(true)\n                } else {\n                    showWarningMsg(\"New file failed\")\n                }\n            case 1:\n                if curFolder.newFolder(text) {\n                    navigationController?.popViewControllerAnimated(true)\n                } else {\n                    showWarningMsg(\"New folder failed\")\n                }\n            default: return\n            }\n        }\n    }\n    \n    func showWarningMsg(word: String) {\n        warningLabel.text = word\n        UIView.animateWithDuration(0.5,\n            animations: { () -> Void in\n                self.warningLabel.alpha = 1\n            },\n            completion: { (_) -> Void in\n                UIView.animateWithDuration(3) {\n                    self.warningLabel.alpha = 0\n                }\n            })\n    }\n\n}\n"
  },
  {
    "path": "Sublime/Sublime/PDFViewController.swift",
    "content": "//\n//  PDFViewController.swift\n//  Sublime\n//\n//  Created by Eular on 2/22/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\nimport SJCSimplePDFView\n\nclass PDFViewController: UIViewController, PopupMenuDelegate {\n    \n    var curFile: File!\n    var pdfView: SJCSimplePDFView!\n    \n    let pagenumLabel = UILabel()\n    let popupMenu = PopupMenu()\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        self.automaticallyAdjustsScrollViewInsets = false\n        tabBarController?.tabBar.hidden = true\n\n        view.backgroundColor = Constant.CapeCod\n        title = curFile.name\n        \n        pdfView = SJCSimplePDFView()\n        pdfView.frame = CGRectMake(0, 0, view.width, view.height - Constant.NavigationBarOffset)\n        pdfView.pageBackgroundColour = UIColor.whiteColor()\n        pdfView.PDFFileURL = curFile.url\n        pdfView.pageInsets = UIEdgeInsets(top: 2.5, left: 5, bottom: 2.5, right: 5)\n        \n        let viewMode = Global.Database.integerForKey(\"pdf-viewmode-\\(curFile.path.md5)\")\n        pdfView.viewMode = [.Continuous, .PageVertical, .PageHorizontal][viewMode]\n        let curPage = Global.Database.integerForKey(\"pdf-curPage-\\(curFile.path.md5)\")\n        pdfView.currentPage = UInt(curPage) // bug: currentPage为'0,1'都显示第一页，'2'显示第三页\n        \n        view.addSubview(pdfView)\n        \n        // 设置分享菜单\n        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Action, target: popupMenu, action: #selector(popupMenu.showUp))\n        popupMenu.controller = self\n        popupMenu.delegate = self\n        popupMenu.itemsToShare = [curFile.url]\n        popupMenu.items = [\n            [\"title\":\"QQ\", \"image\":\"Share_qq_icon\"],\n            [\"title\":\"新浪微博\", \"image\":\"Share_sina_icon\"],\n            [\"title\":\"微信\", \"image\":\"Share_wechat_session_icon\"],\n            [\"title\":\"Facebook\", \"image\":\"Share_facebook_icon\"],\n            [\"title\":\"Line\", \"image\":\"Share_line_icon\"],\n            [\"title\":\"Instagram\", \"image\":\"Share_instagram\"],\n            [\"title\":\"Twitter\", \"image\":\"Share_twitter_icon\"],\n            [\"title\":\"Pinterest\", \"image\":\"Share_pinterest_icon\"],\n            [\"title\":\"PDF Continuous\", \"image\":\"pdf_continuous\"],\n            [\"title\":\"PDF Vertical\", \"image\":\"pdf_vertical\"],\n            [\"title\":\"PDF Horizontal\", \"image\":\"pdf_horizontal\"],\n        ]\n        \n        pdfView.addObserver(self, forKeyPath: \"currentPage\", options: NSKeyValueObservingOptions.New, context: nil)\n        \n        \n        pagenumLabel.frame = CGRectMake(0, view.height - 30, 0, 0)\n        pagenumLabel.layer.masksToBounds = true\n        pagenumLabel.layer.cornerRadius = 3\n        pagenumLabel.backgroundColor = RGB(0, 0, 0, alpha: 0.5)\n        pagenumLabel.textColor = UIColor.whiteColor()\n        pagenumLabel.textAlignment = .Center\n        pagenumLabel.alpha = 0\n        view.addSubview(pagenumLabel)\n    }\n    \n    func setPagenumLabelText(str: String) {\n        pagenumLabel.text = str\n        pagenumLabel.sizeToFit()\n        pagenumLabel.width += 10\n        pagenumLabel.x = (view.width - pagenumLabel.width) / 2\n        \n        UIView.animateWithDuration(0.5, animations: { () -> Void in\n            self.pagenumLabel.alpha = 1\n        }) { (_) -> Void in\n            UIView.animateWithDuration(2) {\n                self.pagenumLabel.alpha = 0\n            }\n        }\n    }\n    \n    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {\n        if keyPath == \"currentPage\" {\n            let n = change?[NSKeyValueChangeNewKey]?.integerValue\n            setPagenumLabelText(\"\\(n!) / \\(pdfView.documentPageCount)\")\n        }\n    }\n    \n    deinit {\n        pdfView.removeObserver(self, forKeyPath: \"currentPage\")\n    }\n    \n    override func viewWillDisappear(animated: Bool) {\n        Global.Database.setInteger(Int(pdfView.currentPage)-1, forKey: \"pdf-curPage-\\(curFile.path.md5)\")\n    }\n    \n    func tapOnPopupMenuItem(itemIndex i: Int) {\n        switch i {\n        case 2:\n            WXShareFile(curFile.name, desc: curFile.name, file: curFile)\n        case 8:\n            pdfView.viewMode = .Continuous\n            Global.Database.setInteger(0, forKey: \"pdf-viewmode-\\(curFile.path.md5)\")\n        case 9:\n            pdfView.viewMode = .PageVertical\n            Global.Database.setInteger(1, forKey: \"pdf-viewmode-\\(curFile.path.md5)\")\n        case 10:\n            pdfView.viewMode = .PageHorizontal\n            Global.Database.setInteger(2, forKey: \"pdf-viewmode-\\(curFile.path.md5)\")\n        default: return\n        }\n    }\n}\n"
  },
  {
    "path": "Sublime/Sublime/RCChatViewController.swift",
    "content": "//\n//  ChatViewController.swift\n//  Sublime\n//\n//  Created by Eular on 4/1/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\n\nclass RCChatViewController: RCConversationViewController {\n    override func didTapCellPortrait(userId: String!) {\n        let contactInfoVC = UIStoryboard(name: \"Main\", bundle: nil).instantiateViewControllerWithIdentifier(Constant.ContactInfoStoryboardID) as! ContactInfoViewController\n        contactInfoVC.id = userId == Constant.RongCloudRobotID ? \"\" : userId\n        navigationController?.pushViewController(contactInfoVC, animated: true)\n    }\n}"
  },
  {
    "path": "Sublime/Sublime/RSSItemListTableViewController.swift",
    "content": "//\n//  RSSItemListTableViewController.swift\n//  Sublime\n//\n//  Created by Eular on 4/7/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\nimport Alamofire\nimport AlamofireRSSParser\nimport AASquaresLoading\n\nclass RSSItemListTableViewController: UITableViewController {\n    \n    var rssUrl = \"\"\n    var itemList: [RSSItem] = []\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        tableView.backgroundColor = Constant.CapeCod\n        tableView.separatorColor = Constant.TableCellSeparatorColor\n        tableView.tableFooterView = UIView()\n        tableView.estimatedRowHeight = 70\n        tableView.rowHeight = UITableViewAutomaticDimension\n        \n        navigationItem.rightBarButtonItem = UIBarButtonItem(title: \"0\", style: .Plain, target: self, action: nil)\n        \n        if Network.isConnectedToNetwork() {\n            let loadingSquare = AASquaresLoading(target: self.view, size: 40)\n            loadingSquare.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.5)\n            loadingSquare.color = UIColor.whiteColor()\n            loadingSquare.start()\n            tableView.scrollEnabled = false\n            \n            Alamofire.request(.GET, rssUrl).responseRSS() { (response) -> Void in\n                if let feed: RSSFeed = response.result.value {\n                    self.itemList = feed.items\n                    self.navigationItem.rightBarButtonItem?.title = \"\\(feed.items.count)\"\n                    loadingSquare.stop()\n                    self.tableView.scrollEnabled = true\n                    self.tableView.reloadData()\n                }\n            }\n        } else {\n            view.Toast(message: \"No network\", hasNavigationBar: true)\n        }\n    }\n\n    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {\n        return 1\n    }\n\n    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return itemList.count\n    }\n    \n    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {\n        let cell = UITableViewCell(style: .Subtitle, reuseIdentifier: nil)\n        cell.backgroundColor = Constant.NavigationBarAndTabBarColor\n        cell.selectedBackgroundView = UIView(frame: cell.frame)\n        cell.selectedBackgroundView?.backgroundColor = Constant.TableCellSelectedColor\n        cell.accessoryType = .DisclosureIndicator\n        \n        cell.textLabel?.text = itemList[indexPath.row].title\n        cell.textLabel?.numberOfLines = 0\n        cell.textLabel?.lineBreakMode = .ByWordWrapping\n        cell.detailTextLabel?.text = itemList[indexPath.row].itemDescription?.trim(charSet: .whitespaceAndNewlineCharacterSet())\n        cell.textLabel?.textColor = UIColor.whiteColor()\n        cell.detailTextLabel?.textColor = UIColor.grayColor()\n        \n        return cell\n    }\n    \n    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {\n        tableView.deselectRowAtIndexPath(indexPath, animated: true)\n        \n        let backItem = UIBarButtonItem()\n        backItem.title = \"back\"\n        navigationItem.backBarButtonItem = backItem\n        \n        let svc = SublimeSafari(URL: NSURL(string: itemList[indexPath.row].link!)!)\n        svc.title = title\n        navigationController?.pushViewController(svc, animated: true)\n    }\n\n}\n"
  },
  {
    "path": "Sublime/Sublime/RSSListTableViewController.swift",
    "content": "//\n//  RSSListTableViewController.swift\n//  Sublime\n//\n//  Created by Eular on 4/7/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\n\nclass RSSListTableViewController: UITableViewController {\n    \n    let RSSPlist = Plist(path: Constant.SublimeRoot+\"/etc/rss_list.plist\")\n    var RSSList: [[String: String]] = [] {\n        didSet {\n            do {\n                try RSSPlist.saveToPlistFile(RSSList)\n            } catch {\n                view.Toast(message: \"Save failed!\", hasNavigationBar: true)\n            }\n            \n            if RSSList.count > oldValue.count {\n                tableView.reloadData()\n            }\n        }\n    }\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        title = \"RSS\"\n        tableView.backgroundColor = Constant.CapeCod\n        tableView.separatorColor = Constant.TableCellSeparatorColor\n        tableView.tableFooterView = UIView()\n        \n        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: #selector(self.addNewRSS))\n    }\n    \n    override func viewWillAppear(animated: Bool) {\n        if let arr = RSSPlist.getArrayInPlistFile() {\n            RSSList = arr as! [[String : String]]\n            tableView.reloadData()\n        }\n    }\n    \n    func addNewRSS() {\n        let alertController = UIAlertController(title: \"New RSS\", message: \"Enter RSS info below\", preferredStyle: .Alert)\n        \n        alertController.addTextFieldWithConfigurationHandler({(textField: UITextField!) in\n            textField.placeholder = \"RSS Title\"\n            textField.borderStyle = .None\n            textField.textAlignment = .Center\n        })\n        alertController.addTextFieldWithConfigurationHandler({(textField: UITextField!) in\n            textField.placeholder = \"RSS URL\"\n            textField.borderStyle = .None\n            textField.textAlignment = .Center\n        })\n        \n        let addAction = UIAlertAction(title: \"Add\", style: UIAlertActionStyle.Default, handler: {\n            (paramAction: UIAlertAction!) in\n            if let textFields = alertController.textFields {\n                let theTextFields = textFields as [UITextField]\n                if let title = theTextFields[0].text, let url = theTextFields[1].text {\n                    if !title.isEmpty && !url.isEmpty {\n                        self.RSSList.append([\"title\": title, \"rss\": url])\n                    } else {\n                        self.view.Toast(message: \"RSS title or url can't be empty!\", hasNavigationBar: true)\n                    }\n                }\n            }\n        })\n        \n        alertController.addAction(addAction)\n        alertController.addAction(UIAlertAction(title: \"Cancel\", style: .Cancel, handler: nil))\n        self.presentViewController(alertController, animated: true, completion: nil)\n    }\n\n    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {\n        return 1\n    }\n\n    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return RSSList.count\n    }\n    \n    override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {\n        return true\n    }\n    \n    override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {\n        if editingStyle == .Delete {\n            RSSList.removeAtIndex(indexPath.row)\n            tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)\n        }\n    }\n    \n    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {\n        let cell = UITableViewCell(style: .Subtitle, reuseIdentifier: nil)\n        cell.backgroundColor = Constant.NavigationBarAndTabBarColor\n        cell.selectedBackgroundView = UIView(frame: cell.frame)\n        cell.selectedBackgroundView?.backgroundColor = Constant.TableCellSelectedColor\n        cell.accessoryType = .DisclosureIndicator\n        \n        cell.textLabel?.text = RSSList[indexPath.row][\"title\"]\n        cell.detailTextLabel?.text = RSSList[indexPath.row][\"rss\"]\n        cell.textLabel?.textColor = UIColor.whiteColor()\n        cell.detailTextLabel?.textColor = UIColor.grayColor()\n        \n        return cell\n    }\n    \n    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {\n        return 50\n    }\n    \n    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {\n        tableView.deselectRowAtIndexPath(indexPath, animated: true)\n        \n        let rssItemList = RSSItemListTableViewController()\n        rssItemList.title = RSSList[indexPath.row][\"title\"]\n        rssItemList.rssUrl = RSSList[indexPath.row][\"rss\"]!\n        navigationController?.pushViewController(rssItemList, animated: true)\n    }\n\n}\n"
  },
  {
    "path": "Sublime/Sublime/ReadingViewController.swift",
    "content": "//\n//  ReadingViewController.swift\n//  Sublime\n//\n//  Created by Eular on 5/10/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\n\nclass ReadingViewController: UIViewController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        title = \"Reading\"\n        view.backgroundColor = Constant.CapeCod\n    }\n\n}\n"
  },
  {
    "path": "Sublime/Sublime/Repo.swift",
    "content": "//\n//  Repo.swift\n//  Sublime\n//\n//  Created by Eular on 5/9/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\nimport Alamofire\nimport SwiftyJSON\n\nclass Repo {\n    var id: String!\n    var name: String!\n    var description: String!\n    var ownerLogin: String!\n    var url: String!\n    var stargazers: Int!\n    var forks: Int!\n    var watchers: Int!\n    var language: String!\n    var issues: Int!\n    var size: Double!\n    var created_at: String!\n    var downloadFolder: Folder?\n    var downloadZipPath: String = \"\"\n    \n    required init(json: JSON) {\n        self.description = json[\"description\"].string\n        self.id = json[\"id\"].string\n        self.name = json[\"name\"].string\n        self.ownerLogin = json[\"owner\"][\"login\"].string\n        self.url = json[\"url\"].string\n        self.stargazers = json[\"stargazers_count\"].int\n        self.forks = json[\"forks_count\"].int\n        self.watchers = json[\"watchers_count\"].int\n        self.language = json[\"language\"].string\n        self.issues = json[\"open_issues_count\"].int\n        self.size = json[\"size\"].double\n        self.created_at = json[\"created_at\"].string\n    }\n    \n    func fatchReadmeFile(format: String = \"raw\", completion: (String) -> Void) {\n        let url = \"https://api.github.com/repos/\\(ownerLogin)/\\(name)/readme\"\n        let header = [\"Accept\": \"application/vnd.github.VERSION.\\(format)\"]\n        \n        Alamofire.request(.GET, url, headers: header).responseString { response in\n            if let str = response.result.value {\n                let metafix = \"<meta name=\\\"viewport\\\" content=\\\"width=device-width,initial-scale=0.8,maximum-scale=0.8,user-scalable=no\\\"/>\"\n                let cssfix = \"<style type=\\\"text/css\\\">body{background-color:#515151;color:#fff}article{margin:0 10px}svg path{fill:#fff}table{width: 100%;border-collapse:collapse}table,td,th{border:1px solid #253238}td,th{padding:5px}a{color:#00AFF4}h1:after,h2:after{margin-top:10px;content:' ';display:block;border:.5px solid gray}code{color:pink}pre{padding:10px;word-wrap:break-word;background-color:#253238}pre>code{color:#fff}</style>\"\n                switch format {\n                case \"raw\":\n                    completion(str)\n                case \"html\":\n                    completion(metafix+str+cssfix)\n                default:\n                    completion(str)\n                }\n                \n            }\n        }\n    }\n    \n    func download(duration: ((Int64, Int64, Int64) -> Void)? = nil, completion: (() -> Void)? = nil, failed: (() -> Void)? = nil) {\n        let url = \"https://api.github.com/repos/\\(ownerLogin)/\\(name)/zipball/master\"\n        \n        Alamofire.download(.GET, url) { temporaryURL, response in\n            let pathComponent = response.suggestedFilename\n            let downloadUrl: NSURL!\n            if let url = self.downloadFolder?.url {\n                downloadUrl = url.URLByAppendingPathComponent(pathComponent!)\n            } else {\n                let directoryURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]\n                downloadUrl = directoryURL.URLByAppendingPathComponent(pathComponent!)\n            }\n            self.downloadZipPath = downloadUrl.path!\n            return downloadUrl\n            }.progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in\n                Log(\"Total bytes read: \\(totalBytesRead)\")\n                if let d = duration { d(bytesRead, totalBytesRead, totalBytesExpectedToRead) }\n                // This closure is NOT called on the main queue for performance\n                // reasons. To update your ui, dispatch to the main queue.\n                // dispatch_async(dispatch_get_main_queue()) {\n                //    print(\"Total bytes read on main queue: \\(totalBytesRead)\")\n                // }\n            }.response { _, _, _, error in\n                if let error = error {\n                    Log(\"Download failed with error: \\(error)\")\n                    if let f = failed { f() }\n                } else {\n                    Log(\"Downloaded file successfully\")\n                    let zipFile = File(path: self.downloadZipPath)\n                    zipFile.unzip(keepFile: false)\n                    Log(\"Unzip file successfully\")\n                    if let c = completion { c() }\n                }\n        }\n    }\n}"
  },
  {
    "path": "Sublime/Sublime/ReposTableViewController.swift",
    "content": "//\n//  ReposTableViewController.swift\n//  Sublime\n//\n//  Created by Eular on 2/29/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\nimport AASquaresLoading\n\nclass ReposTableViewController: UITableViewController {\n    @IBOutlet weak var starLB: UILabel!\n    @IBOutlet weak var forkLB: UILabel!\n    @IBOutlet weak var watcherLB: UILabel!\n    @IBOutlet weak var commitTimeLB: UILabel!\n    @IBOutlet weak var descriptionLB: UILabel!\n    @IBOutlet weak var sizeLB: UILabel!\n    @IBOutlet weak var webView: UIWebView!\n    \n    var repo: Repo!\n    var loadingSquare: AASquaresLoading!\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        title = repo.name\n        \n        let downloadBtn = UIBarButtonItem(image: UIImage(named: \"repo_download\"), style: UIBarButtonItemStyle.Plain, target: self, action: #selector(self.downloadRepo))\n        navigationItem.rightBarButtonItem = downloadBtn\n        \n        watcherLB.text = \"\\(repo.watchers)\"\n        starLB.text = \"\\(repo.stargazers)\"\n        forkLB.text = \"\\(repo.forks)\"\n        commitTimeLB.text = \"Created at: \\(repo.created_at)\"\n        descriptionLB.text = repo.description\n        sizeLB.text = \"[\\((repo.size * 1024).MB.afterPoint(2))M]\"\n        \n        webView.backgroundColor = UIColor.clearColor()\n        webView.opaque = false\n        webView.scalesPageToFit = true\n        webView.scrollView.showsHorizontalScrollIndicator = false\n\n        repo.fatchReadmeFile(\"html\") { (str) -> Void in\n            self.webView.loadHTMLString(str, baseURL: nil)\n        }\n        \n        //webView.loadRequest(NSURLRequest(URL: NSURL(string: \"https://github.com/\\(repo.ownerLogin)/\\(repo.name)/blob/master/README.md\")!))\n        \n        loadingSquare = AASquaresLoading(target: self.view, size: 40)\n        loadingSquare.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.5)\n        loadingSquare.color = UIColor.whiteColor()\n    }\n    \n    func downloadRepo() {\n        tableView.scrollEnabled = false\n        let barItem = UIBarButtonItem(title: \"0 %\", style: .Plain, target: nil, action: nil)\n        navigationItem.rightBarButtonItem = barItem\n        \n        loadingSquare.start()\n        repo.download({ (bytesRead, totalBytesRead, totalBytesExpectedToRead) -> Void in\n            let read = CGFloat(totalBytesRead)\n            let total = CGFloat(totalBytesExpectedToRead)\n            let r = Int(read * 100.0 / total)\n            dispatch_async(dispatch_get_main_queue()) {\n                // 导航栏右边按钮显示下载进度\n                let barItem = UIBarButtonItem(title: \"\\(r) %\", style: .Plain, target: nil, action: nil)\n                self.navigationItem.rightBarButtonItem = barItem\n            }\n        }, completion: {\n            self.loadingSquare.stop()\n            self.tableView.scrollEnabled = true\n            self.navigationItem.rightBarButtonItem = nil\n        }) {\n            self.loadingSquare.stop()\n            self.tableView.scrollEnabled = true\n            let downloadBtn = UIBarButtonItem(image: UIImage(named: \"repo_download\"), style: UIBarButtonItemStyle.Plain, target: self, action: #selector(self.downloadRepo))\n            self.navigationItem.rightBarButtonItem = downloadBtn\n            self.view.Toast(message: \"Download Fail\", hasNavigationBar: true)\n        }\n    }\n\n    // MARK: - Table view data source\n    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {\n        return 3\n    }\n\n    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return [3,1,1][section]\n    }\n    \n    override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {\n        let secTitle = [\"   \\(repo.ownerLogin) / \\(repo.name)\", \"   master\", \"   README.md\"]\n        let title = UILabel(frame: CGRectMake(0, 0, view.width, Constant.FilesTableSectionHight))\n        title.backgroundColor = Constant.CapeCod\n        title.text = secTitle[section]\n        title.textColor = UIColor.whiteColor()\n        title.font = title.font.fontWithSize(12)\n        title.textAlignment = .Natural\n        let headerView = UIView()\n        headerView.addSubview(title)\n        return headerView\n    }\n    \n    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {\n        return indexPath.section == 2 ? view.height - Constant.NavigationBarOffset : 44\n    }\n    \n    override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {\n        return Constant.FilesTableSectionHight\n    }\n    \n    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {\n        tableView.deselectRowAtIndexPath(indexPath, animated: true)\n    }\n\n}\n"
  },
  {
    "path": "Sublime/Sublime/SDK/Weixin/WXApi.h",
    "content": "//\n//  WXApi.h\n//  所有Api接口\n//\n//  Created by Wechat on 12-2-28.\n//  Copyright (c) 2012年 Tencent. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import \"WXApiObject.h\"\n\n\n#pragma mark - WXApiDelegate\n/*! @brief 接收并处理来自微信终端程序的事件消息\n *\n * 接收并处理来自微信终端程序的事件消息，期间微信界面会切换到第三方应用程序。\n * WXApiDelegate 会在handleOpenURL:delegate:中使用并触发。\n */\n@protocol WXApiDelegate <NSObject>\n@optional\n\n/*! @brief 收到一个来自微信的请求，第三方应用程序处理完后调用sendResp向微信发送结果\n *\n * 收到一个来自微信的请求，异步处理完成后必须调用sendResp发送处理结果给微信。\n * 可能收到的请求有GetMessageFromWXReq、ShowMessageFromWXReq等。\n * @param req 具体请求内容，是自动释放的\n */\n-(void) onReq:(BaseReq*)req;\n\n\n\n/*! @brief 发送一个sendReq后，收到微信的回应\n *\n * 收到一个来自微信的处理结果。调用一次sendReq后会收到onResp。\n * 可能收到的处理结果有SendMessageToWXResp、SendAuthResp等。\n * @param resp具体的回应内容，是自动释放的\n */\n-(void) onResp:(BaseResp*)resp;\n\n@end\n\n\n\n#pragma mark - WXApi\n\n/*! @brief 微信Api接口函数类\n *\n * 该类封装了微信终端SDK的所有接口\n */\n@interface WXApi : NSObject\n\n/*! @brief WXApi的成员函数，向微信终端程序注册第三方应用。\n *\n * 需要在每次启动第三方应用程序时调用。第一次调用后，会在微信的可用应用列表中出现。\n * iOS7及以上系统需要调起一次微信才会出现在微信的可用应用列表中。\n * @attention 请保证在主线程中调用此函数\n * @param appid 微信开发者ID\n * @param typeFlag 应用支持打开的文件类型\n * @return 成功返回YES，失败返回NO。\n */\n+(BOOL) registerApp:(NSString *)appid;\n\n\n/*! @brief WXApi的成员函数，向微信终端程序注册第三方应用。\n *\n * 需要在每次启动第三方应用程序时调用。第一次调用后，会在微信的可用应用列表中出现。\n * @see registerApp\n * @param appid 微信开发者ID\n * @param appdesc 应用附加信息，长度不超过1024字节\n * @return 成功返回YES，失败返回NO。\n */\n+(BOOL) registerApp:(NSString *)appid withDescription:(NSString *)appdesc;\n\n\n/*! @brief WXApi的成员函数，向微信终端程序注册应用支持打开的文件类型。\n *\n * 需要在每次启动第三方应用程序时调用。调用后并第一次成功分享数据到微信后，会在微信的可用应用列表中出现。\n * @see registerApp\n * @param typeFlag 应用支持打开的数据类型, enAppSupportContentFlag枚举类型 “|” 操作后结果\n */\n+(void) registerAppSupportContentFlag:(UInt64)typeFlag;\n\n\n\n/*! @brief 处理微信通过URL启动App时传递的数据\n *\n * 需要在 application:openURL:sourceApplication:annotation:或者application:handleOpenURL中调用。\n * @param url 微信启动第三方应用时传递过来的URL\n * @param delegate  WXApiDelegate对象，用来接收微信触发的消息。\n * @return 成功返回YES，失败返回NO。\n */\n+(BOOL) handleOpenURL:(NSURL *) url delegate:(id<WXApiDelegate>) delegate;\n\n\n\n/*! @brief 检查微信是否已被用户安装\n *\n * @return 微信已安装返回YES，未安装返回NO。\n */\n+(BOOL) isWXAppInstalled;\n\n\n\n/*! @brief 判断当前微信的版本是否支持OpenApi\n *\n * @return 支持返回YES，不支持返回NO。\n */\n+(BOOL) isWXAppSupportApi;\n\n\n\n/*! @brief 获取微信的itunes安装地址\n *\n * @return 微信的安装地址字符串。\n */\n+(NSString *) getWXAppInstallUrl;\n\n\n\n/*! @brief 获取当前微信SDK的版本号\n *\n * @return 返回当前微信SDK的版本号\n */\n+(NSString *) getApiVersion;\n\n\n\n/*! @brief 打开微信\n *\n * @return 成功返回YES，失败返回NO。\n */\n+(BOOL) openWXApp;\n\n\n\n/*! @brief 发送请求到微信，等待微信返回onResp\n *\n * 函数调用后，会切换到微信的界面。第三方应用程序等待微信返回onResp。微信在异步处理完成后一定会调用onResp。支持以下类型\n * SendAuthReq、SendMessageToWXReq、PayReq等。\n * @param req 具体的发送请求，在调用函数后，请自己释放。\n * @return 成功返回YES，失败返回NO。\n */\n+(BOOL) sendReq:(BaseReq*)req;\n\n/*! @brief 发送Auth请求到微信，支持用户没安装微信，等待微信返回onResp\n *\n * 函数调用后，会切换到微信的界面。第三方应用程序等待微信返回onResp。微信在异步处理完成后一定会调用onResp。支持SendAuthReq类型。\n * @param req 具体的发送请求，在调用函数后，请自己释放。\n * @param viewController 当前界面对象。\n * @param delegate  WXApiDelegate对象，用来接收微信触发的消息。\n * @return 成功返回YES，失败返回NO。\n */\n+(BOOL) sendAuthReq:(SendAuthReq*)req viewController:(UIViewController*)viewController delegate:(id<WXApiDelegate>)delegate;\n\n\n/*! @brief 收到微信onReq的请求，发送对应的应答给微信，并切换到微信界面\n *\n * 函数调用后，会切换到微信的界面。第三方应用程序收到微信onReq的请求，异步处理该请求，完成后必须调用该函数。可能发送的相应有\n * GetMessageFromWXResp、ShowMessageFromWXResp等。\n * @param resp 具体的应答内容，调用函数后，请自己释放\n * @return 成功返回YES，失败返回NO。\n */\n+(BOOL) sendResp:(BaseResp*)resp;\n\n\n@end\n"
  },
  {
    "path": "Sublime/Sublime/SDK/Weixin/WXApiObject.h",
    "content": "//\n//  MMApiObject.h\n//  Api对象，包含所有接口和对象数据定义\n//\n//  Created by Wechat on 12-2-28.\n//  Copyright (c) 2012年 Tencent. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n/*! @brief 错误码\n *\n */\nenum  WXErrCode {\n    WXSuccess           = 0,    /**< 成功    */\n    WXErrCodeCommon     = -1,   /**< 普通错误类型    */\n    WXErrCodeUserCancel = -2,   /**< 用户点击取消并返回    */\n    WXErrCodeSentFail   = -3,   /**< 发送失败    */\n    WXErrCodeAuthDeny   = -4,   /**< 授权失败    */\n    WXErrCodeUnsupport  = -5,   /**< 微信不支持    */\n};\n\n\n\n/*! @brief 请求发送场景\n *\n */\nenum WXScene {\n    WXSceneSession  = 0,        /**< 聊天界面    */\n    WXSceneTimeline = 1,        /**< 朋友圈      */\n    WXSceneFavorite = 2,        /**< 收藏       */\n};\n\n\n\nenum WXAPISupport {\n    WXAPISupportSession = 0,\n};\n\n\n\n/*! @brief 跳转profile类型\n *\n */\nenum WXBizProfileType{\n    WXBizProfileType_Normal = 0,    //**< 普通公众号  */\n    WXBizProfileType_Device = 1,    //**< 硬件公众号  */\n};\n\n\n\n/*! @brief 跳转mp网页类型\n *\n */\nenum WXMPWebviewType {\n    WXMPWebviewType_Ad = 0,        /**< 广告网页 **/\n};\n\n\n/*! @brief 应用支持接收微信的文件类型\n *\n */\ntypedef NS_ENUM(UInt64, enAppSupportContentFlag)\n{\n    MMAPP_SUPPORT_NOCONTENT = 0x0,\n    MMAPP_SUPPORT_TEXT      = 0x1,\n    MMAPP_SUPPORT_PICTURE   = 0x2,\n    MMAPP_SUPPORT_LOCATION  = 0x4,\n    MMAPP_SUPPORT_VIDEO     = 0x8,\n    MMAPP_SUPPORT_AUDIO     = 0x10,\n    MMAPP_SUPPORT_WEBPAGE   = 0x20,\n    \n    // Suport File Type\n    MMAPP_SUPPORT_DOC  = 0x40,               // doc\n    MMAPP_SUPPORT_DOCX = 0x80,               // docx\n    MMAPP_SUPPORT_PPT  = 0x100,              // ppt\n    MMAPP_SUPPORT_PPTX = 0x200,              // pptx\n    MMAPP_SUPPORT_XLS  = 0x400,              // xls\n    MMAPP_SUPPORT_XLSX = 0x800,              // xlsx\n    MMAPP_SUPPORT_PDF  = 0x1000,             // pdf\n};\n\n#pragma mark - BaseReq\n/*! @brief 该类为微信终端SDK所有请求类的基类\n *\n */\n@interface BaseReq : NSObject\n\n/** 请求类型 */\n@property (nonatomic, assign) int type;\n/** 由用户微信号和AppID组成的唯一标识，发送请求时第三方程序必须填写，用于校验微信用户是否换号登录*/\n@property (nonatomic, retain) NSString* openID;\n\n@end\n\n\n\n#pragma mark - BaseResp\n/*! @brief 该类为微信终端SDK所有响应类的基类\n *\n */\n@interface BaseResp : NSObject\n/** 错误码 */\n@property (nonatomic, assign) int errCode;\n/** 错误提示字符串 */\n@property (nonatomic, retain) NSString *errStr;\n/** 响应类型 */\n@property (nonatomic, assign) int type;\n\n@end\n\n\n\n#pragma mark - WXMediaMessage\n@class WXMediaMessage;\n\n/*! @brief 第三方向微信终端发起支付的消息结构体\n *\n *  第三方向微信终端发起支付的消息结构体，微信终端处理后会向第三方返回处理结果\n * @see PayResp\n */\n@interface PayReq : BaseReq\n\n/** 商家向财付通申请的商家id */\n@property (nonatomic, retain) NSString *partnerId;\n/** 预支付订单 */\n@property (nonatomic, retain) NSString *prepayId;\n/** 随机串，防重发 */\n@property (nonatomic, retain) NSString *nonceStr;\n/** 时间戳，防重发 */\n@property (nonatomic, assign) UInt32 timeStamp;\n/** 商家根据财付通文档填写的数据和签名 */\n@property (nonatomic, retain) NSString *package;\n/** 商家根据微信开放平台文档对数据做的签名 */\n@property (nonatomic, retain) NSString *sign;\n\n@end\n\n\n\n#pragma mark - PayResp\n/*! @brief 微信终端返回给第三方的关于支付结果的结构体\n *\n *  微信终端返回给第三方的关于支付结果的结构体\n */\n@interface PayResp : BaseResp\n\n/** 财付通返回给商家的信息 */\n@property (nonatomic, retain) NSString *returnKey;\n\n@end\n\n\n\n/*! @brief 第三方向微信终端发起拆企业红包的消息结构体\n *\n *  第三方向微信终端发起拆企业红包的消息结构体，微信终端处理后会向第三方返回处理结果\n * @see HBReq\n */\n@interface HBReq : BaseReq\n\n/** 随机串，防重发 */\n@property (nonatomic, retain) NSString *nonceStr;\n/** 时间戳，防重发 */\n@property (nonatomic, assign) UInt32 timeStamp;\n/** 商家根据微信企业红包开发文档填写的数据和签名 */\n@property (nonatomic, retain) NSString *package;\n/** 商家根据微信企业红包开发文档对数据做的签名 */\n@property (nonatomic, retain) NSString *sign;\n\n@end\n\n\n\n#pragma mark - HBResp\n/*! @brief 微信终端返回给第三方的关于拆企业红包结果的结构体\n *\n *  微信终端返回给第三方的关于拆企业红包结果的结构体\n */\n@interface HBResp : BaseResp\n\n@end\n\n\n\n\n#pragma mark - SendAuthReq\n/*! @brief 第三方程序向微信终端请求认证的消息结构\n *\n * 第三方程序要向微信申请认证，并请求某些权限，需要调用WXApi的sendReq成员函数，\n * 向微信终端发送一个SendAuthReq消息结构。微信终端处理完后会向第三方程序发送一个处理结果。\n * @see SendAuthResp\n */\n@interface SendAuthReq : BaseReq\n/** 第三方程序要向微信申请认证，并请求某些权限，需要调用WXApi的sendReq成员函数，向微信终端发送一个SendAuthReq消息结构。微信终端处理完后会向第三方程序发送一个处理结果。\n * @see SendAuthResp\n * @note scope字符串长度不能超过1K\n */\n@property (nonatomic, retain) NSString* scope;\n/** 第三方程序本身用来标识其请求的唯一性，最后跳转回第三方程序时，由微信终端回传。\n * @note state字符串长度不能超过1K\n */\n@property (nonatomic, retain) NSString* state;\n@end\n\n\n\n#pragma mark - SendAuthResp\n/*! @brief 微信处理完第三方程序的认证和权限申请后向第三方程序回送的处理结果。\n *\n * 第三方程序要向微信申请认证，并请求某些权限，需要调用WXApi的sendReq成员函数，向微信终端发送一个SendAuthReq消息结构。\n * 微信终端处理完后会向第三方程序发送一个SendAuthResp。\n * @see onResp\n */\n@interface SendAuthResp : BaseResp\n@property (nonatomic, retain) NSString* code;\n/** 第三方程序发送时用来标识其请求的唯一性的标志，由第三方程序调用sendReq时传入，由微信终端回传\n * @note state字符串长度不能超过1K\n */\n@property (nonatomic, retain) NSString* state;\n@property (nonatomic, retain) NSString* lang;\n@property (nonatomic, retain) NSString* country;\n@end\n\n\n\n#pragma mark - SendMessageToWXReq\n/*! @brief 第三方程序发送消息至微信终端程序的消息结构体\n *\n * 第三方程序向微信发送信息需要传入SendMessageToWXReq结构体，信息类型包括文本消息和多媒体消息，\n * 分别对应于text和message成员。调用该方法后，微信处理完信息会向第三方程序发送一个处理结果。\n * @see SendMessageToWXResp\n */\n@interface SendMessageToWXReq : BaseReq\n/** 发送消息的文本内容\n * @note 文本长度必须大于0且小于10K\n */\n@property (nonatomic, retain) NSString* text;\n/** 发送消息的多媒体内容\n * @see WXMediaMessage\n */\n@property (nonatomic, retain) WXMediaMessage* message;\n/** 发送消息的类型，包括文本消息和多媒体消息两种，两者只能选择其一，不能同时发送文本和多媒体消息 */\n@property (nonatomic, assign) BOOL bText;\n/** 发送的目标场景，可以选择发送到会话(WXSceneSession)或者朋友圈(WXSceneTimeline)。 默认发送到会话。\n * @see WXScene\n */\n@property (nonatomic, assign) int scene;\n\n@end\n\n\n\n#pragma mark - SendMessageToWXResp\n/*! @brief 微信终端向第三方程序返回的SendMessageToWXReq处理结果。\n *\n * 第三方程序向微信终端发送SendMessageToWXReq后，微信发送回来的处理结果，该结果用SendMessageToWXResp表示。\n */\n@interface SendMessageToWXResp : BaseResp\n@property(nonatomic, retain) NSString* lang;\n@property(nonatomic, retain) NSString* country;\n@end\n\n\n\n#pragma mark - GetMessageFromWXReq\n/*! @brief 微信终端向第三方程序请求提供内容的消息结构体。\n *\n * 微信终端向第三方程序请求提供内容，微信终端会向第三方程序发送GetMessageFromWXReq消息结构体，\n * 需要第三方程序调用sendResp返回一个GetMessageFromWXResp消息结构体。\n */\n@interface GetMessageFromWXReq : BaseReq\n@property (nonatomic, retain) NSString* lang;\n@property (nonatomic, retain) NSString* country;\n@end\n\n\n\n#pragma mark - GetMessageFromWXResp\n/*! @brief 微信终端向第三方程序请求提供内容，第三方程序向微信终端返回的消息结构体。\n *\n * 微信终端向第三方程序请求提供内容，第三方程序调用sendResp向微信终端返回一个GetMessageFromWXResp消息结构体。\n */\n@interface GetMessageFromWXResp : BaseResp\n/** 向微信终端提供的文本内容\n @note 文本长度必须大于0且小于10K\n */\n@property (nonatomic, retain) NSString* text;\n/** 向微信终端提供的多媒体内容。\n * @see WXMediaMessage\n */\n@property (nonatomic, retain) WXMediaMessage* message;\n/** 向微信终端提供内容的消息类型，包括文本消息和多媒体消息两种，两者只能选择其一，不能同时发送文本和多媒体消息 */\n@property (nonatomic, assign) BOOL bText;\n@end\n\n\n\n#pragma mark - ShowMessageFromWXReq\n/*! @brief 微信通知第三方程序，要求第三方程序显示的消息结构体。\n *\n * 微信需要通知第三方程序显示或处理某些内容时，会向第三方程序发送ShowMessageFromWXReq消息结构体。\n * 第三方程序处理完内容后调用sendResp向微信终端发送ShowMessageFromWXResp。\n */\n@interface ShowMessageFromWXReq : BaseReq\n/** 微信终端向第三方程序发送的要求第三方程序处理的多媒体内容\n * @see WXMediaMessage\n */\n@property (nonatomic, retain) WXMediaMessage* message;\n@property (nonatomic, retain) NSString* lang;\n@property (nonatomic, retain) NSString* country;\n@end\n\n\n\n#pragma mark - ShowMessageFromWXResp\n/*! @brief 微信通知第三方程序，要求第三方程序显示或处理某些消息，第三方程序处理完后向微信终端发送的处理结果。\n *\n * 微信需要通知第三方程序显示或处理某些内容时，会向第三方程序发送ShowMessageFromWXReq消息结构体。\n * 第三方程序处理完内容后调用sendResp向微信终端发送ShowMessageFromWXResp。\n */\n@interface ShowMessageFromWXResp : BaseResp\n@end\n\n\n\n#pragma mark - LaunchFromWXReq\n/*! @brief 微信终端打开第三方程序携带的消息结构体\n *\n *  微信向第三方发送的结构体，第三方不需要返回\n */\n@interface LaunchFromWXReq : BaseReq\n@property (nonatomic, retain) WXMediaMessage* message;\n@property (nonatomic, retain) NSString* lang;\n@property (nonatomic, retain) NSString* country;\n@end\n\n#pragma mark - OpenTempSessionReq\n/* ! @brief 第三方通知微信，打开临时会话\n *\n * 第三方通知微信，打开临时会话\n */\n@interface OpenTempSessionReq : BaseReq\n/** 需要打开的用户名\n * @attention 长度不能超过512字节\n */\n@property (nonatomic, retain) NSString* username;\n/** 开发者自定义参数，拉起临时会话后会发给开发者后台，可以用于识别场景\n * @attention 长度不能超过32位\n */\n@property (nonatomic, retain) NSString*  sessionFrom;\n@end\n\n#pragma mark - OpenWebviewReq\n/* ! @brief 第三方通知微信启动内部浏览器，打开指定网页\n *\n *  第三方通知微信启动内部浏览器，打开指定Url对应的网页\n */\n@interface OpenWebviewReq : BaseReq\n/** 需要打开的网页对应的Url\n * @attention 长度不能超过1024\n */\n@property(nonatomic,retain)NSString* url;\n\n@end\n\n#pragma mark - OpenWebviewResp\n/*! @brief 微信终端向第三方程序返回的OpenWebviewReq处理结果\n *\n * 第三方程序向微信终端发送OpenWebviewReq后，微信发送回来的处理结果，该结果用OpenWebviewResp表示\n */\n@interface OpenWebviewResp : BaseResp\n\n@end\n\n\n#pragma mark - OpenTempSessionResp\n/*! @brief 微信终端向第三方程序返回的OpenTempSessionReq处理结果。\n *\n * 第三方程序向微信终端发送OpenTempSessionReq后，微信发送回来的处理结果，该结果用OpenTempSessionResp表示。\n */\n@interface OpenTempSessionResp : BaseResp\n\n@end\n\n#pragma mark - OpenRankListReq\n/* ! @brief 第三方通知微信，打开硬件排行榜\n *\n * 第三方通知微信，打开硬件排行榜\n */\n@interface OpenRankListReq : BaseReq\n\n@end\n\n#pragma mark - OpenRanklistResp\n/*! @brief 微信终端向第三方程序返回的OpenRankListReq处理结果。\n *\n * 第三方程序向微信终端发送OpenRankListReq后，微信发送回来的处理结果，该结果用OpenRankListResp表示。\n */\n@interface OpenRankListResp : BaseResp\n\n@end\n\n#pragma mark - JumpToBizProfileReq\n/* ! @brief 第三方通知微信，打开指定微信号profile页面\n *\n * 第三方通知微信，打开指定微信号profile页面\n */\n@interface JumpToBizProfileReq : BaseReq\n/** 跳转到该公众号的profile\n * @attention 长度不能超过512字节\n */\n@property (nonatomic, retain) NSString* username;\n/** 如果用户加了该公众号为好友，extMsg会上传到服务器\n * @attention 长度不能超过1024字节\n */\n@property (nonatomic, retain) NSString* extMsg;\n/**\n * 跳转的公众号类型\n * @see WXBizProfileType\n */\n@property (nonatomic, assign) int profileType;\n@end\n\n\n\n#pragma mark - JumpToBizWebviewReq\n/* ! @brief 第三方通知微信，打开指定usrname的profile网页版\n *\n */\n@interface JumpToBizWebviewReq : BaseReq\n/** 跳转的网页类型，目前只支持广告页\n * @see WXMPWebviewType\n */\n@property(nonatomic, assign) int webType;\n/** 跳转到该公众号的profile网页版\n * @attention 长度不能超过512字节\n */\n@property(nonatomic, retain) NSString* tousrname;\n/** 如果用户加了该公众号为好友，extMsg会上传到服务器\n * @attention 长度不能超过1024字节\n */\n@property(nonatomic, retain) NSString* extMsg;\n\n@end\n\n#pragma mark - WXCardItem\n\n@interface WXCardItem : NSObject\n/** 卡id\n * @attention 长度不能超过1024字节\n */\n@property (nonatomic,retain) NSString* cardId;\n/** ext信息\n * @attention 长度不能超过2024字节\n */\n@property (nonatomic,retain) NSString* extMsg;\n/**\n * @attention 卡的状态,req不需要填。resp:0为未添加，1为已添加。\n */\n@property (nonatomic,assign) UInt32 cardState;\n/**\n * @attention req不需要填，chooseCard返回的。\n */\n@property (nonatomic,retain) NSString* encryptCode;\n/**\n * @attention req不需要填，chooseCard返回的。\n */\n@property (nonatomic,retain) NSString* appID;\n@end;\n\n#pragma mark - AddCardToWXCardPackageReq\n/* ! @brief 请求添加卡券至微信卡包\n *\n */\n\n@interface AddCardToWXCardPackageReq : BaseReq\n/** 卡列表\n * @attention 个数不能超过40个 类型WXCardItem\n */\n@property (nonatomic,retain) NSArray* cardAry;\n\n@end\n\n\n#pragma mark - AddCardToWXCardPackageResp\n/** ! @brief 微信返回第三方添加卡券结果\n *\n */\n\n@interface AddCardToWXCardPackageResp : BaseResp\n/** 卡列表\n * @attention 个数不能超过40个 类型WXCardItem\n */\n@property (nonatomic,retain) NSArray* cardAry;\n@end\n\n#pragma mark - WXChooseCardReq\n/* ! @brief 请求从微信选取卡券\n *\n */\n\n@interface WXChooseCardReq : BaseReq\n@property(nonatomic, strong) NSString *appID;\n@property(nonatomic, assign) UInt32 shopID;\n@property(nonatomic, assign) UInt32 canMultiSelect;\n@property(nonatomic, strong) NSString *cardType;\n@property(nonatomic, strong) NSString *cardTpID;\n@property(nonatomic, strong) NSString *signType;\n@property(nonatomic, strong) NSString *cardSign;\n@property(nonatomic, assign) UInt32 timeStamp;\n@property(nonatomic, strong) NSString *nonceStr;\n@end\n\n\n#pragma mark - WXChooseCardResp\n/** ! @brief 微信返回第三方请求选择卡券结果\n *\n */\n\n@interface WXChooseCardResp : BaseResp\n@property (nonatomic,retain) NSArray* cardAry;\n@end\n\n#pragma mark - WXMediaMessage\n\n/*! @brief 多媒体消息结构体\n *\n * 用于微信终端和第三方程序之间传递消息的多媒体消息内容\n */\n@interface WXMediaMessage : NSObject\n\n+(WXMediaMessage *) message;\n\n/** 标题\n * @note 长度不能超过512字节\n */\n@property (nonatomic, retain) NSString *title;\n/** 描述内容\n * @note 长度不能超过1K\n */\n@property (nonatomic, retain) NSString *description;\n/** 缩略图数据\n * @note 大小不能超过32K\n */\n@property (nonatomic, retain) NSData   *thumbData;\n/**\n * @note 长度不能超过64字节\n */\n@property (nonatomic, retain) NSString *mediaTagName;\n/**\n *\n */\n@property (nonatomic, retain) NSString *messageExt;\n@property (nonatomic, retain) NSString *messageAction;\n/**\n * 多媒体数据对象，可以为WXImageObject，WXMusicObject，WXVideoObject，WXWebpageObject等。\n */\n@property (nonatomic, retain) id        mediaObject;\n\n/*! @brief 设置消息缩略图的方法\n *\n * @param image 缩略图\n * @note 大小不能超过32K\n */\n- (void) setThumbImage:(UIImage *)image;\n\n@end\n\n\n\n#pragma mark - WXImageObject\n/*! @brief 多媒体消息中包含的图片数据对象\n *\n * 微信终端和第三方程序之间传递消息中包含的图片数据对象。\n * @note imageData成员不能为空\n * @see WXMediaMessage\n */\n@interface WXImageObject : NSObject\n/*! @brief 返回一个WXImageObject对象\n *\n * @note 返回的WXImageObject对象是自动释放的\n */\n+(WXImageObject *) object;\n\n/** 图片真实数据内容\n * @note 大小不能超过10M\n */\n@property (nonatomic, retain) NSData    *imageData;\n\n@end\n\n\n#pragma mark - WXMusicObject\n/*! @brief 多媒体消息中包含的音乐数据对象\n *\n * 微信终端和第三方程序之间传递消息中包含的音乐数据对象。\n * @note musicUrl和musicLowBandUrl成员不能同时为空。\n * @see WXMediaMessage\n */\n@interface WXMusicObject : NSObject\n/*! @brief 返回一个WXMusicObject对象\n *\n * @note 返回的WXMusicObject对象是自动释放的\n */\n+(WXMusicObject *) object;\n\n/** 音乐网页的url地址\n * @note 长度不能超过10K\n */\n@property (nonatomic, retain) NSString *musicUrl;\n/** 音乐lowband网页的url地址\n * @note 长度不能超过10K\n */\n@property (nonatomic, retain) NSString *musicLowBandUrl;\n/** 音乐数据url地址\n * @note 长度不能超过10K\n */\n@property (nonatomic, retain) NSString *musicDataUrl;\n\n/**音乐lowband数据url地址\n * @note 长度不能超过10K\n */\n@property (nonatomic, retain) NSString *musicLowBandDataUrl;\n\n@end\n\n\n\n#pragma mark - WXVideoObject\n/*! @brief 多媒体消息中包含的视频数据对象\n *\n * 微信终端和第三方程序之间传递消息中包含的视频数据对象。\n * @note videoUrl和videoLowBandUrl不能同时为空。\n * @see WXMediaMessage\n */\n@interface WXVideoObject : NSObject\n/*! @brief 返回一个WXVideoObject对象\n *\n * @note 返回的WXVideoObject对象是自动释放的\n */\n+(WXVideoObject *) object;\n\n/** 视频网页的url地址\n * @note 长度不能超过10K\n */\n@property (nonatomic, retain) NSString *videoUrl;\n/** 视频lowband网页的url地址\n * @note 长度不能超过10K\n */\n@property (nonatomic, retain) NSString *videoLowBandUrl;\n\n@end\n\n\n\n#pragma mark - WXWebpageObject\n/*! @brief 多媒体消息中包含的网页数据对象\n *\n * 微信终端和第三方程序之间传递消息中包含的网页数据对象。\n * @see WXMediaMessage\n */\n@interface WXWebpageObject : NSObject\n/*! @brief 返回一个WXWebpageObject对象\n *\n * @note 返回的WXWebpageObject对象是自动释放的\n */\n+(WXWebpageObject *) object;\n\n/** 网页的url地址\n * @note 不能为空且长度不能超过10K\n */\n@property (nonatomic, retain) NSString *webpageUrl;\n\n@end\n\n\n\n#pragma mark - WXAppExtendObject\n/*! @brief 多媒体消息中包含的App扩展数据对象\n *\n * 第三方程序向微信终端发送包含WXAppExtendObject的多媒体消息，\n * 微信需要处理该消息时，会调用该第三方程序来处理多媒体消息内容。\n * @note url，extInfo和fileData不能同时为空\n * @see WXMediaMessage\n */\n@interface WXAppExtendObject : NSObject\n/*! @brief 返回一个WXAppExtendObject对象\n *\n * @note 返回的WXAppExtendObject对象是自动释放的\n */\n+(WXAppExtendObject *) object;\n\n/** 若第三方程序不存在，微信终端会打开该url所指的App下载地址\n * @note 长度不能超过10K\n */\n@property (nonatomic, retain) NSString *url;\n/** 第三方程序自定义简单数据，微信终端会回传给第三方程序处理\n * @note 长度不能超过2K\n */\n@property (nonatomic, retain) NSString *extInfo;\n/** App文件数据，该数据发送给微信好友，微信好友需要点击后下载数据，微信终端会回传给第三方程序处理\n * @note 大小不能超过10M\n */\n@property (nonatomic, retain) NSData   *fileData;\n\n@end\n\n\n\n#pragma mark - WXEmoticonObject\n/*! @brief 多媒体消息中包含的表情数据对象\n *\n * 微信终端和第三方程序之间传递消息中包含的表情数据对象。\n * @see WXMediaMessage\n */\n@interface WXEmoticonObject : NSObject\n\n/*! @brief 返回一个WXEmoticonObject对象\n *\n * @note 返回的WXEmoticonObject对象是自动释放的\n */\n+(WXEmoticonObject *) object;\n\n/** 表情真实数据内容\n * @note 大小不能超过10M\n */\n@property (nonatomic, retain) NSData    *emoticonData;\n\n@end\n\n\n\n#pragma mark - WXFileObject\n/*! @brief 多媒体消息中包含的文件数据对象\n *\n * @see WXMediaMessage\n */\n@interface WXFileObject : NSObject\n\n/*! @brief 返回一个WXFileObject对象\n *\n * @note 返回的WXFileObject对象是自动释放的\n */\n+(WXFileObject *) object;\n\n/** 文件后缀名\n * @note 长度不超过64字节\n */\n@property (nonatomic, retain) NSString  *fileExtension;\n\n/** 文件真实数据内容\n * @note 大小不能超过10M\n */\n@property (nonatomic, retain) NSData    *fileData;\n\n@end\n\n\n#pragma mark - WXLocationObject\n/*! @brief 多媒体消息中包含的地理位置数据对象\n *\n * 微信终端和第三方程序之间传递消息中包含的地理位置数据对象。\n * @see WXMediaMessage\n */\n@interface WXLocationObject : NSObject\n\n/*! @brief 返回一个WXLocationObject对象\n *\n * @note 返回的WXLocationObject对象是自动释放的\n */\n+(WXLocationObject *) object;\n\n/** 地理位置信息\n * @note 经纬度\n */\n@property (nonatomic, assign) double lng; //经度\n@property (nonatomic, assign) double lat; //纬度\n\n@end\n\n\n#pragma mark - WXTextObject\n/*! @brief 多媒体消息中包含的文本数据对象\n *\n * 微信终端和第三方程序之间传递消息中包含的文本数据对象。\n * @see WXMediaMessage\n */\n@interface WXTextObject : NSObject\n\n/*! @brief 返回一个WXTextObject对象\n *\n * @note 返回的WXTextObject对象是自动释放的\n */\n+(WXTextObject *) object;\n\n/** 地理位置信息\n * @note 文本内容\n */\n@property (nonatomic, retain) NSString *contentText;\n\n@end\n\n"
  },
  {
    "path": "Sublime/Sublime/SDK/Weixin/WechatAuthSDK.h",
    "content": "//\n//  WechatAuthSDK.h\n//  WechatAuthSDK\n//\n//  Created by 李凯 on 13-11-29.\n//  Copyright (c) 2013年 Tencent. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <UIKit/UIKit.h>\n\nenum  AuthErrCode {\n    WechatAuth_Err_Ok = 0,  //Auth成功\n    WechatAuth_Err_NormalErr = -1,  //普通错误\n    WechatAuth_Err_NetworkErr = -2, //网络错误\n    WechatAuth_Err_GetQrcodeFailed = -3,    //获取二维码失败\n    WechatAuth_Err_Cancel = -4,     //用户取消授权\n    WechatAuth_Err_Timeout = -5,    //超时\n};\n\n@protocol WechatAuthAPIDelegate<NSObject>\n@optional\n\n- (void)onAuthGotQrcode:(UIImage *)image;  //得到二维码\n- (void)onQrcodeScanned;    //二维码被扫描\n- (void)onAuthFinish:(int)errCode AuthCode:(NSString *)authCode;    //成功登录\n\n@end\n\n@interface WechatAuthSDK : NSObject{\n    NSString *_sdkVersion;\n    __weak id<WechatAuthAPIDelegate> _delegate;\n}\n\n@property(nonatomic, weak) id<WechatAuthAPIDelegate> delegate;\n@property(nonatomic, readonly) NSString *sdkVersion;   //authSDK版本号\n\n/*! @brief 发送登录请求，等待WechatAuthAPIDelegate回调\n *\n * @param appId 微信开发者ID\n * @param nonceStr 一个随机的尽量不重复的字符串，用来使得每次的signature不同\n * @param timeStamp 时间戳\n * @param scope 应用授权作用域，拥有多个作用域用逗号（,）分隔\n * @param signature 签名\n * @param schemeData 会在扫码后拼在scheme后\n * @return 成功返回YES，失败返回NO\n    注:该实现只保证同时只有一个Auth在运行，Auth未完成或未Stop再次调用Auth接口时会返回NO。\n */\n\n- (BOOL)Auth:(NSString *)appId\n    nonceStr:(NSString *)nonceStr\n   timeStamp:(NSString*)timeStamp\n       scope:(NSString *)scope\n   signature:(NSString *)signature\n  schemeData:(NSString *)schemeData;\n\n\n/*! @brief 暂停登录请求\n *\n * @return 成功返回YES，失败返回NO。\n */\n- (BOOL)StopAuth;\n\n@end\n"
  },
  {
    "path": "Sublime/Sublime/SSHAddNewServerViewController.swift",
    "content": "//\n//  SSHAddNewServerViewController.swift\n//  Sublime\n//\n//  Created by Eular on 3/28/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\nimport Gifu\n\nclass SSHAddNewServerViewController: UITableViewController, UITextFieldDelegate {\n    \n    let settingList = [\n        [\"ssh_server\", \"host\"],\n        [\"ssh_port\", \"port\"],\n        [\"ssh_user\", \"username\"],\n        [\"ssh_password\", \"password\"]\n    ]\n    var textFieldList = [UITextField]()\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        title = \"New Server\"\n        tableView.backgroundColor = Constant.CapeCod\n        tableView.separatorColor = Constant.TableCellSeparatorColor\n        tableView.tableFooterView = UIView()\n        \n        Global.Notifi.addObserver(self, selector: #selector(self.keyboardDidShow), name: UIKeyboardDidShowNotification, object: nil)\n        Global.Notifi.addObserver(self, selector: #selector(self.keyboardWillHide), name: UIKeyboardDidHideNotification, object: nil)\n        \n        let header = UIView(frame: CGRectMake(0, 0, view.width, 80))\n        let gif = AnimatableImageView()\n        gif.frame = CGRectMake(0, 20, view.width, 60)\n        gif.contentMode = .ScaleAspectFit\n        gif.animateWithImageData(NSData(contentsOfFile: NSBundle.mainBundle().pathForResource(\"animation\", ofType: \"gif\")!)!)\n        gif.startAnimatingGIF()\n        header.addSubview(gif)\n        tableView.tableHeaderView = header\n    }\n    \n    func keyboardDidShow() {\n        navigationItem.rightBarButtonItem = UIBarButtonItem(image: UIImage(named: \"ssh_keyboard\"), style: .Plain, target: self, action: #selector(self.dismissKeyboard))\n    }\n    \n    func keyboardWillHide() {\n        navigationItem.rightBarButtonItem = nil\n    }\n    \n    func dismissKeyboard() {\n        self.view.endEditing(true)\n    }\n    \n    func textFieldShouldReturn(textField: UITextField) -> Bool {\n        textField.resignFirstResponder()\n        return true\n    }\n    \n    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {\n        return 2\n    }\n    \n    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return [settingList.count, 1][section]\n    }\n    \n    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {\n        return 50\n    }\n    \n    override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {\n        if section == 0 { return 0 }\n        return Constant.FilesTableSectionHight\n    }\n    \n    override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {\n        if section == 0 { return nil }\n        let headerView = UIView()\n        headerView.frame = CGRectMake(0, 0, view.width, Constant.FilesTableSectionHight)\n        headerView.backgroundColor = Constant.CapeCod\n        return headerView\n    }\n    \n    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {\n        let cell = UITableViewCell(style: .Default, reuseIdentifier: nil)\n        cell.backgroundColor = Constant.NavigationBarAndTabBarColor\n        cell.selectedBackgroundView = UIView(frame: cell.frame)\n        cell.selectedBackgroundView?.backgroundColor = Constant.NavigationBarAndTabBarColor\n        \n        if indexPath.section == 0 {\n            let tf = UITextField()\n            tf.frame = CGRectMake(70, 3, cell.frame.width - 80, cell.frame.height)\n            tf.attributedPlaceholder = NSAttributedString(string: settingList[indexPath.row][1], attributes: [NSForegroundColorAttributeName: UIColor.grayColor()])\n            tf.textColor = UIColor.whiteColor()\n            tf.delegate = self\n            if tf.placeholder == \"port\" {\n                tf.keyboardType = .NumberPad\n            } else if tf.placeholder == \"host\" {\n                tf.keyboardType = .URL\n            }\n            tf.autocorrectionType = .No\n            tf.autocapitalizationType = .None\n            cell.addSubview(tf)\n            cell.imageView?.image = UIImage(named: settingList[indexPath.row][0])\n            \n            textFieldList.append(tf)\n        } else {\n            let doneImg = UIImageView()\n            doneImg.frame = CGRectMake(0, 0, 40, 40)\n            doneImg.image = UIImage(named: \"ssh_done\")\n            cell.addSubview(doneImg)\n            doneImg.atCenter()\n        }\n        return cell\n    }\n    \n    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {\n        tableView.deselectRowAtIndexPath(indexPath, animated: true)\n        if indexPath.section == 1 {\n            var serverInfo = [String:String]()\n            for tf in textFieldList {\n                if tf.text!.isEmpty {\n                    view.Toast(message: \"\\(tf.placeholder!) can't be empty\", hasNavigationBar: true)\n                    return\n                } else {\n                    serverInfo[tf.placeholder!] = tf.text\n                }\n            }\n            \n            let serverPlist = Plist(path: Constant.SublimeRoot+\"/etc/ssh_list.plist\")\n            do {\n                try serverPlist.appendToPlistFile(serverInfo)\n                navigationController?.popViewControllerAnimated(true)\n            } catch {\n                view.Toast(message: \"Save failed!\", hasNavigationBar: true)\n            }\n            \n        }\n    }\n}\n"
  },
  {
    "path": "Sublime/Sublime/SSHServerListTableViewController.swift",
    "content": "//\n//  SSHServerListTableViewController.swift\n//  Sublime\n//\n//  Created by Eular on 3/28/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\n\nclass SSHServerListTableViewController: UITableViewController {\n    \n    let serverPlist = Plist(path: Constant.SublimeRoot+\"/etc/ssh_list.plist\")\n    var serverList: [[String: String]] = []\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        title = \"Servers\"\n        tableView.backgroundColor = Constant.CapeCod\n        tableView.separatorColor = Constant.NavigationBarAndTabBarColor\n        tableView.tableFooterView = UIView()\n        \n        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: #selector(self.addNewServer))\n        \n    }\n    \n    override func viewWillAppear(animated: Bool) {\n        if let arr = serverPlist.getArrayInPlistFile() {\n            serverList = arr as! [[String : String]]\n            tableView.reloadData()\n        }\n    }\n    \n    func addNewServer() {\n        let addnew = SSHAddNewServerViewController()\n        navigationController?.pushViewController(addnew, animated: true)\n    }\n\n    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {\n        return 1\n    }\n\n    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return serverList.count\n    }\n    \n    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {\n        return Constant.SSHServerListCellHeight\n    }\n    \n    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {\n        let cell = UITableViewCell(style: .Subtitle, reuseIdentifier: nil)\n        cell.backgroundColor = Constant.NavigationBarAndTabBarColor\n        cell.selectedBackgroundView = UIView(frame: cell.frame)\n        cell.selectedBackgroundView?.backgroundColor = Constant.TableCellSelectedColor\n        cell.accessoryType = .DisclosureIndicator\n        \n        cell.textLabel?.text = serverList[indexPath.row][\"host\"]\n        cell.textLabel?.textColor = UIColor.whiteColor()\n        \n        cell.detailTextLabel?.text = serverList[indexPath.row][\"username\"]\n        cell.detailTextLabel?.textColor = RGB(190, 190, 190)\n        \n        cell.imageView?.image = UIImage(named: \"ssh_server\")\n        \n        return cell\n    }\n    \n    override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {\n        return true\n    }\n    \n    override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {\n        if editingStyle == .Delete {\n            serverList.removeAtIndex(indexPath.row)\n            do {\n                try serverPlist.saveToPlistFile(serverList)\n            } catch {}\n            tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)\n        }\n    }\n\n    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {\n        tableView.deselectRowAtIndexPath(indexPath, animated: true)\n        \n        let terminal = SSHTerminalViewController()\n        terminal.server = serverList[indexPath.row]\n        navigationController?.pushViewController(terminal, animated: true)\n    }\n}\n"
  },
  {
    "path": "Sublime/Sublime/SSHTerminalViewController.swift",
    "content": "//\n//  SSHTerminalViewController.swift\n//  Sublime\n//\n//  Created by Eular on 3/28/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\nimport NMSSH\n\nclass SSHTerminalViewController: UIViewController, UITextViewDelegate {\n    \n    var server = [\"host\": \"localhost\", \"port\": \"22\", \"username\": \"sublime\", \"password\": \"sublime\"]\n    \n    let terminalTextView = UITextView()\n    var sshSession: NMSSHSession!\n    var shellPrompt: String!\n    let promptView = UIView()\n    var promptViewBottom: NSLayoutConstraint!\n    var promptViewHeight: NSLayoutConstraint!\n    let promptLines = 3\n    let promptLineHeight: CGFloat = 14\n    let promptViewTopMargin: CGFloat = 5\n    let promptViewBottomOffset: CGFloat = 5\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        title = server[\"host\"]\n        view.backgroundColor = Constant.CapeCod\n        shellPrompt = \"[\\(server[\"username\"]!)@\\(server[\"host\"]!) ~] >\"\n        \n        Global.Notifi.addObserver(self, selector: #selector(self.keyboardWillShow(_:)), name: UIKeyboardWillShowNotification, object: nil)\n        Global.Notifi.addObserver(self, selector: #selector(self.keyboardDidShow), name: UIKeyboardDidShowNotification, object: nil)\n        Global.Notifi.addObserver(self, selector: #selector(self.keyboardWillHide(_:)), name: UIKeyboardWillHideNotification, object: nil)\n        \n        view.addSubview(terminalTextView)\n        view.addSubview(promptView)\n        setTerminalTextView()\n        setPromptView(\">\", lineHeight: promptLineHeight, maxLines: promptLines)\n        \n        SSHLog(\"[sublime@localhost ~] > ssh \\(server[\"username\"]!)@\\(server[\"host\"]!):\\(server[\"port\"]!)\")\n    }\n    \n    deinit {\n        sshSession.disconnect()\n    }\n    \n    func keyboardWillShow(noti: NSNotification) {\n        let info = noti.userInfo!\n        let value = info[UIKeyboardFrameBeginUserInfoKey] as! NSValue\n        let value2 = info[UIKeyboardAnimationDurationUserInfoKey] as! NSValue\n        let keyboardSize = value.CGRectValue()\n        let height = keyboardSize.height\n        var time: NSTimeInterval = 0\n        value2.getValue(&time)\n\n        promptViewBottom.constant = -height - promptViewBottomOffset\n        UIView.animateWithDuration(time, animations: { \n            self.view.layoutIfNeeded()\n        }) { (_) in\n            self.updateTerminalTextView()\n        }\n    }\n    \n    func keyboardDidShow() {\n        navigationItem.rightBarButtonItem = UIBarButtonItem(image: UIImage(named: \"ssh_keyboard\"), style: .Plain, target: self, action: #selector(self.dismissKeyboard))\n    }\n    \n    func keyboardWillHide(noti: NSNotification) {\n        navigationItem.rightBarButtonItem = nil\n        \n        let info = noti.userInfo!\n        let value2 = info[UIKeyboardAnimationDurationUserInfoKey] as! NSValue\n        var time: NSTimeInterval = 0\n        value2.getValue(&time)\n        promptViewBottom.constant = -promptViewBottomOffset\n        UIView.animateWithDuration(time) { () -> Void in\n            self.view.layoutIfNeeded()\n        }\n    }\n    \n    func dismissKeyboard() {\n        self.view.endEditing(true)\n    }\n    \n    func setTerminalTextView() {\n        // terminalTextView.frame = view.frame\n        terminalTextView.backgroundColor = Constant.CapeCod\n        terminalTextView.textColor = UIColor.whiteColor()\n        terminalTextView.textContainerInset.top = 0\n        terminalTextView.textContainerInset.bottom = 0\n        terminalTextView.editable = false\n        terminalTextView.translatesAutoresizingMaskIntoConstraints = false\n        \n        view.addConstraint(NSLayoutConstraint(item: terminalTextView, attribute: .Top, relatedBy: .Equal, toItem: view, attribute: .Top, multiplier: 1, constant: 0))\n        view.addConstraint(NSLayoutConstraint(item: terminalTextView, attribute: .Left, relatedBy: .Equal, toItem: view, attribute: .Left, multiplier: 1, constant: 0))\n        view.addConstraint(NSLayoutConstraint(item: terminalTextView, attribute: .Bottom, relatedBy: .Equal, toItem: promptView, attribute: .Top, multiplier: 1, constant: 0))\n        view.addConstraint(NSLayoutConstraint(item: terminalTextView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: view.width))\n    }\n    \n    func setPromptView(promptText: String, lineHeight: CGFloat, maxLines: Int){\n        promptView.translatesAutoresizingMaskIntoConstraints = false\n        \n        // Add constraints\n        promptViewBottom = NSLayoutConstraint(item: promptView, attribute: .Bottom, relatedBy: .Equal, toItem: view, attribute: .Bottom, multiplier: 1, constant: -promptViewBottomOffset)\n        promptViewHeight = NSLayoutConstraint(item: promptView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: lineHeight)\n        view.addConstraint(promptViewBottom)\n        view.addConstraint(NSLayoutConstraint(item: promptView, attribute: .Left, relatedBy: .Equal, toItem: view, attribute: .Left, multiplier: 1, constant: 0))\n        view.addConstraint(NSLayoutConstraint(item: promptView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: view.width))\n        view.addConstraint(promptViewHeight)\n        \n        let prompt = UILabel()\n        prompt.text = promptText\n        prompt.textColor = UIColor.whiteColor()\n        prompt.font = terminalTextView.font\n        prompt.frame = CGRectMake(5, 0, prompt.intrinsicContentSize().width, lineHeight)\n        promptView.addSubview(prompt)\n        \n        let input = UITextView()\n        input.frame = CGRectMake(0, 0, view.width, lineHeight * maxLines)\n        input.backgroundColor = UIColor.clearColor()\n        input.font = terminalTextView.font\n        input.textContainer.maximumNumberOfLines = maxLines\n        input.textContainerInset.top = 0\n        input.textContainerInset.bottom = 0\n        input.autocorrectionType = .No\n        input.autocapitalizationType = .None\n        input.keyboardType = .ASCIICapable\n        input.keyboardAppearance = .Dark\n        input.spellCheckingType = .No\n        input.delegate = self\n        input.tintColor = UIColor.whiteColor()\n        \n        let paragraphStyle = NSMutableParagraphStyle()\n        paragraphStyle.lineBreakMode = .ByCharWrapping\n        paragraphStyle.firstLineHeadIndent = prompt.frame.width + prompt.frame.origin.x\n        let attrs = [\n            NSParagraphStyleAttributeName: paragraphStyle,\n            NSForegroundColorAttributeName: UIColor.whiteColor()\n        ]\n        input.attributedText = NSAttributedString(string: \" \", attributes: attrs)\n        input.text = nil\n        promptView.addSubview(input)\n    }\n    \n    func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {\n        if text == \"\\n\" {\n\n            let cmd = textView.text.trim()\n            if cmd.isEmpty {\n                SSHLog(shellPrompt)\n            } else {\n                SSHLog(\"\\(shellPrompt) \\(cmd)\")\n                textView.text = nil\n                \n                if promptViewHeight.constant != promptLineHeight {\n                    promptViewHeight.constant = promptLineHeight\n                    UIView.animateWithDuration(0.3, animations: { () -> Void in\n                        self.view.layoutIfNeeded()\n                    })\n                }\n                \n                if sshSession.authorized {\n                    do {\n                        let response = try sshSession.channel.execute(cmd)\n                        if !response.isEmpty {\n                            SSHLog(response[nil,-1])\n                        }\n                    } catch {}\n                }\n            }\n            \n            return false\n        }\n        return true\n    }\n    \n    func textViewDidChange(textView: UITextView) {\n        promptViewHeight.constant = textView.contentSize.height\n        UIView.animateWithDuration(0.3, animations: { () -> Void in\n            self.view.layoutIfNeeded()\n        })\n    }\n    \n    override func viewDidAppear(animated: Bool) {\n        let user = server[\"username\"]!\n        let host = server[\"host\"]!\n        let port = server[\"port\"]!\n        let passwd = server[\"password\"]!\n        sshSession = NMSSHSession(host: \"\\(host):\\(port)\", andUsername: user)\n        \n        if Network.isConnectedToNetwork() {\n            if sshSession.connect() {\n                SSHLog(\"Password: ******\")\n                if sshSession.authenticateByPassword(passwd) {\n                    SSHLog(\"Connect: Successful!\")\n                    SSHLog(\"=============================\")\n                } else {\n                    SSHLog(\"Error: Password is wrong!\")\n                }\n            } else {\n                SSHLog(\"Error: Connect fialed!\")\n            }\n        } else {\n            SSHLog(\"Error: No network!\")\n        }\n    }\n    \n    func SSHLog(msg: String) {\n        terminalTextView.text = terminalTextView.text + \"\\(msg)\\n\"\n        terminalTextView.setLineBreakMode(.ByCharWrapping)\n        terminalTextView.scrollToBottom()\n    }\n    \n    func updateTerminalTextView() {\n        terminalTextView.attributedText = terminalTextView.attributedText.copy() as! NSAttributedString\n        terminalTextView.scrollToBottom()\n    }\n\n}\n"
  },
  {
    "path": "Sublime/Sublime/SettingTableViewController.swift",
    "content": "//\n//  SettingTableViewController.swift\n//  Sublime\n//\n//  Created by Eular on 2/23/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nclass SettingTableViewController: UITableViewController {\n    \n    let secTitle = [\"   General\", \"   Other\", \"   About\"]\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n    }\n    \n    override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {\n        let title = UILabel(frame: CGRectMake(0, 0, view.width, Constant.FilesTableSectionHight))\n        title.backgroundColor = Constant.CapeCod\n        title.text = secTitle[section]\n        title.textColor = UIColor.whiteColor()\n        title.font = title.font.fontWithSize(12)\n        title.textAlignment = .Natural\n        let headerView = UIView()\n        headerView.addSubview(title)\n        return headerView\n    }\n    \n    override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {\n        return Constant.FilesTableSectionHight\n    }\n    \n    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {\n        tableView.deselectRowAtIndexPath(indexPath, animated: true)\n        \n        switch (indexPath.section, indexPath.row) {\n        case (1,0):\n            let rvc = ReadingViewController()\n            rvc.hidesBottomBarWhenPushed = true\n            navigationController?.pushViewController(rvc, animated: true)\n        case (1,1):\n            let svc = StorageViewController()\n            svc.hidesBottomBarWhenPushed = true\n            navigationController?.pushViewController(svc, animated: true)\n        case (2,0):\n            let avc = AppInfoViewController()\n            avc.hidesBottomBarWhenPushed = true\n            navigationController?.pushViewController(avc, animated: true)\n        case (2,1):\n            let dvc = DonateViewController()\n            dvc.hidesBottomBarWhenPushed = true\n            navigationController?.pushViewController(dvc, animated: true)\n        case (2,2):\n            let lvc = LicenseTableViewController()\n            lvc.hidesBottomBarWhenPushed = true\n            navigationController?.pushViewController(lvc, animated: true)\n        default: return\n        }\n    }\n}\n"
  },
  {
    "path": "Sublime/Sublime/StorageViewController.swift",
    "content": "//\n//  StorageViewController.swift\n//  Sublime\n//\n//  Created by Eular on 5/5/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Charts\n\nclass StorageViewController: UIViewController {\n\n    let pieChart = PieChartView()\n    let cacheCell = UITableViewCell(style: .Value1, reuseIdentifier: nil)\n    let processing = UILabel()\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        title = \"Storage\"\n        view.backgroundColor = Constant.CapeCod\n        \n        view.addSubview(processing)\n        processing.text = \"0 %\"\n        processing.textAlignment = .Center\n        processing.textColor = UIColor.whiteColor()\n        processing.frame = CGRectMake(0, 0, view.width, 40)\n        processing.atCenter(true)\n    }\n    \n    override func viewDidAppear(animated: Bool) {\n        let total = Device.systemSize\n        var tmp = 0\n        \n        Device.appSize({ percent in\n            \n            let per = Int(percent * 100)\n            if per != tmp {\n                tmp = per\n                dispatch_async(dispatch_get_main_queue()) {\n                    self.processing.text = \"\\(per) %\"\n                }\n            }\n            \n        }, completion: { app, cache in\n            \n            let sublime = app / total * 100\n            let available = Device.systemFreeSize / total * 100\n            let other = 100 - available - sublime\n            \n            let xValues = [\"Sublime\", \"Available\", \"Other\"]\n            let yValues = [sublime, available, other]\n            \n            dispatch_async(dispatch_get_main_queue()) {\n                self.processing.removeFromSuperview()\n                self.setupPieChart(xValues, values: yValues)\n                self.setupCacheCell(cache.size)\n            }\n            \n        })\n    }\n    \n    func setupCacheCell(cache: String) {\n        cacheCell.frame = CGRectMake(0, view.height - 80, view.width, 50)\n        cacheCell.backgroundColor = RGB(100, 100, 100, alpha: 0.5)\n        cacheCell.selectedBackgroundView = UIView(frame: cacheCell.frame)\n        cacheCell.selectedBackgroundView?.backgroundColor = Constant.CapeCod\n        cacheCell.accessoryType = .DisclosureIndicator\n        cacheCell.textLabel?.text = \"Cache\"\n        cacheCell.textLabel?.textColor = UIColor.whiteColor()\n        cacheCell.imageView?.image = UIImage(named: \"setting_cache\")\n        cacheCell.detailTextLabel?.text = cache\n        view.addSubview(cacheCell)\n        cacheCell.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.cleanCache)))\n    }\n    \n    func cleanCache() {\n        cacheCell.selected = true\n        Device.cache = 0\n        cacheCell.detailTextLabel?.text = \"0 KB\"\n    }\n    \n    func setupPieChart(dataPoints: [String], values: [Double]) {\n        pieChart.frame = CGRectMake(0, 0, view.width, view.height - 100)\n        pieChart.descriptionText = \"Sublime 仅占有少量储存空间，建议清理手机中其他应用和数据\"\n        pieChart.descriptionTextAlign = .Center\n        pieChart.descriptionTextPosition = CGPoint(x: pieChart.center.x, y: pieChart.height - 40)\n        pieChart.descriptionTextColor = UIColor.whiteColor()\n        pieChart.descriptionFont = pieChart.descriptionFont?.fontWithSize(10)\n        pieChart.holeColor = UIColor.clearColor()\n        pieChart.legend.position = .BelowChartCenter\n        pieChart.legend.textColor = UIColor.whiteColor()\n        pieChart.infoTextColor = UIColor.whiteColor()\n        view.addSubview(pieChart)\n        \n        var dataEntries: [ChartDataEntry] = []\n        \n        for i in 0..<dataPoints.count {\n            let dataEntry = ChartDataEntry(value: values[i], xIndex: i)\n            dataEntries.append(dataEntry)\n        }\n        \n        let pieChartDataSet = PieChartDataSet(yVals: dataEntries, label: \"\")\n        var colors = ChartColorTemplates.liberty()\n        colors.shift()\n        pieChartDataSet.colors = colors\n        pieChartDataSet.sliceSpace = 2\n        \n        \n        let pieChartData = PieChartData(xVals: dataPoints, dataSet: pieChartDataSet)\n        \n        let pFormatter = NSNumberFormatter()\n        pFormatter.numberStyle = .PercentStyle\n        pFormatter.maximumFractionDigits = 1\n        pFormatter.multiplier = 1\n        pFormatter.percentSymbol = \" %\"\n        pieChartData.setValueFormatter(pFormatter)\n        \n        pieChart.data = pieChartData\n        \n        pieChart.animate(xAxisDuration: 1.4)\n    }\n    \n}\n"
  },
  {
    "path": "Sublime/Sublime/Sublime-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 <UIKit/UIKit.h>\n#import <CommonCrypto/CommonCrypto.h>\n#import <CommonCrypto/CommonHMAC.h>\n#import \"WXApi.h\"\n#import \"MusicWave.h\"\n#import \"ObjC.h\"\n#include <ifaddrs.h>\n#import <RongIMKit/RongIMKit.h>\n#import <Cycript/Cycript.h>"
  },
  {
    "path": "Sublime/Sublime/SublimeSafari.swift",
    "content": "//\n//  SublimeSafari.swift\n//  Sublime\n//\n//  Created by Eular on 4/19/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\nimport WebKit\n\nclass SublimeSafari: UIViewController, WKNavigationDelegate {\n    \n    let popupMenu = PopupMenu()\n    let url: NSURL\n    var webView: WKWebView!\n    var progressBar: UIProgressView!\n    \n    init(URL: NSURL) {\n        url = URL\n        super.init(nibName: nil, bundle: nil)\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        view.backgroundColor = Constant.CapeCod\n        self.automaticallyAdjustsScrollViewInsets = false\n        \n        // 设置分享菜单\n        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Action, target: popupMenu, action: #selector(popupMenu.showUp))\n        popupMenu.controller = self\n        popupMenu.itemsToShare = [url]\n        \n        webView = WKWebView()\n        webView.frame = CGRectMake(0, 0, view.width, view.height - Constant.NavigationBarOffset)\n        webView.backgroundColor = UIColor.clearColor()\n        webView.scrollView.backgroundColor = UIColor.clearColor()\n        webView.navigationDelegate = self\n        view.addSubview(webView)\n        \n        if let host = url.host {\n            let hostLB = UILabel()\n            hostLB.frame = CGRectMake(0, 10, view.width, 20)\n            hostLB.text = \"网页由 \\(host) 提供\"\n            hostLB.font = hostLB.font.fontWithSize(12)\n            hostLB.textAlignment = .Center\n            hostLB.textColor = UIColor.grayColor()\n            \n            webView.addSubview(hostLB)\n            webView.sendSubviewToBack(hostLB)\n        }\n        \n        progressBar = UIProgressView()\n        progressBar.frame = CGRectMake(0, 0, view.width, 0)\n        progressBar.progress = 0\n        progressBar.progressTintColor = UIColor.greenColor()\n        progressBar.trackTintColor = UIColor.clearColor()\n        webView.addSubview(progressBar)\n        \n        webView.loadRequest(NSURLRequest(URL: url))\n        webView.allowsBackForwardNavigationGestures = true\n    }\n    \n    // 准备加载页面\n    func webView(webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {\n        progressBar.setProgress(0.5, animated: true)\n    }\n    \n    // 已开始加载页面\n    func webView(webView: WKWebView, didCommitNavigation navigation: WKNavigation!) {\n        progressBar.setProgress(0.9, animated: true)\n    }\n    \n    // 页面已全部加载\n    func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {\n        if title == nil {\n            title = webView.title\n        }\n        progressBar.removeFromSuperview()\n    }\n\n}\n"
  },
  {
    "path": "Sublime/Sublime/SublimeServer.swift",
    "content": "//\n//  SublimeServer.swift\n//  Sublime\n//\n//  Created by Eular on 3/10/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\nimport Swifter\nimport SwiftyJSON\n\npublic func SublimeServer(serverLog: WebServerLog?) -> HttpServer {\n    let server = HttpServer()\n    let webDir = NSBundle.mainBundle().resourcePath!.stringByAppendingPathComponent(\"Web\")\n    \n    server[\"/file_manager/:path\"] = HttpHandlers.shareFilesFromDirectory(webDir, serverLog: serverLog)\n    server[\"/file_manager\"] = { r in\n        serverLog?.log(r, statusCode: 301)\n        return .MovedPermanently(\"/file_manager/index.html\")\n    }\n    \n    server[\"/\"] = { r in\n        serverLog?.log(r, statusCode: 301)\n        return .MovedPermanently(\"/file_manager/index.html\")\n    }\n    \n    server[\"/json/:param\"] = { r in\n        serverLog?.log(r)\n        \n        var json = [\"code\": 200, \"filelist\": []]\n        var filelist = [NSObject]()\n        if r.params[\":param\"] == \"filelist\" {\n            for (key, value) in r.queryParams {\n                if key == \"path\" {\n                    let folder = Folder(path: NSHomeDirectory()+\"/Documents\"+value)\n                    for f in folder.listFiles() {\n                        var type = \"unknown\"\n                        if f.isImg {\n                            type = \"image\"\n                        } else {\n                            switch f.img {\n                                case \"folder\": type = \"folder\"\n                                case \"file_unknown\": type = \"unknown\"\n                                default: type = \"file\"\n                            }\n                        }\n                        filelist.append([\"name\": f.name, \"type\": type])\n                    }\n                }\n            }\n        }\n        json[\"filelist\"] = filelist\n        \n        return .OK(.Json(json))\n    }\n    \n    return server\n}"
  },
  {
    "path": "Sublime/Sublime/Utils/ActionSheet.swift",
    "content": "//\n//  DropdownMenu.swift\n//  Sublime\n//\n//  Created by Eular on 5/3/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\nprotocol ActionSheetDelegate {\n    func tapOnActionSheetItem(itemAtRow row: Int)\n}\n\nclass ActionSheet {\n    var delegate: ActionSheetDelegate?\n    var controller: UIViewController?\n    var items: [String] = []\n    \n    private var sheet: UIView?\n    private var mask: UIView?\n    \n    private let rowWidth: CGFloat\n    private let rowHight: CGFloat\n    private let cancelGap: CGFloat = 5\n    \n    private let textColor = Constant.ActionSheetTextColor\n    private let splitLineColor = Constant.ActionSheetLineColor\n    private let actionSheetColor = Constant.ActionSheetColor\n    private let maskColor = Constant.BlackMaskViewColor\n    \n    init(rowWidth: CGFloat, rowHight: CGFloat) {\n        self.rowWidth = rowWidth\n        self.rowHight = rowHight\n    }\n    \n    @objc func showUp() {\n        let window = controller?.view.window\n        \n        var sheetItems = items\n        sheetItems << \"Cancel\"\n        let numberOfRow = sheetItems.count\n        let actionSheetHight = rowHight * numberOfRow + cancelGap\n        \n        let actionSheet = UIView(frame: CGRectMake(0, window?.height ?? 0, rowWidth, actionSheetHight))\n        actionSheet.backgroundColor = actionSheetColor\n        \n        // Insert item label into menu\n        for i in 0..<numberOfRow {\n            let btn = UIButton()\n            btn.frame = CGRectMake(0, rowHight * i + (i == numberOfRow - 1 ? cancelGap : 0), rowWidth, rowHight)\n            btn.setTitle(sheetItems[i], forState: .Normal)\n            btn.setTitleColor(textColor, forState: .Normal)\n            btn.tag = i\n            btn.addTarget(self, action: #selector(tapOnActionSheetItem(_:)), forControlEvents: .TouchUpInside)\n            actionSheet.addSubview(btn)\n            \n            // Draw a line\n            if i != 0 {\n                let line = UILabel()\n                line.frame = CGRectMake(0, rowHight * i, rowWidth, i == numberOfRow - 1 ? cancelGap : 1)\n                line.backgroundColor = splitLineColor\n                actionSheet.addSubview(line)\n            }\n        }\n        \n        // Black the below view\n        let blackMaskView = UIView(frame: window?.frame ?? CGRectZero)\n        blackMaskView.backgroundColor = maskColor\n        blackMaskView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tapOnBlackMaskView)))\n        \n        window?.addSubview(blackMaskView)\n        window?.addSubview(actionSheet)\n        \n        UIView.animateWithDuration(0.3) { () -> Void in\n            actionSheet.y -= actionSheet.height\n        }\n        \n        self.sheet = actionSheet\n        self.mask = blackMaskView\n    }\n    \n    @objc private func tapOnBlackMaskView() {\n        dismissActionSheet()\n    }\n    \n    @objc private func tapOnActionSheetItem(btn: UIButton) {\n        dismissActionSheet {\n            if btn.tag != self.items.count {\n                self.delegate?.tapOnActionSheetItem(itemAtRow: btn.tag)\n            }\n        }\n    }\n    \n    private func dismissActionSheet(completion: (() -> Void)? = nil) {\n        if let actionSheet = self.sheet, blackMaskView = self.mask {\n            UIView.animateWithDuration(0.3, animations: { () -> Void in\n                actionSheet.y += actionSheet.height\n            }, completion: { (_) -> Void in\n                actionSheet.removeFromSuperview()\n                blackMaskView.removeFromSuperview()\n                completion?()\n            })\n        }\n    }\n}"
  },
  {
    "path": "Sublime/Sublime/Utils/Device.swift",
    "content": "//\n//  Device.swift\n//  Sublime\n//\n//  Created by Eular on 5/6/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\nstruct Device {\n    \n    static func appSize(process: ((Double) -> Void)? = nil, completion: ((Double, Double) -> Void)? = nil) {\n        // 后台执行\n        let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT\n        dispatch_async(dispatch_get_global_queue(priority, 0)) {\n        \n            let fileMgr = NSFileManager.defaultManager()\n            \n            let homePath = NSHomeDirectory()\n            let appPath = NSBundle.mainBundle().bundlePath\n            \n            let fileArray:[AnyObject] = fileMgr.subpathsAtPath(homePath)!\n            let fileArray2:[AnyObject] = fileMgr.subpathsAtPath(appPath)!\n            \n            let total = fileArray.count + fileArray2.count\n            var count = 0\n            var allSize = 0.0\n            var cacheSize = 0.0\n            \n            for fn in fileArray {\n                count += 1\n                let attr = try! fileMgr.attributesOfItemAtPath(homePath + \"/\\(fn)\")\n                let size = attr[\"NSFileSize\"] as! Double\n                allSize += size\n                if fn.hasPrefix(\"Library/Caches\") { cacheSize += size }\n                process?(Double(count) / Double(total))\n            }\n            \n            for fn in fileArray2 {\n                count += 1\n                let attr = try! fileMgr.attributesOfItemAtPath(appPath + \"/\\(fn)\")\n                let size = attr[\"NSFileSize\"] as! Double\n                allSize += size\n                process?(Double(count) / Double(total))\n            }\n            \n            completion?(allSize, cacheSize)\n        }\n    }\n    \n    static var cache: Double {\n        get {\n            let fileMgr = NSFileManager.defaultManager()\n            let path = NSHomeDirectory() + \"/Library/Caches/\"\n\n            let fileArray:[AnyObject] = fileMgr.subpathsAtPath(path)!\n            \n            var allSize = 0.0\n            for fn in fileArray {\n                let attr = try! fileMgr.attributesOfItemAtPath(path + \"/\\(fn)\")\n                let size = attr[\"NSFileSize\"] as! Double\n                allSize += size\n            }\n            \n            return allSize\n        }\n        set {\n            let fileMgr = NSFileManager.defaultManager()\n            let path = NSHomeDirectory() + \"/Library/Caches/\"\n            do {\n                try fileMgr.removeItemAtPath(path)\n                try fileMgr.createDirectoryAtPath(path, withIntermediateDirectories: true, attributes: nil)\n            } catch {\n                Log(\"Error: clean cache failed.\")\n            }\n        }\n    }\n    \n    static var systemFreeSize: Double {\n        let fm = NSFileManager.defaultManager()\n        let fattributes = try! fm.attributesOfFileSystemForPath(NSHomeDirectory())\n        return fattributes[\"NSFileSystemFreeSize\"] as! Double\n    }\n    \n    static var systemSize: Double {\n        let fm = NSFileManager.defaultManager()\n        let fattributes = try! fm.attributesOfFileSystemForPath(NSHomeDirectory())\n        return fattributes[\"NSFileSystemSize\"] as! Double\n    }\n    \n    static var batteryLevel: Float {\n        return UIDevice.currentDevice().batteryLevel\n    }\n    \n    static var batteryState: UIDeviceBatteryState {\n        return UIDevice.currentDevice().batteryState\n    }\n\n    static var UUID: String {\n        return UIDevice.currentDevice().identifierForVendor!.UUIDString\n    }\n    \n    static var name: String {\n        return UIDevice.currentDevice().name\n    }\n    \n    static var systemVersion: String {\n        return UIDevice.currentDevice().systemVersion\n    }\n    \n    static var app: Array<String> {\n        var appList = [String]()\n        for app in ObjC.getAppList() {\n            let BundleID = String(app).split(\" \")[2]\n            if !BundleID.hasPrefix(\"com.apple\") {\n                appList.append(BundleID)\n            }\n        }\n        return appList\n    }\n    \n    static var appNum: Int {\n        return app.count\n    }\n    \n    static var SSID: String {\n        return ObjC.SSID()\n    }\n    \n    static var BSSID: String {\n        return ObjC.BSSID()\n    }\n}"
  },
  {
    "path": "Sublime/Sublime/Utils/Extension/Array.swift",
    "content": "//\n//  Array.swift\n//  Sublime\n//\n//  Created by Eular on 4/20/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\n// MARK: - Array\nextension Array {\n    mutating func shift() -> Element? {\n        return self.removeFirst()\n    }\n    \n    mutating func pop() -> Element? {\n        return self.popLast()\n    }\n}\n\nclass Array2D<T> {\n    let rows: Int\n    let columns: Int\n    var array: Array<T?>\n    \n    init(_ rows: Int, _ columns: Int) {\n        self.rows = rows\n        self.columns = columns\n        \n        array = Array<T?>(count:rows * columns, repeatedValue: nil)\n    }\n    \n    subscript(row: Int, column: Int) -> T? {\n        get {\n            return array[(row * columns) + column]\n        }\n        set {\n            array[(row * columns) + column] = newValue\n        }\n    }\n}"
  },
  {
    "path": "Sublime/Sublime/Utils/Extension/Date.swift",
    "content": "//\n//  Date.swift\n//  Sublime\n//\n//  Created by Eular on 4/25/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\nenum TimeIntervalUnit {\n    case Seconds, Minutes, Hours, Days, Months, Years\n    \n    func dateComponents(interval: Int) -> NSDateComponents {\n        let components = NSDateComponents()\n        \n        switch (self) {\n        case .Seconds:\n            components.second = interval\n        case .Minutes:\n            components.minute = interval\n        case .Hours:\n            components.hour = interval\n        case .Days:\n            components.day = interval\n        case .Months:\n            components.month = interval\n        case .Years:\n            components.year = interval\n        }\n        return components\n    }\n}\n\nstruct TimeInterval {\n    var interval: Int\n    var unit: TimeIntervalUnit\n    \n    var ago: NSDate {\n        let calendar = NSCalendar.currentCalendar()\n        let today = NSDate()\n        let components = unit.dateComponents(-self.interval)\n        return calendar.dateByAddingComponents(components, toDate: today, options: .WrapComponents)!\n    }\n    \n    init(interval: Int, unit: TimeIntervalUnit) {\n        self.interval = interval\n        self.unit = unit\n    }\n}\n\nextension Int {\n    var seconds: TimeInterval {\n        return TimeInterval(interval: self, unit: .Seconds)\n    }\n    \n    var minutes: TimeInterval {\n        return TimeInterval(interval: self, unit: .Minutes)\n    }\n    \n    var hours: TimeInterval {\n        return TimeInterval(interval: self, unit: .Hours)\n    }\n    \n    var days: TimeInterval {\n        return TimeInterval(interval: self, unit: .Days)\n    }\n    \n    var months: TimeInterval {\n        return TimeInterval(interval: self, unit: .Months)\n    }\n    \n    var years: TimeInterval {\n        return TimeInterval(interval: self, unit: .Years)\n    }\n}\n\nextension NSDate {\n    class func yesterday() -> NSDate {\n        return NSDate() - 1.days\n    }\n    \n    func toS(format: String) -> String? {\n        let formatter = NSDateFormatter()\n        formatter.locale = NSLocale(localeIdentifier: \"en_US_POSIX\")\n        formatter.timeZone = NSTimeZone()\n        formatter.dateFormat = format\n        return formatter.stringFromDate(self)\n    }\n}\n\nextension String {\n    func toDate(format: String = \"dd/MM/yyyy\") -> NSDate? {\n        let formatter = NSDateFormatter()\n        formatter.locale = NSLocale(localeIdentifier: \"en_US_POSIX\")\n        formatter.timeZone = NSTimeZone()\n        formatter.dateFormat = format\n        return formatter.dateFromString(self)\n    }\n    \n    func toGMTDate(format: String = \"dd/MM/yyyy\") -> NSDate? {\n        let formatter = NSDateFormatter()\n        formatter.locale = NSLocale(localeIdentifier: \"en_US_POSIX\")\n        formatter.timeZone = NSTimeZone(forSecondsFromGMT: 0)\n        formatter.dateFormat = format\n        return formatter.dateFromString(self)\n    }\n}\n\nfunc + (left: NSDate, right: TimeInterval) -> NSDate {\n    let calendar = NSCalendar.currentCalendar()\n    let components = right.unit.dateComponents(right.interval)\n    return calendar.dateByAddingComponents(components, toDate: left, options: .WrapComponents)!\n}\n\nfunc - (left: NSDate, right: TimeInterval) -> NSDate {\n    let calendar = NSCalendar.currentCalendar()\n    let components = right.unit.dateComponents(-right.interval)\n    return calendar.dateByAddingComponents(components, toDate: left, options: .WrapComponents)!\n}\n\nfunc < (left: NSDate, right: NSDate) -> Bool {\n    let result: NSComparisonResult = left.compare(right)\n    var isEarlier = false\n    if (result == NSComparisonResult.OrderedAscending) {\n        isEarlier = true\n    }\n    return isEarlier\n}\n\nfunc - (left: NSDate, right: NSDate) -> NSDateComponents {\n    let diffDateComponents = NSCalendar.currentCalendar().components([.Year, .Month, .Day, .Hour, .Minute, .Second], fromDate: right, toDate: left, options: NSCalendarOptions.init(rawValue: 0))\n    return diffDateComponents\n}\n"
  },
  {
    "path": "Sublime/Sublime/Utils/Extension/Number.swift",
    "content": "//\n//  Number.swift\n//  Sublime\n//\n//  Created by Eular on 4/20/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\n// MARK: - Int\nextension Int {\n    var KB: Int {\n        return self / 1024\n    }\n    \n    var MB: Int {\n        return self.KB / 1024\n    }\n    \n    var GB: Int {\n        return self.MB / 1024\n    }\n    \n    func times(block: () -> ()) {\n        for _ in 0..<self {\n            block()\n        }\n    }\n}\n\n// MARK: - Double\nextension Double {\n    \n    var size: String {\n        var str = \"\"\n        var tmp = self\n        \n        for i in [\"KB\", \"MB\", \"GB\"] {\n            tmp = tmp / 1000\n            str = \"\\(tmp.afterPoint(1)) \\(i)\"\n            \n            if tmp < 1000 {\n                break\n            }\n            \n        }\n        \n        return str\n    }\n    \n    var KB: Double {\n        return self / 1024\n    }\n    \n    var MB: Double {\n        return self.KB / 1024\n    }\n    \n    var GB: Double {\n        return self.MB / 1024\n    }\n    \n    func afterPoint(n: Int) -> Double {\n        let s = String(format: \"%.\\(n)f\", self)\n        return Double(s)!\n    }\n    \n    func formatedTime(format: String) -> String {\n        let d = NSDate(timeIntervalSince1970: self)\n        let GTMzone = NSTimeZone(forSecondsFromGMT: 0)\n        let formatter = NSDateFormatter()\n        formatter.dateFormat = format\n        formatter.timeZone = GTMzone\n        return formatter.stringFromDate(d)\n    }\n}"
  },
  {
    "path": "Sublime/Sublime/Utils/Extension/Operation.swift",
    "content": "//\n//  Operation.swift\n//  Sublime\n//\n//  Created by Eular on 4/20/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\n// MARK: - Operation\nfunc + (left: Int, right: String) -> String {\n    return \"\\(left)\"+right\n}\n\nfunc + (left: String, right: Int) -> String {\n    return left+\"\\(right)\"\n}\n\nfunc * (left: String, right: Int) -> String {\n    var s = \"\"\n    for _ in 0..<right { s += left }\n    return s\n}\n\nfunc % (left: Int, right: Int) -> Int {\n    var tmp = left\n    tmp %= right\n    return tmp >= 0 ? tmp : tmp + right\n}\n\nfunc / (left: CGFloat, right: Int) -> CGFloat {\n    return left / CGFloat(right)\n}\n\nfunc * (left: CGFloat, right: Int) -> CGFloat {\n    return left * CGFloat(right)\n}\n\nfunc <<<T> (inout left: [T], right: T) {\n    left.append(right)\n}\n"
  },
  {
    "path": "Sublime/Sublime/Utils/Extension/Other.swift",
    "content": "//\n//  Other.swift\n//  Sublime\n//\n//  Created by Eular on 4/20/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\n// MARK: - UIImage\nextension UIImage {\n    func saveToCameraRoll() {\n        UIImageWriteToSavedPhotosAlbum(self, nil, nil, nil)\n    }\n}\n\n// MARK: - UITabBar\nextension UITabBar {\n    func showRedBadgeOnItem(index: Int, totalItemNums: Int) {\n        hideRedBadgeOnItem(index)\n        \n        let badgeSize: CGFloat = 8\n        \n        let badgeView = UIView()\n        badgeView.tag = 888 + index\n        badgeView.layer.cornerRadius = badgeSize / 2\n        badgeView.backgroundColor = Constant.TabBatItemBadgeColor\n        \n        let percentX = (CGFloat(index) + 0.6) / totalItemNums\n        let x = CGFloat(ceilf(Float(percentX * self.width)))\n        let y = CGFloat(ceilf(Float(0.1 * self.height)))\n        badgeView.frame = CGRectMake(x, y, badgeSize, badgeSize)\n        addSubview(badgeView)\n    }\n    \n    func hideRedBadgeOnItem(index: Int) {\n        for subView in self.subviews {\n            if (subView.tag == 888 + index) {\n                subView.removeFromSuperview()\n            }\n        }\n    }\n}\n\n// MARK: - Range\nextension Range {\n    func each(iterator: (Element) -> ()) {\n        for i in self {\n            iterator(i)\n        }\n    }\n}"
  },
  {
    "path": "Sublime/Sublime/Utils/Extension/String.swift",
    "content": "//\n//  String.swift\n//  Sublime\n//\n//  Created by Eular on 4/20/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\n// MARK: - String\nextension String {\n    // MARK: - property\n    \n    // md5 need import <CommonCrypto/CommonCrypto.h> in bridging header file\n    var md5: String! {\n        let str = self.cStringUsingEncoding(NSUTF8StringEncoding)\n        let strLen = CC_LONG(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))\n        let digestLen = Int(CC_MD5_DIGEST_LENGTH)\n        let result = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLen)\n        \n        CC_MD5(str!, strLen, result)\n        \n        let hash = NSMutableString()\n        for i in 0..<digestLen {\n            hash.appendFormat(\"%02x\", result[i])\n        }\n        \n        result.dealloc(digestLen)\n        \n        return String(format: hash as String)\n    }\n    \n    // sha1 need import <CommonCrypto/CommonHMAC.h> in bridging header file\n    var sha1: String {\n        let data = self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!\n        var digest = [UInt8](count:Int(CC_SHA1_DIGEST_LENGTH),repeatedValue:0)\n        CC_SHA1(data.bytes, CC_LONG(data.length), &digest)\n        \n        let output = NSMutableString(capacity: Int(CC_SHA1_DIGEST_LENGTH))\n        for byte in digest{\n            output.appendFormat(\"%02x\", byte)\n        }\n        return output as String\n    }\n    \n    // length of the string\n    var count: Int {\n        return self.characters.count\n    }\n    \n    var lower: String {\n        return self.lowercaseString\n    }\n    \n    var upper: String {\n        return self.uppercaseString\n    }\n    \n    var islower: Bool {\n        return self == self.lower\n    }\n    \n    var isupper: Bool {\n        return self == self.upper\n    }\n    \n    var lastPathComponent: String {\n        return (self as NSString).lastPathComponent\n    }\n    \n    var pathExtension: String {\n        return (self as NSString).pathExtension\n    }\n    \n    var stringByDeletingLastPathComponent: String {\n        return (self as NSString).stringByDeletingLastPathComponent\n    }\n    var stringByDeletingPathExtension: String {\n        return (self as NSString).stringByDeletingPathExtension\n    }\n    \n    var pathComponents: [String] {\n        return (self as NSString).pathComponents\n    }\n    \n    // format: \"#ffffff\"\n    var color: UIColor? {\n        if self[0] == \"#\" {\n            if let r = Int(self[1,3], radix: 16),\n                let g = Int(self[3,5], radix: 16),\n                let b = Int(self[5,nil], radix: 16) {\n                return RGB(r, g, b)\n            }\n        }\n        return nil\n    }\n    \n    // MARK: - method\n    func stringByAppendingPathComponent(path: String) -> String {\n        let nsSt = self as NSString\n        return nsSt.stringByAppendingPathComponent(path)\n    }\n    \n    func stringByAppendingPathExtension(ext: String) -> String? {\n        let nsSt = self as NSString\n        return nsSt.stringByAppendingPathExtension(ext)\n    }\n    \n    // Return the number of non-overlapping occurrences of substring sub in string S[start:end]\n    func count(subString: String) -> Int {\n        var n = 0\n        if let r = self.rangeOfString(subString) {\n            n += 1 + self.substringFromIndex(r.endIndex).count(subString)\n        }\n        return n\n    }\n    \n    func has(subString: String) -> Bool {\n        if self.rangeOfString(subString) != nil {\n            return true\n        }\n        return false\n    }\n    \n    func hasAny(strArr: Array<String>) -> Bool {\n        let r = strArr.filter() { self.has($0) }\n        return !r.isEmpty\n    }\n    \n    // Remove the last character and return it\n    mutating func pop() -> Character {\n        return self.removeAtIndex(self.endIndex.predecessor())\n    }\n    \n    // Return the lowest index in S where substring sub is found\n    func find(subString: String) -> Int {\n        if let r = self.rangeOfString(subString) {\n            return Int(String(r.startIndex))!\n        } else {\n            return -1\n        }\n    }\n    \n    // Return a string which is the concatenation of the strings in the iterable.\n    func join(arr: Array<AnyObject>) -> String {\n        var str = \"\"\n        for i in arr {\n            str += String(i) + self\n        }\n        str.pop()\n        return str\n    }\n    \n    func split(separator: String = \" \") -> [String] {\n        return self.componentsSeparatedByString(separator)\n    }\n    \n    func replace(before: String, _ after: String) -> String {\n        return self.stringByReplacingOccurrencesOfString(before, withString: after)\n    }\n    \n    // Return a copy of the string S with leading and trailing whitespace removed\n    func strip(char: Character = \" \") -> String {\n        return String(self.characters.filter() { $0 != char } )\n    }\n    \n    func trim() -> String {\n        return self.stringByTrimmingCharactersInSet(.whitespaceCharacterSet())\n    }\n    \n    func trim(charSet charSet: NSCharacterSet) -> String {\n        return self.stringByTrimmingCharactersInSet(charSet)\n    }\n    \n    func urlencode() -> String {\n        return self.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())!\n    }\n    \n    // String indices\n    subscript(index: Int) -> Character {\n        if index >= 0 {\n            return self[self.startIndex.advancedBy(index)]\n        } else {\n            return self[self.endIndex.advancedBy(index)]\n        }\n    }\n    \n    subscript(m: Int?, n: Int?) -> String {\n        var i1: Index, i2: Index\n        if m != nil {\n            i1 = self.startIndex.advancedBy(m!)\n        } else {\n            i1 = self.startIndex\n        }\n        if n != nil {\n            if n >= 0 {\n                i2 = self.startIndex.advancedBy(n!)\n            } else {\n                i2 = self.endIndex.advancedBy(n!)\n            }\n        } else {\n            i2 = self.endIndex\n        }\n        let indexRange = Range(i1..<i2)\n        return self.substringWithRange(indexRange)\n    }\n    \n    subscript(range: Range<Int>) -> String {\n        return self[range.startIndex, range.endIndex]\n    }\n}"
  },
  {
    "path": "Sublime/Sublime/Utils/Extension/UIApplication.swift",
    "content": "//\n//  UIApplication.swift\n//  Sublime\n//\n//  Created by Eular on 4/20/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\n// MARK: - UIApplication\nextension UIApplication {\n    class func topViewController(base: UIViewController? = UIApplication.sharedApplication().keyWindow?.rootViewController) -> UIViewController? {\n        if let nav = base as? UINavigationController {\n            return topViewController(nav.visibleViewController)\n        }\n        if let tab = base as? UITabBarController {\n            if let selected = tab.selectedViewController {\n                return topViewController(selected)\n            }\n        }\n        if let presented = base?.presentedViewController {\n            return topViewController(presented)\n        }\n        return base\n    }\n}"
  },
  {
    "path": "Sublime/Sublime/Utils/Extension/UIColor.swift",
    "content": "//\n//  UIColor.swift\n//  Sublime\n//\n//  Created by Eular on 5/4/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\nextension UIColor{\n    func toImage() -> UIImage {\n        let rect = CGRectMake(0, 0, 1, 1)\n        UIGraphicsBeginImageContextWithOptions(rect.size, true, 0)\n        self.setFill()\n        UIRectFill(rect)\n        let image = UIGraphicsGetImageFromCurrentImageContext()\n        UIGraphicsEndImageContext()\n        return image\n    }\n}"
  },
  {
    "path": "Sublime/Sublime/Utils/Extension/UIImage.swift",
    "content": "//\n//  UIImage.swift\n//  Sublime\n//\n//  Created by Eular on 5/8/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\nextension UIImage {\n    func rescaleImageToSize(width: CGFloat, _ height: CGFloat) -> UIImage {\n        let rect = CGRectMake(0, 0, width, height)\n        UIGraphicsBeginImageContextWithOptions(rect.size, false, UIScreen.mainScreen().scale)\n        self.drawInRect(rect)\n        let resImage = UIGraphicsGetImageFromCurrentImageContext()\n        UIGraphicsEndImageContext()\n        return resImage\n    }\n    \n    func rescaleImageByWidth(width: CGFloat) -> UIImage {\n        let height = width / self.size.width * self.size.height\n        return self.rescaleImageToSize(width, height)\n    }\n}"
  },
  {
    "path": "Sublime/Sublime/Utils/Extension/UIImageView.swift",
    "content": "//\n//  UIImageView.swift\n//  Sublime\n//\n//  Created by Eular on 4/20/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\n// MARK: - UIImageView\nextension UIImageView {\n    \n    // ---------------------------------\n    // MARK: - 长按识别二维码\n    var recognizeQRCodeEnabled: Bool {\n        get {\n            return self.userInteractionEnabled\n        }\n        set {\n            self.userInteractionEnabled = newValue\n            \n            let longPress = UILongPressGestureRecognizer(target: self, action: #selector(self._handleLongPress(_:)))\n            if newValue { self.addGestureRecognizer(longPress) }\n            else { self.removeGestureRecognizer(longPress) }\n        }\n    }\n    \n    override public func canBecomeFirstResponder() -> Bool {\n        return true\n    }\n    \n    override public func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {\n        if action == #selector(self.recognizeQrcode) {\n            return true\n        }\n        return super.canPerformAction(action, withSender: sender)\n    }\n    \n    @objc private func _handleLongPress(longPress: UILongPressGestureRecognizer) {\n        if longPress.state == .Began {\n            guard let img = self.image else { return }\n            if QRCode().hasQRCode(img) {\n                self.becomeFirstResponder()\n                let qrcodeItem = UIMenuItem(title: NSLocalizedString(\"RECOGNIZE_QRCODE\", comment: \"Recognize QRCode\"), action: #selector(self.recognizeQrcode))\n                let menu = UIMenuController.sharedMenuController()\n                menu.menuItems = [qrcodeItem]\n                menu.setTargetRect(self.bounds, inView: self)\n                menu.setMenuVisible(true, animated: true)\n            }\n        }\n    }\n    \n    func recognizeQrcode() {\n        guard let img = self.image else { return }\n        guard let topController = UIApplication.topViewController() else { return }\n        let str = QRCode().read(img)!\n        if let url = NSURL(string: str) {\n            let backItem = UIBarButtonItem()\n            backItem.title = \"back\"\n            topController.navigationItem.backBarButtonItem = backItem\n            \n            let svc = SublimeSafari(URL: url)\n            topController.navigationController?.pushViewController(svc, animated: true)\n        } else {\n            topController.view.Toast(message: str)\n        }\n    }\n    \n    // ---------------------------------\n    // 请求网络图片并简单缓存\n    public func imageFromUrl(urlString: String) {\n        if !urlString.isEmpty {\n            let fileMgr = NSFileManager.defaultManager()\n            let filePath = Constant.CachePath + urlString.md5 + \".png\"\n            \n            if fileMgr.fileExistsAtPath(filePath) {\n                let imgData = fileMgr.contentsAtPath(filePath)\n                self.image = UIImage(data: imgData!)\n            } else {\n                if Network.isConnectedToNetwork() {\n                    if let url = NSURL(string: urlString) {\n                        let request = NSURLRequest(URL: url)\n                        let session = NSURLSession.sharedSession()\n                        let task = session.dataTaskWithRequest(request, completionHandler: { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in\n                            guard let d = data else { return }\n                            let img = UIImage(data: d)\n                            let imgData = UIImagePNGRepresentation(img!)\n                            imgData?.writeToFile(filePath, atomically: true)\n                            \n                            dispatch_async(dispatch_get_main_queue()) {\n                                self.image = img\n                            }\n                        })\n                        task.resume()\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Sublime/Sublime/Utils/Extension/UITableView.swift",
    "content": "//\n//  UITableView.swift\n//  Sublime\n//\n//  Created by Eular on 4/20/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\n// MARK: - UITableView\nextension UITableView {\n    \n    func scrollToBottomAnimated(animated: Bool) {\n        let row = numberOfRowsInSection(0) - 1\n        if row >= 0 {\n            let indexPath = NSIndexPath(forRow: row, inSection: 0)\n            scrollToIndexPath(indexPath, animated: animated)\n        }\n    }\n    \n    func scrollToIndexPath(indexPath: NSIndexPath, animated: Bool) {\n        scrollToRowAtIndexPath(indexPath, atScrollPosition: UITableViewScrollPosition.Bottom, animated: animated)\n    }\n    \n}"
  },
  {
    "path": "Sublime/Sublime/Utils/Extension/UITextView.swift",
    "content": "//\n//  UITextView.swift\n//  Sublime\n//\n//  Created by Eular on 4/20/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\n// MARK: - UITextView\nextension UITextView {\n    func scrollToBottom() {\n        let range:NSRange = NSMakeRange(self.text.characters.count - 1, 1)\n        self.scrollRangeToVisible(range)\n        self.scrollEnabled = false\n        self.scrollEnabled = true\n    }\n    \n    func setLineBreakMode(mode: NSLineBreakMode) {\n        let attrStr = self.attributedText.mutableCopy()\n        let paragraphStyle = NSMutableParagraphStyle()\n        paragraphStyle.lineBreakMode = mode\n        attrStr.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: NSMakeRange(0, attrStr.mutableString.length))\n        self.attributedText = attrStr as! NSAttributedString\n    }\n}"
  },
  {
    "path": "Sublime/Sublime/Utils/Extension/UIView.swift",
    "content": "//\n//  UIView.swift\n//  Sublime\n//\n//  Created by Eular on 4/20/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\n// MARK: - UIView\nextension UIView {\n    \n    var x: CGFloat {\n        get {\n            return self.frame.origin.x\n        }\n        set {\n            self.frame.origin.x = newValue\n        }\n    }\n    \n    var y: CGFloat {\n        get {\n            return self.frame.origin.y\n        }\n        set {\n            self.frame.origin.y = newValue\n        }\n    }\n    \n    var width: CGFloat {\n        get {\n            return self.frame.width\n        }\n        set {\n            self.frame.size.width = newValue\n        }\n    }\n    \n    var height: CGFloat {\n        get {\n            return self.frame.height\n        }\n        set {\n            self.frame.size.height = newValue\n        }\n    }\n    \n    func atCenter(hasNavigationBar: Bool = false) {\n        if let s = self.superview {\n            self.center = s.center\n            \n            if hasNavigationBar {\n                self.y -= 64\n            }\n        }\n    }\n    \n    func snapshot() -> UIImage {\n        UIGraphicsBeginImageContextWithOptions(self.frame.size, false, UIScreen.mainScreen().scale)\n        self.layer.renderInContext(UIGraphicsGetCurrentContext()!)\n        let image = UIGraphicsGetImageFromCurrentImageContext()\n        UIGraphicsEndImageContext()\n        return image\n    }\n    \n    func snapshot(frame: CGRect) -> UIImage {\n        let pt = frame.origin\n        UIGraphicsBeginImageContextWithOptions(frame.size, false, UIScreen.mainScreen().scale)\n        let context = UIGraphicsGetCurrentContext()\n        CGContextConcatCTM(context, CGAffineTransformMakeTranslation(-pt.x, -pt.y))\n        \n        // Dirty fix: force update layer\n        self.snapshotViewAfterScreenUpdates(true)\n        // Is there someone who help me to can fix this problem, T_T...\n        \n        self.layer.renderInContext(context!)\n        let image = UIGraphicsGetImageFromCurrentImageContext()\n        UIGraphicsEndImageContext()\n        return image\n    }\n    \n    func Toast(message msg: String, hasNavigationBar: Bool = false) {\n        let toast = UILabel()\n        let h: CGFloat = 30\n        toast.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.8)\n        toast.text = msg\n        toast.textColor = UIColor.whiteColor()\n        toast.textAlignment = .Center\n        toast.font = toast.font.fontWithSize(12)\n        toast.alpha = 0\n        toast.frame = CGRectMake(0, 0, toast.intrinsicContentSize().width + 10, h)\n        addSubview(toast)\n        bringSubviewToFront(toast)\n        toast.atCenter(hasNavigationBar)\n        \n        UIView.animateWithDuration(0.5, animations: {\n            toast.alpha = 1\n        }) { (_) -> Void in\n            UIView.animateWithDuration(4, animations: {\n                toast.alpha = 0\n                }, completion: { (_) -> Void in\n                    toast.removeFromSuperview()\n            })\n        }\n    }\n    \n    class func loadFromNibNamed(nibNamed: String, bundle : NSBundle? = nil) -> UIView? {\n        return UINib(\n            nibName: nibNamed,\n            bundle: bundle\n            ).instantiateWithOwner(nil, options: nil)[0] as? UIView\n    }\n    \n    func autoLayout(top top: CGFloat, left: CGFloat, bottom: CGFloat, right: CGFloat) {\n        self.translatesAutoresizingMaskIntoConstraints = false\n        superview?.addConstraint(NSLayoutConstraint(item: self, attribute: .Top, relatedBy: .Equal, toItem: superview, attribute: .Top, multiplier: 1, constant: top))\n        superview?.addConstraint(NSLayoutConstraint(item: self, attribute: .Left, relatedBy: .Equal, toItem: superview, attribute: .Left, multiplier: 1, constant: left))\n        superview?.addConstraint(NSLayoutConstraint(item: self, attribute: .Bottom, relatedBy: .Equal, toItem: superview, attribute: .Bottom, multiplier: 1, constant: bottom))\n        superview?.addConstraint(NSLayoutConstraint(item: self, attribute: .Right, relatedBy: .Equal, toItem: superview, attribute: .Right, multiplier: 1, constant: right))\n    }\n    \n    func autoLayout(top top: CGFloat, left: CGFloat) {\n        self.translatesAutoresizingMaskIntoConstraints = false\n        superview?.addConstraint(NSLayoutConstraint(item: self, attribute: .Top, relatedBy: .Equal, toItem: superview, attribute: .Top, multiplier: 1, constant: top))\n        superview?.addConstraint(NSLayoutConstraint(item: self, attribute: .Left, relatedBy: .Equal, toItem: superview, attribute: .Left, multiplier: 1, constant: left))\n        superview?.addConstraint(NSLayoutConstraint(item: self, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: self.width))\n        superview?.addConstraint(NSLayoutConstraint(item: self, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: self.height))\n    }\n    \n    func autoLayout(left left: CGFloat, bottom: CGFloat) {\n        self.translatesAutoresizingMaskIntoConstraints = false\n        superview?.addConstraint(NSLayoutConstraint(item: self, attribute: .Left, relatedBy: .Equal, toItem: superview, attribute: .Left, multiplier: 1, constant: left))\n        superview?.addConstraint(NSLayoutConstraint(item: self, attribute: .Bottom, relatedBy: .Equal, toItem: superview, attribute: .Bottom, multiplier: 1, constant: bottom))\n        superview?.addConstraint(NSLayoutConstraint(item: self, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: self.width))\n        superview?.addConstraint(NSLayoutConstraint(item: self, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: self.height))\n    }\n    \n    func autoLayout(right right: CGFloat, bottom: CGFloat) {\n        self.translatesAutoresizingMaskIntoConstraints = false\n        superview?.addConstraint(NSLayoutConstraint(item: self, attribute: .Right, relatedBy: .Equal, toItem: superview, attribute: .Right, multiplier: 1, constant: right))\n        superview?.addConstraint(NSLayoutConstraint(item: self, attribute: .Bottom, relatedBy: .Equal, toItem: superview, attribute: .Bottom, multiplier: 1, constant: bottom))\n        superview?.addConstraint(NSLayoutConstraint(item: self, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: self.width))\n        superview?.addConstraint(NSLayoutConstraint(item: self, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: self.height))\n    }\n}\n"
  },
  {
    "path": "Sublime/Sublime/Utils/Extension/UIViewController.swift",
    "content": "//\n//  UIViewController.swift\n//  Sublime\n//\n//  Created by Eular on 4/20/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\n// MARK: - Loading\nextension UIViewController {\n    func startLoading(text: String) {\n        \n        let backView = UIView()\n        backView.frame = CGRectMake((view.width - 100) / 2, (view.height - 100) / 2, 100, 100)\n        backView.backgroundColor = RGB(0, 0, 0)\n        backView.alpha = 0.8\n        backView.layer.cornerRadius = 10\n        backView.tag = 10086\n        \n        let activityIndicator = UIActivityIndicatorView()\n        activityIndicator.frame = CGRectMake(25, 15, 50, 50)\n        activityIndicator.activityIndicatorViewStyle = .WhiteLarge\n        activityIndicator.hidesWhenStopped = true\n        \n        let lb = UILabel()\n        lb.frame = CGRectMake(0, 72, 100, 20)\n        lb.font = lb.font.fontWithSize(12)\n        lb.text = text\n        lb.textAlignment = .Center\n        lb.textColor = UIColor.whiteColor()\n        \n        backView.addSubview(lb)\n        backView.addSubview(activityIndicator)\n        \n        view.addSubview(backView)\n        activityIndicator.startAnimating()\n    }\n    \n    func stopLoading() {\n        if let v = view.viewWithTag(10086) {\n            v.removeFromSuperview()\n        }\n    }\n}"
  },
  {
    "path": "Sublime/Sublime/Utils/File.swift",
    "content": "//\n//  File.swift\n//  Sublime\n//\n//  Created by Eular on 2/18/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\nimport UIKit\nimport Foundation\nimport Photos\nimport SSZipArchive\n\nenum FileType {\n    case Regular, Directory, SymbolicLink, Socket, CharacterSpecial, BlockSpecial, Unknown\n}\n\n// MARK: - File Class\nclass File {\n    var name = \"\"\n    var ext = \"\"\n    var path = \"\"\n    var url: NSURL\n    var isDir: Bool = false\n    var type: FileType = .Unknown\n    var size: Int = 0\n    var img: String {\n        get {\n            if isDir {\n                return \"folder\"\n            } else if isExistImageResource(\"file_\\(ext)\") {\n                return \"file_\\(ext)\"\n            } else {\n                return \"file_unknown\"\n            }\n        }\n    }\n    var isImg: Bool {\n        return ([\"jpg\", \"png\", \"gif\"] as NSArray).containsObject(ext)\n    }\n    var isAudio: Bool {\n        return ([\"mp3\"] as NSArray).containsObject(ext)\n    }\n    var isVideo: Bool {\n        return ([\"mp4\", \"rmvb\", \"avi\", \"flv\", \"mov\"] as NSArray).containsObject(ext)\n    }\n    var data: NSData? {\n        get {\n            return NSData(contentsOfFile: path)\n        }\n    }\n    var codeLang: String {\n        let codeLangs = [\n            \"swift\": \"swift\",\n            \"m\": \"objective-c\",\n            \"h\": \"objective-c\",\n            \"c\": \"c\",\n            \"py\": \"python\",\n            \"cpp\": \"cpp\",\n            \"css\": \"css\",\n            \"js\": \"javascript\",\n            \"html\": \"html\",\n            \"htm\": \"html\",\n            \"xml\": \"xml\",\n            \"jsp\": \"jsp\",\n            // \"m\": \"matlab\",\n            \"sh\": \"shell\",\n            \"f90\": \"fortran\",\n            \"java\": \"java\",\n            \"md\": \"markdown\",\n            \"asm\": \"asm\",\n            \"bat\": \"bat\",\n            \"scala\": \"scala\",\n            \"tex\": \"latex\",\n            \"pl\": \"perl\",\n            \"cs\": \"c-sharp\",\n            \"php\": \"php\",\n            \"json\": \"json\",\n            \"yml\": \"yml\",\n        ]\n        return codeLangs[ext] ?? \"txt\"\n    }\n    \n    let readable: Bool\n    let writeable: Bool\n    let executable: Bool\n    let deleteable: Bool\n    \n    private let filemgr = NSFileManager.defaultManager()\n    \n    init(path: String) {\n        self.path = path\n        self.name = path.lastPathComponent\n        self.ext = name.pathExtension\n        self.url = NSURL(fileURLWithPath: path)\n        \n        self.readable = filemgr.isReadableFileAtPath(path)\n        self.writeable  = filemgr.isWritableFileAtPath(path)\n        self.executable = filemgr.isExecutableFileAtPath(path)\n        self.deleteable = filemgr.isDeletableFileAtPath(path)\n        \n        do {\n            let attribs = try filemgr.attributesOfItemAtPath(path)\n            \n            let filetype = attribs[\"NSFileType\"] as! String\n            switch filetype {\n            case \"NSFileTypeDirectory\":\n                self.type = .Directory\n                self.isDir = true\n            case \"NSFileTypeRegular\":\n                self.type = .Regular\n            case \"NSFileTypeSymbolicLink\":\n                self.type = .SymbolicLink\n            case \"NSFileTypeSocket\":\n                self.type = .Socket\n            case \"NSFileTypeCharacterSpecial\":\n                self.type = .CharacterSpecial\n            case \"NSFileTypeBlockSpecial\":\n                self.type = .BlockSpecial\n            default:\n                self.type = .Unknown\n            }\n            \n            self.size = attribs[\"NSFileSize\"] as! Int\n        } catch {}\n    }\n    \n    func delete() -> Bool {\n        do {\n            try filemgr.removeItemAtPath(path)\n            return true\n        } catch {\n            return false\n        }\n    }\n    \n    func read() -> String {\n        if let data = filemgr.contentsAtPath(path) {\n            return String(data: data, encoding: NSUTF8StringEncoding) ?? \"\"\n        }\n        return \"\"\n    }\n    \n    func readlines() -> [String] {\n        return (self.read() ?? \"\").split(\"\\n\")\n    }\n    \n    func write(str: String) -> Bool {\n        do {\n            try str.writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding)\n            return true\n        } catch {\n            return false\n        }\n        \n    }\n    \n    func write(data: NSData) -> Bool {\n        return data.writeToFile(path, atomically: true)\n    }\n    \n    func append(str: String) -> Bool {\n        if let handler = NSFileHandle(forUpdatingAtPath: path), let data = str.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true) {\n            handler.seekToEndOfFile()\n            handler.writeData(data)\n            return true\n        }\n        return false\n    }\n    \n    func insert(str: String, offset: UInt64) -> Bool {\n        if let handler = NSFileHandle(forUpdatingAtPath: path), let data = str.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true) {\n            handler.seekToFileOffset(offset)\n            let data2 = handler.readDataToEndOfFile()\n            handler.seekToFileOffset(offset)\n            handler.writeData(data)\n            handler.writeData(data2)\n            return true\n        }\n        return false\n    }\n    \n    func copy(dest: String) -> Bool {\n        do {\n            try filemgr.copyItemAtPath(path, toPath: dest)\n            return true\n        } catch {\n            return false\n        }\n    }\n    \n    func move(dest: String) -> Bool {\n        do {\n            try filemgr.moveItemAtPath(path, toPath: dest)\n            return true\n        } catch {\n            return false\n        }\n    }\n    \n    func unzip(destPath: String = \"\", keepFile: Bool = true) {\n        if ext == \"zip\" {\n            if destPath.isEmpty {\n                SSZipArchive.unzipFileAtPath(path, toDestination: path.stringByDeletingLastPathComponent)\n            } else {\n                SSZipArchive.unzipFileAtPath(path, toDestination: destPath)\n            }\n            if !keepFile {\n                self.delete()\n            }\n        } else {\n            Log(\"Not zip file\")\n        }\n    }\n    \n    static func exist(path: String) -> Bool {\n        return NSFileManager.defaultManager().fileExistsAtPath(path)\n    }\n}\n\n// MARK: - Folder Class\nclass Folder: File {\n    override init(path: String) {\n        if !File.exist(path) {\n            let upper = Folder(path: path.stringByDeletingLastPathComponent)\n            upper.newFolder(path.lastPathComponent)\n        }\n        \n        super.init(path: path)\n    }\n    \n    func checkFileExist(name: String) -> Bool {\n        return filemgr.fileExistsAtPath(path.stringByAppendingPathComponent(name))\n    }\n    \n    func newFile(name: String) -> Bool {\n        return filemgr.createFileAtPath(path.stringByAppendingPathComponent(name), contents: nil, attributes: nil)\n    }\n    \n    func newFolder(name: String) -> Bool {\n        do {\n            try filemgr.createDirectoryAtPath(path.stringByAppendingPathComponent(name), withIntermediateDirectories: true, attributes: nil)\n            return true\n        } catch {\n            return false\n        }\n    }\n    \n    func listFiles() -> [File] {\n        var fileList = [File]()\n        do {\n            let files = try filemgr.contentsOfDirectoryAtPath(path)\n            for file in files {\n                let p = path.stringByAppendingPathComponent(file)\n                var f = File(path: p)\n                if f.isDir {f = Folder(path: p)}\n                fileList.append(f)\n            }\n        } catch {}\n        return fileList\n    }\n    \n    func saveImage(image: UIImage, name: String, url: NSURL?) {\n        let imgext = name.pathExtension\n        switch imgext {\n        case \"png\":\n            if let data = UIImagePNGRepresentation(image) {\n                data.writeToFile(path.stringByAppendingPathComponent(name), atomically: true)\n            }\n        case \"jpg\":\n            if let data = UIImageJPEGRepresentation(image, 1) {\n                data.writeToFile(path.stringByAppendingPathComponent(name), atomically: true)\n            }\n        case \"gif\":\n            let imgMgr = PHImageManager()\n            let asset = PHAsset.fetchAssetsWithALAssetURLs([url!], options: nil)[0] as! PHAsset\n            imgMgr.requestImageDataForAsset(asset, options: nil) { (data, _, _, _) -> Void in\n                data?.writeToFile(self.path.stringByAppendingPathComponent(name), atomically: true)\n            }\n        default: return\n        }\n        \n    }\n    \n    func zip(destPath: String = \"\") -> File {\n        var zipPath: String\n        if destPath.isEmpty {\n            zipPath = path.stringByDeletingPathExtension.stringByAppendingPathExtension(\"zip\")!\n        } else {\n            zipPath = destPath\n        }\n        SSZipArchive.createZipFileAtPath(zipPath, withContentsOfDirectory: path)\n        return File(path: zipPath)\n    }\n}\n\n"
  },
  {
    "path": "Sublime/Sublime/Utils/Function.swift",
    "content": "//\n//  Function.swift\n//  Sublime\n//\n//  Created by Eular on 2/18/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Alamofire\nimport Foundation\nimport AASquaresLoading\n\n// MARK: - Functions\nfunc len(any: AnyObject) -> Int {\n    if any.isKindOfClass(NSString) {\n        let str = any as! String\n        return str.count\n    }\n    return any.count\n}\n\nfunc range(n: Int) -> Array<Int> {\n    return Array(0..<n)\n}\n\nfunc range(m: Int, _ n: Int, _ d: Int = 1) -> Array<Int> {\n    if d == 1 {\n        return Array(m..<n)\n    } else {\n        var arr = [Int]()\n        var i = m\n        while d * (i - n) <= 0 {\n            arr.append(i)\n            i += d\n        }\n        return arr\n    }\n}\n\nfunc random(a: UInt32, _ b: UInt32) -> UInt32? {\n    guard a < b else { return nil }\n    return arc4random_uniform(b - a) + a\n}\n\nfunc random(n: UInt32) -> UInt32 {\n    return arc4random_uniform(n)\n}\n\nfunc random(a: UInt32, _ b: UInt32, arrLen: Int) -> Array<UInt32> {\n    guard a < b else { return [] }\n    var arr = [UInt32]()\n    for _ in range(arrLen) {\n        arr.append(random(a, b)!)\n    }\n    return arr\n}\n\nfunc isExistImageResource(name: String) -> Bool {\n    if UIImage(named: name) != nil {\n        return true\n    }\n    //if NSBundle.mainBundle().pathForResource(name, ofType: \"png\") != nil {\n    //    return true\n    //}\n    return false\n}\n\nfunc RGB(r: Int, _ g: Int, _ b: Int) -> UIColor {\n    return UIColor(red: CGFloat(r) / 256, green: CGFloat(g) / 256, blue: CGFloat(b) / 256, alpha: 1)\n}\n\nfunc RGB(r: Int, _ g: Int, _ b: Int, alpha: CGFloat) -> UIColor {\n    return UIColor(red: CGFloat(r) / 256, green: CGFloat(g) / 256, blue: CGFloat(b) / 256, alpha: alpha)\n}\n\n// MARK: - Ghostbin\nfunc getGhostbinUrl(lang: String, text: String, target: UIViewController, complete: (url: String) -> Void ){\n    let key = \"ghostbin-\\(text.md5)\"\n    if let ghostbinUrl = Global.Database.stringForKey(key) {\n        complete(url: ghostbinUrl)\n    } else {\n        if Network.isConnectedToNetwork() {\n            let loadingSquare = AASquaresLoading(target: target.view, size: 40)\n            loadingSquare.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.5)\n            loadingSquare.color = UIColor.whiteColor()\n            loadingSquare.start()\n            \n            let url = \"https://ghostbin.com/paste/new\"\n            let paras = [\n                \"lang\": lang,\n                \"text\": text\n            ]\n            \n            Alamofire.request(.POST, url, parameters: paras).response { request, response, data, error in\n                if let url = response?.URL{\n                    loadingSquare.stop()\n                    Global.Database.setValue(url, forKey: key)\n                    complete(url: url.URLString)\n                }\n            }\n        } else {\n            target.view.Toast(message: \"No Network\")\n        }\n    }\n}\n\nfunc timestamp() -> Int {\n    return Int(NSDate().timeIntervalSince1970)\n}\n\n\n\n"
  },
  {
    "path": "Sublime/Sublime/Utils/Github.swift",
    "content": "//\n//  Github.swift\n//  Sublime\n//\n//  Created by Eular on 2/24/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\nimport Foundation\nimport SafariServices\nimport Alamofire\nimport SwiftyJSON\n\nclass GitHubAPIManager {\n\n    private let clientID = Constant.githubClientID\n    private let clientSecret = Constant.githubClientSecret\n    private var OAuthToken: String!\n    private var safariVC: SFSafariViewController?\n    \n    static let sharedInstance = GitHubAPIManager()\n    static let GetOAuthCodeNotifi = \"GetOAuthCodeNotifi\"\n    static let GetUserInfoDoneNotifi = \"GetUserInfoDoneNotifi\"\n    \n    static var isLogin: Bool {\n        set {\n            Global.Database.setBool(newValue, forKey: \"github-islogin\")\n        }\n        get {\n            return Global.Database.boolForKey(\"github-islogin\")\n        }\n    }\n    \n    let githubFolder: Folder!\n    var user: JSON!\n    var delegate: UIViewController? {\n        didSet {\n            self.addObserver(delegate!)\n        }\n    }\n    \n    init() {\n        \n        githubFolder = Folder(path: Constant.SublimeRoot+\"/home/sublime/github\")\n        if !githubFolder.checkFileExist(\"stars\") {\n            githubFolder.newFolder(\"stars\")\n        }\n        if !githubFolder.checkFileExist(\"repositories\") {\n            githubFolder.newFolder(\"repositories\")\n        }\n        \n        \n        if GitHubAPIManager.isLogin {\n            OAuthToken = Global.Database.stringForKey(\"github-oauthtoken\")\n            if let data = Global.Database.objectForKey(\"github-user\") as? NSData {\n                user = JSON(data: data)\n            }\n        } else {\n            OAuthToken = \"\"\n            user = JSON(\"\")\n        }\n    }\n    \n    func OAuth2() {\n        let OAuthURL = \"https://github.com/login/oauth/authorize?scope=user,repo,gist&client_id=\\(clientID)\"\n        safariVC = SFSafariViewController(URL: NSURL(string: OAuthURL)!)\n        safariVC!.modalPresentationStyle = .OverCurrentContext\n        delegate!.presentViewController(safariVC!, animated: true, completion: nil)\n    }\n    \n    func handleOAuthCode(notification: NSNotification) {\n        safariVC!.dismissViewControllerAnimated(true, completion: nil)\n        let info = notification.userInfo as! Dictionary<String, AnyObject>\n        let code = info[\"code\"] as! String\n        getOAuthToken(code)\n    }\n    \n    private func getOAuthToken(code: String) {\n        let TokenURL = \"https://github.com/login/oauth/access_token\"\n        let params = [\"client_id\": clientID, \"client_secret\": clientSecret, \"code\": code]\n        Alamofire.request(.POST, TokenURL, parameters: params).responseString { response in\n            if let str = response.result.value {\n                self.OAuthToken = str.split(\"&\")[0].split(\"=\")[1]\n                Global.Database.setValue(self.OAuthToken, forKey: \"github-oauthtoken\")\n                self.getUserInfo()\n            }\n        }\n    }\n    \n    func getUserInfo() {\n        let url = \"https://api.github.com/user\"\n        let params = [\"access_token\": OAuthToken]\n        Alamofire.request(.GET, url, parameters: params).responseJSON { response in\n            if let data = response.result.value {\n                self.user = JSON(data)\n                Global.Database.setObject(try! self.user.rawData(), forKey: \"github-user\")\n                GitHubAPIManager.isLogin = true\n                Global.Notifi.postNotificationName(GitHubAPIManager.GetUserInfoDoneNotifi, object: nil)\n            }\n        }\n    }\n    \n    func listRepositories(completion: (repos: [Repo]) -> Void) {\n        let url = \"https://api.github.com/user/repos\"\n        let params = [\"access_token\": OAuthToken, \"sort\": \"pushed\"]\n        \n        Alamofire.request(.GET, url, parameters: params).responseJSON { response in\n            if let data = response.result.value {\n                var repos = [Repo]()\n                for (_, r) in JSON(data) {\n                    repos.append(Repo(json: r))\n                }\n                completion(repos: repos)\n            }\n        }\n    }\n    \n    func listStarred(completion: (repos: [Repo]) -> Void) {\n        let url = \"https://api.github.com/user/starred\"\n        let params = [\"access_token\": OAuthToken]\n        \n        Alamofire.request(.GET, url, parameters: params).responseJSON { response in\n            if let data = response.result.value {\n                var repos = [Repo]()\n                for (_, r) in JSON(data) {\n                    repos.append(Repo(json: r))\n                }\n                completion(repos: repos)\n            }\n        }\n    }\n    \n    func logout() {\n        GitHubAPIManager.isLogin = false\n        Global.Database.setValue(\"\", forKey: \"github-oauthtoken\")\n        Global.Database.setValue(\"\", forKey: \"github-user\")\n    }\n    \n    private func addObserver(observer: UIViewController) {\n        // ----------------- Rewrite Code Later -----------------\n        Global.Notifi.addObserver(observer, selector: #selector(GithubAccountTableViewController.githubOAuthCode(_:)), name: GitHubAPIManager.GetOAuthCodeNotifi, object: nil)\n        Global.Notifi.addObserver(observer, selector: #selector(GithubAccountTableViewController.githubGetUserInfoCompleted), name: GitHubAPIManager.GetUserInfoDoneNotifi, object: nil)\n    }\n    \n    static func handleURL(url: NSURL) {\n        if url.host == \"githubLogin\" {\n            Global.Notifi.postNotificationName(GitHubAPIManager.GetOAuthCodeNotifi, object: nil, userInfo: [\"code\": url.query!.split(\"=\")[1]])\n        }\n    }\n    \n    func star(owner: String, repo: String, success: (() -> Void)? = nil, fail: (() -> Void)? = nil) {\n        let url = \"https://api.github.com/user/starred/\\(owner)/\\(repo)\"\n        let headers = [\"Authorization\": \"token \" + OAuthToken]\n        \n        Alamofire.request(.PUT, url, headers: headers).response { result in\n            let response = result.1\n            if let code = response?.statusCode {\n                if code == 204 {\n                    success?()\n                } else {\n                    fail?()\n                }\n            }\n        }\n    }\n    \n    func follow(user: String, success: (() -> Void)? = nil, fail: (() -> Void)? = nil) {\n        let url = \"https://api.github.com/user/following/\\(user)\"\n        let headers = [\"Authorization\": \"token \" + OAuthToken]\n        \n        Alamofire.request(.PUT, url, headers: headers).response { result in\n            let response = result.1\n            if let code = response?.statusCode {\n                if code == 204 {\n                    success?()\n                } else {\n                    fail?()\n                }\n            }\n        }\n    }\n    \n    func listGists(completion: ((gists: [Gist]) -> Void)? = nil) {\n        let url = \"https://api.github.com/gists/public\"\n        \n        Alamofire.request(.GET, url).responseJSON { response in\n            if let data = response.result.value {\n                var gists = [Gist]()\n                for (_, r) in JSON(data) {\n                    if r[\"owner\"] != nil && r[\"files\"] != nil {\n                        gists.append(Gist(json: r))\n                    }\n                }\n                completion?(gists: gists)\n            }\n        }\n    }\n}\n\nprotocol GithubAPIManagerDelegate {\n    // return OAuth code\n    func githubOAuthCode(notification: NSNotification)\n    // get user info complete\n    func githubGetUserInfoCompleted()\n}\n\n\n"
  },
  {
    "path": "Sublime/Sublime/Utils/Log.swift",
    "content": "//\n//  Log.swift\n//  Sublime\n//\n//  Created by Eular on 4/20/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\n// MARK: - Log\nfunc Log<T>(message: T, file: String = #file, function: String = #function, line: Int = #line) {\n    // Executed only on simulator\n    #if arch(i386) || arch(x86_64)\n        print(\"\\(file.lastPathComponent)[\\(line)], \\(function): \\(message)\")\n    #endif\n}"
  },
  {
    "path": "Sublime/Sublime/Utils/Network.swift",
    "content": "//\n//  Network.swift\n//  Sublime\n//\n//  Created by Eular on 2/29/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\nimport SystemConfiguration\n\nstruct Network {\n    \n    // MARK: - Get IP Address\n    // Need: #include <ifaddrs.h>\n    static func getIFAddresses() -> [String] {\n        var addresses = [String]()\n        \n        // Get list of all interfaces on the local machine:\n        var ifaddr : UnsafeMutablePointer<ifaddrs> = nil\n        if getifaddrs(&ifaddr) == 0 {\n            \n            // For each interface ...\n            var ptr = ifaddr\n            while ptr != nil {\n                let flags = Int32(ptr.memory.ifa_flags)\n                var addr = ptr.memory.ifa_addr.memory\n                \n                // Check for running IPv4, IPv6 interfaces. Skip the loopback interface.\n                if (flags & (IFF_UP|IFF_RUNNING|IFF_LOOPBACK)) == (IFF_UP|IFF_RUNNING) {\n                    // addr.sa_family == UInt8(AF_INET) || addr.sa_family == UInt8(AF_INET6)\n                    if addr.sa_family == UInt8(AF_INET) {\n                        \n                        // Convert interface address to a human readable string:\n                        var hostname = [CChar](count: Int(NI_MAXHOST), repeatedValue: 0)\n                        if (getnameinfo(&addr, socklen_t(addr.sa_len), &hostname, socklen_t(hostname.count),\n                            nil, socklen_t(0), NI_NUMERICHOST) == 0) {\n                            if let address = String.fromCString(hostname) {\n                                addresses.append(address)\n                            }\n                        }\n                    }\n                }\n                \n                ptr = ptr.memory.ifa_next\n            }\n            freeifaddrs(ifaddr)\n        }\n        \n        return addresses\n    }\n    \n    // MARK: - Checking the network availability\n    static func isConnectedToNetwork() -> Bool {\n        var zeroAddress = sockaddr_in()\n        zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))\n        zeroAddress.sin_family = sa_family_t(AF_INET)\n        \n        guard let defaultRouteReachability = withUnsafePointer(&zeroAddress, {\n            SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))\n        }) else {\n            return false\n        }\n        \n        var flags : SCNetworkReachabilityFlags = []\n        if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) {\n            return false\n        }\n        \n        let isReachable = flags.contains(.Reachable)\n        let needsConnection = flags.contains(.ConnectionRequired)\n        return (isReachable && !needsConnection)\n    }\n}"
  },
  {
    "path": "Sublime/Sublime/Utils/NumberedTextView.swift",
    "content": "//\n//  NumberedTextView.swift\n//  Sublime\n//\n//  Created by Eular on 5/3/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\nclass NumberedTextView: UITextView {\n    \n    init(frame: CGRect) {\n        super.init(frame: frame, textContainer: nil)\n        self.frame.origin.y = -7\n        self.frame.size.height += 7\n        self.backgroundColor = RGB(52, 53, 46)\n        self.editable = false\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    let lineAttr = [NSForegroundColorAttributeName: UIColor.whiteColor()]\n    let lineNumAttr = [\n        NSForegroundColorAttributeName: UIColor.grayColor(),\n        NSBackgroundColorAttributeName: RGB(39, 40, 34)\n    ]\n    \n    override var text: String! {\n        didSet {\n            let tmp = NSMutableAttributedString()\n            \n            for (i, line) in text.split(\"\\n\").enumerate() {\n                let attrLineNum = NSMutableAttributedString(string: \"\\(i)\\t\", attributes: lineNumAttr)\n                let attrLine = NSMutableAttributedString(string: \"\\(line)\\n\", attributes: lineAttr)\n                tmp.appendAttributedString(attrLineNum)\n                tmp.appendAttributedString(attrLine)\n            }\n            \n            self.attributedText = tmp\n            self.contentOffset = CGPoint(x: 0, y: 0)\n        }\n    }\n    \n}"
  },
  {
    "path": "Sublime/Sublime/Utils/Obj-C/MusicWave.h",
    "content": "//\n//  MusicWave.h\n//  Sublime\n//\n//  Created by Eular on 2/21/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import <EZAudio/EZAudio.h>\n#import <ZLMusicFlowWaveView/ZLMusicFlowWaveView.h>\n#import <AVFoundation/AVFoundation.h>\n\n@interface MusicWave : UIViewController <EZAudioPlayerDelegate>\n@property (nonatomic,strong) EZAudioPlayer *audioPlayer;\n@property (nonatomic,strong) NSURL *audioUrl;\n-(void) start;\n@end\n"
  },
  {
    "path": "Sublime/Sublime/Utils/Obj-C/MusicWave.m",
    "content": "//\n//  MusicWave.m\n//  Sublime\n//\n//  Created by Eular on 2/21/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\n#import \"MusicWave.h\"\n\n#define RGB(r,g,b) [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:1.0f]\n\n@interface MusicWave ()\n@property (nonatomic,strong) ZLMusicFlowWaveView *audioPlot;\n@end\n\n@implementation MusicWave\n\n#pragma mark - Initialization\n-(id)init {\n    self = [super init];\n    if(self){\n        [self initializeViewController];\n    }\n    return self;\n}\n\n-(id)initWithCoder:(NSCoder *)aDecoder {\n    self = [super initWithCoder:aDecoder];\n    if(self){\n        [self initializeViewController];\n    }\n    return self;\n}\n\n#pragma mark - Initialize View Controller Here\n-(void)initializeViewController {\n    // Create an instance of the microphone and tell it to use this view controller instance as the delegate\n}\n\n#pragma mark - Customize the Audio Plot\n-(void)viewDidLoad {\n    [super viewDidLoad];\n    // 1. 设置并激活音频会话类别\n    AVAudioSession *session = [AVAudioSession sharedInstance];\n    NSError *error;\n    [session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];\n    if (error) {\n        NSLog(@\"Error setting up audio session category: %@\", error.localizedDescription);\n    }\n    [session setActive:YES error:&error];\n    if (error) {\n        NSLog(@\"Error setting up audio session active: %@\", error.localizedDescription);\n    }\n    // 2. 允许应用程序接收远程控制\n    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];\n    // 3. 设置后台任务ID\n    UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid;\n    newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];\n    \n    if (![self isHeadsetPluggedIn]) {\n        [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:NULL];\n        if(error){\n            NSLog(@\"There was an error sending the audio to the speakers\");\n        }\n    }\n    \n    // set plot\n    self.audioPlot = [[ZLMusicFlowWaveView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 64)];\n    self.audioPlot.backgroundColor = RGB(81, 81, 81);\n    self.audioPlot.color = RGB(255, 255, 255);\n    [self.view addSubview:self.audioPlot];\n}\n\n- (BOOL)isHeadsetPluggedIn {\n    AVAudioSessionRouteDescription* route = [[AVAudioSession sharedInstance] currentRoute];\n    for (AVAudioSessionPortDescription* desc in [route outputs]) {\n        if ([[desc portType] isEqualToString:AVAudioSessionPortHeadphones])\n            return YES;\n    }\n    return NO;\n}\n\n-(void)start {\n    self.audioPlayer = [[EZAudioPlayer alloc] initWithURL:self.audioUrl withDelegate:self];\n    self.audioPlayer.shouldLoop = YES;\n    [self.audioPlayer play];\n}\n\n-(void)audioPlayer:(EZAudioPlayer *)audioPlayer readAudio:(float **)buffer withBufferSize:(UInt32)bufferSize withNumberOfChannels:(UInt32)numberOfChannels inAudioFile:(EZAudioFile *)audioFile {\n    dispatch_async(dispatch_get_main_queue(),^{\n        // All the audio plot needs is the buffer data (float*) and the size. Internally the audio plot will handle all the drawing related code, history management, and freeing its own resources. Hence, one badass line of code gets you a pretty plot :)\n        [self.audioPlot updateBuffer:buffer[0] withBufferSize:bufferSize];\n    });\n}\n\n@end\n"
  },
  {
    "path": "Sublime/Sublime/Utils/Obj-C/ObjC.h",
    "content": "//\n//  ObjC.h\n//  Sublime\n//\n//  Created by Eular on 5/6/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n#import <Foundation/Foundation.h>\n#include <sys/socket.h>\n#include <net/if.h>\n#import <SystemConfiguration/CaptiveNetwork.h>\n#include <objc/runtime.h>\n#import <ifaddrs.h>\n#import <arpa/inet.h>\n#import <NetworkExtension/NEHotspotHelper.h>\n\n@interface ObjC : NSObject\n+(NSString*) SSID;\n+(NSString*) BSSID;\n+(NSArray*) getAppList;\n+(NSDictionary*) getDataFlowBytes;\n@end"
  },
  {
    "path": "Sublime/Sublime/Utils/Obj-C/ObjC.m",
    "content": "//\n//  ObjC.m\n//  Sublime\n//\n//  Created by Eular on 5/6/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\n#import \"ObjC.h\"\n\n\n@implementation ObjC\n\n+(NSString*) iOS9_SSID {\n    for(NEHotspotNetwork *hotspotNetwork in [NEHotspotHelper supportedNetworkInterfaces]) {\n        NSString *ssid = hotspotNetwork.SSID;\n        //NSString *bssid = hotspotNetwork.BSSID;\n        //BOOL secure = hotspotNetwork.secure;\n        //BOOL autoJoined = hotspotNetwork.autoJoined;\n        //double signalStrength = hotspotNetwork.signalStrength;\n        return ssid;\n    }\n    return @\"No WIFI Connection\";\n}\n\n// http://bencoding.com/2015/08/04/captivenetwork-depreciated-in-ios9/\n\n+(NSString*) SSID {\n#if TARGET_IPHONE_SIMULATOR\n    return @\"Simulator\";\n#else\n    NSString * informationUnknown = @\"No WIFI Connection\";\n    CFArrayRef interfaces = CNCopySupportedInterfaces();//supportedNetworkInterfaces\n    if(interfaces == nil){\n        return informationUnknown;\n    }\n    CFIndex count = CFArrayGetCount(interfaces);\n    if(count == 0){\n        return informationUnknown;\n    }\n    CFDictionaryRef captiveNtwrkDict =\n    CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(interfaces, 0));\n    NSDictionary *dict = ( __bridge NSDictionary*) captiveNtwrkDict;\n    CFRelease(interfaces);\n    \n    return (([dict objectForKey:@\"SSID\"]==nil)? informationUnknown : [dict objectForKey:@\"SSID\"]);\n#endif\n}\n\n+(NSString*) BSSID {\n#if TARGET_IPHONE_SIMULATOR\n    return @\"Simulator\";\n#else\n    NSString * informationUnknown = @\"unknown\";\n    CFArrayRef interfaces = CNCopySupportedInterfaces();\n    if(interfaces == nil){\n        return informationUnknown;\n    }\n    CFIndex count = CFArrayGetCount(interfaces);\n    if(count == 0){\n        return informationUnknown;\n    }\n    CFDictionaryRef captiveNtwrkDict =\n    CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(interfaces, 0));\n    NSDictionary *dict = ( __bridge NSDictionary*) captiveNtwrkDict;\n    CFRelease(interfaces);\n    \n    return (([dict objectForKey:@\"BSSID\"]==nil)? informationUnknown : [dict objectForKey:@\"BSSID\"]);\n#endif\n}\n\n\n+(NSDictionary*) getDataFlowBytes {\n    NSString *const DataCounterKeyWWANSent = @\"WWANSent\";\n    NSString *const DataCounterKeyWWANReceived = @\"WWANReceived\";\n    NSString *const DataCounterKeyWiFiSent = @\"WiFiSent\";\n    NSString *const DataCounterKeyWiFiReceived = @\"WiFiReceived\";\n    \n    struct ifaddrs *addrs;\n    const struct ifaddrs *cursor;\n    \n    u_int32_t WiFiSent = 0;\n    u_int32_t WiFiReceived = 0;\n    u_int32_t WWANSent = 0;\n    u_int32_t WWANReceived = 0;\n    \n    if (getifaddrs(&addrs) == 0) {\n        cursor = addrs;\n        while (cursor != NULL)\n        {\n            if (cursor->ifa_addr->sa_family == AF_LINK)\n            {\n                /*\n                 const struct if_data *ifa_data = (struct if_data *)cursor->ifa_data;\n                 if(ifa_data != NULL)\n                 {\n                 NSLog(@\"Interface name %s: sent %tu received %tu\",cursor->ifa_name,ifa_data->ifi_obytes,ifa_data->ifi_ibytes);\n                 }\n                 */\n                \n                // name of interfaces:\n                // en0 is WiFi (provides network bytes exchanges and not just internet)\n                // lo0 is WiFi\n                // pdp_ip0 is WWAN\n                NSString *name = [NSString stringWithFormat:@\"%s\",cursor->ifa_name];\n                if ([name hasPrefix:@\"en\"])\n                {\n                    const struct if_data *ifa_data = (struct if_data *)cursor->ifa_data;\n                    if(ifa_data != NULL)\n                    {\n                        WiFiSent += ifa_data->ifi_obytes;\n                        WiFiReceived += ifa_data->ifi_ibytes;\n                    }\n                }\n                if ([name hasPrefix:@\"pdp_ip\"])\n                {\n                    const struct if_data *ifa_data = (struct if_data *)cursor->ifa_data;\n                    if(ifa_data != NULL)\n                    {\n                        WWANSent += ifa_data->ifi_obytes;\n                        WWANReceived += ifa_data->ifi_ibytes;\n                    }\n                }\n            }\n            cursor = cursor->ifa_next;\n        }\n        freeifaddrs(addrs);\n    }\n    \n    return @{DataCounterKeyWiFiSent:[NSNumber numberWithUnsignedInt:WiFiSent],\n             DataCounterKeyWiFiReceived:[NSNumber numberWithUnsignedInt:WiFiReceived],\n             DataCounterKeyWWANSent:[NSNumber numberWithUnsignedInt:WWANSent],\n             DataCounterKeyWWANReceived:[NSNumber numberWithUnsignedInt:WWANReceived]};\n}\n\n\n+ (NSArray*) getAppList {\n    Class LSApplicationWorkspace_class = objc_getClass(\"LSApplicationWorkspace\");\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wundeclared-selector\"\n    NSObject* workspace = [LSApplicationWorkspace_class performSelector:@selector(defaultWorkspace)];\n    NSArray* app = [workspace performSelector:@selector(allApplications)];\n#pragma clang diagnostic pop\n    // NSLog(@\"apps: %@\", app);\n    return app;\n}\n\n@end\n\n"
  },
  {
    "path": "Sublime/Sublime/Utils/Plist.swift",
    "content": "//\n//  Plist.swift\n//  Sublime\n//\n//  Created by Eular on 3/31/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\nstruct Plist {\n    enum PlistError: ErrorType {\n        case FileNotWritten\n        case FileDoesNotExist\n    }\n    \n    let name: String\n    let path: String\n    \n    init(path: String) {\n        self.path = path\n        self.name = path.lastPathComponent\n        \n        if !NSFileManager.defaultManager().fileExistsAtPath(path) {\n            let f = Folder(path: path.stringByDeletingLastPathComponent)\n            f.newFile(name)\n        }\n    }\n    \n    func getDictInPlistFile() -> NSDictionary? {\n        guard let dict = NSDictionary(contentsOfFile: path) else { return .None }\n        return dict\n    }\n    \n    func getMutableDictInPlistFile() -> NSMutableDictionary? {\n        guard let dict = NSMutableDictionary(contentsOfFile: path) else { return .None }\n        return dict\n    }\n    \n    func getArrayInPlistFile() -> NSArray? {\n        guard let arr = NSArray(contentsOfFile: path) else { return .None }\n        return arr\n    }\n    \n    func getMutableArrayInPlistFile() -> NSMutableArray? {\n        guard let arr = NSMutableArray(contentsOfFile: path) else { return .None }\n        return arr\n    }\n    \n    func saveToPlistFile(any: AnyObject) throws {\n        if !any.writeToFile(path, atomically: false) {\n            throw PlistError.FileNotWritten\n        }\n    }\n    \n    func appendToPlistFile(any: AnyObject) throws {\n        if let arr = getMutableArrayInPlistFile() {\n            arr.addObject(any)\n            if !arr.writeToFile(path, atomically: false) {\n                throw PlistError.FileNotWritten\n            }\n        } else {\n            if !NSArray(array: [any]).writeToFile(path, atomically: false) {\n                throw PlistError.FileNotWritten\n            }\n        }\n    }\n}"
  },
  {
    "path": "Sublime/Sublime/Utils/PopupMenu.swift",
    "content": "//\n//  PopupMenu.swift\n//  Sublime\n//\n//  Created by Eular on 5/3/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\nprotocol PopupMenuDelegate {\n    func tapOnPopupMenuItem(itemIndex i: Int)\n}\n\nclass PopupMenu {\n    var delegate: PopupMenuDelegate?\n    var controller: UIViewController?\n    var itemsToShare: [AnyObject] = []\n    var items: [[String:String]] = []\n    \n    private var menu: UIView?\n    private var mask: UIView?\n    \n    private let defaultItem = [\"title\":\"更多\", \"image\":\"Share_more_icon\"]\n    private let itemNumInRow: Int\n    private let menuColor = Constant.PopupMenuColor\n    private let maskColor = Constant.BlackMaskViewColor\n    \n    init(itemNumInRow: Int = 4) {\n        self.itemNumInRow = itemNumInRow\n        self.items = [\n            [\"title\":\"QQ\", \"image\":\"Share_qq_icon\"],\n            [\"title\":\"新浪微博\", \"image\":\"Share_sina_icon\"],\n            [\"title\":\"微信\", \"image\":\"Share_wechat_session_icon\"],\n            [\"title\":\"朋友圈\", \"image\":\"Share_wechat_timeline_icon\"],\n            [\"title\":\"Facebook\", \"image\":\"Share_facebook_icon\"],\n            [\"title\":\"Line\", \"image\":\"Share_line_icon\"],\n            [\"title\":\"Instagram\", \"image\":\"Share_instagram\"],\n            [\"title\":\"Twitter\", \"image\":\"Share_twitter_icon\"],\n            [\"title\":\"QQ空间\", \"image\":\"Share_qzone_icon\"],\n            [\"title\":\"Pinterest\", \"image\":\"Share_pinterest_icon\"],\n            [\"title\":\"豆瓣\", \"image\":\"Share_douban_icon\"]\n        ]\n    }\n    \n    @objc func showUp() {\n        let window = controller?.view.window\n        let width = window?.width ?? 0\n        let hight = window?.height ?? 0\n        \n        var menuItems = items\n        menuItems << defaultItem\n        \n        let rowNum = (menuItems.count - 1) / itemNumInRow + 1\n        let itemWidth = width / itemNumInRow\n        let rowHight = itemWidth\n        let menuHight = rowHight * rowNum\n        \n        let popupMenu = UIView()\n        popupMenu.backgroundColor = menuColor\n        popupMenu.frame = CGRectMake(0, hight, width, menuHight)\n        \n        // Insert item label into menu\n        for (i, item) in menuItems.enumerate() {\n            let btn = UIButton()\n            btn.frame = CGRectMake(itemWidth * (i % itemNumInRow), rowHight * (i / itemNumInRow), itemWidth, rowHight)\n            btn.setImage(UIImage(named: item[\"image\"] ?? defaultItem[\"image\"]!), forState: .Normal)\n            btn.tag = i\n            btn.addTarget(self, action: #selector(tapOnPopupMenuItem(_:)), forControlEvents: .TouchUpInside)\n            popupMenu.addSubview(btn)\n        }\n        \n        // Black the below view\n        let blackMaskView = UIView(frame: window?.frame ?? CGRectZero)\n        blackMaskView.backgroundColor = maskColor\n        blackMaskView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tapOnBlackMaskView)))\n        \n        window?.addSubview(blackMaskView)\n        window?.addSubview(popupMenu)\n        \n        self.menu = popupMenu\n        self.mask = blackMaskView\n        \n        UIView.animateWithDuration(0.3) { () -> Void in\n            popupMenu.y -= menuHight\n        }\n    }\n    \n    @objc private func tapOnBlackMaskView() {\n        dismissPopupMenu()\n    }\n    \n    @objc private func tapOnPopupMenuItem(btn: UIButton) {\n        dismissPopupMenu {\n            if btn.tag == self.items.count {\n                let activityVC = UIActivityViewController(activityItems: self.itemsToShare, applicationActivities: nil)\n                self.controller?.presentViewController(activityVC, animated: true, completion: nil)\n            } else {\n                self.delegate?.tapOnPopupMenuItem(itemIndex: btn.tag)\n            }\n        }\n    }\n    \n    private func dismissPopupMenu(completion: (() -> Void)? = nil) {\n        if let popupMenu = self.menu, blackMaskView = self.mask {\n            UIView.animateWithDuration(0.3, animations: { () -> Void in\n                popupMenu.y += popupMenu.height\n            }, completion: { (_) -> Void in\n                popupMenu.removeFromSuperview()\n                blackMaskView.removeFromSuperview()\n                completion?()\n            })\n        }\n    }\n}\n"
  },
  {
    "path": "Sublime/Sublime/Utils/QRCode.swift",
    "content": "//\n//  QRCode.swift\n//  Sublime\n//\n//  Created by Eular on 4/1/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\nimport CoreGraphics\n\nclass QRCode {\n    func make(str: String, size: CGFloat = 250) -> UIImage {\n        let qrcode = createNonInterpolatedUIImageFormCIImage(createQRForString(str), withSize: size)\n        return qrcode\n    }\n    \n    func makeWithColor(str: String, size: CGFloat = 250, R: CGFloat = 60, G: CGFloat = 74, B: CGFloat = 89) -> UIImage {\n        let qrcode = createNonInterpolatedUIImageFormCIImage(createQRForString(str), withSize: size)\n        let customQrcode = imageBlackToTransparent(qrcode, red: R, green: G, blue: B)\n        return customQrcode\n    }\n    \n    func hasQRCode(img: UIImage) -> Bool {\n        let ciImg = CIImage(image: img)\n        let context = CIContext(options: nil)\n        let detector = CIDetector(ofType: CIDetectorTypeQRCode, context: context, options: [CIDetectorAccuracy:CIDetectorAccuracyHigh])\n        let features = detector.featuresInImage(ciImg!)\n        return features.count != 0\n    }\n    \n    func read(img: UIImage) -> String? {\n        let ciImg = CIImage(image: img)\n        let context = CIContext(options: nil)\n        let detector = CIDetector(ofType: CIDetectorTypeQRCode, context: context, options: [CIDetectorAccuracy:CIDetectorAccuracyHigh])\n        let features = detector.featuresInImage(ciImg!)\n        \n        if features.count != 0 {\n            return (features[0] as! CIQRCodeFeature).messageString\n        } else {\n            return nil\n        }\n    }\n    \n    private func createQRForString(QRStr: String) -> CIImage {\n        // Need to convert the string to a UTF-8 encoded NSData object\n        let strData = QRStr.dataUsingEncoding(NSUTF8StringEncoding)\n        // Create the filter\n        let qrFilter = CIFilter(name: \"CIQRCodeGenerator\")!\n        // Set the message content and error-correction level\n        qrFilter.setValue(strData, forKey: \"inputMessage\")\n        qrFilter.setValue(\"M\", forKey: \"inputCorrectionLevel\")\n        // Send the image back\n        return qrFilter.outputImage!\n    }\n    \n    private func createNonInterpolatedUIImageFormCIImage(image: CIImage, withSize size: CGFloat) -> UIImage {\n        let extent = CGRectIntegral(image.extent)\n        let scale = min(size / extent.width, size / extent.height)\n        // create a bitmap image that we'll draw into a bitmap context at the desired size;\n        let width = extent.width * scale\n        let height = extent.height * scale\n        let cs = CGColorSpaceCreateDeviceGray()\n        let bitmapRef = CGBitmapContextCreate(nil, Int(width), Int(height), 8, 0, cs, CGImageAlphaInfo.None.rawValue)\n        let context = CIContext(options: nil)\n        let bitmapImage = context.createCGImage(image, fromRect: extent)\n        CGContextSetInterpolationQuality(bitmapRef, .None)\n        CGContextScaleCTM(bitmapRef, scale, scale)\n        CGContextDrawImage(bitmapRef, extent, bitmapImage)\n        // Create an image with the contents of our bitmap\n        let scaledImage = CGBitmapContextCreateImage(bitmapRef)\n        // Cleanup\n        // CGContext instances are automatically memory managed in Swift\n        return UIImage(CGImage: scaledImage!)\n    }\n    \n    private func imageBlackToTransparent(image: UIImage, red: CGFloat, green: CGFloat, blue: CGFloat) -> UIImage {\n        let imageWidth = Int(image.size.width)\n        let imageHeight = Int(image.size.height)\n        let bytesPerRow = imageWidth * 4\n        \n        let rgbImageBuf = UnsafeMutablePointer<UInt32>.alloc(imageWidth * imageHeight)\n        \n        // create context\n        let colorSpace = CGColorSpaceCreateDeviceRGB()\n        let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.NoneSkipLast.rawValue | CGBitmapInfo.ByteOrder32Little.rawValue)\n        let context = CGBitmapContextCreate(rgbImageBuf, imageWidth, imageHeight, 8, bytesPerRow, colorSpace, bitmapInfo.rawValue)\n        CGContextDrawImage(context, CGRect(origin: CGPointZero, size: image.size), image.CGImage)\n        \n        // traverse pixe\n        let pixelNum = imageWidth * imageHeight;\n        var pCurPtr = UnsafeMutablePointer<UInt32>(rgbImageBuf)\n        \n        var i = 0\n        while i < pixelNum {\n            if ((pCurPtr.memory & 0xFFFFFF00) < 0x99999900){\n                // change color\n                let ptr = (UnsafeMutablePointer<UInt8>)(pCurPtr)\n                ptr[3] = UInt8(red)\n                ptr[2] = UInt8(green)\n                ptr[1] = UInt8(blue)\n            }else{\n                let ptr = UnsafeMutablePointer<UInt8>(pCurPtr)\n                ptr[0] = 0;\n            }\n            \n            i += 1\n            pCurPtr += 1\n        }\n        \n        let dataProvider = CGDataProviderCreateWithData(nil, rgbImageBuf, bytesPerRow * imageHeight, nil)\n        let imageRef = CGImageCreate(imageWidth, imageHeight, 8, 32, bytesPerRow, colorSpace, bitmapInfo, dataProvider, nil, true, CGColorRenderingIntent.RenderingIntentDefault)\n        let resultImage = UIImage(CGImage: imageRef!)\n        \n        return resultImage\n    }\n}\n"
  },
  {
    "path": "Sublime/Sublime/Utils/QRCodeReader.swift",
    "content": "//\n//  QRCodeReader.swift\n//  Sublime\n//\n//  Created by Eular on 5/4/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\nimport AVFoundation\nimport AudioToolbox\n\nclass QRCodeReaderViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {\n    var captureSession: AVCaptureSession?\n    var videoPreviewLayer: AVCaptureVideoPreviewLayer?\n    var qrCodeFrameView: UIView?\n    let messageLabel = UILabel()\n    var isQRCodeRecognized: Bool = false\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        title = \"QRCode\"\n        \n        let captureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)\n        \n        let input: AVCaptureInput\n        do {\n            input = try AVCaptureDeviceInput(device: captureDevice)\n        } catch { return }\n        \n        captureSession = AVCaptureSession()\n        captureSession?.addInput(input)\n        \n        // Initialize a AVCaptureMetadataOutput object and set it as the output device to the capture session\n        let captureMetadataOutput = AVCaptureMetadataOutput()\n        captureSession?.addOutput(captureMetadataOutput)\n        \n        // Set delegate and use the default dispatch queue to execute the call back\n        captureMetadataOutput.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())\n        captureMetadataOutput.metadataObjectTypes = [AVMetadataObjectTypeQRCode]\n        \n        // Initialize the video preview layer and add it as a sublayer to the viewPreview view's layer\n        videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)\n        videoPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill\n        videoPreviewLayer?.frame = view.layer.bounds\n        view.layer.addSublayer(videoPreviewLayer!)\n        \n        // Initialize QR Code Frame to highlight the QR code\n        qrCodeFrameView = UIView()\n        qrCodeFrameView?.frame = CGRectMake(0, 0, 230, 230)\n        qrCodeFrameView?.center = view.center\n        qrCodeFrameView?.y -= Constant.NavigationBarOffset\n        qrCodeFrameView?.layer.borderColor = UIColor.whiteColor().CGColor\n        qrCodeFrameView?.layer.borderWidth = 1\n        view.addSubview(qrCodeFrameView!)\n        view.bringSubviewToFront(qrCodeFrameView!)\n        \n        // Initialize qrcode result label\n        messageLabel.frame = CGRectMake(0, view.height - Constant.NavigationBarOffset - 40, view.width, 40)\n        messageLabel.backgroundColor = Constant.BlackMaskViewColor\n        messageLabel.textColor = UIColor.whiteColor()\n        messageLabel.textAlignment = .Center\n        messageLabel.font = UIFont.systemFontOfSize(15)\n        messageLabel.numberOfLines = 2\n        messageLabel.text = \"No QR code is detected\"\n        view.addSubview(messageLabel)\n        \n        // Start video capture.\n        captureSession?.startRunning()\n    }\n    \n    override func viewWillAppear(animated: Bool) {\n        isQRCodeRecognized = false\n    }\n    \n    func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {\n        \n        if !isQRCodeRecognized {\n            // Check if the metadataObjects array is not nil and it contains at least one object.\n            if metadataObjects == nil || metadataObjects.count == 0 {\n                messageLabel.text = \"No QR code is detected\"\n                return\n            }\n            \n            // Get the metadata object.\n            let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject\n            \n            if metadataObj.type == AVMetadataObjectTypeQRCode {\n                // If the found metadata is equal to the QR code metadata then update the status label's text and set the bounds\n                /*\n                 let barCodeObject =\n                 videoPreviewLayer?.transformedMetadataObjectForMetadataObject(metadataObj) as!\n                 AVMetadataMachineReadableCodeObject\n                 qrCodeFrameView?.frame = barCodeObject.bounds\n                 */\n                \n                if let qrStr = metadataObj.stringValue {\n                    isQRCodeRecognized = true\n                    messageLabel.text = qrStr\n                    \n                    \n                    var mySound: SystemSoundID = 0\n                    \n                    if let url = NSBundle.mainBundle().URLForResource(\"qrcode_scan\", withExtension: \"wav\") {\n                        AudioServicesCreateSystemSoundID(url, &mySound)\n                        AudioServicesPlaySystemSound(mySound)\n                    }\n                    \n                    if let url = NSURL(string: qrStr) {\n                        let svc = SublimeSafari(URL: url)\n                        navigationController?.pushViewController(svc, animated: true)\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Sublime/Sublime/Utils/RCIM.swift",
    "content": "//\n//  RCIM.swift\n//  Sublime\n//\n//  Created by Eular on 3/23/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\nimport Alamofire\n\n// RongCloud\nextension RCIM {\n    \n    func Login() {\n        if let token = Global.Database.stringForKey(\"RongCloud-UserToken\") {\n            let user = GitHubAPIManager.sharedInstance.user\n            let name = user[\"name\"].string\n            let portrait = user[\"avatar_url\"].string\n            \n            RCIM.sharedRCIM().connectWithToken(token,\n                success: { (userId) -> Void in\n                    Log(\"登陆成功。当前登录的用户ID：\\(userId)\")\n                    RCIM.sharedRCIM().currentUserInfo = RCUserInfo.init(userId: userId, name: name ?? userId, portrait: portrait ?? Constant.RongCloudDefaultUserPortrait)\n                }, error: { (status) -> Void in\n                    Log(\"登陆的错误码为: \\(status.rawValue)\")\n                }, tokenIncorrect: {\n                    Log(\"token错误\")\n                    self.getTokenAndLogin()\n            })\n        } else {\n            Log(\"用户token不存在\")\n        }\n    }\n    \n    private func makeHeaders() -> [String: String] {\n        let appkey = Constant.RongCloudAppKey\n        let appSecret = Constant.RongCloudAppSecret\n        let nonce = String(random())\n        let ts = String(timestamp())\n        let signature = (appSecret + nonce + ts).sha1\n        let headers = [\"App-Key\": appkey, \"Nonce\": nonce, \"Timestamp\": ts, \"Signature\": signature]\n        return headers\n    }\n    \n    func getToken(id: String, name: String, portrait: String, complete: () -> ()) {\n        let url = \"https://api.cn.rong.io/user/getToken.json\"\n        let params = [\"userId\": id, \"name\": name, \"portraitUri\": portrait]\n        let headers = makeHeaders()\n        \n        Alamofire.request(.POST, url, parameters: params, headers: headers).responseJSON { response in\n            if let data = response.result.value {\n                if let token = data.stringForKey(\"token\") {\n                    Log(\"获取Token成功: \\(token)\")\n                    Global.Database.setValue(token, forKey: \"RongCloud-UserToken\")\n                    complete()\n                }\n            }\n        }\n    }\n    \n    func getInfo(id: String, complete: (String, String) -> ()) {\n        \n        if let info = Global.Database.objectForKey(\"RongCloud-User-\\(id)\") {\n            let name = info.stringForKey(\"name\")!\n            let portrait = info.stringForKey(\"portrait\")!\n            complete(name, portrait)\n            return\n        }\n        \n        let url = \"https://api.cn.rong.io/user/info.json\"\n        let params = [\"userId\": id]\n        let headers = makeHeaders()\n        \n        Alamofire.request(.POST, url, parameters: params, headers: headers).responseJSON { response in\n            if let data = response.result.value {\n                Log(\"获取用户信息成功: \\(data)\")\n                \n                let name = data.stringForKey(\"userName\") ?? id\n                let portrait = data.stringForKey(\"userPortrait\") ?? Constant.RongCloudDefaultUserPortrait\n                Global.Database.setObject([\"name\": name, \"portrait\": portrait], forKey: \"RongCloud-User-\\(id)\")\n                complete(name, portrait)\n            }\n        }\n    }\n    \n    func getTokenAndLogin() {\n        let user = GitHubAPIManager.sharedInstance.user\n        let id = user[\"login\"].string!\n        let name = user[\"name\"].string ?? id\n        let portrait = user[\"avatar_url\"].string ?? Constant.RongCloudDefaultUserPortrait\n        \n        getToken(id, name: name, portrait: portrait, complete: Login)\n    }\n}\n\n"
  },
  {
    "path": "Sublime/Sublime/Utils/RearrangeTable.swift",
    "content": "//\n//  RearrangeTable.swift\n//  Sublime\n//\n//  Created by Eular on 5/3/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\nprotocol RearrangeTableViewDelegate {\n    func rearrangeTableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath)\n//    override func rearrangeTableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) {\n//        let temp = fileList[toIndexPath.row]\n//        fileList[toIndexPath.row] = fileList[fromIndexPath.row]\n//        fileList[fromIndexPath.row] = temp\n//        tableView.moveRowAtIndexPath(fromIndexPath, toIndexPath: toIndexPath)\n//    }\n}\n\nclass RearrangeTableViewController: UITableViewController {\n    \n    private var sourceIndexPath: NSIndexPath?\n    private var snapView: UIView?\n    var delegate: RearrangeTableViewDelegate?\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        tableView.addGestureRecognizer(UILongPressGestureRecognizer(target: self, action: #selector(self.handleLongPress(_:))))\n    }\n    \n    private func snapView(view: UIView) -> UIImageView {\n        UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, 0)\n        view.layer.renderInContext(UIGraphicsGetCurrentContext()!)\n        let image = UIGraphicsGetImageFromCurrentImageContext()\n        UIGraphicsEndImageContext()\n        \n        let snapShot = UIImageView(image: image)\n        snapShot.layer.masksToBounds = false;\n        snapShot.layer.cornerRadius = 0;\n        snapShot.layer.shadowOffset = CGSizeMake(-5.0, 0.0);\n        snapShot.layer.shadowOpacity = 0.4;\n        snapShot.layer.shadowRadius = 5;\n        snapShot.frame = view.frame\n        return snapShot\n    }\n    \n    func handleLongPress(longPress: UILongPressGestureRecognizer) {\n        let point = longPress.locationInView(tableView)\n        \n        if let indexPath = tableView.indexPathForRowAtPoint(point) {\n            switch longPress.state {\n            case .Began:\n                if let cell = tableView.cellForRowAtIndexPath(indexPath) {\n                    sourceIndexPath = indexPath\n                    let snapView = self.snapView(cell)\n                    snapView.alpha = 0\n                    self.snapView = snapView\n                    tableView.addSubview(snapView)\n                    \n                    UIView.animateWithDuration(0.25, animations: {\n                        // 选中Cell跳出放大效果\n                        snapView.alpha = 0.95\n                        snapView.center = CGPointMake(cell.center.x, point.y)\n                        snapView.transform = CGAffineTransformMakeScale(1.05, 1.05)\n                        \n                        cell.alpha = 0\n                        }, completion: { (_) -> Void in\n                            cell.hidden = true\n                            cell.alpha = 1\n                    })\n                } else {\n                    sourceIndexPath = nil\n                    snapView = nil\n                }\n            case .Changed:\n                if let snapView = snapView {\n                    // 截图随手指上下移动\n                    snapView.center = CGPointMake(snapView.center.x, point.y)\n                }\n                \n                // 如果手指移动到一个新的Cell上面，隐藏Cell跟此Cell交换位置\n                if let fromIndexPath = sourceIndexPath {\n                    if fromIndexPath != indexPath {\n                        tableView.beginUpdates()\n                        \n                        delegate?.rearrangeTableView(tableView, moveRowAtIndexPath: fromIndexPath, toIndexPath: indexPath)\n                        \n                        tableView.endUpdates()\n                        sourceIndexPath = indexPath\n                    }\n                }\n                \n                // 手指移动到屏幕顶端或底部，UITableView自动滚动\n                let step: CGFloat = 64\n                if let parentView = tableView.superview {\n                    let parentPos = tableView.convertPoint(point, toView: parentView)\n                    if parentPos.y > parentView.bounds.height - step {\n                        var offset = tableView.contentOffset\n                        offset.y += (parentPos.y - parentView.bounds.height + step)\n                        if offset.y > tableView.contentSize.height - tableView.bounds.height {\n                            offset.y = tableView.contentSize.height - tableView.bounds.height\n                        }\n                        tableView.setContentOffset(offset, animated: false)\n                    } else if parentPos.y <= step {\n                        var offset = tableView.contentOffset\n                        offset.y -= (step - parentPos.y)\n                        if offset.y < 0 {\n                            offset.y = 0\n                        }\n                        tableView.setContentOffset(offset, animated: false)\n                    }\n                }\n            default:\n                if let snapView = snapView, let fromIndexPath = sourceIndexPath, let cell = tableView.cellForRowAtIndexPath(fromIndexPath) {\n                    cell.alpha = 0\n                    cell.hidden = false\n                    \n                    // 长按移动结束，隐藏的Cell恢复显示，删除截图\n                    UIView.animateWithDuration(0.25, animations: { () -> Void in\n                        snapView.center = cell.center\n                        snapView.alpha = 0\n                        cell.alpha = 1\n                        }, completion: { [unowned self] (_) -> Void in\n                            snapView.removeFromSuperview()\n                            self.snapView = nil\n                            self.sourceIndexPath = nil\n                            self.tableView.performSelector(#selector(UITableView.reloadData), withObject: nil, afterDelay: 0.5)\n                        })\n                }\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "Sublime/Sublime/Utils/ShareToWeixin.swift",
    "content": "//\n//  ShareToWeixin.swift\n//  Sublime\n//\n//  Created by Eular on 2/18/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\nimport Foundation\n\n// MARK: - 微信分享\nextension UIViewController {\n    // MARK: - 分享链接\n    func WXShareLink(title: String, desc: String, img: String, link: String, isTimeline: Bool = false) {\n        if WXApi.isWXAppInstalled() {\n            let message = WXMediaMessage()\n            message.title = title\n            message.description = desc\n            message.setThumbImage(UIImage(named: img))\n            let ext = WXWebpageObject()\n            ext.webpageUrl = link\n            message.mediaObject = ext\n            let req =  SendMessageToWXReq()\n            req.bText = false\n            req.message = message\n            req.scene = isTimeline ? Int32(WXSceneTimeline.rawValue) : Int32(WXSceneSession.rawValue)\n            WXApi.sendReq(req)\n        } else {\n            _WXIsNotInstallAlert()\n        }\n    }\n    \n    // MARK: - 分享图片\n    func WXShareImage(image: UIImage, isTimeline: Bool = false) {\n        if WXApi.isWXAppInstalled() {\n            let message = WXMediaMessage()\n            \n            let imageObject = WXImageObject()\n            imageObject.imageData = UIImagePNGRepresentation(image)\n            message.mediaObject = imageObject\n            \n            //图片缩略图\n            let width: CGFloat = 240\n            let height = width * image.size.height / image.size.width\n            UIGraphicsBeginImageContext(CGSizeMake(width, height))\n            image.drawInRect(CGRectMake(0, 0, width, height))\n            message.setThumbImage(UIGraphicsGetImageFromCurrentImageContext())\n            UIGraphicsEndImageContext()\n            \n            let req = SendMessageToWXReq()\n            req.bText = false\n            req.message = message\n            req.scene = isTimeline ? Int32(WXSceneTimeline.rawValue) : Int32(WXSceneSession.rawValue)\n            WXApi.sendReq(req)\n        } else {\n            _WXIsNotInstallAlert()\n        }\n    }\n    \n    // MARK: - 分享文字\n    func WXShareText(text: String, isTimeline: Bool = false) {\n        if WXApi.isWXAppInstalled() {\n            let req = SendMessageToWXReq()\n            req.bText = true\n            req.text = text\n            req.scene = isTimeline ? Int32(WXSceneTimeline.rawValue) : Int32(WXSceneSession.rawValue)\n            WXApi.sendReq(req)\n        } else {\n            _WXIsNotInstallAlert()\n        }\n    }\n    \n    // MARK: - 分享音乐\n    func WXShareMusic(name: String, singer: String, img: String, url: String, isTimeline: Bool = false) {\n        if WXApi.isWXAppInstalled() {\n            let message = WXMediaMessage()\n            message.title = name\n            message.description = singer\n            message.setThumbImage(UIImage(named: img))\n            \n            let music = WXMusicObject()\n            music.musicUrl = url\n            music.musicDataUrl = url\n            message.mediaObject = music\n            \n            let req = SendMessageToWXReq()\n            req.bText = false\n            req.message = message\n            req.scene = isTimeline ? Int32(WXSceneTimeline.rawValue) : Int32(WXSceneSession.rawValue)\n            WXApi.sendReq(req)\n        } else {\n            _WXIsNotInstallAlert()\n        }\n    }\n    \n    // MARK: - 分享视频\n    func WXShareVideo(title: String, desc: String, img: String, url: String, isTimeline: Bool = false) {\n        if WXApi.isWXAppInstalled() {\n            let message = WXMediaMessage()\n            message.title = title\n            message.description = desc\n            message.setThumbImage(UIImage(named: img))\n            \n            let video = WXVideoObject()\n            video.videoUrl = url\n            message.mediaObject = video\n            \n            let req = SendMessageToWXReq()\n            req.bText = false\n            req.message = message\n            req.scene = isTimeline ? Int32(WXSceneTimeline.rawValue) : Int32(WXSceneSession.rawValue)\n            WXApi.sendReq(req)\n        } else {\n            _WXIsNotInstallAlert()\n        }\n    }\n    \n    // MARK: - 分享表情，包括gif\n    func WXShareEmoticon(emotPath: String, isTimeline: Bool = false) {\n        if WXApi.isWXAppInstalled() {\n            let message = WXMediaMessage()\n            message.setThumbImage(UIImage(contentsOfFile: emotPath))\n            \n            let emot = WXEmoticonObject()\n            emot.emoticonData = NSData(contentsOfFile: emotPath)\n            message.mediaObject = emot\n            \n            let req = SendMessageToWXReq()\n            req.bText = false\n            req.message = message\n            req.scene = isTimeline ? Int32(WXSceneTimeline.rawValue) : Int32(WXSceneSession.rawValue)\n            WXApi.sendReq(req)\n        } else {\n            _WXIsNotInstallAlert()\n        }\n    }\n    \n    // MARK: - 分享文件\n    func WXShareFile(title: String, desc: String, file: File, isTimeline: Bool = false) {\n        if WXApi.isWXAppInstalled() {\n            let message = WXMediaMessage()\n            message.title = title\n            message.description = desc\n            message.setThumbImage(UIImage(named: file.img))\n            \n            let fobj = WXFileObject()\n            fobj.fileExtension = file.ext\n            fobj.fileData = file.data\n            message.mediaObject = fobj\n            \n            let req = SendMessageToWXReq()\n            req.bText = false\n            req.message = message\n            req.scene = isTimeline ? Int32(WXSceneTimeline.rawValue) : Int32(WXSceneSession.rawValue)\n            WXApi.sendReq(req)\n        } else {\n            _WXIsNotInstallAlert()\n        }\n    }\n    \n    func WXLogin() {\n        let req: SendAuthReq = SendAuthReq()\n        req.scope = \"snsapi_userinfo,snsapi_base\"\n        WXApi.sendReq(req)\n    }\n    \n    // MARK: - 私有方法\n    private func _WXIsNotInstallAlert() {\n        let alert = UIAlertController(title: \"Share Fail\", message: \"Wechat app is not installed!\", preferredStyle: .Alert)\n        alert.addAction(UIAlertAction(title: \"OK\", style: .Default, handler: nil))\n        presentViewController(alert, animated: true, completion: nil)\n    }\n}"
  },
  {
    "path": "Sublime/Sublime/Utils/SublimeTable.swift",
    "content": "//\n//  SublimeTable.swift\n//  Sublime\n//\n//  Created by Eular on 5/5/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\n\nclass SublimeTable: UITableViewController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n    }\n\n    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {\n        return 0\n    }\n\n    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return 0\n    }\n\n}\n"
  },
  {
    "path": "Sublime/Sublime/Utils/UnitTest.swift",
    "content": "//\n//  UnitTest.swift\n//  Sublime\n//\n//  Created by Eular on 2/18/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\nimport UIKit\nimport Foundation\n\n// MARK: - Unit Test\n\n/*\nlet test_str = \"hello Urinx 521\"\nlet test_arr = [1, 2, 3, 4]\nlet test_dict = [\"a\":1, \"b\":2]\n\n// String.count -> Int\nassert(test_str.count == 15)\n\n// lower & upper\nassert(test_str.islower == false)\nassert(test_str.upper == \"HELLO URINX 521\")\n\n// String[n] -> Character\nassert(test_str[1] == \"e\")\nassert(test_str[-1] == \"1\")\n\n// String[m,n] -> String\nassert(test_str[6,-1] == \"Urinx 52\")\nassert(test_str[nil,2] == \"he\")\nassert(test_str[7,nil] == \"rinx 521\")\n\n// String[range] -> String\nassert(test_str[0...2] == \"hel\")\n\n// String.count() -> Int\nassert(test_str.count(\"lo\") == 1)\n\n// String.has() -> Bool\nassert(test_str.has(\"he\") == true)\n\n// String.hasAny() -> Bool\nassert(test_str.hasAny([\"aa\",\"bb\",\"cc\"]) == false)\n\n// String.pop() -> Character\nvar tmp = \"abc\"\nassert(tmp.pop() == \"c\")\nassert(tmp == \"ab\")\n\n// String.find() -> Int\nassert(test_str.find(\"U\") == 6)\n\n// String.join() -> String\nassert(\"#\".join([1,2,3]) == \"1#2#3\")\nassert(\"#\".join([\"a\",\"b\",\"c\"]) == \"a#b#c\")\n\n// String.split() -> [String]\nassert(test_str.split(\" \") == [\"hello\", \"Urinx\", \"521\"])\n\n// String.replace() -> String\nvar tmp2 = \"abc\"\nassert(tmp2.replace(\"a\", \"1\") == \"1bc\")\n\n// String.strip() -> String\nassert(\" abcd  \".strip() == \"abcd\")\n\n// String.trim() -> String\nassert(\" a b  \".trim() == \"a b\")\n\n// len() -> Int\nassert(len(test_str) == 15)\nassert(len(test_arr) == 4)\nassert(len(test_dict) == 2)\n\n// range() -> Array<Int>\nassert(range(4) == [0, 1, 2, 3])\nassert(range(1,5) == [1, 2, 3, 4])\nassert(range(10,1,-2) == [10, 8, 6, 4, 2])\n\n// Int + String\nassert(1+\"a\" == \"1a\")\n\n// String * Int\nassert(\"a\" * 3 == \"aaa\")\n\n// Array.shift() or .pop()\nvar arr = [1,2,3]\nassert(arr.shift() == 1)\nassert(arr.pop() == 3)\n\n// random() -> UInt32\nrandom()\nrandom(11)\nrandom(5, 10)\nrandom(0, 10, arrLen: 5)\n*/"
  },
  {
    "path": "Sublime/Sublime/Utils/VideoPlayerTimeView.swift",
    "content": "//\n//  VideoPlayerTimeView.swift\n//  Sublime\n//\n//  Created by Eular on 5/3/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\n\nclass VideoPlayerTimeView: UIView {\n    \n    private let curTimeLabel = UILabel()\n    private let totalTimeLabel = UILabel()\n    private let curTimeLine = UILabel()\n    private let totalTimeLine = UILabel()\n    private var originY: CGFloat!\n    \n    var show: Bool = false {\n        didSet {\n            hidden = !show\n            if show {\n                UIView.animateWithDuration(0.5, animations: {\n                    self.frame.origin.y -= self.frame.height\n                    }, completion: { (_) -> Void in\n                        UIView.animateWithDuration(5) {\n                            self.alpha = 0\n                        }\n                })\n            } else {\n                self.frame.origin.y = originY\n                self.alpha = 0.5\n            }\n        }\n    }\n    \n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        \n        backgroundColor = UIColor.blackColor()\n        alpha = 0.5\n        hidden = true\n        originY = frame.origin.y\n        \n        curTimeLabel.text = \"00:00:00\"\n        totalTimeLabel.text = \"00:00:00\"\n        \n        curTimeLabel.frame = CGRectMake(0, 0, 100, frame.height)\n        totalTimeLabel.frame = CGRectMake(frame.width - 100, 0, 100, frame.height)\n        curTimeLine.frame = CGRectMake(100, 14, 0, 2)\n        totalTimeLine.frame = CGRectMake(100, 14, frame.width - 200, 2)\n        \n        curTimeLabel.textAlignment = .Center\n        totalTimeLabel.textAlignment = .Center\n        \n        curTimeLabel.textColor = UIColor.whiteColor()\n        totalTimeLabel.textColor = UIColor.whiteColor()\n        curTimeLine.backgroundColor = RGB(0, 175, 244)\n        totalTimeLine.backgroundColor = UIColor.whiteColor()\n        \n        addSubview(curTimeLabel)\n        addSubview(totalTimeLabel)\n        addSubview(totalTimeLine)\n        addSubview(curTimeLine)\n    }\n    \n    func setTime(curTime: Double, totalTime: Double) {\n        curTimeLabel.text = curTime.formatedTime(\"HH:mm:ss\")\n        totalTimeLabel.text = totalTime.formatedTime(\"HH:mm:ss\")\n        curTimeLine.frame.size.width = totalTimeLine.frame.width * CGFloat( curTime / totalTime )\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n}"
  },
  {
    "path": "Sublime/Sublime/VideoViewController.swift",
    "content": "//\n//  VideoViewController.swift\n//  Sublime\n//\n//  Created by Eular on 2/19/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport UIKit\nimport AVKit\nimport AVFoundation\n\nclass VideoViewController: UIViewController {\n    \n    let popupMenu = PopupMenu()\n    \n    var curFile: File!\n    var player: AVPlayer!\n    var playerLayer: AVPlayerLayer!\n    var isPlay: Bool {\n        return player?.rate == 1.0\n    }\n    var isFullScreen: Bool = false {\n        didSet {\n            navigationController?.setNavigationBarHidden(isFullScreen, animated: true)\n            tabBarController?.tabBar.hidden = isFullScreen\n            playerTimeView.show = isFullScreen && !isPlay\n        }\n    }\n    \n    let pauseView = UIView()\n    var pauseViewFrame: CGRect {\n        if isFullScreen {\n            return CGRectMake((view.width - 200) / 2, (view.height - 200) / 2, 200, 200)\n        } else {\n            return CGRectMake(0, (view.height - 200) / 2, view.width, 200)\n        }\n    }\n    \n    var playerTimeView: VideoPlayerTimeView!\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        view.backgroundColor = Constant.CapeCod\n        title = curFile.name\n        \n        // 设置分享菜单\n        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Action, target: popupMenu, action: #selector(popupMenu.showUp))\n        popupMenu.controller = self\n        popupMenu.itemsToShare = [curFile.url]\n        \n        player = AVPlayer(URL: curFile.url)\n        playerLayer = AVPlayerLayer(player: player)\n        playerLayer.frame = self.view.frame\n        playerLayer.frame.size.height -= Constant.NavigationBarOffset\n        self.view.layer.addSublayer(playerLayer)\n        \n        let oneTap = UITapGestureRecognizer(target: self, action: #selector(self.handleOneTapGesture(_:)))\n        pauseView.frame = pauseViewFrame\n        pauseView.frame.size.height -= Constant.NavigationBarOffset\n        pauseView.addGestureRecognizer(oneTap)\n        view.addSubview(pauseView)\n        \n        let doubleTap = UITapGestureRecognizer(target: self, action: #selector(self.handleDoubleTapGesture(_:)))\n        doubleTap.numberOfTapsRequired = 2\n        view.addGestureRecognizer(doubleTap)\n        \n        playerTimeView = VideoPlayerTimeView(frame: CGRectMake( 0, view.width, view.height, 30))\n        view.addSubview(playerTimeView)\n        \n        let lastPlayTime = Global.Database.doubleForKey(\"video-\\(curFile.name.md5)\")\n        player.seekToTime(CMTimeMakeWithSeconds(lastPlayTime, 600))\n        player.play()\n    }\n    \n    func handleOneTapGesture(sender: UITapGestureRecognizer) {\n        if isPlay {\n            player.pause()\n        } else {\n            player.play()\n        }\n        \n        let playerItem = player.currentItem!\n        playerTimeView.setTime(playerItem.currentTime().seconds, totalTime: playerItem.duration.seconds)\n        playerTimeView.show = isFullScreen && !isPlay\n\n    }\n    \n    func handleDoubleTapGesture(sender: UITapGestureRecognizer) {\n        isFullScreen = !isFullScreen\n        if isFullScreen {\n            UIDevice.currentDevice().setValue(UIInterfaceOrientation.LandscapeLeft.rawValue, forKey: \"orientation\")\n        } else {\n            UIDevice.currentDevice().setValue(UIInterfaceOrientation.Portrait.rawValue, forKey: \"orientation\")\n            tabBarController?.tabBar.hidden = true\n        }\n        playerLayer.frame = self.view.bounds\n        pauseView.frame = pauseViewFrame\n    }\n    \n    override func viewWillDisappear(animated: Bool) {\n        player.pause()\n        let key = \"video-\\(curFile.name.md5)\"\n        let playerItem = player.currentItem!\n        if CMTimeGetSeconds(playerItem.duration - playerItem.currentTime()) < 0.1 {\n            Global.Database.setDouble(0, forKey: key)\n        } else {\n            Global.Database.setDouble(playerItem.currentTime().seconds, forKey: key)\n        }\n    }\n    \n    override func shouldAutorotate() -> Bool {\n        return true\n    }\n}\n\n//        let player = AVPlayer(URL: curFile.url)\n//        let playerController = AVPlayerViewController()\n//        playerController.player = player\n//        self.addChildViewController(playerController)\n//        self.view.addSubview(playerController.view)\n//        playerController.view.frame = CGRectMake(0, 200, 320, 200)\n//        player.play()"
  },
  {
    "path": "Sublime/Sublime/Web/404.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no\"/>\n<meta charset=\"utf-8\">\n<title>Sublime Text</title>\n<style type=\"text/css\">\n*{\n\tmargin: 0;\n\tpadding: 0;\n}\nbody{\n\tbackground: #253238;\n\tcolor: #fff;\n\tdisplay: flex;\n\tflex-direction: column;\n}\nh1{\n\tmargin: 10vh auto;\n\twidth: 300px;\n\ttext-align: center;\n\tfont-size: 3em;\n}\nul{\n\tborder: 1px solid white;\n\twidth: 70vw;\n\t/*height: 50vh;*/\n\tmargin: auto;\n\tpadding: 10px 10px 10px 50px;\n\tfont-size: 2em;\n}\nli{\n\tmargin: 5vh auto;\n}\nspan{\n\tcolor: #00AFF4;\n}\n/* on mobile */\n@media only screen and (max-width : 400px) {\n\th1{\n\t\tmargin: 7vh auto;\n\t\tfont-size: 2em;\n\t}\n\tul{\n\t\tfont-size: 1.2em;\n\t\tpadding-left: 40px;\n\t}\n\tli{\n\t\tmargin: 10px auto;\n\t}\n}\n</style>\n</head>\n<body>\n<h1>Sublime Text</h1>\n<ul>\n<li>This is default 404 page and it will shows up when there is no page in the current path.</li>\n<li>The server root folder is located at <span>/var/www/</span>, you can put all your HTML, js, css files into there.</li>\n<li>Remind, PHP file is not support now.</li>\n</ul>\n</body>\n</html>"
  },
  {
    "path": "Sublime/Sublime/Web/README.txt",
    "content": "A Pen created at CodePen.io. You can find this one at http://codepen.io/frxnz/pen/kqGaI.\n\n "
  },
  {
    "path": "Sublime/Sublime/Web/index.html",
    "content": "<!DOCTYPE html>\n<html >\n<head>\n<meta charset=\"UTF-8\">\n<title>Sublime Text</title>\n<style type=\"text/css\">\n/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\nhtml{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=\"button\"],input[type=\"reset\"],input[type=\"submit\"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=\"checkbox\"],input[type=\"radio\"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=\"number\"]::-webkit-inner-spin-button,input[type=\"number\"]::-webkit-outer-spin-button{height:auto}input[type=\"search\"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=\"search\"]::-webkit-search-cancel-button,input[type=\"search\"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}\n\n/*!\n *  Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n@font-face{font-family:'FontAwesome';src:url('font/fontawesome-webfont.eot');src:url('font/fontawesome-webfont.eot') format('embedded-opentype'),url('font/fontawesome-webfont.woff') format('woff'),url('font/fontawesome-webfont.ttf') format('truetype'),url('font/fontawesome-webfont.svg') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857142858em;text-align:center}.fa-ul{padding-left:0;margin-left:2.142857142857143em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;top:.14285714285714285em;text-align:center}.fa-li.fa-lg{left:-1.8571428571428572em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.fa-rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scale(-1,1);-moz-transform:scale(-1,1);-ms-transform:scale(-1,1);-o-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:\"\\f000\"}.fa-music:before{content:\"\\f001\"}.fa-search:before{content:\"\\f002\"}.fa-envelope-o:before{content:\"\\f003\"}.fa-heart:before{content:\"\\f004\"}.fa-star:before{content:\"\\f005\"}.fa-star-o:before{content:\"\\f006\"}.fa-user:before{content:\"\\f007\"}.fa-film:before{content:\"\\f008\"}.fa-th-large:before{content:\"\\f009\"}.fa-th:before{content:\"\\f00a\"}.fa-th-list:before{content:\"\\f00b\"}.fa-check:before{content:\"\\f00c\"}.fa-times:before{content:\"\\f00d\"}.fa-search-plus:before{content:\"\\f00e\"}.fa-search-minus:before{content:\"\\f010\"}.fa-power-off:before{content:\"\\f011\"}.fa-signal:before{content:\"\\f012\"}.fa-gear:before,.fa-cog:before{content:\"\\f013\"}.fa-trash-o:before{content:\"\\f014\"}.fa-home:before{content:\"\\f015\"}.fa-file-o:before{content:\"\\f016\"}.fa-clock-o:before{content:\"\\f017\"}.fa-road:before{content:\"\\f018\"}.fa-download:before{content:\"\\f019\"}.fa-arrow-circle-o-down:before{content:\"\\f01a\"}.fa-arrow-circle-o-up:before{content:\"\\f01b\"}.fa-inbox:before{content:\"\\f01c\"}.fa-play-circle-o:before{content:\"\\f01d\"}.fa-rotate-right:before,.fa-repeat:before{content:\"\\f01e\"}.fa-refresh:before{content:\"\\f021\"}.fa-list-alt:before{content:\"\\f022\"}.fa-lock:before{content:\"\\f023\"}.fa-flag:before{content:\"\\f024\"}.fa-headphones:before{content:\"\\f025\"}.fa-volume-off:before{content:\"\\f026\"}.fa-volume-down:before{content:\"\\f027\"}.fa-volume-up:before{content:\"\\f028\"}.fa-qrcode:before{content:\"\\f029\"}.fa-barcode:before{content:\"\\f02a\"}.fa-tag:before{content:\"\\f02b\"}.fa-tags:before{content:\"\\f02c\"}.fa-book:before{content:\"\\f02d\"}.fa-bookmark:before{content:\"\\f02e\"}.fa-print:before{content:\"\\f02f\"}.fa-camera:before{content:\"\\f030\"}.fa-font:before{content:\"\\f031\"}.fa-bold:before{content:\"\\f032\"}.fa-italic:before{content:\"\\f033\"}.fa-text-height:before{content:\"\\f034\"}.fa-text-width:before{content:\"\\f035\"}.fa-align-left:before{content:\"\\f036\"}.fa-align-center:before{content:\"\\f037\"}.fa-align-right:before{content:\"\\f038\"}.fa-align-justify:before{content:\"\\f039\"}.fa-list:before{content:\"\\f03a\"}.fa-dedent:before,.fa-outdent:before{content:\"\\f03b\"}.fa-indent:before{content:\"\\f03c\"}.fa-video-camera:before{content:\"\\f03d\"}.fa-picture-o:before{content:\"\\f03e\"}.fa-pencil:before{content:\"\\f040\"}.fa-map-marker:before{content:\"\\f041\"}.fa-adjust:before{content:\"\\f042\"}.fa-tint:before{content:\"\\f043\"}.fa-edit:before,.fa-pencil-square-o:before{content:\"\\f044\"}.fa-share-square-o:before{content:\"\\f045\"}.fa-check-square-o:before{content:\"\\f046\"}.fa-arrows:before{content:\"\\f047\"}.fa-step-backward:before{content:\"\\f048\"}.fa-fast-backward:before{content:\"\\f049\"}.fa-backward:before{content:\"\\f04a\"}.fa-play:before{content:\"\\f04b\"}.fa-pause:before{content:\"\\f04c\"}.fa-stop:before{content:\"\\f04d\"}.fa-forward:before{content:\"\\f04e\"}.fa-fast-forward:before{content:\"\\f050\"}.fa-step-forward:before{content:\"\\f051\"}.fa-eject:before{content:\"\\f052\"}.fa-chevron-left:before{content:\"\\f053\"}.fa-chevron-right:before{content:\"\\f054\"}.fa-plus-circle:before{content:\"\\f055\"}.fa-minus-circle:before{content:\"\\f056\"}.fa-times-circle:before{content:\"\\f057\"}.fa-check-circle:before{content:\"\\f058\"}.fa-question-circle:before{content:\"\\f059\"}.fa-info-circle:before{content:\"\\f05a\"}.fa-crosshairs:before{content:\"\\f05b\"}.fa-times-circle-o:before{content:\"\\f05c\"}.fa-check-circle-o:before{content:\"\\f05d\"}.fa-ban:before{content:\"\\f05e\"}.fa-arrow-left:before{content:\"\\f060\"}.fa-arrow-right:before{content:\"\\f061\"}.fa-arrow-up:before{content:\"\\f062\"}.fa-arrow-down:before{content:\"\\f063\"}.fa-mail-forward:before,.fa-share:before{content:\"\\f064\"}.fa-expand:before{content:\"\\f065\"}.fa-compress:before{content:\"\\f066\"}.fa-plus:before{content:\"\\f067\"}.fa-minus:before{content:\"\\f068\"}.fa-asterisk:before{content:\"\\f069\"}.fa-exclamation-circle:before{content:\"\\f06a\"}.fa-gift:before{content:\"\\f06b\"}.fa-leaf:before{content:\"\\f06c\"}.fa-fire:before{content:\"\\f06d\"}.fa-eye:before{content:\"\\f06e\"}.fa-eye-slash:before{content:\"\\f070\"}.fa-warning:before,.fa-exclamation-triangle:before{content:\"\\f071\"}.fa-plane:before{content:\"\\f072\"}.fa-calendar:before{content:\"\\f073\"}.fa-random:before{content:\"\\f074\"}.fa-comment:before{content:\"\\f075\"}.fa-magnet:before{content:\"\\f076\"}.fa-chevron-up:before{content:\"\\f077\"}.fa-chevron-down:before{content:\"\\f078\"}.fa-retweet:before{content:\"\\f079\"}.fa-shopping-cart:before{content:\"\\f07a\"}.fa-folder:before{content:\"\\f07b\"}.fa-folder-open:before{content:\"\\f07c\"}.fa-arrows-v:before{content:\"\\f07d\"}.fa-arrows-h:before{content:\"\\f07e\"}.fa-bar-chart-o:before{content:\"\\f080\"}.fa-twitter-square:before{content:\"\\f081\"}.fa-facebook-square:before{content:\"\\f082\"}.fa-camera-retro:before{content:\"\\f083\"}.fa-key:before{content:\"\\f084\"}.fa-gears:before,.fa-cogs:before{content:\"\\f085\"}.fa-comments:before{content:\"\\f086\"}.fa-thumbs-o-up:before{content:\"\\f087\"}.fa-thumbs-o-down:before{content:\"\\f088\"}.fa-star-half:before{content:\"\\f089\"}.fa-heart-o:before{content:\"\\f08a\"}.fa-sign-out:before{content:\"\\f08b\"}.fa-linkedin-square:before{content:\"\\f08c\"}.fa-thumb-tack:before{content:\"\\f08d\"}.fa-external-link:before{content:\"\\f08e\"}.fa-sign-in:before{content:\"\\f090\"}.fa-trophy:before{content:\"\\f091\"}.fa-github-square:before{content:\"\\f092\"}.fa-upload:before{content:\"\\f093\"}.fa-lemon-o:before{content:\"\\f094\"}.fa-phone:before{content:\"\\f095\"}.fa-square-o:before{content:\"\\f096\"}.fa-bookmark-o:before{content:\"\\f097\"}.fa-phone-square:before{content:\"\\f098\"}.fa-twitter:before{content:\"\\f099\"}.fa-facebook:before{content:\"\\f09a\"}.fa-github:before{content:\"\\f09b\"}.fa-unlock:before{content:\"\\f09c\"}.fa-credit-card:before{content:\"\\f09d\"}.fa-rss:before{content:\"\\f09e\"}.fa-hdd-o:before{content:\"\\f0a0\"}.fa-bullhorn:before{content:\"\\f0a1\"}.fa-bell:before{content:\"\\f0f3\"}.fa-certificate:before{content:\"\\f0a3\"}.fa-hand-o-right:before{content:\"\\f0a4\"}.fa-hand-o-left:before{content:\"\\f0a5\"}.fa-hand-o-up:before{content:\"\\f0a6\"}.fa-hand-o-down:before{content:\"\\f0a7\"}.fa-arrow-circle-left:before{content:\"\\f0a8\"}.fa-arrow-circle-right:before{content:\"\\f0a9\"}.fa-arrow-circle-up:before{content:\"\\f0aa\"}.fa-arrow-circle-down:before{content:\"\\f0ab\"}.fa-globe:before{content:\"\\f0ac\"}.fa-wrench:before{content:\"\\f0ad\"}.fa-tasks:before{content:\"\\f0ae\"}.fa-filter:before{content:\"\\f0b0\"}.fa-briefcase:before{content:\"\\f0b1\"}.fa-arrows-alt:before{content:\"\\f0b2\"}.fa-group:before,.fa-users:before{content:\"\\f0c0\"}.fa-chain:before,.fa-link:before{content:\"\\f0c1\"}.fa-cloud:before{content:\"\\f0c2\"}.fa-flask:before{content:\"\\f0c3\"}.fa-cut:before,.fa-scissors:before{content:\"\\f0c4\"}.fa-copy:before,.fa-files-o:before{content:\"\\f0c5\"}.fa-paperclip:before{content:\"\\f0c6\"}.fa-save:before,.fa-floppy-o:before{content:\"\\f0c7\"}.fa-square:before{content:\"\\f0c8\"}.fa-bars:before{content:\"\\f0c9\"}.fa-list-ul:before{content:\"\\f0ca\"}.fa-list-ol:before{content:\"\\f0cb\"}.fa-strikethrough:before{content:\"\\f0cc\"}.fa-underline:before{content:\"\\f0cd\"}.fa-table:before{content:\"\\f0ce\"}.fa-magic:before{content:\"\\f0d0\"}.fa-truck:before{content:\"\\f0d1\"}.fa-pinterest:before{content:\"\\f0d2\"}.fa-pinterest-square:before{content:\"\\f0d3\"}.fa-google-plus-square:before{content:\"\\f0d4\"}.fa-google-plus:before{content:\"\\f0d5\"}.fa-money:before{content:\"\\f0d6\"}.fa-caret-down:before{content:\"\\f0d7\"}.fa-caret-up:before{content:\"\\f0d8\"}.fa-caret-left:before{content:\"\\f0d9\"}.fa-caret-right:before{content:\"\\f0da\"}.fa-columns:before{content:\"\\f0db\"}.fa-unsorted:before,.fa-sort:before{content:\"\\f0dc\"}.fa-sort-down:before,.fa-sort-asc:before{content:\"\\f0dd\"}.fa-sort-up:before,.fa-sort-desc:before{content:\"\\f0de\"}.fa-envelope:before{content:\"\\f0e0\"}.fa-linkedin:before{content:\"\\f0e1\"}.fa-rotate-left:before,.fa-undo:before{content:\"\\f0e2\"}.fa-legal:before,.fa-gavel:before{content:\"\\f0e3\"}.fa-dashboard:before,.fa-tachometer:before{content:\"\\f0e4\"}.fa-comment-o:before{content:\"\\f0e5\"}.fa-comments-o:before{content:\"\\f0e6\"}.fa-flash:before,.fa-bolt:before{content:\"\\f0e7\"}.fa-sitemap:before{content:\"\\f0e8\"}.fa-umbrella:before{content:\"\\f0e9\"}.fa-paste:before,.fa-clipboard:before{content:\"\\f0ea\"}.fa-lightbulb-o:before{content:\"\\f0eb\"}.fa-exchange:before{content:\"\\f0ec\"}.fa-cloud-download:before{content:\"\\f0ed\"}.fa-cloud-upload:before{content:\"\\f0ee\"}.fa-user-md:before{content:\"\\f0f0\"}.fa-stethoscope:before{content:\"\\f0f1\"}.fa-suitcase:before{content:\"\\f0f2\"}.fa-bell-o:before{content:\"\\f0a2\"}.fa-coffee:before{content:\"\\f0f4\"}.fa-cutlery:before{content:\"\\f0f5\"}.fa-file-text-o:before{content:\"\\f0f6\"}.fa-building-o:before{content:\"\\f0f7\"}.fa-hospital-o:before{content:\"\\f0f8\"}.fa-ambulance:before{content:\"\\f0f9\"}.fa-medkit:before{content:\"\\f0fa\"}.fa-fighter-jet:before{content:\"\\f0fb\"}.fa-beer:before{content:\"\\f0fc\"}.fa-h-square:before{content:\"\\f0fd\"}.fa-plus-square:before{content:\"\\f0fe\"}.fa-angle-double-left:before{content:\"\\f100\"}.fa-angle-double-right:before{content:\"\\f101\"}.fa-angle-double-up:before{content:\"\\f102\"}.fa-angle-double-down:before{content:\"\\f103\"}.fa-angle-left:before{content:\"\\f104\"}.fa-angle-right:before{content:\"\\f105\"}.fa-angle-up:before{content:\"\\f106\"}.fa-angle-down:before{content:\"\\f107\"}.fa-desktop:before{content:\"\\f108\"}.fa-laptop:before{content:\"\\f109\"}.fa-tablet:before{content:\"\\f10a\"}.fa-mobile-phone:before,.fa-mobile:before{content:\"\\f10b\"}.fa-circle-o:before{content:\"\\f10c\"}.fa-quote-left:before{content:\"\\f10d\"}.fa-quote-right:before{content:\"\\f10e\"}.fa-spinner:before{content:\"\\f110\"}.fa-circle:before{content:\"\\f111\"}.fa-mail-reply:before,.fa-reply:before{content:\"\\f112\"}.fa-github-alt:before{content:\"\\f113\"}.fa-folder-o:before{content:\"\\f114\"}.fa-folder-open-o:before{content:\"\\f115\"}.fa-smile-o:before{content:\"\\f118\"}.fa-frown-o:before{content:\"\\f119\"}.fa-meh-o:before{content:\"\\f11a\"}.fa-gamepad:before{content:\"\\f11b\"}.fa-keyboard-o:before{content:\"\\f11c\"}.fa-flag-o:before{content:\"\\f11d\"}.fa-flag-checkered:before{content:\"\\f11e\"}.fa-terminal:before{content:\"\\f120\"}.fa-code:before{content:\"\\f121\"}.fa-reply-all:before{content:\"\\f122\"}.fa-mail-reply-all:before{content:\"\\f122\"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:\"\\f123\"}.fa-location-arrow:before{content:\"\\f124\"}.fa-crop:before{content:\"\\f125\"}.fa-code-fork:before{content:\"\\f126\"}.fa-unlink:before,.fa-chain-broken:before{content:\"\\f127\"}.fa-question:before{content:\"\\f128\"}.fa-info:before{content:\"\\f129\"}.fa-exclamation:before{content:\"\\f12a\"}.fa-superscript:before{content:\"\\f12b\"}.fa-subscript:before{content:\"\\f12c\"}.fa-eraser:before{content:\"\\f12d\"}.fa-puzzle-piece:before{content:\"\\f12e\"}.fa-microphone:before{content:\"\\f130\"}.fa-microphone-slash:before{content:\"\\f131\"}.fa-shield:before{content:\"\\f132\"}.fa-calendar-o:before{content:\"\\f133\"}.fa-fire-extinguisher:before{content:\"\\f134\"}.fa-rocket:before{content:\"\\f135\"}.fa-maxcdn:before{content:\"\\f136\"}.fa-chevron-circle-left:before{content:\"\\f137\"}.fa-chevron-circle-right:before{content:\"\\f138\"}.fa-chevron-circle-up:before{content:\"\\f139\"}.fa-chevron-circle-down:before{content:\"\\f13a\"}.fa-html5:before{content:\"\\f13b\"}.fa-css3:before{content:\"\\f13c\"}.fa-anchor:before{content:\"\\f13d\"}.fa-unlock-alt:before{content:\"\\f13e\"}.fa-bullseye:before{content:\"\\f140\"}.fa-ellipsis-h:before{content:\"\\f141\"}.fa-ellipsis-v:before{content:\"\\f142\"}.fa-rss-square:before{content:\"\\f143\"}.fa-play-circle:before{content:\"\\f144\"}.fa-ticket:before{content:\"\\f145\"}.fa-minus-square:before{content:\"\\f146\"}.fa-minus-square-o:before{content:\"\\f147\"}.fa-level-up:before{content:\"\\f148\"}.fa-level-down:before{content:\"\\f149\"}.fa-check-square:before{content:\"\\f14a\"}.fa-pencil-square:before{content:\"\\f14b\"}.fa-external-link-square:before{content:\"\\f14c\"}.fa-share-square:before{content:\"\\f14d\"}.fa-compass:before{content:\"\\f14e\"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:\"\\f150\"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:\"\\f151\"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:\"\\f152\"}.fa-euro:before,.fa-eur:before{content:\"\\f153\"}.fa-gbp:before{content:\"\\f154\"}.fa-dollar:before,.fa-usd:before{content:\"\\f155\"}.fa-rupee:before,.fa-inr:before{content:\"\\f156\"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:\"\\f157\"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:\"\\f158\"}.fa-won:before,.fa-krw:before{content:\"\\f159\"}.fa-bitcoin:before,.fa-btc:before{content:\"\\f15a\"}.fa-file:before{content:\"\\f15b\"}.fa-file-text:before{content:\"\\f15c\"}.fa-sort-alpha-asc:before{content:\"\\f15d\"}.fa-sort-alpha-desc:before{content:\"\\f15e\"}.fa-sort-amount-asc:before{content:\"\\f160\"}.fa-sort-amount-desc:before{content:\"\\f161\"}.fa-sort-numeric-asc:before{content:\"\\f162\"}.fa-sort-numeric-desc:before{content:\"\\f163\"}.fa-thumbs-up:before{content:\"\\f164\"}.fa-thumbs-down:before{content:\"\\f165\"}.fa-youtube-square:before{content:\"\\f166\"}.fa-youtube:before{content:\"\\f167\"}.fa-xing:before{content:\"\\f168\"}.fa-xing-square:before{content:\"\\f169\"}.fa-youtube-play:before{content:\"\\f16a\"}.fa-dropbox:before{content:\"\\f16b\"}.fa-stack-overflow:before{content:\"\\f16c\"}.fa-instagram:before{content:\"\\f16d\"}.fa-flickr:before{content:\"\\f16e\"}.fa-adn:before{content:\"\\f170\"}.fa-bitbucket:before{content:\"\\f171\"}.fa-bitbucket-square:before{content:\"\\f172\"}.fa-tumblr:before{content:\"\\f173\"}.fa-tumblr-square:before{content:\"\\f174\"}.fa-long-arrow-down:before{content:\"\\f175\"}.fa-long-arrow-up:before{content:\"\\f176\"}.fa-long-arrow-left:before{content:\"\\f177\"}.fa-long-arrow-right:before{content:\"\\f178\"}.fa-apple:before{content:\"\\f179\"}.fa-windows:before{content:\"\\f17a\"}.fa-android:before{content:\"\\f17b\"}.fa-linux:before{content:\"\\f17c\"}.fa-dribbble:before{content:\"\\f17d\"}.fa-skype:before{content:\"\\f17e\"}.fa-foursquare:before{content:\"\\f180\"}.fa-trello:before{content:\"\\f181\"}.fa-female:before{content:\"\\f182\"}.fa-male:before{content:\"\\f183\"}.fa-gittip:before{content:\"\\f184\"}.fa-sun-o:before{content:\"\\f185\"}.fa-moon-o:before{content:\"\\f186\"}.fa-archive:before{content:\"\\f187\"}.fa-bug:before{content:\"\\f188\"}.fa-vk:before{content:\"\\f189\"}.fa-weibo:before{content:\"\\f18a\"}.fa-renren:before{content:\"\\f18b\"}.fa-pagelines:before{content:\"\\f18c\"}.fa-stack-exchange:before{content:\"\\f18d\"}.fa-arrow-circle-o-right:before{content:\"\\f18e\"}.fa-arrow-circle-o-left:before{content:\"\\f190\"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:\"\\f191\"}.fa-dot-circle-o:before{content:\"\\f192\"}.fa-wheelchair:before{content:\"\\f193\"}.fa-vimeo-square:before{content:\"\\f194\"}.fa-turkish-lira:before,.fa-try:before{content:\"\\f195\"}.fa-plus-square-o:before{content:\"\\f196\"}\n\n/* http://ux.nowsecure.com/css/nowsecure.css */\nmeta.foundation-version{font-family:\"/5.5.0/\"}meta.foundation-mq-small{font-family:\"/only screen/\";width:0}meta.foundation-mq-small-only{font-family:\"/only screen and (max-width: 40em)/\";width:0}meta.foundation-mq-medium{font-family:\"/only screen and (min-width:40.063em)/\";width:40.063em}meta.foundation-mq-medium-only{font-family:\"/only screen and (min-width:40.063em) and (max-width:64em)/\";width:40.063em}meta.foundation-mq-large{font-family:\"/only screen and (min-width:64.063em)/\";width:64.063em}meta.foundation-mq-large-only{font-family:\"/only screen and (min-width:64.063em) and (max-width:90em)/\";width:64.063em}meta.foundation-mq-xlarge{font-family:\"/only screen and (min-width:90.063em)/\";width:90.063em}meta.foundation-mq-xlarge-only{font-family:\"/only screen and (min-width:90.063em) and (max-width:120em)/\";width:90.063em}meta.foundation-mq-xxlarge{font-family:\"/only screen and (min-width:120.063em)/\";width:120.063em}meta.foundation-data-attribute-namespace{font-family:false}html,body{height:100%}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html,body{font-size:100%}body{background:#fff;color:#222;padding:0;margin:0;font-family:\"Helvetica Neue\",Helvetica,Roboto,Arial,sans-serif;font-weight:normal;font-style:normal;line-height:1.5;position:relative;cursor:auto}a:hover{cursor:pointer}img{max-width:100%;height:auto}img{-ms-interpolation-mode:bicubic}#map_canvas img,#map_canvas embed,#map_canvas object,.map_canvas img,.map_canvas embed,.map_canvas object{max-width:none!important}.left{float:left!important}.right{float:right!important}.clearfix:before,.clearfix:after{content:\" \";display:table}.clearfix:after{clear:both}.hide{display:none!important;visibility:hidden}.invisible{visibility:hidden}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}img{display:inline-block;vertical-align:middle}textarea{height:auto;min-height:50px}select{width:100%}.row{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5rem}.row:before,.row:after{content:\" \";display:table}.row:after{clear:both}.row.collapse>.column,.row.collapse>.columns{padding-left:0;padding-right:0}.row.collapse .row{margin-left:0;margin-right:0}.row .row{width:auto;margin-left:-0.9375rem;margin-right:-0.9375rem;margin-top:0;margin-bottom:0;max-width:none}.row .row:before,.row .row:after{content:\" \";display:table}.row .row:after{clear:both}.row .row.collapse{width:auto;margin:0;max-width:none}.row .row.collapse:before,.row .row.collapse:after{content:\" \";display:table}.row .row.collapse:after{clear:both}.column,.columns{padding-left:.9375rem;padding-right:.9375rem;width:100%;float:left}[class*=\"column\"]+[class*=\"column\"]:last-child{float:right}[class*=\"column\"]+[class*=\"column\"].end{float:left}@media only screen{.small-push-0{position:relative;left:0;right:auto}.small-pull-0{position:relative;right:0;left:auto}.small-push-1{position:relative;left:8.33333%;right:auto}.small-pull-1{position:relative;right:8.33333%;left:auto}.small-push-2{position:relative;left:16.66667%;right:auto}.small-pull-2{position:relative;right:16.66667%;left:auto}.small-push-3{position:relative;left:25%;right:auto}.small-pull-3{position:relative;right:25%;left:auto}.small-push-4{position:relative;left:33.33333%;right:auto}.small-pull-4{position:relative;right:33.33333%;left:auto}.small-push-5{position:relative;left:41.66667%;right:auto}.small-pull-5{position:relative;right:41.66667%;left:auto}.small-push-6{position:relative;left:50%;right:auto}.small-pull-6{position:relative;right:50%;left:auto}.small-push-7{position:relative;left:58.33333%;right:auto}.small-pull-7{position:relative;right:58.33333%;left:auto}.small-push-8{position:relative;left:66.66667%;right:auto}.small-pull-8{position:relative;right:66.66667%;left:auto}.small-push-9{position:relative;left:75%;right:auto}.small-pull-9{position:relative;right:75%;left:auto}.small-push-10{position:relative;left:83.33333%;right:auto}.small-pull-10{position:relative;right:83.33333%;left:auto}.small-push-11{position:relative;left:91.66667%;right:auto}.small-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:.9375rem;padding-right:.9375rem;float:left}.small-1{width:8.33333%}.small-2{width:16.66667%}.small-3{width:25%}.small-4{width:33.33333%}.small-5{width:41.66667%}.small-6{width:50%}.small-7{width:58.33333%}.small-8{width:66.66667%}.small-9{width:75%}.small-10{width:83.33333%}.small-11{width:91.66667%}.small-12{width:100%}.small-offset-0{margin-left:0!important}.small-offset-1{margin-left:8.33333%!important}.small-offset-2{margin-left:16.66667%!important}.small-offset-3{margin-left:25%!important}.small-offset-4{margin-left:33.33333%!important}.small-offset-5{margin-left:41.66667%!important}\n.small-offset-6{margin-left:50%!important}.small-offset-7{margin-left:58.33333%!important}.small-offset-8{margin-left:66.66667%!important}.small-offset-9{margin-left:75%!important}.small-offset-10{margin-left:83.33333%!important}.small-offset-11{margin-left:91.66667%!important}.small-reset-order{margin-left:0;margin-right:0;left:auto;right:auto;float:left}.column.small-centered,.columns.small-centered{margin-left:auto;margin-right:auto;float:none}.column.small-uncentered,.columns.small-uncentered{margin-left:0;margin-right:0;float:left}.column.small-centered:last-child,.columns.small-centered:last-child{float:none}.column.small-uncentered:last-child,.columns.small-uncentered:last-child{float:left}.column.small-uncentered.opposite,.columns.small-uncentered.opposite{float:right}.row.small-collapse>.column,.row.small-collapse>.columns{padding-left:0;padding-right:0}.row.small-collapse .row{margin-left:0;margin-right:0}.row.small-uncollapse>.column,.row.small-uncollapse>.columns{padding-left:.9375rem;padding-right:.9375rem;float:left}}@media only screen and (min-width:40.063em){.medium-push-0{position:relative;left:0;right:auto}.medium-pull-0{position:relative;right:0;left:auto}.medium-push-1{position:relative;left:8.33333%;right:auto}.medium-pull-1{position:relative;right:8.33333%;left:auto}.medium-push-2{position:relative;left:16.66667%;right:auto}.medium-pull-2{position:relative;right:16.66667%;left:auto}.medium-push-3{position:relative;left:25%;right:auto}.medium-pull-3{position:relative;right:25%;left:auto}.medium-push-4{position:relative;left:33.33333%;right:auto}.medium-pull-4{position:relative;right:33.33333%;left:auto}.medium-push-5{position:relative;left:41.66667%;right:auto}.medium-pull-5{position:relative;right:41.66667%;left:auto}.medium-push-6{position:relative;left:50%;right:auto}.medium-pull-6{position:relative;right:50%;left:auto}.medium-push-7{position:relative;left:58.33333%;right:auto}.medium-pull-7{position:relative;right:58.33333%;left:auto}.medium-push-8{position:relative;left:66.66667%;right:auto}.medium-pull-8{position:relative;right:66.66667%;left:auto}.medium-push-9{position:relative;left:75%;right:auto}.medium-pull-9{position:relative;right:75%;left:auto}.medium-push-10{position:relative;left:83.33333%;right:auto}.medium-pull-10{position:relative;right:83.33333%;left:auto}.medium-push-11{position:relative;left:91.66667%;right:auto}.medium-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:.9375rem;padding-right:.9375rem;float:left}.medium-1{width:8.33333%}.medium-2{width:16.66667%}.medium-3{width:25%}.medium-4{width:33.33333%}.medium-5{width:41.66667%}.medium-6{width:50%}.medium-7{width:58.33333%}.medium-8{width:66.66667%}.medium-9{width:75%}.medium-10{width:83.33333%}.medium-11{width:91.66667%}.medium-12{width:100%}.medium-offset-0{margin-left:0!important}.medium-offset-1{margin-left:8.33333%!important}.medium-offset-2{margin-left:16.66667%!important}.medium-offset-3{margin-left:25%!important}.medium-offset-4{margin-left:33.33333%!important}.medium-offset-5{margin-left:41.66667%!important}.medium-offset-6{margin-left:50%!important}.medium-offset-7{margin-left:58.33333%!important}.medium-offset-8{margin-left:66.66667%!important}.medium-offset-9{margin-left:75%!important}.medium-offset-10{margin-left:83.33333%!important}.medium-offset-11{margin-left:91.66667%!important}.medium-reset-order{margin-left:0;margin-right:0;left:auto;right:auto;float:left}.column.medium-centered,.columns.medium-centered{margin-left:auto;margin-right:auto;float:none}.column.medium-uncentered,.columns.medium-uncentered{margin-left:0;margin-right:0;float:left}.column.medium-centered:last-child,.columns.medium-centered:last-child{float:none}.column.medium-uncentered:last-child,.columns.medium-uncentered:last-child{float:left}.column.medium-uncentered.opposite,.columns.medium-uncentered.opposite{float:right}.row.medium-collapse>.column,.row.medium-collapse>.columns{padding-left:0;padding-right:0}.row.medium-collapse .row{margin-left:0;margin-right:0}.row.medium-uncollapse>.column,.row.medium-uncollapse>.columns{padding-left:.9375rem;padding-right:.9375rem;float:left}.push-0{position:relative;left:0;right:auto}.pull-0{position:relative;right:0;left:auto}.push-1{position:relative;left:8.33333%;right:auto}.pull-1{position:relative;right:8.33333%;left:auto}.push-2{position:relative;left:16.66667%;right:auto}.pull-2{position:relative;right:16.66667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.33333%;right:auto}.pull-4{position:relative;right:33.33333%;left:auto}.push-5{position:relative;left:41.66667%;right:auto}.pull-5{position:relative;right:41.66667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.33333%;right:auto}.pull-7{position:relative;right:58.33333%;left:auto}.push-8{position:relative;left:66.66667%;right:auto}\n.pull-8{position:relative;right:66.66667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.33333%;right:auto}.pull-10{position:relative;right:83.33333%;left:auto}.push-11{position:relative;left:91.66667%;right:auto}.pull-11{position:relative;right:91.66667%;left:auto}}@media only screen and (min-width:64.063em){.large-push-0{position:relative;left:0;right:auto}.large-pull-0{position:relative;right:0;left:auto}.large-push-1{position:relative;left:8.33333%;right:auto}.large-pull-1{position:relative;right:8.33333%;left:auto}.large-push-2{position:relative;left:16.66667%;right:auto}.large-pull-2{position:relative;right:16.66667%;left:auto}.large-push-3{position:relative;left:25%;right:auto}.large-pull-3{position:relative;right:25%;left:auto}.large-push-4{position:relative;left:33.33333%;right:auto}.large-pull-4{position:relative;right:33.33333%;left:auto}.large-push-5{position:relative;left:41.66667%;right:auto}.large-pull-5{position:relative;right:41.66667%;left:auto}.large-push-6{position:relative;left:50%;right:auto}.large-pull-6{position:relative;right:50%;left:auto}.large-push-7{position:relative;left:58.33333%;right:auto}.large-pull-7{position:relative;right:58.33333%;left:auto}.large-push-8{position:relative;left:66.66667%;right:auto}.large-pull-8{position:relative;right:66.66667%;left:auto}.large-push-9{position:relative;left:75%;right:auto}.large-pull-9{position:relative;right:75%;left:auto}.large-push-10{position:relative;left:83.33333%;right:auto}.large-pull-10{position:relative;right:83.33333%;left:auto}.large-push-11{position:relative;left:91.66667%;right:auto}.large-pull-11{position:relative;right:91.66667%;left:auto}.column,.columns{position:relative;padding-left:.9375rem;padding-right:.9375rem;float:left}.large-1{width:8.33333%}.large-2{width:16.66667%}.large-3{width:25%}.large-4{width:33.33333%}.large-5{width:41.66667%}.large-6{width:50%}.large-7{width:58.33333%}.large-8{width:66.66667%}.large-9{width:75%}.large-10{width:83.33333%}.large-11{width:91.66667%}.large-12{width:100%}.large-offset-0{margin-left:0!important}.large-offset-1{margin-left:8.33333%!important}.large-offset-2{margin-left:16.66667%!important}.large-offset-3{margin-left:25%!important}.large-offset-4{margin-left:33.33333%!important}.large-offset-5{margin-left:41.66667%!important}.large-offset-6{margin-left:50%!important}.large-offset-7{margin-left:58.33333%!important}.large-offset-8{margin-left:66.66667%!important}.large-offset-9{margin-left:75%!important}.large-offset-10{margin-left:83.33333%!important}.large-offset-11{margin-left:91.66667%!important}.large-reset-order{margin-left:0;margin-right:0;left:auto;right:auto;float:left}.column.large-centered,.columns.large-centered{margin-left:auto;margin-right:auto;float:none}.column.large-uncentered,.columns.large-uncentered{margin-left:0;margin-right:0;float:left}.column.large-centered:last-child,.columns.large-centered:last-child{float:none}.column.large-uncentered:last-child,.columns.large-uncentered:last-child{float:left}.column.large-uncentered.opposite,.columns.large-uncentered.opposite{float:right}.row.large-collapse>.column,.row.large-collapse>.columns{padding-left:0;padding-right:0}.row.large-collapse .row{margin-left:0;margin-right:0}.row.large-uncollapse>.column,.row.large-uncollapse>.columns{padding-left:.9375rem;padding-right:.9375rem;float:left}.push-0{position:relative;left:0;right:auto}.pull-0{position:relative;right:0;left:auto}.push-1{position:relative;left:8.33333%;right:auto}.pull-1{position:relative;right:8.33333%;left:auto}.push-2{position:relative;left:16.66667%;right:auto}.pull-2{position:relative;right:16.66667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.33333%;right:auto}.pull-4{position:relative;right:33.33333%;left:auto}.push-5{position:relative;left:41.66667%;right:auto}.pull-5{position:relative;right:41.66667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.33333%;right:auto}.pull-7{position:relative;right:58.33333%;left:auto}.push-8{position:relative;left:66.66667%;right:auto}.pull-8{position:relative;right:66.66667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.33333%;right:auto}.pull-10{position:relative;right:83.33333%;left:auto}.push-11{position:relative;left:91.66667%;right:auto}.pull-11{position:relative;right:91.66667%;left:auto}}@media only screen{.show-for-small-only,.show-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit!important}\n.hide-for-small-only,.hide-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none!important}.visible-for-small-only,.visible-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static!important;height:auto;width:auto;overflow:visible;clip:auto}.hidden-for-small-only,.hidden-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute!important;height:1px;width:1px;overflow:hidden;clip:rect(1px,1px,1px,1px)}table.show-for-small-only,table.show-for-small-up,table.show-for-small,table.show-for-small-down,table.hide-for-medium-only,table.hide-for-medium-up,table.hide-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table!important}thead.show-for-small-only,thead.show-for-small-up,thead.show-for-small,thead.show-for-small-down,thead.hide-for-medium-only,thead.hide-for-medium-up,thead.hide-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group!important}tbody.show-for-small-only,tbody.show-for-small-up,tbody.show-for-small,tbody.show-for-small-down,tbody.hide-for-medium-only,tbody.hide-for-medium-up,tbody.hide-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group!important}tr.show-for-small-only,tr.show-for-small-up,tr.show-for-small,tr.show-for-small-down,tr.hide-for-medium-only,tr.hide-for-medium-up,tr.hide-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row!important}th.show-for-small-only,td.show-for-small-only,th.show-for-small-up,td.show-for-small-up,th.show-for-small,td.show-for-small,th.show-for-small-down,td.show-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.hide-for-medium-up,td.hide-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell!important}}@media only screen and (min-width:40.063em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit!important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none!important}\n.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static!important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute!important;height:1px;width:1px;overflow:hidden;clip:rect(1px,1px,1px,1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.show-for-medium-only,table.show-for-medium-up,table.show-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table!important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.show-for-medium-only,thead.show-for-medium-up,thead.show-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group!important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.show-for-medium-only,tbody.show-for-medium-up,tbody.show-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group!important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.show-for-medium-only,tr.show-for-medium-up,tr.show-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row!important}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.show-for-medium-only,td.show-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.show-for-medium,td.show-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell!important}}@media only screen and (min-width:64.063em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit!important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none!important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static!important;height:auto;width:auto;overflow:visible;clip:auto}\n.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute!important;height:1px;width:1px;overflow:hidden;clip:rect(1px,1px,1px,1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.show-for-large-only,table.show-for-large-up,table.show-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table!important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.show-for-large-only,thead.show-for-large-up,thead.show-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group!important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.show-for-large-only,tbody.show-for-large-up,tbody.show-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group!important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.show-for-large-only,tr.show-for-large-up,tr.show-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row!important}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.show-for-large-only,td.show-for-large-only,th.show-for-large-up,td.show-for-large-up,th.show-for-large,td.show-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell!important}}@media only screen and (min-width:90.063em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit!important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none!important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static!important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute!important;height:1px;width:1px;overflow:hidden;clip:rect(1px,1px,1px,1px)}\ntable.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.show-for-xlarge-only,table.show-for-xlarge-up,table.show-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table!important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.show-for-xlarge-only,thead.show-for-xlarge-up,thead.show-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group!important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.show-for-xlarge-only,tbody.show-for-xlarge-up,tbody.show-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group!important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.show-for-xlarge-only,tr.show-for-xlarge-up,tr.show-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row!important}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.show-for-xlarge-only,td.show-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.show-for-xlarge,td.show-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell!important}}@media only screen and (min-width:120.063em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.hide-for-xlarge-only,.show-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.show-for-xxlarge-down{display:inherit!important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.show-for-xlarge-only,.hide-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.hide-for-xxlarge-down{display:none!important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.hidden-for-xlarge-only,.visible-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.visible-for-xxlarge-down{position:static!important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.visible-for-xlarge-only,.hidden-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.hidden-for-xxlarge-down{position:absolute!important;height:1px;width:1px;overflow:hidden;clip:rect(1px,1px,1px,1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.hide-for-xlarge-only,table.show-for-xlarge-up,table.hide-for-xlarge,table.hide-for-xlarge-down,table.show-for-xxlarge-only,table.show-for-xxlarge-up,table.show-for-xxlarge,table.show-for-xxlarge-down{display:table!important}\nthead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.hide-for-xlarge-only,thead.show-for-xlarge-up,thead.hide-for-xlarge,thead.hide-for-xlarge-down,thead.show-for-xxlarge-only,thead.show-for-xxlarge-up,thead.show-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group!important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.hide-for-xlarge-only,tbody.show-for-xlarge-up,tbody.hide-for-xlarge,tbody.hide-for-xlarge-down,tbody.show-for-xxlarge-only,tbody.show-for-xxlarge-up,tbody.show-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group!important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.hide-for-xlarge-only,tr.show-for-xlarge-up,tr.hide-for-xlarge,tr.hide-for-xlarge-down,tr.show-for-xxlarge-only,tr.show-for-xxlarge-up,tr.show-for-xxlarge,tr.show-for-xxlarge-down{display:table-row!important}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.hide-for-xlarge-down,td.hide-for-xlarge-down,th.show-for-xxlarge-only,td.show-for-xxlarge-only,th.show-for-xxlarge-up,td.show-for-xxlarge-up,th.show-for-xxlarge,td.show-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell!important}}.show-for-landscape,.hide-for-portrait{display:inherit!important}.hide-for-landscape,.show-for-portrait{display:none!important}table.hide-for-landscape,table.show-for-portrait{display:table!important}thead.hide-for-landscape,thead.show-for-portrait{display:table-header-group!important}tbody.hide-for-landscape,tbody.show-for-portrait{display:table-row-group!important}tr.hide-for-landscape,tr.show-for-portrait{display:table-row!important}td.hide-for-landscape,td.show-for-portrait,th.hide-for-landscape,th.show-for-portrait{display:table-cell!important}@media only screen and (orientation:landscape){.show-for-landscape,.hide-for-portrait{display:inherit!important}.hide-for-landscape,.show-for-portrait{display:none!important}table.show-for-landscape,table.hide-for-portrait{display:table!important}thead.show-for-landscape,thead.hide-for-portrait{display:table-header-group!important}tbody.show-for-landscape,tbody.hide-for-portrait{display:table-row-group!important}tr.show-for-landscape,tr.hide-for-portrait{display:table-row!important}td.show-for-landscape,td.hide-for-portrait,th.show-for-landscape,th.hide-for-portrait{display:table-cell!important}}@media only screen and (orientation:portrait){.show-for-portrait,.hide-for-landscape{display:inherit!important}.hide-for-portrait,.show-for-landscape{display:none!important}table.show-for-portrait,table.hide-for-landscape{display:table!important}thead.show-for-portrait,thead.hide-for-landscape{display:table-header-group!important}tbody.show-for-portrait,tbody.hide-for-landscape{display:table-row-group!important}tr.show-for-portrait,tr.hide-for-landscape{display:table-row!important}td.show-for-portrait,td.hide-for-landscape,th.show-for-portrait,th.hide-for-landscape{display:table-cell!important}}.show-for-touch{display:none!important}.hide-for-touch{display:inherit!important}.touch .show-for-touch{display:inherit!important}.touch .hide-for-touch{display:none!important}table.hide-for-touch{display:table!important}.touch table.show-for-touch{display:table!important}thead.hide-for-touch{display:table-header-group!important}.touch thead.show-for-touch{display:table-header-group!important}tbody.hide-for-touch{display:table-row-group!important}.touch tbody.show-for-touch{display:table-row-group!important}tr.hide-for-touch{display:table-row!important}.touch tr.show-for-touch{display:table-row!important}td.hide-for-touch{display:table-cell!important}.touch td.show-for-touch{display:table-cell!important}th.hide-for-touch{display:table-cell!important}.touch th.show-for-touch{display:table-cell!important}\n@media print{.show-for-print{display:block}.hide-for-print{display:none}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print{display:table-cell!important}th.show-for-print{display:table-cell!important}}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}.text-justify{text-align:justify!important}@media only screen and (max-width:40em){.small-only-text-left{text-align:left!important}.small-only-text-right{text-align:right!important}.small-only-text-center{text-align:center!important}.small-only-text-justify{text-align:justify!important}}@media only screen{.small-text-left{text-align:left!important}.small-text-right{text-align:right!important}.small-text-center{text-align:center!important}.small-text-justify{text-align:justify!important}}@media only screen and (min-width:40.063em) and (max-width:64em){.medium-only-text-left{text-align:left!important}.medium-only-text-right{text-align:right!important}.medium-only-text-center{text-align:center!important}.medium-only-text-justify{text-align:justify!important}}@media only screen and (min-width:40.063em){.medium-text-left{text-align:left!important}.medium-text-right{text-align:right!important}.medium-text-center{text-align:center!important}.medium-text-justify{text-align:justify!important}}@media only screen and (min-width:64.063em) and (max-width:90em){.large-only-text-left{text-align:left!important}.large-only-text-right{text-align:right!important}.large-only-text-center{text-align:center!important}.large-only-text-justify{text-align:justify!important}}@media only screen and (min-width:64.063em){.large-text-left{text-align:left!important}.large-text-right{text-align:right!important}.large-text-center{text-align:center!important}.large-text-justify{text-align:justify!important}}@media only screen and (min-width:90.063em) and (max-width:120em){.xlarge-only-text-left{text-align:left!important}.xlarge-only-text-right{text-align:right!important}.xlarge-only-text-center{text-align:center!important}.xlarge-only-text-justify{text-align:justify!important}}@media only screen and (min-width:90.063em){.xlarge-text-left{text-align:left!important}.xlarge-text-right{text-align:right!important}.xlarge-text-center{text-align:center!important}.xlarge-text-justify{text-align:justify!important}}@media only screen and (min-width:120.063em) and (max-width:99999999em){.xxlarge-only-text-left{text-align:left!important}.xxlarge-only-text-right{text-align:right!important}.xxlarge-only-text-center{text-align:center!important}.xxlarge-only-text-justify{text-align:justify!important}}@media only screen and (min-width:120.063em){.xxlarge-text-left{text-align:left!important}.xxlarge-text-right{text-align:right!important}.xxlarge-text-center{text-align:center!important}.xxlarge-text-justify{text-align:justify!important}}div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}a{color:#008cba;line-height:inherit;text-decoration:none}a:hover,a:focus{color:#0078a0}a img{border:0}p{font-family:inherit;font-size:1rem;font-weight:normal;line-height:1.6;margin-bottom:1.25rem;text-rendering:optimizeLegibility}p.lead{font-size:1.21875rem;line-height:1.6}p aside{font-size:.875rem;font-style:italic;line-height:1.35}h1,h2,h3,h4,h5,h6{color:#222;font-family:\"Helvetica Neue\",Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:normal;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem;text-rendering:optimizeLegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#6f6f6f;font-size:60%;line-height:0}h1{font-size:2.125rem}h2{font-size:1.6875rem}h3{font-size:1.375rem}h4{font-size:1.125rem}h5{font-size:1.125rem}h6{font-size:1rem}.subheader{line-height:1.4;color:#6f6f6f;font-weight:normal;margin-top:.2rem;margin-bottom:.5rem}hr{border:solid #ddd;border-width:1px 0 0;clear:both;height:0;margin:1.25rem 0 1.1875rem}em,i{font-style:italic;line-height:inherit}strong,b{font-weight:bold;line-height:inherit}small{font-size:60%;line-height:inherit}code{background-color:#f8f8f8;border-color:#dfdfdf;border-style:solid;border-width:1px;color:#333;font-family:Consolas,\"Liberation Mono\",Courier,monospace;font-weight:normal;padding:.125rem .3125rem .0625rem}ul,ol,dl{font-family:inherit;font-size:1rem;line-height:1.6;list-style-position:outside;margin-bottom:1.25rem}ul{margin-left:1.1rem}ul li ul,ul li ol{margin-left:1.25rem;margin-bottom:0}ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}ul.square{list-style-type:square;margin-left:1.1rem}ul.circle{list-style-type:circle;margin-left:1.1rem}ul.disc{list-style-type:disc;margin-left:1.1rem}ol{margin-left:1.4rem}ol li ul,ol li ol{margin-left:1.25rem;margin-bottom:0}.no-bullet{list-style-type:none;margin-left:0}.no-bullet li ul,.no-bullet li ol{margin-left:1.25rem;margin-bottom:0;list-style:none}\ndl dt{margin-bottom:.3rem;font-weight:bold}dl dd{margin-bottom:.75rem}abbr,acronym{text-transform:uppercase;font-size:90%;color:#222;cursor:help}abbr{text-transform:none}abbr[title]{border-bottom:1px dotted #ddd}blockquote{margin:0 0 1.25rem;padding:.5625rem 1.25rem 0 1.1875rem;border-left:1px solid #ddd}blockquote cite{display:block;font-size:.8125rem;color:#555}blockquote cite:before{content:\"\\2014 \\0020\"}blockquote cite a,blockquote cite a:visited{color:#555}blockquote,blockquote p{line-height:1.6;color:#6f6f6f}.vcard{display:inline-block;margin:0 0 1.25rem 0;border:1px solid #ddd;padding:.625rem .75rem}.vcard li{margin:0;display:block}.vcard .fn{font-weight:bold;font-size:.9375rem}.vevent .summary{font-weight:bold}.vevent abbr{cursor:default;text-decoration:none;font-weight:bold;border:0;padding:0 .0625rem}@media only screen and (min-width:40.063em){h1,h2,h3,h4,h5,h6{line-height:1.4}h1{font-size:2.75rem}h2{font-size:2.3125rem}h3{font-size:1.6875rem}h4{font-size:1.4375rem}h5{font-size:1.125rem}h6{font-size:1rem}}html,body,div,span,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,abbr,address,cite,code,del,dfn,em,img,ins,kbd,q,samp,small,strong,sub,sup,var,b,i,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,figcaption,figure,footer,header,hgroup,menu,nav,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent}body{line-height:1}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}nav ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none}a{margin:0;padding:0;font-size:100%;vertical-align:baseline;background:transparent}ins{background-color:#ff9;color:#000;text-decoration:none}mark{background-color:#ff9;color:#000;font-style:italic;font-weight:bold}del{text-decoration:line-through}abbr[title],dfn[title]{border-bottom:1px dotted;cursor:help}table{border-collapse:collapse;border-spacing:0}hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:1em 0;padding:0}input,select{vertical-align:middle}[class^=\"icon-\"],[class*=\" icon-\"]{height:32px;width:32px;display:inline-block;fill:currentColor}[class^=\"icon-\"],[class*=\" icon-\"],.icon{height:32px;width:32px;display:inline-block;fill:currentColor}.icon-simple{height:16px;width:16px}.icon-complex{height:64px;width:64px}.diagram-complexity{width:600px;max-width:100%}.imp-download{text-decoration:none}.blue{color:#09f}.lightblue{color:#3cf}.gray{color:#999cab}.orange{color:#ff941a}.blue-bg{background-color:#09f}.lightblue-bg{background-color:#3cf}.lighterblue-bg{background-color:#eafaff}.gray-bg{background-color:#999cab}.lightgray-bg{background-color:#e5e6ea}.lightergray-bg{background-color:#f5f5f6}.green-bg{background-color:#7ecf54}.lightgreen-bg{background-color:#dff3d4}.mediumgray-bg{background-color:#cccdd5}.darkblue-bg{background-color:#262a48}.darkerblue-bg{background-color:#1b1d32}.red-bg{background-color:#ef3444}.orange-bg{background-color:#ff941a}.gold-bg{background-color:#ffc41f}.fill-blue{fill:#09f}.fill-lightblue{fill:#3cf}.fill-gray{fill:#999cab}.fill-lightgray{fill:#e5e6ea}.fill-green{fill:#7ecf54}.fill-darkblue{fill:#262a48}.fill-red{fill:#ef3444}.fill-yellow,.fill-gold{fill:#ffc41f}.fill-white{fill:#fff}.fill-orange{fill:#ff941a}body{font-family:'Lato','Helvetica Neue','Helvetica','Arial',sans-serif;font-weight:400;font-style:normal;height:100%;font-size:17px;font-size:1.0625rem;color:#999cab}html{height:100%}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.wrapper{position:relative;height:100%}a{color:#09f;text-decoration:underline}a:hover,a:focus,a:visited,a:active{color:#09f}a:focus{outline:0}a.button{color:#fff}a.gray,a.gray:hover,a.gray:focus,a.gray:visited,a.gray:active{color:#999cab}table tr td{font-size:.80rem}.link{text-decoration:underline}.smtext{font-size:.7rem}.left{float:left}.right{float:right}.clearfix:before,.clearfix:after{content:\" \";display:table}.clearfix:after{clear:both}.clear{clear:both}.round{border-radius:25px}.nopad{padding:0}.uppercase{text-transform:uppercase}.small-sidebar-margin{margin-left:68px}.wide-sidebar-margin{margin-left:180px}h1{font-family:'Lato','Helvetica Neue','Helvetica','Arial',sans-serif;font-weight:300;font-style:normal;font-size:2.625em;color:#09f;font-style:normal;letter-spacing:1px}h2{font-family:'Lato','Helvetica Neue','Helvetica','Arial',sans-serif;font-weight:400;font-style:normal;text-transform:uppercase;color:#09f;font-size:1rem;letter-spacing:1px}\nh3{font-family:'Lato','Helvetica Neue','Helvetica','Arial',sans-serif;font-weight:400;font-style:italic;font-size:1.125em;line-height:2.063em;color:#999cab;letter-spacing:1px}h4{font-family:'Lato','Helvetica Neue','Helvetica','Arial',sans-serif;font-weight:400;font-style:normal;text-transform:uppercase;font-size:.75em;line-height:1em;color:#999cab;letter-spacing:1px}ul.list{list-style:none;padding:0;margin:0;font-size:16px;color:#3cf;line-height:24px}ul.list li{color:#585e66;padding-left:1em;text-indent:-.7em}ul.list li:before{content:'\\002022';color:#3cf;padding-right:6px}ol{padding:0;margin:0;font-size:16px;color:#3cf;line-height:24px}ol li{list-style-position:inside}ol li span{color:#585e66;padding-left:6px}.row{max-width:100%}.f-dropdown{border-radius:5px;max-width:250px;border-color:#e5e6ea;right:0}.f-dropdown a{font-size:.90rem;color:#262a48;text-transform:none}.f-dropdown:hover{border-radius:5px;border-color:#e5e6ea}.f-dropdown li{padding:7px 10px;text-align:left}.arrow-down{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:6px solid #999cab}.breadcrumb{background:#eafaff;height:60px;line-height:60px;font-size:.85rem}.breadcrumb a.first{margin-left:25px}.breadcrumb a{padding:0 5px;text-decoration:none}.pagination{margin-top:0;width:100%;padding-right:30px;position:relative;bottom:27px}.pagination a{text-decoration:none}.pagination a:hover{color:#262a48}.pagination .next:before{font-size:30px;content:'\\2190';position:relative;padding-right:4px;top:3px}.pagination .previous{float:right}.pagination .previous:after{font-size:30px;content:'\\2192';position:relative;padding-left:4px;top:3px}.f-dropdown{border-radius:5px;max-width:250px;border-color:#e5e6ea;right:0;margin-top:-51px}.f-dropdown a{font-size:.90rem;color:#262a48;text-transform:none}.f-dropdown:hover{border-radius:5px;border-color:#e5e6ea}.f-dropdown li{padding:7px 10px;text-align:left}.tabs{text-align:center;font-family:'Lato','Helvetica Neue','Helvetica','Arial',sans-serif;font-weight:300;font-style:normal}.tabs .tabs-state{display:none}.tabs .flex-tabs{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.tabs .flex-tabs .tab{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.tabs .tab{padding:20px 10px;background-color:white;color:#999cab;font-size:16px;cursor:pointer;border-bottom:1px solid #e5e6ea;font-weight:400;z-index:1}.content .panel{margin-top:-6px;background-color:#fff;padding-top:20px;padding-left:20px;border:1px solid #e5e6ea;display:none;text-align:left}.tabs-state:nth-child(1):checked ~ .flex-tabs .tab:nth-child(1),.tabs-state:nth-child(2):checked ~ .flex-tabs .tab:nth-child(2),.tabs-state:nth-child(3):checked ~ .flex-tabs .tab:nth-child(3),.tabs-state:nth-child(4):checked ~ .flex-tabs .tab:nth-child(4),.tabs-state:nth-child(5):checked ~ .flex-tabs .tab:nth-child(5){background-color:#fff;color:#09f;cursor:default;border-top:1px solid #e5e6ea;border-right:1px solid #e5e6ea;border-bottom:1px solid #fff;border-left:1px solid #e5e6ea}.tabs-state:nth-child(1):checked ~ .content .panel:nth-child(1),.tabs-state:nth-child(2):checked ~ .content .panel:nth-child(2),.tabs-state:nth-child(3):checked ~ .content .panel:nth-child(3),.tabs-state:nth-child(4):checked ~ .content .panel:nth-child(4),.tabs-state:nth-child(5):checked ~ .content .panel:nth-child(5){display:block}.file-upload,.upload-label{position:relative}#filename,#upload-shield{border:0;outline:0;color:#262a48;cursor:pointer;width:100%;max-height:50px;min-height:50px}#upload-shield{z-index:100;opacity:0}#upload-shield::-webkit-file-upload-button{display:none}#filename{position:absolute;padding-right:40px;font-size:16px;border-radius:0;word-break:break-word;background:#f5f5f6 url(/images/icons/svg/default_blue/icon-upload-file.svg) no-repeat;background-position:right 9px center;background-size:22px}span.ng-binding{position:relative;bottom:10px;color:#ef3444;font-size:.75rem;font-style:italic;display:block}span.error-subject{position:relative;top:-20px;color:#ef3444;font-size:.75rem;font-style:italic;display:block}span.error-message{position:relative;top:-35px;color:#ef3444;font-size:.75rem;font-style:italic;display:block}label{text-transform:uppercase;color:#999cab;letter-spacing:1px;font-size:.75rem;margin-bottom:5px}input[type=\"text\"],input[type=\"password\"],input[type=\"email\"],input[type=\"search\"],textarea{border-radius:6px;border-width:2px;border-style:solid;border-color:#e5e6ea;padding:14px 11px;height:auto;font-size:1rem;color:#262a48;display:block;clear:both;-webkit-appearance:none;-moz-appearance:none;width:100%;box-sizing:border-box;transition:border-color .15s linear,background .15s linear;margin:6px 0 40px}\ninput[type=\"text\"]:focus,input[type=\"search\"]:focus,input[type=\"password\"]:focus{box-shadow:none;border-color:#999cab;background:#fff;outline:0;color:#262a48}input[type=\"text\"].complete{border-color:#7ecf54;color:#262a48}input.error{border-color:#ef3444;color:#262a48}form.alt-submit{position:relative}form.alt-submit input[type=\"submit\"]{display:none}form.alt-submit .icon-search{position:absolute;right:10px;width:45px;top:10px;cursor:pointer;fill:#09f}select{background:url(../images/arrow-select.png) no-repeat 98% center;border-radius:6px;border-width:2px;border-style:solid;border-color:#e5e6ea;padding:14px 11px;height:auto;font-size:1rem;color:#262a48;display:block;clear:both;-webkit-appearance:none;-moz-appearance:none;width:100%;box-sizing:border-box;transition:border-color .15s linear,background .15s linear;margin:6px 0 40px}::-webkit-input-placeholder{color:#cccdd5}:-moz-placeholder{color:#cccdd5}::-moz-placeholder{color:#cccdd5}:-ms-input-placeholder{color:#cccdd5}input[type=\"text\"]::-ms-clear{display:none}.hideShowPassword-toggle{background-color:transparent!important;background-image:url(\"../images/eye-off.png\");background-image:url(\"../images/eye.png\"),none;background-position:0 center;background-repeat:no-repeat;border:2px solid transparent;border-radius:.25em;cursor:pointer;font-size:100%;height:44px;margin:0;max-height:100%;padding:0;overflow:hidden;text-indent:-999em;width:46px}.hideShowPassword-toggle-hide{background-image:url(\"../images/eye-off.png\"),none;background-color:transparent}.hideShowPassword-toggle:hover,.hideShowPassword-toggle:focus{outline:transparent}select{background-color:#fff}.styled-select{width:170px;height:28px;border-radius:25px;overflow:hidden;background:url(../images/arrow-select.png) no-repeat 145px center/9px auto #e5e6ea;margin-right:20px}.styled-select select{background:transparent;width:200px;font-family:'Lato','Helvetica Neue','Helvetica','Arial',sans-serif;font-weight:400;font-style:italic;font-size:.80rem;border:0;height:28px;color:#999cab;padding:0 15px;margin:0}.styled-select select option{line-height:30px;font-family:'Lato','Helvetica Neue','Helvetica','Arial',sans-serif;font-weight:400;font-style:normal;padding:5px 10px 5px 15px}select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}select:focus{outline:0;box-shadow:none!important}select:focus::-ms-value{background:#e5e6ea;color:#999cab;background:url(../images/arrow-select.png) no-repeat 160px center/9px auto}.gray-dropdown{border:0;border-radius:15px;padding:0;font-family:'Lato','Helvetica Neue','Helvetica','Arial',sans-serif;font-weight:400;font-style:italic;font-size:.80rem;color:#999cab;width:142px}.lightgray{background:#e5e6ea}input[type=checkbox].custom:not(old){width:28px;margin:0;padding:0;opacity:0}input[type=checkbox].custom:not(old)+label{display:inline-block;margin-left:-28px;padding-left:28px;background:url(\"../images/check-radio-sprite.png\") no-repeat 0 0;line-height:24px}input[type=checkbox].custom:not(old):checked+label{background-position:0 -24px}input[type=checkbox].custom{visibility:hidden}input[type=\"checkbox\"].custom:disabled+label{background:url(\"../images/check-radio-sprite.png\") no-repeat 0 -96px}input[type=radio].custom:not(old){width:28px;margin:0;padding:0;opacity:0}input[type=radio].custom:not(old)+label{display:inline-block;margin-left:-28px;padding-left:28px;background:url(\"../images/check-radio-sprite.png\") no-repeat 0 -48px;line-height:24px}input[type=radio].custom:not(old):checked+label{background-position:0 -72px}input[type=radio].custom{visibility:hidden}.round-button{border-radius:50px;border:1px solid #999cab;font-family:'Lato','Helvetica Neue','Helvetica','Arial',sans-serif;font-weight:400;font-style:italic;font-size:.90rem;font-style:italic;color:#999cab;padding:10px 35px;transition:all .2s ease-in;text-decoration:none}.round-button:hover{background-color:#999cab;color:#fff}.round-button-blue{border-radius:50px;border:1px solid #09f;font-family:'Lato','Helvetica Neue','Helvetica','Arial',sans-serif;font-weight:400;font-style:italic;font-size:.9rem;font-style:italic;color:#09f;padding:10px 35px;transition:all .2s ease-in;text-decoration:none}.round-button-blue:hover{background-color:#09f;color:#fff}input[type=\"submit\"],.button,button{display:block;background-color:#09f;font-family:'Lato','Helvetica Neue','Helvetica','Arial',sans-serif;font-weight:400;font-style:italic;text-align:center;color:#fff;margin:0 auto;transition:none;border:0;text-decoration:none}\ninput[type=\"submit\"]:disabled,.button:disabled,button:disabled{background-color:#cccdd5;color:#999cab;cursor:none}input[type=\"submit\"]:hover,.button:hover,button:hover{background-color:#3cf;color:#fff}input[type=\"submit\"]:focus,.button:focus,button:focus{background-color:#3cf;color:#fff;outline:0}.button{padding:20px 0}input[type=\"submit\"],button{padding:18px 0}@media only screen{input[type=\"submit\"],.button,button{width:150px;font-size:.9rem}}@media only screen and (min-width:40.063em){input[type=\"submit\"],.button,button{width:280px;font-size:1.12rem}}button.disabled,button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#cccdd5;color:#999cab;cursor:pointer}.contain-upload{margin:70px}.button-progress,.button-loading{position:relative;max-height:55px;min-height:55px;cursor:pointer}.button-progress:focus,.button-loading:focus{background:#09f}.button-meter{display:none;position:absolute;top:55px;width:0;height:7px;background:#3cf}.button-meter-bg{display:none;position:absolute;top:55px;width:100%;height:7px;background:#252a46}.button-progress.is-active .button-meter,.button-progress.is-active .button-meter-bg{display:block}.button-progress.is-active .button-meter{animation:progress 6s forwards linear;-webkit-animation:progress 6s forwards linear}@keyframes progress{100%{width:100%}}@-webkit-keyframes progress{100%{width:100%}}.button-loading{padding:0}.loader_1{display:none;vertical-align:middle}.button-loading.is-active .button-label{display:none}.button-loading.is-active .loader_1{display:inline-block}.loader_1 .line_1,.loader_1 .line_2,.loader_1 .line_3,.loader_1 .line_4,.loader_1 .line_5,.loader_1 .line_6{transform-origin:center;-webkit-transform-origin:center}.loader_1 .line_1{animation:load 1s infinite}.loader_1 .line_2{animation:load 1s infinite;animation-delay:150ms}.loader_1 .line_3{animation:load 1s infinite;animation-delay:350ms}.loader_1 .line_4{animation:load 1s infinite;animation-delay:550ms}.loader_1 .line_5{animation:load 1s 750ms infinite}.loader_1 .line_6{animation:load 1s infinite;animation-delay:900ms}@keyframes load{10%{transform:scale(1.5);-webkit-transform:scale(1.5);opacity:1}}@-webkit-keyframes load{10%{transform:scale(1.5);-webkit-transform:scale(1.5);opacity:1}}.onoffswitch{position:relative;width:71px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch .onoffswitch-checkbox{display:none}.onoffswitch .onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-left:0}.onoffswitch .onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:0}.onoffswitch .onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:2px solid #fff;border-radius:18px}.onoffswitch .onoffswitch-label .onoffswitch-inner{display:block;width:200%;margin-left:-100%;transition:margin .3s ease-in 0s}.onoffswitch .onoffswitch-label .onoffswitch-inner:before,.onoffswitch .onoffswitch-label .onoffswitch-inner:after{display:block;float:left;width:50%;height:30px;padding:0;line-height:30px;font-size:14px;color:#fff;box-sizing:border-box}.onoffswitch .onoffswitch-label .onoffswitch-inner:before{content:\"ON\";padding-left:10px;background-color:#7ecf54;color:#fff}.onoffswitch .onoffswitch-label .onoffswitch-inner:after{content:\"OFF\";padding-right:10px;background-color:#ef3444;color:#fff;text-align:right}.onoffswitch .onoffswitch-label .onoffswitch-switch{display:block;width:15px;margin:9px;background:#fff;border:9px solid #fff;border-radius:9px;position:absolute;bottom:-1px;right:37px;transition:all .3s ease-in 0s}.progress{color:#fff;box-sizing:initial;color:#fff;height:12px;line-height:1.182;margin:6px 0;position:relative;text-align:center;width:100%;border-radius:1000px;background-color:#cccdd5}.progress>span{display:block;height:100%;overflow:hidden;position:relative;width:auto}.progress.progress-stacked>span{display:inline-block;float:left}.progress-stacked span{border-radius:1000px;position:relative;right:10px}.progress-stacked span:first-of-type{right:0}table{margin-bottom:1.25rem;border:0;table-layout:auto;color:#999cab;width:100%}table th{letter-spacing:1px;font-size:.75rem;text-transform:uppercase;font-weight:normal;background:#fff;cursor:pointer;white-space:normal;text-align:left;display:table-cell;line-height:1.125rem;vertical-align:middle;padding:.5rem .625rem .625rem}table .selected::after{border-top:8px solid #999cab}table tbody tr:nth-child(odd){background-color:#eafaff}table tr td{font-size:.8rem;display:table-cell;line-height:1.125rem;vertical-align:middle;padding:.5rem .625rem .625rem}@media(max-width:750px){thead tr th{display:none}tbody tr td{display:block}\ntbody tr td:first-child{padding-top:1rem}tbody tr td:last-child{padding-bottom:1rem}tbody tr td:before{display:block;content:attr(data-th) \": \";text-transform:uppercase;width:10rem}}table.selectable tbody tr:hover,table.selectable tbody tr:nth-child(odd):hover{background-color:#ccf2ff;cursor:pointer}.sort-header::after{display:inline-block;margin-left:3px;width:0;height:0;border-left:4px solid transparent;border-right:4px solid transparent;border-top:8px solid #e5e6ea;content:' '}.responsive-sort{overflow:auto;width:100%}@media(max-width:750px){.sort{overflow:auto}.sort thead tr th{display:table-cell}.sort tbody tr td{display:table-cell}.sort tbody tr td:first-child{padding:.5rem .625rem .625rem}.sort tbody tr td:last-child{padding:.5rem .625rem .625rem}.sort tbody tr td:before{display:none}}#accordion input{display:none}#accordion label{background:#fff url(../images/icons/png/icon-plus.png) no-repeat 99% center;cursor:pointer;display:block;padding:15px;z-index:20;color:#09f;font-size:.9em;text-transform:none}#accordion input:checked+label{background:#eafaff url(../images/icons/png/icon-minus.png) no-repeat 99% center;margin-bottom:0}#accordion article{background:#eafaff;height:0;overflow:hidden;z-index:10}#accordion article p{padding:1.5em 1em}#accordion input:checked ~ article{height:auto;margin-bottom:.125em}a.tooltip{position:relative;display:inline}a.tooltip:after{display:block;visibility:hidden;position:absolute;bottom:0;left:20%;opacity:0;content:attr(data-tool);height:auto;min-width:200px;padding:5px 8px;z-index:999;color:#999cab;font-size:12px;text-decoration:none;text-align:center;background:#fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;border:1px solid #e5e6ea}a.tooltip:before{position:absolute;visibility:hidden;width:0;height:0;left:50%;bottom:0;opacity:0;content:\"\";border-style:solid;border-width:6px 6px 0 6px;border-color:#e5e6ea transparent transparent transparent}a.tooltip:hover:after{visibility:visible;opacity:1;bottom:20px}a.tooltip:hover:before{visibility:visible;opacity:1;bottom:14px}a.tooltip.bottom:after{bottom:auto;top:0;left:0}a.tooltip.bottom:hover:after{top:33px}a.tooltip.bottom:before{border-width:0 8px 10px 8px;border-color:transparent transparent #e5e6ea transparent;top:0}a.tooltip.bottom:hover:before{top:25px}a.tooltip.right{float:none!important}a.tooltip.right:after{left:100%;bottom:-45%;right:20%}a.tooltip.right:hover:after{left:110%;bottom:-45%}a.tooltip.right:before{border-width:8px 10px 8px 0;border-color:transparent #e5e6ea transparent transparent;left:90%;bottom:2%}a.tooltip.right:hover:before{left:102%;bottom:2%}a.tooltip.left:after{left:auto;right:100%;bottom:-45%}a.tooltip.left:hover:after{right:110%;bottom:-45%}a.tooltip.left:before{border-width:5px 0 5px 10px;border-color:transparent transparent transparent #e5e6ea;left:auto;right:90%;bottom:2%}a.tooltip.left:hover:before{right:100%;bottom:2%}a.tooltip.animate:after,a.tooltip.animate:before{-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.alert-box{border-style:solid;border-width:1px;display:block;margin-bottom:1.25rem;position:fixed;top:0;z-index:998;text-align:center;padding:.875rem 1.5rem .875rem .875rem;font-family:'Lato','Helvetica Neue','Helvetica','Arial',sans-serif;font-weight:200;font-style:normal;font-size:.9rem;transition:opacity 300ms ease-out;background-color:#008cba;border-color:#0078a0;color:#fff;width:100%}.alert-box .alert-left{width:20px;height:20px;margin-right:10px}.alert-box .login{color:#fff;text-decoration:underline}.alert-box .alert-close img{width:20px;height:20px}.user-header .alert-box,.close-header .alert-box{top:64px}.success{background-color:#7ecf54!important;border-color:#7ecf54!important;color:#fff}.danger{background:#ef3444!important;border:#ef3444!important;color:#fff}.warning{background:#09f!important;border:#09f!important;color:#fff}.reveal-modal-bg{background:rgba(0,0,0,0.65);position:fixed}.modal-error .reveal-modal{border:5px solid #ef3444!important}.reveal-modal{padding:0;margin:8px;box-shadow:0 0 4px 0 rgba(50,50,50,0.75),0px 0 8px 0 rgba(50,50,50,0.75);border-radius:2px;overflow:hidden;background:#fff;text-align:center}.reveal-modal header{font-family:'Lato','Helvetica Neue','Helvetica','Arial',sans-serif;font-weight:300;font-style:normal;background:#262a48;font-size:1.55rem;color:#3cf;padding:15px;position:relative}.reveal-modal header .icon-close-modal{width:17px}.reveal-modal header .close-reveal-modal{font-size:2.5rem;line-height:1;position:absolute;top:.625rem;right:1.375rem;cursor:pointer}.reveal-modal h1{color:#262a48}\n.reveal-modal h1.thanks{font-size:2.5rem}.reveal-modal h1.thanks .icon-filled-pass{fill:#7ecf54}.reveal-modal .error{background:#ef3444;color:#fff;text-align:center;padding:20px 40px;font-size:.85rem}.reveal-modal .headline{color:#262a48;line-height:24px;margin:30px auto 20px}.reveal-modal .note{font-family:'Lato','Helvetica Neue','Helvetica','Arial',sans-serif;font-weight:400;font-style:italic;font-size:.86rem;font-style:italic;color:#999cab;margin:20px auto 30px;width:70%;line-height:20px}.reveal-modal p.thanks{margin-top:10px}.reveal-modal p.premium{margin:5px auto;width:85%}.reveal-modal .centered .button{margin:0 auto;float:none}.reveal-modal ul.payment li .icon-notification{float:left;fill:#999cab;position:relative;left:7px;width:15px;height:15px}.reveal-modal ul.payment li:first-of-type{width:40%}.reveal-modal ul.payment li:last-of-type{width:40%;float:right}.reveal-modal form{width:75%;margin:30px auto 0}.reveal-modal form label{float:left}.reveal-modal form .textfield-error{border:1px solid #ef3444}.reveal-modal form span.ng-binding{text-align:left}.reveal-modal .confirm{font-family:'Lato','Helvetica Neue','Helvetica','Arial',sans-serif;font-weight:300;font-style:normal;color:#262a48;font-size:1.5rem;margin:0 auto 50px;width:70%}.reveal-modal .modal-footer{background:#f5f5f6;padding:15px}.reveal-modal .modal-footer button{padding:13px;cursor:pointer;width:60%}.reveal-modal:focus{outline:0}@media only screen and (max-width:40em){.reveal-modal{width:60%}.reveal-modal .button{font-size:.9rem}}@media only screen and (min-width:40.063em) and (max-width:64em){.reveal-modal{width:55%}.reveal-modal .button{font-size:1.0rem}}@media only screen and (min-width:64.063em){.reveal-modal{width:35%}}.main{margin-bottom:50px}body.about .wrapper h1{margin-top:100px;color:#09f;max-width:720px;line-height:110%}body.about .wrapper h2{font-weight:300;font-style:normal;text-transform:none;color:#262a48;margin-top:25px}body.about .wrapper h4{text-transform:uppercase;margin:10px 3px 30px;color:#999cab;letter-spacing:1px;font-size:.8em;font-weight:400;display:block}@media only screen{body.about .wrapper h1{margin-top:40px;font-size:2.5em}body.about .wrapper h2{font-size:1.5em}}@media only screen and (min-width:64.063em){body.about .wrapper h1{margin-top:100px;font-size:4.5em}body.about .wrapper h2{font-size:2em}}@media only screen and (min-width:90.063em){body.about .wrapper h1{font-size:5em}body.about .wrapper h2{font-size:2em}}body.about .wrapper hr{width:30px;border-top:2px solid #09f}body.about .wrapper p{line-height:30px;color:#999cab;font-weight:300;margin-top:20px;max-width:720px}body.about .wrapper ul.home{margin:10px 0 20px 30px;line-height:30px;color:#999cab;font-weight:300}.wrapper{position:relative;height:100%;width:100%}.wrapper header{border-bottom:2px solid #f5f5f6}.wrapper header .logo{height:35px;margin:10px 10px 8px}.wrapper header .menu-wrapper{float:right;border-left:2px solid #f5f5f6;width:0;height:55px;overflow:hidden}.wrapper header .menu-wrapper .icon-menu{position:absolute;top:18px;right:20px;display:block;width:20px;height:14px;background:#999cab;border:6px solid #fff;border-left:0;border-right:0;top:19px;width:20px;height:18px;border-width:8px}.wrapper header .menu-wrapper .icon-menu:before,.wrapper header .menu-wrapper .icon-menu:after{position:absolute;display:block;left:0;width:100%;height:2px;background:#999cab;content:''}.wrapper header .menu-wrapper .icon-menu:before{top:-6px}.wrapper header .menu-wrapper .icon-menu:after{bottom:-6px}.wrapper header .menu-wrapper .link{float:right;text-transform:uppercase;color:#999cab;font-size:.8em;width:63px;line-height:55px;text-decoration:none}.wrapper header .menu-wrapper .header-menu{position:fixed;top:57px;right:0;bottom:0;padding:10px 30px;z-index:2;background:#fff;opacity:0;filter:alpha(opacity=0);transform:translateY(-150%);-webkit-transform:translateY(-150%);transition:all,1s;-webkit-transition:all,1s}.wrapper header .menu-wrapper .header-menu.active{opacity:1;filter:alpha(opacity=100);transform:translateX(0);-webkit-transform:translateX(0);transition:all .4s;-webkit-transition:all .4s;width:300px;border-left:1px solid #efefef}.wrapper header .menu-wrapper .header-menu .icon-menu{display:none}.wrapper header .menu-wrapper .header-menu ul{width:200px;margin:10px auto 0}.wrapper header .menu-wrapper .header-menu li{list-style-type:none}.wrapper header .menu-wrapper .header-menu li a{font-size:15px;margin:5px 75px 5px 0;display:block;width:100%;background:#fff;border-radius:5px;padding:5px 0}.wrapper header .menu-wrapper .header-menu li a,.wrapper header .menu-wrapper .header-menu li a:visited,.wrapper header .menu-wrapper .header-menu li a:hover,.wrapper header .menu-wrapper .header-menu li a:focus,.wrapper header .menu-wrapper .header-menu li a:active{color:#999cab;text-decoration:none}\n.wrapper header .menu-wrapper .header-menu li a:hover{color:#09f}.wrapper header .menu-wrapper .header-menu li a.selected{background:#f5f5f6;color:#999cab}.wrapper ul.tabs-layout{margin:0;padding:0;list-style:none;padding:20px 0 10px}.wrapper ul.tabs-layout li{background:0;color:#999cab;display:inline-block;padding:10px 15px;cursor:pointer;font-size:13px;border-right:1px solid #e5e6ea;padding:0 15px;font-family:'Lato','Helvetica Neue','Helvetica','Arial',sans-serif;font-weight:400;font-style:normal}.wrapper ul.tabs-layout li:first-of-type{padding-left:0}.wrapper ul.tabs-layout li:last-of-type{border-right:0}.wrapper ul.tabs-layout li.current{color:#09f}.wrapper .tab-layout-content{display:none;background:#fff}.wrapper .tab-layout-content.current{display:inherit}.wrapper .sidebar{width:245px;margin-right:50px}.wrapper .sidebar .logo{width:185px;margin:40px 20px;display:block}.wrapper .sidebar nav.primary{margin-top:30px}.wrapper .sidebar nav.primary ul{margin-top:25px}.wrapper .sidebar nav.primary ul li a{font-size:14px;padding:15px 20px;display:block;width:100%}.wrapper .content{padding-bottom:60px}.wrapper .content h1.layout{font-weight:300;font-style:normal;font-size:50px;color:#999cab;letter-spacing:1px;margin:40px 0 30px;color:#09f}.wrapper .content nav.secondary{width:auto;padding:10px;background:#f5f5f6;border-radius:5px}.wrapper .content nav.secondary ul li{float:left}.wrapper .content nav.secondary ul li a{font-size:14px;padding:0 10px;color:#09f;line-height:28px}.wrapper .content section.module{margin:70px 0 20px}.wrapper .content section.module h2.layout{font-family:'Lato','Helvetica Neue','Helvetica','Arial',sans-serif;font-weight:300;font-style:normal;display:block;color:#999cab;font-size:30px;padding-bottom:10px;line-height:36px;border-bottom:1px solid #f5f5f6;width:100%;font-style:normal;text-transform:none;margin:0 0 20px}.wrapper .content section.module p{font-family:'Lato','Helvetica Neue','Helvetica','Arial',sans-serif;font-weight:300;font-style:normal;color:#999cab;font-size:17px;line-height:27px}.wrapper .content section.module .textfields .small-12 input[type=\"text\"].complete,.wrapper .content section.module .textfields .small-12 input[type=\"text\"].error{margin-bottom:40px}.wrapper .content section.module .textfields .small-12 input[type=\"text\"].error{margin-bottom:10px}.wrapper .content section.module form.alt-submit input[type=\"text\"]{margin-bottom:10px}.wrapper .content section.module .rendered{margin:30px 0 10px}.wrapper .content section.module .rendered .layout{float:left;margin-right:20px}@media only screen and (max-width:40em){.wrapper .content section.module .rendered .layout{margin-bottom:10px}}.wrapper .content section.module .rendered input[type=\"text\"].active{border-color:#999cab;color:#262a48}.wrapper .content section.module .rendered .font{font-family:'Lato','Helvetica Neue','Helvetica','Arial',sans-serif;font-weight:300;font-style:normal;display:block;font-size:2.2em;line-height:1.4em;letter-spacing:2px;margin-top:30px;color:#09f}.wrapper .content section.module .rendered .font span{display:block;color:#999cab;font-size:17px;word-wrap:break-word}@media only screen and (min-width:40.063em){.wrapper .content section.module .rendered .font span{font-size:32px}}.wrapper .content section.module .rendered h4.layout{margin-bottom:10px;font-size:.9em;display:block;float:none;line-height:1.4em}.wrapper .content section.module .rendered p a.space{margin-right:20px}.wrapper .content section.module .rendered p{margin:20px 0}.wrapper .content section.module .rendered select{margin-bottom:10px}.wrapper .content section.module .rendered ul.glyphs{list-style:none;margin-top:30px}.wrapper .content section.module .rendered ul.glyphs li{float:left;width:31%;text-align:center;margin-right:2%}.wrapper .content section.module .rendered ul.glyphs li object{height:50px;margin:0 auto}.wrapper .content section.module .rendered ul.glyphs li #delete path g{fill:#3cf}.wrapper .content section.module .rendered ul.glyphs li input[type=\"text\"]{height:80px;font-size:.7rem;word-break:break-word;color:#999cab}.wrapper .content section.module .rendered span.blue{color:#09f;padding-right:10px}.wrapper .content section.module .rendered span.gray{color:#999cab;padding-right:10px}.wrapper .content section.module .rendered span.lightblue{color:#3cf;padding-right:10px}.wrapper .content section.module .rendered span.lightgray{color:#e5e6ea;background:transparent;padding-right:10px}\n.wrapper .content section.module .rendered span.darkblue{color:#262a48;padding-right:10px}.wrapper .content section.module .rendered span.green{color:#7ecf54;padding-right:10px}.wrapper .content section.module .rendered span.yellow{color:#ffc41f;padding-right:10px}.wrapper .content section.module .rendered span.red{color:#ef3444;padding-right:10px}.wrapper .content section.module .rendered span.white{color:#fff;padding-right:10px}.wrapper .content section.module .headings h1{margin-bottom:30px}.wrapper .content section.module .headings h2,.wrapper .content section.module .headings h3{margin-bottom:20px}.wrapper .content section.module .password input[type=\"password\"]{margin-bottom:0}.wrapper .content section.sub{margin:20px 0 0}.wrapper label.alt{text-transform:none}.wrapper pre{background-color:#262a48;margin:0 0 1em;padding:.5em 1em;white-space:pre-wrap}.wrapper pre code{word-break:break-all}.wrapper pre code,.wrapper pre .line-number{font:normal normal 12px/14px \"Courier New\",Courier,Monospace;color:#fff;display:block}.wrapper pre .line-number{float:left;margin:0 1em 0 -1em;border-right:1px solid #3b3f5d;text-align:right;color:#999cab}.wrapper pre .line-number span{display:block;padding:0 .5em 0 1em}.wrapper pre .cl{display:block;clear:both}.wrapper .color{float:left;height:auto}.wrapper .color p{font-size:.8em!important;line-height:1.4em!important}@media only screen{.wrapper .color .colorblock{display:block;width:70px;height:70px;margin:10px 10px 10px 0}.wrapper .color p{width:70px}.wrapper .color p span{display:none}}@media only screen and (min-width:40.063em){.wrapper .color .colorblock{display:block;width:100px;height:100px;margin:20px 20px 10px 0}.wrapper .color p{width:100px}.wrapper .color p span{display:none}}@media only screen and (min-width:64.063em){.wrapper .color .colorblock{display:block;width:120px;height:120px;margin:20px 25px 10px 0}.wrapper .color p{width:120px}.wrapper .color p span{display:inline}}.wrapper .color p{text-align:left;font-size:12px;color:#999cab}@media only screen and (max-width:40em){.wrapper .reveal-modal{width:60%}.wrapper .reveal-modal .button{font-size:.9rem}}@media only screen and (min-width:40.063em) and (max-width:64em){.wrapper .reveal-modal{width:55%}.wrapper .reveal-modal .button{font-size:1.0rem}}@media only screen and (min-width:64.063em){.wrapper .reveal-modal{width:55%}}nav a,nav a:visited,nav a:hover,nav a:focus,nav a:active{color:#999cab;text-decoration:none}nav a:hover{color:#3cf}body.about nav ul li.about a,body.colors nav ul li.colors a,body.emails nav ul li.emails a,body.forms nav ul li.forms a,body.grid nav ul li.grid a,body.helpers nav ul li.helpers a,body.icons nav ul li.icons a,body.nav nav ul li.nav a,body.photo nav ul li.photo a,body.tables nav ul li.tables a,body.type nav ul li.type a,body.ui nav ul li.ui a{background:#3cf;color:#fff}body.ui a.tooltip{text-decoration:none}body.grid .row .display{background:#eee;font-size:11px;margin-bottom:10px;line-height:2rem;border:solid 1px #c6c6c6;margin-left:0!important;margin-right:0!important;margin-top:35px}body.grid .row .display .columns:nth-child(2),body.grid .row .display .columns.small-centered,body.grid .row .display .columns.large-centered{background:#e1e1e1}body.grid .row .display .columns.color-end{background:#d4d4d4}body.grid .row.display-end{background:#fff;font-size:11px;margin-bottom:10px;line-height:2rem;border:solid 1px #c6c6c6;margin-left:0!important;margin-right:0!important}body.grid .row.display-end .columns{background:#e1e1e1;border-left:1px solid #c6c6c6}body.grid .row.display-end .columns .color-end{background:#d4d4d4}body.emails tbody tr:nth-child(odd){background-color:transparent}.strong{font-family:'Lato','Helvetica Neue','Helvetica','Arial',sans-serif;font-weight:700;font-style:normal}section#individual .rendered svg{width:100px;margin-right:50px}section#png ul{list-style:none}section#png ul li{float:left}section#png ul li:first-of-type{width:80%}section#png ul li:last-of-type img{float:right;margin:20px 0 0 50px}section#tabs .rendered p{margin:0 0 30px}.nopad p{margin-bottom:20px}.matrix th{font-weight:bold}.matrix{table-layout:fixed}.matrix-supported{background:#7ecf54;color:#fff;border:2px solid #fff}.matrix-limited{background:#ffc41f}.matrix-none{background:#fff}.matrix-key-justify{margin-right:20px;padding:3px 8px;background:#7ecf54;border-radius:3px;font-size:13px;color:white}.justify-yellow{background:#ffc41f;margin-right:0}@media(max-width:750px){.matrix-none{display:none}}\n\n/*=================================*/\n.browser {\n  position: relative;\n  width: 90%;\n  max-width: 50em;\n  min-height: 25em;\n  margin: 0 auto;\n  background: white;\n  overflow: hidden;\n  box-shadow: 0 0.5em 2em 0 rgba(0, 0, 0, 0.2);\n}\n.browser h1 {\n  margin: 0;\n  padding: 0.5em 0;\n  background: #269dd9;\n  font-size: 1em;\n  line-height: 1.5;\n  text-transform: uppercase;\n  color: white;\n}\n.browser ul {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n}\n.browser .folders {\n  position: absolute;\n  top: 3.125em;\n  bottom: 0;\n  width: 12.5em;\n  background: #444;\n  font-size: 0.8em;\n  color: white;\n  z-index: 9999;\n}\n.browser .folders li {\n  display: block;\n}\n.browser .folders li a {\n  display: block;\n  padding: 0.625em;\n  border-left: 5px solid #e8a17d;\n  text-decoration: none;\n  color: inherit;\n}\n.browser .folders li:nth-child(even) a {\n  border-left: 5px solid #7dc4e8;\n  background: #555;\n}\n.browser .folders li a:hover, .browser .folders li a.active {\n  border-left: 5px solid #e8a17d;\n  background: #e8a17d;\n  color: white;\n}\n.browser .folders i {\n  margin-right: 0.5em;\n}\n.browser .files {\n  position: relative;\n  height: 100%;\n  padding-left: 10em;\n}\n.browser .files .placeholder {\n  position: absolute;\n  /*top: 50%;*/\n  left: 50%;\n  font-size: 10em;\n  font-weight: bold;\n  text-transform: uppercase;\n  color: black;\n  opacity: 0;\n  transition: opacity 0.2s ease-in-out;\n  transform: translate(-50%, -50%);\n  animation: rockit 1s infinite ease-in-out;\n}\n.browser .files .placeholder.active {\n  opacity: 0.05;\n}\n.browser .files .files__actions {\n  max-height: 0em;\n  background: #7dc4e8;\n  font-size: 0.75em;\n  color: white;\n  overflow: hidden;\n  transition: max-height 0.2s ease-in-out;\n}\n.browser .files .files__actions.active {\n  max-height: 3em;\n}\n.browser .files__list {\n  opacity: 0;\n  transition: opacity 0.2s ease-in-out;\n}\n.browser .files__list.active {\n  opacity: 1;\n}\n.browser .files__list li {\n  position: relative;\n  transition: transform 0.2s ease-in-out;\n  transform: translateX(-3.5em);\n}\n.browser .files__list li:hover, .browser .files__list li.active {\n  transform: translateX(0);\n}\n.browser .files__list li:nth-child(even) a {\n  background: #f7f7f7;\n}\n.browser .files__list li a {\n  display: block;\n  width: calc(100% + 3.5em);\n  padding: 1em 1em 1em 4.5em;\n  background: white;\n  text-decoration: none;\n  color: inherit;\n}\n.browser .files__list li a i {\n  width: 1.5em;\n  margin-right: 0.5em;\n  text-align: center;\n}\n.browser .files__list li > .thumbnail {\n  position: absolute;\n  width: 3.5em;\n  height: 3.5em;\n}\n.browser .files__list li > .thumbnail img {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  width: 100%;\n  transform: translate(-50%, -50%);\n}\n.browser .files__list li > .thumbnail > i {\n  width: 100%;\n  background: #e8a17d;\n  font-size: 1.5em;\n  line-height: 2.35;\n  text-align: center;\n  color: white;\n}\n.browser .files__list li > .thumbnail .zoom {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background: rgba(0, 0, 0, 0.5);\n  cursor: pointer;\n  opacity: 0;\n  transition: opacity 0.2s ease-in-out;\n}\n.browser .files__list li > .thumbnail .zoom:hover {\n  opacity: 1;\n}\n.browser .files__list li > .thumbnail .zoom i {\n  width: 100%;\n  font-size: 1.5em;\n  line-height: 2.3333;\n  text-align: center;\n  color: white;\n}\n.browser .files__list .settings {\n  width: calc(100% + 4.6667em);\n  max-height: 0;\n  padding: 0 1em 0 6em;\n  background: #7dc4e8;\n  font-size: 0.75em;\n  color: white;\n  transition: max-height 0.2s ease-in-out;\n}\n.browser .files__list .settings.active {\n  max-height: 3em;\n}\n.browser .files__list .settings label {\n  display: inline-block;\n  padding: 0.5em;\n  background: #269dd9;\n}\n.browser .files__list .settings input {\n  margin: 0 1em;\n  border: 1px solid #269dd9;\n  color: #222;\n}\n.browser .files__list .settings .insert {\n  display: inline-block;\n  margin-left: 1em;\n  padding: 0.5em;\n  background: white;\n  color: #269dd9;\n  cursor: pointer;\n}\n.browser .files__list .settings .insert:hover {\n  background: #269dd9;\n  color: white;\n}\n\n/** PAGE STYLES **/\n* {\n  box-sizing: border-box;\n}\n\nhtml, body {\n  width: 100%;\n  height: 100%;\n}\n\nhtml {\n  font-size: 62.5%;\n}\n\nbody {\n  font-family: \"proxima-nova\", sans-serif;\n  font-size: 2em;\n  line-height: 1.5;\n  font-weight: 300;\n  color: #222;\n  overflow-x: hidden;\n  -webkit-backface-visibility: hidden;\n}\n\nh1 {\n  margin: 0;\n  font-size: 3em;\n  font-weight: bold;\n  line-height: 1;\n  text-align: center;\n  color: #e8a17d;\n}\n\nh2 {\n  margin: 0 0 0.5em;\n  font-size: 1.5em;\n  font-weight: normal;\n  text-align: center;\n  text-transform: lowercase;\n  color: #e8a17d;\n}\n\nh3 {\n  margin: 1em 0;\n  font-family: \"proxima-nova\", sans-serif;\n  font-size: 2em;\n  font-weight: 100;\n  text-transform: uppercase;\n}\n\n.container {\n  visibility: hidden;\n  padding: 1em 0;\n}\n\n.no-js .container,\n.container.tk-loaded {\n  visibility: visible;\n}\n\n.cf:before, .browser .files .files__actions:before,\n.cf:after,\n.browser .files .files__actions:after {\n  content: \" \";\n  /* 1 */\n  display: table;\n  /* 2 */\n}\n\n.cf:after, .browser .files .files__actions:after {\n  clear: both;\n}\n\n.cf, .browser .files .files__actions {\n  zoom: 1;\n}\n\n@keyframes rockit {\n  0% {\n    transform: translate(-50%, -50%) rotate(0deg);\n  }\n  25% {\n    transform: translate(-48%, -48%) rotate(2deg);\n  }\n  50% {\n    transform: translate(-50%, -50%) rotate(-2deg);\n  }\n  75% {\n    transform: translate(-52%, -52%) rotate(2deg);\n  }\n  100% {\n    transform: translate(-50%, -50%) rotate(0deg);\n  }\n}\n\n/* File Upload Style */\n.file-upload {\n  position: relative;\n  top: -8px;\n}\n.upload-label {\n  position: relative;\n}\n#filename, #upload-shield {\n  border: none;\n  outline: none;\n  color: #252a46;\n  cursor: pointer;\n  width: 100%;\n  max-height: 50px;\n  min-height: 50px;\n}\n#uploa-shield {\n  z-index: 100;\n  opacity: 0;\n}\n#upload-shield::-webkit-file-upload-button {\n  display: none;\n}\n#filename {\n  text-align: center;\n  position: absolute;\n  padding-right: 40px;\n  font-size: 16px;\n  border-radius: 0;\n  word-break: break-word;\n  background: #f5f5f6 url(\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOC4xLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCAzMiAzMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMzIgMzIiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHBhdGggZmlsbD0iIzMzY2NmZiIgZD0iTTIxLjIsMC42SDQuM3YzMC44aDIzLjVWNi43TDIxLjIsMC42eiBNNS41LDMwLjJWMS44aDE0LjhWOGg2LjJ2MjIuMkg1LjV6IE0xNi42LDE1LjRoNi4ydjEuMmgtNi4ydjYuMg0KCWgtMS4ydi02LjJIOS4ydi0xLjJoNi4yVjkuMmgxLjJWMTUuNHoiLz4NCjwvc3ZnPg0K\") no-repeat;\n  background-position: right 9px center;\n  background-size: 22px;\n}\n</style>\n</head>\n\n<body>\n\t<div class=\"container\">\n\t\t<h1>Sublime Text</h1>\n\t\t<br>\n\t\t\n\t\t<div class=\"browser\">\n\t\t\t<h1>File Browser</h1>\n\t\t\t<ul class=\"folders\"></ul>\n\n\t\t\t<div class=\"files\">\n\t\t\t\t<!-- File Upload -->\n\t\t\t\t<div class=\"files__actions active\">\n\t\t\t\t\t<div class=\"file-upload\">\n\t\t\t\t\t\t<label class=\"upload-label\">\n\t\t\t\t\t\t\t<input id=\"filename\" type=\"text\" placeholder=\"UPLOAD FILE\" class=\"upload-actual\"/>\n\t\t\t\t\t\t\t<input id=\"upload-shield\" type=\"file\" class=\"upload-file\"/>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<ul  class=\"files__list\">\n\t\t\t\t<!-- <li>\n\t\t\t\t\t<div class=\"thumbnail\">\n\t\t\t\t\t\t<i class=\"fa fa-picture-o\"></i>\n\t\t\t\t\t\t<div class=\"zoom\"><i class=\"fa fa-search\"></i></div>\n\t\t\t\t\t</div>\n\t\t  \t\t\t<a href=\"#\"><i class=\"fa fa-picture-o\"></i>happy-trees.png</a>\n\t\t\t\t</li> -->\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n<script src=\"js/index.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "Sublime/Sublime/Web/js/index.js",
    "content": "/*! jQuery v2.1.3 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */\n!function(a,b){\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error(\"jQuery requires a window with a document\");return b(a)}:b(a)}(\"undefined\"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m=\"2.1.3\",n=function(a,b){return new n.fn.init(a,b)},o=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,p=/^-ms-/,q=/-([\\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:\"\",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for(\"boolean\"==typeof g&&(j=g,g=arguments[h]||{},h++),\"object\"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:\"jQuery\"+(m+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return\"function\"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return\"object\"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,\"isPrototypeOf\")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+\"\":\"object\"==typeof a||\"function\"==typeof a?h[i.call(a)]||\"object\":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf(\"use strict\")?(b=l.createElement(\"script\"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,\"ms-\").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?\"\":(a+\"\").replace(o,\"\")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,\"string\"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return\"string\"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"),function(a,b){h[\"[object \"+b+\"]\"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return\"function\"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:\"array\"===c||0===b||\"number\"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u=\"sizzle\"+1*new Date,v=a.document,w=0,x=0,y=hb(),z=hb(),A=hb(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",L=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",M=\"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",N=M.replace(\"w\",\"w#\"),O=\"\\\\[\"+L+\"*(\"+M+\")(?:\"+L+\"*([*^$|!~]?=)\"+L+\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\"+N+\"))|)\"+L+\"*\\\\]\",P=\":(\"+M+\")(?:\\\\((('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+O+\")*)|.*)\\\\)|)\",Q=new RegExp(L+\"+\",\"g\"),R=new RegExp(\"^\"+L+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+L+\"+$\",\"g\"),S=new RegExp(\"^\"+L+\"*,\"+L+\"*\"),T=new RegExp(\"^\"+L+\"*([>+~]|\"+L+\")\"+L+\"*\"),U=new RegExp(\"=\"+L+\"*([^\\\\]'\\\"]*?)\"+L+\"*\\\\]\",\"g\"),V=new RegExp(P),W=new RegExp(\"^\"+N+\"$\"),X={ID:new RegExp(\"^#(\"+M+\")\"),CLASS:new RegExp(\"^\\\\.(\"+M+\")\"),TAG:new RegExp(\"^(\"+M.replace(\"w\",\"w*\")+\")\"),ATTR:new RegExp(\"^\"+O),PSEUDO:new RegExp(\"^\"+P),CHILD:new RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+L+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+L+\"*(?:([+-]|)\"+L+\"*(\\\\d+)|))\"+L+\"*\\\\)|)\",\"i\"),bool:new RegExp(\"^(?:\"+K+\")$\",\"i\"),needsContext:new RegExp(\"^\"+L+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+L+\"*((?:-\\\\d)?\\\\d*)\"+L+\"*\\\\)|)(?=[^-]|$)\",\"i\")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\\d$/i,$=/^[^{]+\\{\\s*\\[native \\w/,_=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,ab=/[+~]/,bb=/'|\\\\/g,cb=new RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+L+\"?|(\"+L+\")|.)\",\"ig\"),db=function(a,b,c){var d=\"0x\"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},eb=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fb){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function gb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,\"string\"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&\"object\"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute(\"id\"))?s=r.replace(bb,\"\\\\$&\"):b.setAttribute(\"id\",s),s=\"[id='\"+s+\"'] \",l=o.length;while(l--)o[l]=s+rb(o[l]);w=ab.test(a)&&pb(b.parentNode)||b,x=o.join(\",\")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute(\"id\")}}}return i(a.replace(R,\"$1\"),b,d,e)}function hb(){var a=[];function b(c,e){return a.push(c+\" \")>d.cacheLength&&delete b[a.shift()],b[c+\" \"]=e}return b}function ib(a){return a[u]=!0,a}function jb(a){var b=n.createElement(\"div\");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function kb(a,b){var c=a.split(\"|\"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function lb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return\"input\"===c&&b.type===a}}function nb(a){return function(b){var c=b.nodeName.toLowerCase();return(\"input\"===c||\"button\"===c)&&b.type===a}}function ob(a){return ib(function(b){return b=+b,ib(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pb(a){return a&&\"undefined\"!=typeof a.getElementsByTagName&&a}c=gb.support={},f=gb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?\"HTML\"!==b.nodeName:!1},m=gb.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener(\"unload\",eb,!1):e.attachEvent&&e.attachEvent(\"onunload\",eb)),p=!f(g),c.attributes=jb(function(a){return a.className=\"i\",!a.getAttribute(\"className\")}),c.getElementsByTagName=jb(function(a){return a.appendChild(g.createComment(\"\")),!a.getElementsByTagName(\"*\").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=jb(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(\"undefined\"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute(\"id\")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=\"undefined\"!=typeof a.getAttributeNode&&a.getAttributeNode(\"id\");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return\"undefined\"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if(\"*\"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(jb(function(a){o.appendChild(a).innerHTML=\"<a id='\"+u+\"'></a><select id='\"+u+\"-\\f]' msallowcapture=''><option selected=''></option></select>\",a.querySelectorAll(\"[msallowcapture^='']\").length&&q.push(\"[*^$]=\"+L+\"*(?:''|\\\"\\\")\"),a.querySelectorAll(\"[selected]\").length||q.push(\"\\\\[\"+L+\"*(?:value|\"+K+\")\"),a.querySelectorAll(\"[id~=\"+u+\"-]\").length||q.push(\"~=\"),a.querySelectorAll(\":checked\").length||q.push(\":checked\"),a.querySelectorAll(\"a#\"+u+\"+*\").length||q.push(\".#.+[+~]\")}),jb(function(a){var b=g.createElement(\"input\");b.setAttribute(\"type\",\"hidden\"),a.appendChild(b).setAttribute(\"name\",\"D\"),a.querySelectorAll(\"[name=d]\").length&&q.push(\"name\"+L+\"*[*^$|!~]?=\"),a.querySelectorAll(\":enabled\").length||q.push(\":enabled\",\":disabled\"),a.querySelectorAll(\"*,:x\"),q.push(\",.*:\")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&jb(function(a){c.disconnectedMatch=s.call(a,\"div\"),s.call(a,\"[s!='']:x\"),r.push(\"!=\",P)}),q=q.length&&new RegExp(q.join(\"|\")),r=r.length&&new RegExp(r.join(\"|\")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return lb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?lb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},gb.matches=function(a,b){return gb(a,null,null,b)},gb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,\"='$1']\"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return gb(b,n,null,[a]).length>0},gb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},gb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},gb.error=function(a){throw new Error(\"Syntax error, unrecognized expression: \"+a)},gb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=gb.getText=function(a){var b,c=\"\",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if(\"string\"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=gb.selectors={cacheLength:50,createPseudo:ib,match:X,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||\"\").replace(cb,db),\"~=\"===a[2]&&(a[3]=\" \"+a[3]+\" \"),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),\"nth\"===a[1].slice(0,3)?(a[3]||gb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*(\"even\"===a[3]||\"odd\"===a[3])),a[5]=+(a[7]+a[8]||\"odd\"===a[3])):a[3]&&gb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||\"\":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(\")\",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return\"*\"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+\" \"];return b||(b=new RegExp(\"(^|\"+L+\")\"+a+\"(\"+L+\"|$)\"))&&y(a,function(a){return b.test(\"string\"==typeof a.className&&a.className||\"undefined\"!=typeof a.getAttribute&&a.getAttribute(\"class\")||\"\")})},ATTR:function(a,b,c){return function(d){var e=gb.attr(d,a);return null==e?\"!=\"===b:b?(e+=\"\",\"=\"===b?e===c:\"!=\"===b?e!==c:\"^=\"===b?c&&0===e.indexOf(c):\"*=\"===b?c&&e.indexOf(c)>-1:\"$=\"===b?c&&e.slice(-c.length)===c:\"~=\"===b?(\" \"+e.replace(Q,\" \")+\" \").indexOf(c)>-1:\"|=\"===b?e===c||e.slice(0,c.length+1)===c+\"-\":!1):!0}},CHILD:function(a,b,c,d,e){var f=\"nth\"!==a.slice(0,3),g=\"last\"!==a.slice(-4),h=\"of-type\"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?\"nextSibling\":\"previousSibling\",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p=\"only\"===a&&!o&&\"nextSibling\"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||gb.error(\"unsupported pseudo: \"+a);return e[u]?e(b):e.length>1?(c=[a,a,\"\",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ib(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ib(function(a){var b=[],c=[],d=h(a.replace(R,\"$1\"));return d[u]?ib(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ib(function(a){return function(b){return gb(a,b).length>0}}),contains:ib(function(a){return a=a.replace(cb,db),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ib(function(a){return W.test(a||\"\")||gb.error(\"unsupported lang: \"+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute(\"xml:lang\")||b.getAttribute(\"lang\"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+\"-\");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return\"input\"===b&&!!a.checked||\"option\"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return\"input\"===b&&\"button\"===a.type||\"button\"===b},text:function(a){var b;return\"input\"===a.nodeName.toLowerCase()&&\"text\"===a.type&&(null==(b=a.getAttribute(\"type\"))||\"text\"===b.toLowerCase())},first:ob(function(){return[0]}),last:ob(function(a,b){return[b-1]}),eq:ob(function(a,b,c){return[0>c?c+b:c]}),even:ob(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:ob(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:ob(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:ob(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=mb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=nb(b);function qb(){}qb.prototype=d.filters=d.pseudos,d.setFilters=new qb,g=gb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+\" \"];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R,\" \")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?gb.error(a):z(a,i).slice(0)};function rb(a){for(var b=0,c=a.length,d=\"\";c>b;b++)d+=a[b].value;return d}function sb(a,b,c){var d=b.dir,e=c&&\"parentNode\"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function tb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ub(a,b,c){for(var d=0,e=b.length;e>d;d++)gb(a,b[d],c);return c}function vb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wb(a,b,c,d,e,f){return d&&!d[u]&&(d=wb(d)),e&&!e[u]&&(e=wb(e,f)),ib(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ub(b||\"*\",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:vb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=vb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=vb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[\" \"],i=g?1:0,k=sb(function(a){return a===b},h,!0),l=sb(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sb(tb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wb(i>1&&tb(m),i>1&&rb(a.slice(0,i-1).concat({value:\" \"===a[i-2].type?\"*\":\"\"})).replace(R,\"$1\"),c,e>i&&xb(a.slice(i,e)),f>e&&xb(a=a.slice(e)),f>e&&rb(a))}m.push(c)}return tb(m)}function yb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q=\"0\",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG(\"*\",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=vb(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&gb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ib(f):f}return h=gb.compile=function(a,b){var c,d=[],e=[],f=A[a+\" \"];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,yb(e,d)),f.selector=a}return f},i=gb.select=function(a,b,e,f){var i,j,k,l,m,n=\"function\"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&\"ID\"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&pb(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&rb(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&pb(b.parentNode)||b),e},c.sortStable=u.split(\"\").sort(B).join(\"\")===u,c.detectDuplicates=!!l,m(),c.sortDetached=jb(function(a){return 1&a.compareDocumentPosition(n.createElement(\"div\"))}),jb(function(a){return a.innerHTML=\"<a href='#'></a>\",\"#\"===a.firstChild.getAttribute(\"href\")})||kb(\"type|href|height|width\",function(a,b,c){return c?void 0:a.getAttribute(b,\"type\"===b.toLowerCase()?1:2)}),c.attributes&&jb(function(a){return a.innerHTML=\"<input/>\",a.firstChild.setAttribute(\"value\",\"\"),\"\"===a.firstChild.getAttribute(\"value\")})||kb(\"value\",function(a,b,c){return c||\"input\"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),jb(function(a){return null==a.getAttribute(\"disabled\")})||kb(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),gb}(a);n.find=t,n.expr=t.selectors,n.expr[\":\"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,w=/^.[^:#\\[\\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if(\"string\"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=\":not(\"+a+\")\"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if(\"string\"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+\" \"+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,\"string\"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if(\"string\"==typeof a){if(c=\"<\"===a[0]&&\">\"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?\"undefined\"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||\"string\"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?\"string\"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,\"parentNode\")},parentsUntil:function(a,b,c){return n.dir(a,\"parentNode\",c)},next:function(a){return D(a,\"nextSibling\")},prev:function(a){return D(a,\"previousSibling\")},nextAll:function(a){return n.dir(a,\"nextSibling\")},prevAll:function(a){return n.dir(a,\"previousSibling\")},nextUntil:function(a,b,c){return n.dir(a,\"nextSibling\",c)},prevUntil:function(a,b,c){return n.dir(a,\"previousSibling\",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return\"Until\"!==a.slice(-5)&&(d=c),d&&\"string\"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a=\"string\"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);\"function\"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&\"string\"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[[\"resolve\",\"done\",n.Callbacks(\"once memory\"),\"resolved\"],[\"reject\",\"fail\",n.Callbacks(\"once memory\"),\"rejected\"],[\"notify\",\"progress\",n.Callbacks(\"memory\")]],c=\"pending\",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+\"With\"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+\"With\"](this===e?d:this,arguments),this},e[f[0]+\"With\"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler(\"ready\"),n(l).off(\"ready\"))))}});function I(){l.removeEventListener(\"DOMContentLoaded\",I,!1),a.removeEventListener(\"load\",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),\"complete\"===l.readyState?setTimeout(n.ready):(l.addEventListener(\"DOMContentLoaded\",I,!1),a.addEventListener(\"load\",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if(\"object\"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if(\"string\"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&\"string\"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d=\"data-\"+b.replace(O,\"-$1\").toLowerCase(),c=a.getAttribute(d),\"string\"==typeof c){try{c=\"true\"===c?!0:\"false\"===c?!1:\"null\"===c?null:+c+\"\"===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c)\n},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,\"hasDataAttrs\"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf(\"data-\")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,\"hasDataAttrs\",!0)}return e}return\"object\"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf(\"-\")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||\"fx\")+\"queue\",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||\"fx\";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};\"inprogress\"===e&&(e=c.shift(),d--),e&&(\"fx\"===b&&c.unshift(\"inprogress\"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+\"queueHooks\";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks(\"once memory\").add(function(){L.remove(a,[b+\"queue\",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return\"string\"!=typeof a&&(b=a,a=\"fx\",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),\"fx\"===a&&\"inprogress\"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||\"fx\",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};\"string\"!=typeof a&&(b=a,a=void 0),a=a||\"fx\";while(g--)c=L.get(f[g],a+\"queueHooks\"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,R=[\"Top\",\"Right\",\"Bottom\",\"Left\"],S=function(a,b){return a=b||a,\"none\"===n.css(a,\"display\")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement(\"div\")),c=l.createElement(\"input\");c.setAttribute(\"type\",\"radio\"),c.setAttribute(\"checked\",\"checked\"),c.setAttribute(\"name\",\"t\"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML=\"<textarea>x</textarea>\",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U=\"undefined\";k.focusinBubbles=\"onfocusin\"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||\"\").match(E)||[\"\"],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||\"\").split(\".\").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(\".\")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||\"\").match(E)||[\"\"],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||\"\").split(\".\").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp(\"(^|\\\\.)\"+p.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&(\"**\"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,\"events\"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,\"type\")?b.type:b,r=j.call(b,\"namespace\")?b.namespace.split(\".\"):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(\".\")>=0&&(r=q.split(\".\"),q=r.shift(),r.sort()),k=q.indexOf(\":\")<0&&\"on\"+q,b=b[n.expando]?b:new n.Event(q,\"object\"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join(\".\"),b.namespace_re=b.namespace?new RegExp(\"(^|\\\\.)\"+r.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,\"events\")||{})[b.type]&&L.get(g,\"handle\"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,\"events\")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||\"click\"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||\"click\"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+\" \",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:\"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),fixHooks:{},keyHooks:{props:\"char charCode key keyCode\".split(\" \"),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:\"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||l,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=W.test(e)?this.mouseHooks:V.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=l),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==_()&&this.focus?(this.focus(),!1):void 0},delegateType:\"focusin\"},blur:{trigger:function(){return this===_()&&this.blur?(this.blur(),!1):void 0},delegateType:\"focusout\"},click:{trigger:function(){return\"checkbox\"===this.type&&this.click&&n.nodeName(this,\"input\")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,\"a\")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?Z:$):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:$,isPropagationStopped:$,isImmediatePropagationStopped:$,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=Z,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=Z,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=Z,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\",pointerenter:\"pointerover\",pointerleave:\"pointerout\"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.focusinBubbles||n.each({focus:\"focusin\",blur:\"focusout\"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=L.access(d,b);e||d.addEventListener(a,c,!0),L.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=L.access(d,b)-1;e?L.access(d,b,e):(d.removeEventListener(a,c,!0),L.remove(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if(\"object\"==typeof a){\"string\"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&(\"string\"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=$;else if(!d)return this;return 1===e&&(f=d,d=function(a){return n().off(a),f.apply(this,arguments)},d.guid=f.guid||(f.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+\".\"+d.namespace:d.origType,d.selector,d.handler),this;if(\"object\"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||\"function\"==typeof b)&&(c=b,b=void 0),c===!1&&(c=$),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var ab=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,bb=/<([\\w:]+)/,cb=/<|&#?\\w+;/,db=/<(?:script|style|link)/i,eb=/checked\\s*(?:[^=]|=\\s*.checked.)/i,fb=/^$|\\/(?:java|ecma)script/i,gb=/^true\\/(.*)/,hb=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,ib={option:[1,\"<select multiple='multiple'>\",\"</select>\"],thead:[1,\"<table>\",\"</table>\"],col:[2,\"<table><colgroup>\",\"</colgroup></table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:[0,\"\",\"\"]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return n.nodeName(a,\"table\")&&n.nodeName(11!==b.nodeType?b:b.firstChild,\"tr\")?a.getElementsByTagName(\"tbody\")[0]||a.appendChild(a.ownerDocument.createElement(\"tbody\")):a}function kb(a){return a.type=(null!==a.getAttribute(\"type\"))+\"/\"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute(\"type\"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],\"globalEval\",!b||L.get(b[c],\"globalEval\"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||\"*\"):a.querySelectorAll?a.querySelectorAll(b||\"*\"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();\"input\"===c&&T.test(a.type)?b.checked=a.checked:(\"input\"===c||\"textarea\"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,\"script\"),g.length>0&&mb(g,!i&&ob(a,\"script\")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if(\"object\"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement(\"div\")),g=(bb.exec(e)||[\"\",\"\"])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,\"<$1></$2>\")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=\"\"}else l.push(b.createTextNode(e));k.textContent=\"\",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=ob(k.appendChild(e),\"script\"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||\"\")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(ob(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&mb(ob(c,\"script\")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(ob(a,!1)),a.textContent=\"\");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if(\"string\"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||[\"\",\"\"])[1].toLowerCase()]){a=a.replace(ab,\"<$1></$2>\");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&\"string\"==typeof p&&!k.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(ob(c,\"script\"),kb),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,ob(h,\"script\"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||\"\")&&!L.access(h,\"globalEval\")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(hb,\"\")))}return this}}),n.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],\"display\");return e.detach(),f}function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),\"none\"!==c&&c||(qb=(qb||n(\"<iframe frameborder='0' width='0' height='0'/>\")).appendTo(b.documentElement),b=qb[0].contentDocument,b.write(),b.close(),c=sb(a,b),qb.detach()),rb[a]=c),c}var ub=/^margin/,vb=new RegExp(\"^(\"+Q+\")(?!px)[a-z%]+$\",\"i\"),wb=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)};function xb(a,b,c){var d,e,f,g,h=a.style;return c=c||wb(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(\"\"!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),vb.test(g)&&ub.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+\"\":g}function yb(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement(\"div\"),f=l.createElement(\"div\");if(f.style){f.style.backgroundClip=\"content-box\",f.cloneNode(!0).style.backgroundClip=\"\",k.clearCloneStyle=\"content-box\"===f.style.backgroundClip,e.style.cssText=\"border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute\",e.appendChild(f);function g(){f.style.cssText=\"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute\",f.innerHTML=\"\",d.appendChild(e);var g=a.getComputedStyle(f,null);b=\"1%\"!==g.top,c=\"4px\"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement(\"div\"));return c.style.cssText=f.style.cssText=\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0\",c.style.marginRight=c.style.width=\"0\",f.style.width=\"1px\",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),f.removeChild(c),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var zb=/^(none|table(?!-c[ea]).+)/,Ab=new RegExp(\"^(\"+Q+\")(.*)$\",\"i\"),Bb=new RegExp(\"^([+-])=(\"+Q+\")\",\"i\"),Cb={position:\"absolute\",visibility:\"hidden\",display:\"block\"},Db={letterSpacing:\"0\",fontWeight:\"400\"},Eb=[\"Webkit\",\"O\",\"Moz\",\"ms\"];function Fb(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Eb.length;while(e--)if(b=Eb[e]+c,b in a)return b;return d}function Gb(a,b,c){var d=Ab.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||\"px\"):b}function Hb(a,b,c,d,e){for(var f=c===(d?\"border\":\"content\")?4:\"width\"===b?1:0,g=0;4>f;f+=2)\"margin\"===c&&(g+=n.css(a,c+R[f],!0,e)),d?(\"content\"===c&&(g-=n.css(a,\"padding\"+R[f],!0,e)),\"margin\"!==c&&(g-=n.css(a,\"border\"+R[f]+\"Width\",!0,e))):(g+=n.css(a,\"padding\"+R[f],!0,e),\"padding\"!==c&&(g+=n.css(a,\"border\"+R[f]+\"Width\",!0,e)));return g}function Ib(a,b,c){var d=!0,e=\"width\"===b?a.offsetWidth:a.offsetHeight,f=wb(a),g=\"border-box\"===n.css(a,\"boxSizing\",!1,f);if(0>=e||null==e){if(e=xb(a,b,f),(0>e||null==e)&&(e=a.style[b]),vb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Hb(a,b,c||(g?\"border\":\"content\"),d,f)+\"px\"}function Jb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,\"olddisplay\"),c=d.style.display,b?(f[g]||\"none\"!==c||(d.style.display=\"\"),\"\"===d.style.display&&S(d)&&(f[g]=L.access(d,\"olddisplay\",tb(d.nodeName)))):(e=S(d),\"none\"===c&&e||L.set(d,\"olddisplay\",e?c:n.css(d,\"display\"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&\"none\"!==d.style.display&&\"\"!==d.style.display||(d.style.display=b?f[g]||\"\":\"none\"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xb(a,\"opacity\");return\"\"===c?\"1\":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{\"float\":\"cssFloat\"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fb(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&\"get\"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,\"string\"===f&&(e=Bb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f=\"number\"),null!=c&&c===c&&(\"number\"!==f||n.cssNumber[h]||(c+=\"px\"),k.clearCloneStyle||\"\"!==c||0!==b.indexOf(\"background\")||(i[b]=\"inherit\"),g&&\"set\"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fb(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&\"get\"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xb(a,b,d)),\"normal\"===e&&b in Db&&(e=Db[b]),\"\"===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each([\"height\",\"width\"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?zb.test(n.css(a,\"display\"))&&0===a.offsetWidth?n.swap(a,Cb,function(){return Ib(a,b,d)}):Ib(a,b,d):void 0},set:function(a,c,d){var e=d&&wb(a);return Gb(a,c,d?Hb(a,b,d,\"border-box\"===n.css(a,\"boxSizing\",!1,e),e):0)}}}),n.cssHooks.marginRight=yb(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:\"inline-block\"},xb,[a,\"marginRight\"]):void 0}),n.each({margin:\"\",padding:\"\",border:\"Width\"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f=\"string\"==typeof c?c.split(\" \"):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ub.test(a)||(n.cssHooks[a+b].set=Gb)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wb(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Jb(this,!0)},hide:function(){return Jb(this)},toggle:function(a){return\"boolean\"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Kb(a,b,c,d,e){return new Kb.prototype.init(a,b,c,d,e)}n.Tween=Kb,Kb.prototype={constructor:Kb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||\"swing\",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?\"\":\"px\")},cur:function(){var a=Kb.propHooks[this.prop];return a&&a.get?a.get(this):Kb.propHooks._default.get(this)},run:function(a){var b,c=Kb.propHooks[this.prop];return this.pos=b=this.options.duration?n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Kb.propHooks._default.set(this),this}},Kb.prototype.init.prototype=Kb.prototype,Kb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,\"\"),b&&\"auto\"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Kb.propHooks.scrollTop=Kb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Kb.prototype.init,n.fx.step={};var Lb,Mb,Nb=/^(?:toggle|show|hide)$/,Ob=new RegExp(\"^(?:([+-])=|)(\"+Q+\")([a-z%]*)$\",\"i\"),Pb=/queueHooks$/,Qb=[Vb],Rb={\"*\":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Ob.exec(b),f=e&&e[3]||(n.cssNumber[a]?\"\":\"px\"),g=(n.cssNumber[a]||\"px\"!==f&&+d)&&Ob.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||\".5\",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sb(){return setTimeout(function(){Lb=void 0}),Lb=n.now()}function Tb(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e[\"margin\"+c]=e[\"padding\"+c]=a;return b&&(e.opacity=e.width=a),e}function Ub(a,b,c){for(var d,e=(Rb[b]||[]).concat(Rb[\"*\"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Vb(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,\"fxshow\");c.queue||(h=n._queueHooks(a,\"fx\"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,\"fx\").length||h.empty.fire()})})),1===a.nodeType&&(\"height\"in b||\"width\"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,\"display\"),k=\"none\"===j?L.get(a,\"olddisplay\")||tb(a.nodeName):j,\"inline\"===k&&\"none\"===n.css(a,\"float\")&&(o.display=\"inline-block\")),c.overflow&&(o.overflow=\"hidden\",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Nb.exec(e)){if(delete b[d],f=f||\"toggle\"===e,e===(p?\"hide\":\"show\")){if(\"show\"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))\"inline\"===(\"none\"===j?tb(a.nodeName):j)&&(o.display=j);else{q?\"hidden\"in q&&(p=q.hidden):q=L.access(a,\"fxshow\",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,\"fxshow\");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ub(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start=\"width\"===d||\"height\"===d?1:0))}}function Wb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&\"expand\"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xb(a,b,c){var d,e,f=0,g=Qb.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Lb||Sb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:Lb||Sb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wb(k,j.opts.specialEasing);g>f;f++)if(d=Qb[f].call(j,a,k,j.opts))return d;return n.map(k,Ub,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xb,{tweener:function(a,b){n.isFunction(a)?(b=a,a=[\"*\"]):a=a.split(\" \");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Rb[c]=Rb[c]||[],Rb[c].unshift(b)},prefilter:function(a,b){b?Qb.unshift(a):Qb.push(a)}}),n.speed=function(a,b,c){var d=a&&\"object\"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:\"number\"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue=\"fx\"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css(\"opacity\",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xb(this,n.extend({},a),f);(e||L.get(this,\"finish\"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return\"string\"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||\"fx\",[]),this.each(function(){var b=!0,e=null!=a&&a+\"queueHooks\",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||\"fx\"),this.each(function(){var b,c=L.get(this),d=c[a+\"queue\"],e=c[a+\"queueHooks\"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each([\"toggle\",\"show\",\"hide\"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||\"boolean\"==typeof a?c.apply(this,arguments):this.animate(Tb(b,!0),a,d,e)}}),n.each({slideDown:Tb(\"show\"),slideUp:Tb(\"hide\"),slideToggle:Tb(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(Lb=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),Lb=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Mb||(Mb=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(Mb),Mb=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||\"fx\",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=l.createElement(\"input\"),b=l.createElement(\"select\"),c=b.appendChild(l.createElement(\"option\"));a.type=\"checkbox\",k.checkOn=\"\"!==a.value,k.optSelected=c.selected,b.disabled=!0,k.optDisabled=!c.disabled,a=l.createElement(\"input\"),a.value=\"t\",a.type=\"radio\",k.radioValue=\"t\"===a.value}();var Yb,Zb,$b=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return J(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Zb:Yb)),void 0===c?d&&\"get\"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&\"set\"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+\"\"),c):void n.removeAttr(a,b))\n},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&\"radio\"===b&&n.nodeName(a,\"input\")){var c=a.value;return a.setAttribute(\"type\",b),c&&(a.value=c),b}}}}}),Zb={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\\w+/g),function(a,b){var c=$b[b]||n.find.attr;$b[b]=function(a,b,d){var e,f;return d||(f=$b[b],$b[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$b[b]=f),e}});var _b=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{\"for\":\"htmlFor\",\"class\":\"className\"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&\"set\"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&\"get\"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute(\"tabindex\")||_b.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){n.propFix[this.toLowerCase()]=this});var ac=/[\\t\\r\\n\\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=\"string\"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||\"\").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(\" \"+c.className+\" \").replace(ac,\" \"):\" \")){f=0;while(e=b[f++])d.indexOf(\" \"+e+\" \")<0&&(d+=e+\" \");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||\"string\"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||\"\").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(\" \"+c.className+\" \").replace(ac,\" \"):\"\")){f=0;while(e=b[f++])while(d.indexOf(\" \"+e+\" \")>=0)d=d.replace(\" \"+e+\" \",\" \");g=a?n.trim(d):\"\",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return\"boolean\"==typeof b&&\"string\"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if(\"string\"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||\"boolean\"===c)&&(this.className&&L.set(this,\"__className__\",this.className),this.className=this.className||a===!1?\"\":L.get(this,\"__className__\")||\"\")})},hasClass:function(a){for(var b=\" \"+a+\" \",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(\" \"+this[c].className+\" \").replace(ac,\" \").indexOf(b)>=0)return!0;return!1}});var bc=/\\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e=\"\":\"number\"==typeof e?e+=\"\":n.isArray(e)&&(e=n.map(e,function(a){return null==a?\"\":a+\"\"})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&\"set\"in b&&void 0!==b.set(this,e,\"value\")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&\"get\"in b&&void 0!==(c=b.get(e,\"value\"))?c:(c=e.value,\"string\"==typeof c?c.replace(bc,\"\"):null==c?\"\":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,\"value\");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f=\"select-one\"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute(\"disabled\"))||c.parentNode.disabled&&n.nodeName(c.parentNode,\"optgroup\"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each([\"radio\",\"checkbox\"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute(\"value\")?\"on\":a.value})}),n.each(\"blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu\".split(\" \"),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,\"**\"):this.off(b,a||\"**\",c)}});var cc=n.now(),dc=/\\?/;n.parseJSON=function(a){return JSON.parse(a+\"\")},n.parseXML=function(a){var b,c;if(!a||\"string\"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,\"text/xml\")}catch(d){b=void 0}return(!b||b.getElementsByTagName(\"parsererror\").length)&&n.error(\"Invalid XML: \"+a),b};var ec=/#.*$/,fc=/([?&])_=[^&]*/,gc=/^(.*?):[ \\t]*([^\\r\\n]*)$/gm,hc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,ic=/^(?:GET|HEAD)$/,jc=/^\\/\\//,kc=/^([\\w.+-]+:)(?:\\/\\/(?:[^\\/?#]*@|)([^\\/?#:]*)(?::(\\d+)|)|)/,lc={},mc={},nc=\"*/\".concat(\"*\"),oc=a.location.href,pc=kc.exec(oc.toLowerCase())||[];function qc(a){return function(b,c){\"string\"!=typeof b&&(c=b,b=\"*\");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])\"+\"===d[0]?(d=d.slice(1)||\"*\",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function rc(a,b,c,d){var e={},f=a===mc;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return\"string\"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e[\"*\"]&&g(\"*\")}function sc(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function tc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while(\"*\"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader(\"Content-Type\"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+\" \"+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function uc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if(\"*\"===f)f=i;else if(\"*\"!==i&&i!==f){if(g=j[i+\" \"+f]||j[\"* \"+f],!g)for(e in j)if(h=e.split(\" \"),h[1]===f&&(g=j[i+\" \"+h[0]]||j[\"* \"+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a[\"throws\"])b=g(b);else try{b=g(b)}catch(l){return{state:\"parsererror\",error:g?l:\"No conversion from \"+i+\" to \"+f}}}return{state:\"success\",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:oc,type:\"GET\",isLocal:hc.test(pc[1]),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":nc,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":n.parseJSON,\"text xml\":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?sc(sc(a,n.ajaxSettings),b):sc(n.ajaxSettings,a)},ajaxPrefilter:qc(lc),ajaxTransport:qc(mc),ajax:function(a,b){\"object\"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks(\"once memory\"),q=k.statusCode||{},r={},s={},t=0,u=\"canceled\",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=gc.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||oc)+\"\").replace(ec,\"\").replace(jc,pc[1]+\"//\"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||\"*\").toLowerCase().match(E)||[\"\"],null==k.crossDomain&&(h=kc.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===pc[1]&&h[2]===pc[2]&&(h[3]||(\"http:\"===h[1]?\"80\":\"443\"))===(pc[3]||(\"http:\"===pc[1]?\"80\":\"443\")))),k.data&&k.processData&&\"string\"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),rc(lc,k,b,v),2===t)return v;i=n.event&&k.global,i&&0===n.active++&&n.event.trigger(\"ajaxStart\"),k.type=k.type.toUpperCase(),k.hasContent=!ic.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(dc.test(d)?\"&\":\"?\")+k.data,delete k.data),k.cache===!1&&(k.url=fc.test(d)?d.replace(fc,\"$1_=\"+cc++):d+(dc.test(d)?\"&\":\"?\")+\"_=\"+cc++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader(\"If-Modified-Since\",n.lastModified[d]),n.etag[d]&&v.setRequestHeader(\"If-None-Match\",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader(\"Content-Type\",k.contentType),v.setRequestHeader(\"Accept\",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+(\"*\"!==k.dataTypes[0]?\", \"+nc+\"; q=0.01\":\"\"):k.accepts[\"*\"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u=\"abort\";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=rc(mc,k,b,v)){v.readyState=1,i&&m.trigger(\"ajaxSend\",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort(\"timeout\")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,\"No Transport\");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||\"\",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=tc(k,v,f)),u=uc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader(\"Last-Modified\"),w&&(n.lastModified[d]=w),w=v.getResponseHeader(\"etag\"),w&&(n.etag[d]=w)),204===a||\"HEAD\"===k.type?x=\"nocontent\":304===a?x=\"notmodified\":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x=\"error\",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+\"\",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?\"ajaxSuccess\":\"ajaxError\",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger(\"ajaxComplete\",[v,k]),--n.active||n.event.trigger(\"ajaxStop\")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,\"json\")},getScript:function(a,b){return n.get(a,void 0,b,\"script\")}}),n.each([\"get\",\"post\"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n._evalUrl=function(a){return n.ajax({url:a,type:\"GET\",dataType:\"script\",async:!1,global:!1,\"throws\":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,\"body\")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var vc=/%20/g,wc=/\\[\\]$/,xc=/\\r?\\n/g,yc=/^(?:submit|button|image|reset|file)$/i,zc=/^(?:input|select|textarea|keygen)/i;function Ac(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||wc.test(a)?d(a,e):Ac(a+\"[\"+(\"object\"==typeof e?b:\"\")+\"]\",e,c,d)});else if(c||\"object\"!==n.type(b))d(a,b);else for(e in b)Ac(a+\"[\"+e+\"]\",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?\"\":b,d[d.length]=encodeURIComponent(a)+\"=\"+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Ac(c,a[c],b,e);return d.join(\"&\").replace(vc,\"+\")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,\"elements\");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(\":disabled\")&&zc.test(this.nodeName)&&!yc.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(xc,\"\\r\\n\")}}):{name:b.name,value:c.replace(xc,\"\\r\\n\")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Bc=0,Cc={},Dc={0:200,1223:204},Ec=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent(\"onunload\",function(){for(var a in Cc)Cc[a]()}),k.cors=!!Ec&&\"withCredentials\"in Ec,k.ajax=Ec=!!Ec,n.ajaxTransport(function(a){var b;return k.cors||Ec&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Bc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c[\"X-Requested-With\"]||(c[\"X-Requested-With\"]=\"XMLHttpRequest\");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Cc[g],b=f.onload=f.onerror=null,\"abort\"===a?f.abort():\"error\"===a?d(f.status,f.statusText):d(Dc[f.status]||f.status,f.statusText,\"string\"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b(\"error\"),b=Cc[g]=b(\"abort\");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/(?:java|ecma)script/},converters:{\"text script\":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter(\"script\",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type=\"GET\")}),n.ajaxTransport(\"script\",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n(\"<script>\").prop({async:!0,charset:a.scriptCharset,src:a.url}).on(\"load error\",c=function(a){b.remove(),c=null,a&&e(\"error\"===a.type?404:200,a.type)}),l.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Fc=[],Gc=/(=)\\?(?=&|$)|\\?\\?/;n.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var a=Fc.pop()||n.expando+\"_\"+cc++;return this[a]=!0,a}}),n.ajaxPrefilter(\"json jsonp\",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Gc.test(b.url)?\"url\":\"string\"==typeof b.data&&!(b.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&Gc.test(b.data)&&\"data\");return h||\"jsonp\"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Gc,\"$1\"+e):b.jsonp!==!1&&(b.url+=(dc.test(b.url)?\"&\":\"?\")+b.jsonp+\"=\"+e),b.converters[\"script json\"]=function(){return g||n.error(e+\" was not called\"),g[0]},b.dataTypes[0]=\"json\",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Fc.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),\"script\"):void 0}),n.parseHTML=function(a,b,c){if(!a||\"string\"!=typeof a)return null;\"boolean\"==typeof b&&(c=b,b=!1),b=b||l;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var Hc=n.fn.load;n.fn.load=function(a,b,c){if(\"string\"!=typeof a&&Hc)return Hc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(\" \");return h>=0&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&\"object\"==typeof b&&(e=\"POST\"),g.length>0&&n.ajax({url:a,type:e,dataType:\"html\",data:b}).done(function(a){f=arguments,g.html(d?n(\"<div>\").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},n.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var Ic=a.document.documentElement;function Jc(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,\"position\"),l=n(a),m={};\"static\"===k&&(a.style.position=\"relative\"),h=l.offset(),f=n.css(a,\"top\"),i=n.css(a,\"left\"),j=(\"absolute\"===k||\"fixed\"===k)&&(f+i).indexOf(\"auto\")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),\"using\"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(typeof d.getBoundingClientRect!==U&&(e=d.getBoundingClientRect()),c=Jc(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return\"fixed\"===n.css(c,\"position\")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],\"html\")||(d=a.offset()),d.top+=n.css(a[0],\"borderTopWidth\",!0),d.left+=n.css(a[0],\"borderLeftWidth\",!0)),{top:b.top-d.top-n.css(c,\"marginTop\",!0),left:b.left-d.left-n.css(c,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||Ic;while(a&&!n.nodeName(a,\"html\")&&\"static\"===n.css(a,\"position\"))a=a.offsetParent;return a||Ic})}}),n.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(b,c){var d=\"pageYOffset\"===c;n.fn[b]=function(e){return J(this,function(b,e,f){var g=Jc(b);return void 0===f?g?g[c]:b[e]:void(g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),n.each([\"top\",\"left\"],function(a,b){n.cssHooks[b]=yb(k.pixelPosition,function(a,c){return c?(c=xb(a,b),vb.test(c)?n(a).position()[b]+\"px\":c):void 0})}),n.each({Height:\"height\",Width:\"width\"},function(a,b){n.each({padding:\"inner\"+a,content:b,\"\":\"outer\"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||\"boolean\"!=typeof d),g=c||(d===!0||e===!0?\"margin\":\"border\");return J(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement[\"client\"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body[\"scroll\"+a],e[\"scroll\"+a],b.body[\"offset\"+a],e[\"offset\"+a],e[\"client\"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return n});var Kc=a.jQuery,Lc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Lc),b&&a.jQuery===n&&(a.jQuery=Kc),n},typeof b===U&&(a.jQuery=a.$=n),n});\n\n$(function () {\n\tconst $folders = $('.folders'),\n\t\t  $filesList = $('.files__list');\n\n\tvar FileManager = {\n\t\tFileType: {\n\t\t\t\"image\": \"fa-picture-o\",\n\t\t\t\"file\": \"fa-file\",\n\t\t\t\"unknown\": \"fa-question\",\n\t\t\t\"folder\": \"fa-folder\",\n\t\t},\n\t\tSideList: [\"Document\", \"Setting\", \"About\"],\n\t\tCurrentFileList: [ /*format: {\"type\": \"file\", \"name\": \"file_name\",}*/ ],\n\t\tCurrentPath: '/',\n\t\tFakeData: {\n\t\t\t'/': [\n\t\t\t\t{\"type\" : \"unknown\", \"name\" : \".DS_Store\"},\n\t\t\t\t{\"type\" : \"folder\", \"name\" : \".Github\"},\n\t\t\t\t{\"type\" : \"unknown\", \"name\" : \".tencent_analysis_WXOMTAStore\"},\n\t\t\t\t{\"type\" : \"unknown\", \"name\" : \"pipeline.sh\"},\n\t\t\t\t{\"type\" : \"folder\", \"name\" : \"var\"}\n\t\t\t],\n\t\t\t'/var/': [\n\t\t\t\t{\"type\" : \"folder\", \"name\" : \"log\"},\n\t\t\t\t{\"type\" : \"folder\", \"name\" : \"www\"},\n\t\t\t\t{\"type\" : \"file\", \"name\" : \"123.py\"},\n\t\t\t],\n\t\t\t'/.Github/': [\n\t\t\t\t{\"type\" : \"folder\", \"name\" : \"sscd\"},\n\t\t\t\t{\"type\" : \"unknown\", \"name\" : \"dsav.md\"},\n\t\t\t],\n\t\t},\n\n\t\t// Functions\n\t\tupdateSideList: function(){\n\t\t\t$folders.html(\"\");\n\t\t\tthis.SideList.forEach(function(s){\n\t\t\t\tvar li = document.createElement('li');\n\t\t\t\tli.innerHTML = '<a href=\"#\"><i class=\"fa fa-folder\"></i>'+s+'</a>';\n\t\t\t\t$folders.append(li);\n\t\t\t});\n\t\t},\n\n\t\tupdateFileList: function(filelist){\n\t\t\tvar self = this,\n\t\t\t\tfs = filelist || [],\n\t\t\t\ttmp1 = fs.filter(function(f){return f.type == 'folder'}),\n\t\t\t\ttmp2 = fs.filter(function(f){return f.type != 'folder'});\n\t\t\tself.CurrentFileList = (self.CurrentPath == '/' ? [] : [{\"type\" : \"folder\", \"name\" : \"..\"}]).concat(tmp1, tmp2);\n\n\t\t\t$filesList.html(\"\");\n\t\t\tself.CurrentFileList.forEach(function(file){\n\t\t\t\tvar type = self.FileType[file.type];\n\t\t\t\tvar htmlStr = '\\\n\t\t\t\t<div class=\"thumbnail\">\\\n\t\t\t\t\t<i class=\"fa #TYPE#\"></i>\\\n\t\t\t\t\t<div class=\"zoom\"><i class=\"fa fa-search\"></i></div>\\\n\t\t\t\t</div>\\\n\t\t\t\t<a href=\"#\"><i class=\"fa #TYPE#\"></i>#NAME#</a>';\n\t\t\t\thtmlStr = htmlStr.replace(/#TYPE#/g,type).replace(/#NAME#/g,file.name);\n\n\t\t\t\tvar li = document.createElement('li');\n\t\t\t\tli.innerHTML = htmlStr;\n\t\t\t\t$filesList.append(li);\n\t\t\t});\n\t\t\treturn self\n\t\t},\n\n\t\tfetchFileListAtPath: function(path){\n\t\t\tvar self = this;\n\t\t\t$.ajax(\"/json/filelist?path=\"+path).done(function(data){\n\t\t\t\tself.updateFileList(data[\"filelist\"]);\n\t\t\t}).error(function(){\n\t\t\t\t// just for test\n\t\t\t\tself.updateFileList(self.FakeData[path]);\n\t\t\t});\n\t\t},\n\n\t\tinit: function(){\n\t\t\tvar self = this;\n\n\t\t\t// Show the whole file manager window\n\t\t\t$('.container').addClass('tk-loaded');\n\n\t\t\t// File Uploader\n\t\t\t$('#upload-shield').change(function() {\n\t\t\t\tvar filename = $(this).val();\n\t\t\t\tvar lastIndex = filename.lastIndexOf(\"\\\\\");\n\t\t\t\tif (lastIndex >= 0) {\n\t\t\t\t\tfilename = filename.substring(lastIndex + 1);\n\t\t\t\t}\n\t\t\t\t$('#filename').val(filename);\n\t\t\t});\n\n\t\t\t// Sidelist click event\n\t\t\t$folders.on('click', 'a', function () {\n\t\t\t\t// Hightlight only the clicked folder\n\t\t\t\t$('a', $folders).removeClass('active');\n\t\t\t\t$(this).addClass('active');\n\t\t\t\t$filesList.addClass('active');\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\t\t$filesList.on('click', 'a', function(){\n\t\t\t\tif ($(this).find('i').hasClass('fa-folder')){\n\t\t\t\t\tif ($(this).text() == '..') {\n\t\t\t\t\t\tvar tmp = self.CurrentPath.split('/')\n\t\t\t\t\t\ttmp.pop();\n\t\t\t\t\t\ttmp.pop();\n\t\t\t\t\t\tself.CurrentPath = tmp.join('/')+'/';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.CurrentPath += $(this).text()+'/';\n\t\t\t\t\t}\n\t\t\t\t\tconsole.log(self.CurrentPath);\n\t\t\t\t\tself.fetchFileListAtPath(self.CurrentPath);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\t\tself.updateSideList();\n\t\t\tself.fetchFileListAtPath(self.CurrentPath);\n\t\t\t$folders.find('li a')[0].click();\n\t\t},\n\t};\n\n\tFileManager.init();\n});\n"
  },
  {
    "path": "Sublime/Sublime/Web/license.txt",
    "content": "\n<!--\nCopyright (c) 2016 by Derek Wheelden (http://codepen.io/frxnz/pen/kqGaI)\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"
  },
  {
    "path": "Sublime/Sublime/WebServerLog.swift",
    "content": "//\n//  ServerLog.swift\n//  Sublime\n//\n//  Created by Eular on 3/11/16.\n//  Copyright © 2016 Eular. All rights reserved.\n//\n\nimport Foundation\nimport Swifter\n\n\npublic class WebServerLog {\n    let output: UITextView\n    var logFile: File?\n    \n    init(output: UITextView) {\n        self.output = output\n    }\n    \n    func log(msg: String, isError: Bool = false) {\n        let t = formattedTimeString()\n        let strList: [[String: AnyObject]] = [\n            [\"str\": \"[\\(t)] \", \"color\": \"#FD9720\".color!],\n            [\"str\": \"\\(msg)\\n\", \"color\": isError ? \"#FF3C50\".color! : UIColor.whiteColor()],\n        ]\n        outputString(toAttributedString(strList))\n    }\n    \n    func log(r: HttpRequest, statusCode: Int = 200) {\n        let t = formattedTimeString()\n        let ip = r.address!\n        let method = r.method\n        let path = r.path\n        let userAgent = r.headers[\"user-agent\"]!\n        \n        let strList: [[String: AnyObject]] = [\n            [\"str\": \"[\\(t)] \", \"color\": \"#FD9720\".color!],\n            [\"str\": \"-- \", \"color\": UIColor.whiteColor()],\n            [\"str\": \"\\(ip) \", \"color\": \"#66D9EF\".color!],\n            [\"str\": \"\\\"\\(method) \\(path) HTTP/1.1\\\" \", \"color\": \"#AE81FF\".color!],\n            [\"str\": \"\\(statusCode) \", \"color\": \"#4CD964\".color!],\n            [\"str\": \"\\\"\\(userAgent)\\\"\\n\", \"color\": UIColor.grayColor()]\n        ]\n        \n        outputString(toAttributedString(strList))\n    }\n    \n    func saveInLogFile(str: String) {\n        if logFile == nil {\n            let t = formattedTimeString().split()[0]\n            let fname = \"\\(t).log\"\n            let logFolder = Folder(path: Constant.SublimeRoot+\"/var/log\")\n            if !logFolder.checkFileExist(fname) {\n                logFolder.newFile(fname)\n            }\n            self.logFile = File(path: Constant.SublimeRoot+\"/var/log/\\(fname)\")\n        }\n        \n        logFile?.append(str)\n    }\n    \n    private func toAttributedString(strList: [[String: AnyObject]]) -> NSMutableAttributedString {\n        let attrStr = NSMutableAttributedString()\n        for s in strList {\n            let attr = [NSForegroundColorAttributeName: s[\"color\"] as! UIColor]\n            let str = NSMutableAttributedString(string: s[\"str\"] as! String, attributes: attr)\n            attrStr.appendAttributedString(str)\n        }\n        return attrStr\n    }\n    \n    private func outputString(newLog: NSMutableAttributedString) {\n        let log = NSMutableAttributedString()\n        \n        dispatch_async(dispatch_get_main_queue()) {\n            let oldLog = NSMutableAttributedString(attributedString: self.output.attributedText)\n            log.appendAttributedString(oldLog)\n            log.appendAttributedString(newLog)\n            self.output.attributedText = log\n            self.output.setLineBreakMode(.ByCharWrapping)\n            self.output.scrollToBottom()\n        }\n    }\n    \n    private func formattedTimeString() -> String {\n        let now = NSDate()\n        let dateFormatter = NSDateFormatter()\n        dateFormatter.dateFormat = \"yyyy-MM-dd HH:mm:ss\"\n        return dateFormatter.stringFromDate(now)\n    }\n}"
  },
  {
    "path": "Sublime/Sublime/en.lproj/Localizable.strings",
    "content": "/* \n  Localizable.strings\n  Sublime\n\n  Created by Eular on 4/6/16.\n  Copyright © 2016 Eular. All rights reserved.\n*/\n\nSHARE_IN_PICTURE=\"Share in picture\";\nRECOGNIZE_QRCODE=\"Recognize QRCode\";"
  },
  {
    "path": "Sublime/Sublime/zh-Hans.lproj/Localizable.strings",
    "content": "/* \n  Localizable.strings\n  Sublime\n\n  Created by Eular on 4/6/16.\n  Copyright © 2016 Eular. All rights reserved.\n*/\n\nSHARE_IN_PICTURE=\"以图片分享\";\nRECOGNIZE_QRCODE=\"识别二维码\";"
  },
  {
    "path": "Sublime/Sublime.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\t0EB377D160AA7E843C727C1F /* Pods.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8924B9FA7AD15AAC2FBDBC46 /* Pods.framework */; };\n\t\tBB0661681C75A1B000D1A434 /* Function.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0661671C75A1B000D1A434 /* Function.swift */; };\n\t\tBB066DE51C6F90A50059B48C /* NewFileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB066DE41C6F90A50059B48C /* NewFileViewController.swift */; };\n\t\tBB071E201CDF36C3004A2E38 /* UIImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB071E1F1CDF36C3004A2E38 /* UIImage.swift */; };\n\t\tBB0905061C704A86007EBC53 /* CodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0905051C704A86007EBC53 /* CodeViewController.swift */; };\n\t\tBB0905081C704B3F007EBC53 /* FolderTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0905071C704B3F007EBC53 /* FolderTableViewController.swift */; };\n\t\tBB09050A1C704DE0007EBC53 /* GithubTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0905091C704DE0007EBC53 /* GithubTableViewController.swift */; };\n\t\tBB09050C1C706881007EBC53 /* Global.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB09050B1C706881007EBC53 /* Global.swift */; };\n\t\tBB0905121C71DF8E007EBC53 /* ImageFileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0905111C71DF8E007EBC53 /* ImageFileViewController.swift */; };\n\t\tBB0905141C71E4A0007EBC53 /* ImagePageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0905131C71E4A0007EBC53 /* ImagePageViewController.swift */; };\n\t\tBB0AD49B1CE1F38300CDFC95 /* Code.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0AD49A1CE1F38300CDFC95 /* Code.swift */; };\n\t\tBB0AD49D1CE204A700CDFC95 /* ReadingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0AD49C1CE204A700CDFC95 /* ReadingViewController.swift */; };\n\t\tBB0B85CB1CC60192008CA4A4 /* SublimeSafari.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0B85CA1CC60192008CA4A4 /* SublimeSafari.swift */; };\n\t\tBB0B85CE1CC7C506008CA4A4 /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0B85CD1CC7C506008CA4A4 /* String.swift */; };\n\t\tBB0B85D01CC7C5CD008CA4A4 /* Operation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0B85CF1CC7C5CD008CA4A4 /* Operation.swift */; };\n\t\tBB0B85D21CC7C62A008CA4A4 /* Array.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0B85D11CC7C62A008CA4A4 /* Array.swift */; };\n\t\tBB0B85D41CC7C64C008CA4A4 /* Number.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0B85D31CC7C64C008CA4A4 /* Number.swift */; };\n\t\tBB0B85D61CC7C705008CA4A4 /* UIImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0B85D51CC7C705008CA4A4 /* UIImageView.swift */; };\n\t\tBB0B85D81CC7C94D008CA4A4 /* UIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0B85D71CC7C94D008CA4A4 /* UIView.swift */; };\n\t\tBB0B85DA1CC7C9BF008CA4A4 /* Other.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0B85D91CC7C9BF008CA4A4 /* Other.swift */; };\n\t\tBB0B85DC1CC7C9F8008CA4A4 /* UIApplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0B85DB1CC7C9F8008CA4A4 /* UIApplication.swift */; };\n\t\tBB0B85DE1CC7CA21008CA4A4 /* UITextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0B85DD1CC7CA21008CA4A4 /* UITextView.swift */; };\n\t\tBB0B85E01CC7CA59008CA4A4 /* UITableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0B85DF1CC7CA59008CA4A4 /* UITableView.swift */; };\n\t\tBB0B85E41CC7CAB5008CA4A4 /* UIViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0B85E31CC7CAB5008CA4A4 /* UIViewController.swift */; };\n\t\tBB0B85E61CC7CC79008CA4A4 /* Log.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0B85E51CC7CC79008CA4A4 /* Log.swift */; };\n\t\tBB0D4A2D1CE0724500C96B62 /* Repo.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0D4A2C1CE0724500C96B62 /* Repo.swift */; };\n\t\tBB0D4A2F1CE0729000C96B62 /* Gist.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0D4A2E1CE0729000C96B62 /* Gist.swift */; };\n\t\tBB0D4A311CE078D100C96B62 /* GistTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0D4A301CE078D100C96B62 /* GistTable.swift */; };\n\t\tBB0D4A341CE0E13200C96B62 /* CodeEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0D4A331CE0E13200C96B62 /* CodeEngine.swift */; };\n\t\tBB124DAF1CAE58E1002CAE2A /* ContactInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB124DAE1CAE58E1002CAE2A /* ContactInfoViewController.swift */; };\n\t\tBB124DB11CAE6531002CAE2A /* QRCode.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB124DB01CAE6531002CAE2A /* QRCode.swift */; };\n\t\tBB124DB31CAE83F1002CAE2A /* RCChatViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB124DB21CAE83F1002CAE2A /* RCChatViewController.swift */; };\n\t\tBB14E6F01C79DFC60043C9EB /* MusicViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB14E6EF1C79DFC60043C9EB /* MusicViewController.swift */; };\n\t\tBB14E6F31C79FEEC0043C9EB /* MusicWave.m in Sources */ = {isa = PBXBuildFile; fileRef = BB14E6F21C79FEEC0043C9EB /* MusicWave.m */; };\n\t\tBB1643CC1CDCA06000BF5348 /* DonateViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB1643CB1CDCA06000BF5348 /* DonateViewController.swift */; };\n\t\tBB1643D41CDE2FCE00BF5348 /* 山外小楼夜听雨.m4a in Resources */ = {isa = PBXBuildFile; fileRef = BB1643D31CDE2FCE00BF5348 /* 山外小楼夜听雨.m4a */; };\n\t\tBB17D8A21C7AE1920026FA59 /* PDFViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB17D8A11C7AE1920026FA59 /* PDFViewController.swift */; };\n\t\tBB191D831CE4AA5F0015DA2F /* libWeChatSDK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BB191D7E1CE4AA5F0015DA2F /* libWeChatSDK.a */; };\n\t\tBB1C6AA91CCF3F82002517E2 /* Constant.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB1C6AA81CCF3F82002517E2 /* Constant.swift */; };\n\t\tBB1C6AAB1CCF3FAD002517E2 /* Configure.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB1C6AAA1CCF3FAD002517E2 /* Configure.swift */; };\n\t\tBB3BCFA61CA030C0003D2CB0 /* RongCloudIMKit.LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = BB3BCFA51CA030C0003D2CB0 /* RongCloudIMKit.LICENSE */; };\n\t\tBB3F6CF21C929B0700F303A2 /* WebServerLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB3F6CF11C929B0700F303A2 /* WebServerLog.swift */; };\n\t\tBB41CBC41C6E37EE000B2954 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BBF248CA1C6B7198003148B6 /* Assets.xcassets */; };\n\t\tBB5213191C9EE32F008108E7 /* libstdc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = BB5213181C9EE32F008108E7 /* libstdc++.tbd */; };\n\t\tBB5B8C5C1C745C51008F8CDB /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBA04E011C74435E00FADAD2 /* CoreTelephony.framework */; };\n\t\tBB5B8C5E1C745CD1008F8CDB /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BB5B8C5D1C745CD1008F8CDB /* SystemConfiguration.framework */; };\n\t\tBB5B8C631C757F0E008F8CDB /* ShareToWeixin.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB5B8C621C757F0E008F8CDB /* ShareToWeixin.swift */; };\n\t\tBB5B8C651C7593A5008F8CDB /* File.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB5B8C641C7593A5008F8CDB /* File.swift */; };\n\t\tBB5B8C671C75957F008F8CDB /* UnitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB5B8C661C75957F008F8CDB /* UnitTest.swift */; };\n\t\tBB6B7BEA1C76226200889708 /* VideoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB6B7BE91C76226200889708 /* VideoViewController.swift */; };\n\t\tBB6DDC9C1CA2DE6E00E1665F /* RCIM.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB6DDC9B1CA2DE6E00E1665F /* RCIM.swift */; };\n\t\tBB6E08E61CB4C464007239A4 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = BB6E08E81CB4C464007239A4 /* Localizable.strings */; };\n\t\tBB6E08EB1CB4E7EB007239A4 /* ExploreTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB6E08EA1CB4E7EB007239A4 /* ExploreTableViewController.swift */; };\n\t\tBB6E08ED1CB51D41007239A4 /* qrcode_scan.wav in Resources */ = {isa = PBXBuildFile; fileRef = BB6E08EC1CB51D41007239A4 /* qrcode_scan.wav */; };\n\t\tBB6FAAB41CB558BF001ED62C /* AlamofireRSSParser.LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = BB6FAAB31CB558BF001ED62C /* AlamofireRSSParser.LICENSE */; };\n\t\tBB6FAB141CB6348A001ED62C /* Cycript.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BB6FAB131CB6348A001ED62C /* Cycript.framework */; };\n\t\tBB6FAB161CB634B1001ED62C /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BB6FAB151CB634B1001ED62C /* JavaScriptCore.framework */; };\n\t\tBB6FAB181CB634D3001ED62C /* libstdc++.6.0.9.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = BB6FAB171CB634D3001ED62C /* libstdc++.6.0.9.tbd */; };\n\t\tBB6FAB1B1CB63976001ED62C /* ConfigTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB6FAB1A1CB63976001ED62C /* ConfigTableViewController.swift */; };\n\t\tBB6FAB1D1CB64D30001ED62C /* RSSListTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB6FAB1C1CB64D30001ED62C /* RSSListTableViewController.swift */; };\n\t\tBB6FAB201CB654E8001ED62C /* RSSItemListTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB6FAB1F1CB654E8001ED62C /* RSSItemListTableViewController.swift */; };\n\t\tBB74E9251C918ED10037AE83 /* SublimeServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB74E9241C918ED10037AE83 /* SublimeServer.swift */; };\n\t\tBB74E9271C918F6F0037AE83 /* CustomServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB74E9261C918F6F0037AE83 /* CustomServer.swift */; };\n\t\tBB7B25011CD89A43000A8F1E /* RearrangeTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB7B25001CD89A43000A8F1E /* RearrangeTable.swift */; };\n\t\tBB7B25051CD8ACBE000A8F1E /* VideoPlayerTimeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB7B25041CD8ACBE000A8F1E /* VideoPlayerTimeView.swift */; };\n\t\tBB7B25071CD8AD31000A8F1E /* NumberedTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB7B25061CD8AD31000A8F1E /* NumberedTextView.swift */; };\n\t\tBB7B25091CD8B051000A8F1E /* PopupMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB7B25081CD8B051000A8F1E /* PopupMenu.swift */; };\n\t\tBB7B250B1CD8B527000A8F1E /* ActionSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB7B250A1CD8B527000A8F1E /* ActionSheet.swift */; };\n\t\tBB8AC7FD1C97F1100029B686 /* Web in Resources */ = {isa = PBXBuildFile; fileRef = BB8AC7FC1C97F1100029B686 /* Web */; };\n\t\tBB8EF8391C7C460400C01A60 /* SettingTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8EF8381C7C460400C01A60 /* SettingTableViewController.swift */; };\n\t\tBB8EF83C1C7C766000C01A60 /* HTTPServerTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB8EF83B1C7C766000C01A60 /* HTTPServerTableViewController.swift */; };\n\t\tBBA2956D1CBFBAA00096294B /* GomokuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBA2956C1CBFBAA00096294B /* GomokuViewController.swift */; };\n\t\tBBA2956F1CBFC5050096294B /* BoardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBA2956E1CBFC5050096294B /* BoardView.swift */; };\n\t\tBBA295721CC0AFA80096294B /* shake.wav in Resources */ = {isa = PBXBuildFile; fileRef = BBA295711CC0AFA80096294B /* shake.wav */; };\n\t\tBBA295741CC0BDAE0096294B /* BoardModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBA295731CC0BDAE0096294B /* BoardModel.swift */; };\n\t\tBBA295781CC0CCF40096294B /* GomokuAI.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBA295771CC0CCF40096294B /* GomokuAI.swift */; };\n\t\tBBA46E791C7D92DE008AFBEB /* AppInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBA46E781C7D92DE008AFBEB /* AppInfoViewController.swift */; };\n\t\tBBA46E7B1C7D9D35008AFBEB /* LicenseTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBA46E7A1C7D9D35008AFBEB /* LicenseTableViewController.swift */; };\n\t\tBBA46EA51C7DB8E8008AFBEB /* Alamofire.LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = BBA46E9D1C7DB8E8008AFBEB /* Alamofire.LICENSE */; };\n\t\tBBA46EA61C7DB8E8008AFBEB /* CYRTextView.LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = BBA46E9E1C7DB8E8008AFBEB /* CYRTextView.LICENSE */; };\n\t\tBBA46EA71C7DB8E8008AFBEB /* EZAudio.LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = BBA46E9F1C7DB8E8008AFBEB /* EZAudio.LICENSE */; };\n\t\tBBA46EA81C7DB8E8008AFBEB /* SJCSimplePDFView.LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = BBA46EA01C7DB8E8008AFBEB /* SJCSimplePDFView.LICENSE */; };\n\t\tBBA46EA91C7DB8E8008AFBEB /* Swifter.LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = BBA46EA11C7DB8E8008AFBEB /* Swifter.LICENSE */; };\n\t\tBBA46EAA1C7DB8E8008AFBEB /* SwiftyJSON.LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = BBA46EA21C7DB8E8008AFBEB /* SwiftyJSON.LICENSE */; };\n\t\tBBA46EAB1C7DB8E8008AFBEB /* ZLMusicFlowWaveView.LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = BBA46EA31C7DB8E8008AFBEB /* ZLMusicFlowWaveView.LICENSE */; };\n\t\tBBA46EAC1C7DB8E8008AFBEB /* ZLSinusWaveView.LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = BBA46EA41C7DB8E8008AFBEB /* ZLSinusWaveView.LICENSE */; };\n\t\tBBA46EAE1C7DD4EA008AFBEB /* Github.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBA46EAD1C7DD4EA008AFBEB /* Github.swift */; };\n\t\tBBA46EB01C7DDB52008AFBEB /* GithubAccountTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBA46EAF1C7DDB52008AFBEB /* GithubAccountTableViewController.swift */; };\n\t\tBBAC80181CA8F928001A5F5D /* NMSSH.LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = BBAC80171CA8F928001A5F5D /* NMSSH.LICENSE */; };\n\t\tBBB473EE1CA6C8200049621E /* MobileVLCKit.LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = BBB473ED1CA6C8200049621E /* MobileVLCKit.LICENSE */; };\n\t\tBBBBDD151CDB82E900906981 /* Charts.LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = BBBBDD141CDB82E900906981 /* Charts.LICENSE */; };\n\t\tBBBBDD171CDB848100906981 /* StorageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBBBDD161CDB848100906981 /* StorageViewController.swift */; };\n\t\tBBC16D0E1C9FB329008F877B /* Gifu.LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = BBC16D0D1C9FB329008F877B /* Gifu.LICENSE */; };\n\t\tBBC548D31C6DCAB1003679DB /* MainTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBC548D21C6DCAB1003679DB /* MainTableViewController.swift */; };\n\t\tBBC7BBED1C9FD75F00F2B0EA /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = BBC7BBEC1C9FD75F00F2B0EA /* libz.tbd */; };\n\t\tBBC7BBEF1C9FD78700F2B0EA /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = BBC7BBEE1C9FD78700F2B0EA /* libsqlite3.tbd */; };\n\t\tBBC7BBF31C9FD7B500F2B0EA /* libiconv.2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = BBC7BBF21C9FD7B500F2B0EA /* libiconv.2.tbd */; };\n\t\tBBC7BBF51C9FDE2000F2B0EA /* MessageListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBC7BBF41C9FDE2000F2B0EA /* MessageListViewController.swift */; };\n\t\tBBC7BBF71C9FED8900F2B0EA /* ContactTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBC7BBF61C9FED8900F2B0EA /* ContactTableViewController.swift */; };\n\t\tBBD070F31C842036006710D4 /* AASquaresLoading.LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = BBD070F21C842036006710D4 /* AASquaresLoading.LICENSE */; };\n\t\tBBD070F51C84204C006710D4 /* DGElasticPullToRefresh.LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = BBD070F41C84204C006710D4 /* DGElasticPullToRefresh.LICENSE */; };\n\t\tBBD070F71C8437E6006710D4 /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD070F61C8437E6006710D4 /* Network.swift */; };\n\t\tBBD070FB1C84540D006710D4 /* ReposTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD070FA1C84540D006710D4 /* ReposTableViewController.swift */; };\n\t\tBBD4D1CB1CD9DA270098DFB6 /* UIColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD4D1CA1CD9DA270098DFB6 /* UIColor.swift */; };\n\t\tBBD77FA31CDA45E900071B5E /* QRCodeReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD77FA21CDA45E900071B5E /* QRCodeReader.swift */; };\n\t\tBBD77FA51CDB727100071B5E /* SublimeTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD77FA41CDB727100071B5E /* SublimeTable.swift */; };\n\t\tBBD9ADDA1CA6E80800D90A93 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBD9ADD91CA6E80800D90A93 /* MediaPlayer.framework */; };\n\t\tBBD9ADDC1CA6E81600D90A93 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBD9ADDB1CA6E81600D90A93 /* AVFoundation.framework */; };\n\t\tBBD9ADDE1CA6E82200D90A93 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBD9ADDD1CA6E82200D90A93 /* CoreAudio.framework */; };\n\t\tBBD9ADE01CA6E82D00D90A93 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBD9ADDF1CA6E82D00D90A93 /* CoreVideo.framework */; };\n\t\tBBD9ADE21CA6E83900D90A93 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBD9ADE11CA6E83900D90A93 /* CoreMedia.framework */; };\n\t\tBBD9ADE41CA6E84500D90A93 /* VideoToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBD9ADE31CA6E84500D90A93 /* VideoToolbox.framework */; };\n\t\tBBD9ADE61CA6E84F00D90A93 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBD9ADE51CA6E84F00D90A93 /* AudioToolbox.framework */; };\n\t\tBBD9ADE91CA6E8BC00D90A93 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = BBD9ADE81CA6E8BC00D90A93 /* libc++.tbd */; };\n\t\tBBD9ADEB1CA6E8D500D90A93 /* libbz2.1.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = BBD9ADEA1CA6E8D500D90A93 /* libbz2.1.0.tbd */; };\n\t\tBBDF9D4C1C85CA6E0015FD97 /* SSZipArchive.LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = BBDF9D4B1C85CA6E0015FD97 /* SSZipArchive.LICENSE */; };\n\t\tBBEA5CF81CDC59A500C44F95 /* LogoView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBEA5CF71CDC59A500C44F95 /* LogoView.xib */; };\n\t\tBBEA5CFA1CDC704100C44F95 /* Device.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBEA5CF91CDC704100C44F95 /* Device.swift */; };\n\t\tBBEA5CFC1CDC747800C44F95 /* ObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = BBEA5CFB1CDC747800C44F95 /* ObjC.m */; };\n\t\tBBECEAEA1C74527700887945 /* Social.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBECEAE91C74527700887945 /* Social.framework */; };\n\t\tBBEDAD901CAD01BD0062A175 /* Plist.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBEDAD8F1CAD01BD0062A175 /* Plist.swift */; };\n\t\tBBF248C21C6B7198003148B6 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBF248C11C6B7198003148B6 /* AppDelegate.swift */; };\n\t\tBBF248C91C6B7198003148B6 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BBF248C71C6B7198003148B6 /* Main.storyboard */; };\n\t\tBBF248CE1C6B7198003148B6 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BBF248CC1C6B7198003148B6 /* LaunchScreen.storyboard */; };\n\t\tBBFC29551CCDE12300F2CE4E /* Date.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBFC29541CCDE12300F2CE4E /* Date.swift */; };\n\t\tBBFEEDFD1CA903D3004C19C3 /* SSHServerListTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBFEEDFC1CA903D3004C19C3 /* SSHServerListTableViewController.swift */; };\n\t\tBBFEEDFF1CA9115F004C19C3 /* SSHAddNewServerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBFEEDFE1CA9115F004C19C3 /* SSHAddNewServerViewController.swift */; };\n\t\tBBFEEE011CA91290004C19C3 /* SSHTerminalViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBFEEE001CA91290004C19C3 /* SSHTerminalViewController.swift */; };\n\t\tBBFEEE031CA97A03004C19C3 /* animation.gif in Resources */ = {isa = PBXBuildFile; fileRef = BBFEEE021CA97A03004C19C3 /* animation.gif */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\tBB85556D1C7417E3005A1E22 /* Embed App Extensions */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 13;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Embed App Extensions\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t2E036C58ACB2EE5D20127B26 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = \"Pods/Target Support Files/Pods/Pods.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t637A844DDC75B0CAC7C68338 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = \"Pods/Target Support Files/Pods/Pods.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t8924B9FA7AD15AAC2FBDBC46 /* Pods.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tBB0661671C75A1B000D1A434 /* Function.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Function.swift; sourceTree = \"<group>\"; };\n\t\tBB066DE41C6F90A50059B48C /* NewFileViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewFileViewController.swift; sourceTree = \"<group>\"; };\n\t\tBB071E1F1CDF36C3004A2E38 /* UIImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImage.swift; sourceTree = \"<group>\"; };\n\t\tBB0905051C704A86007EBC53 /* CodeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CodeViewController.swift; sourceTree = \"<group>\"; };\n\t\tBB0905071C704B3F007EBC53 /* FolderTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FolderTableViewController.swift; sourceTree = \"<group>\"; };\n\t\tBB0905091C704DE0007EBC53 /* GithubTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GithubTableViewController.swift; sourceTree = \"<group>\"; };\n\t\tBB09050B1C706881007EBC53 /* Global.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Global.swift; sourceTree = \"<group>\"; };\n\t\tBB0905111C71DF8E007EBC53 /* ImageFileViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageFileViewController.swift; sourceTree = \"<group>\"; };\n\t\tBB0905131C71E4A0007EBC53 /* ImagePageViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImagePageViewController.swift; sourceTree = \"<group>\"; };\n\t\tBB0AD49A1CE1F38300CDFC95 /* Code.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Code.swift; sourceTree = \"<group>\"; };\n\t\tBB0AD49C1CE204A700CDFC95 /* ReadingViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadingViewController.swift; sourceTree = \"<group>\"; };\n\t\tBB0B85CA1CC60192008CA4A4 /* SublimeSafari.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SublimeSafari.swift; path = ../SublimeSafari.swift; sourceTree = \"<group>\"; };\n\t\tBB0B85CD1CC7C506008CA4A4 /* String.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = String.swift; sourceTree = \"<group>\"; };\n\t\tBB0B85CF1CC7C5CD008CA4A4 /* Operation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Operation.swift; sourceTree = \"<group>\"; };\n\t\tBB0B85D11CC7C62A008CA4A4 /* Array.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Array.swift; sourceTree = \"<group>\"; };\n\t\tBB0B85D31CC7C64C008CA4A4 /* Number.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Number.swift; sourceTree = \"<group>\"; };\n\t\tBB0B85D51CC7C705008CA4A4 /* UIImageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIImageView.swift; sourceTree = \"<group>\"; };\n\t\tBB0B85D71CC7C94D008CA4A4 /* UIView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIView.swift; sourceTree = \"<group>\"; };\n\t\tBB0B85D91CC7C9BF008CA4A4 /* Other.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Other.swift; sourceTree = \"<group>\"; };\n\t\tBB0B85DB1CC7C9F8008CA4A4 /* UIApplication.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIApplication.swift; sourceTree = \"<group>\"; };\n\t\tBB0B85DD1CC7CA21008CA4A4 /* UITextView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UITextView.swift; sourceTree = \"<group>\"; };\n\t\tBB0B85DF1CC7CA59008CA4A4 /* UITableView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UITableView.swift; sourceTree = \"<group>\"; };\n\t\tBB0B85E31CC7CAB5008CA4A4 /* UIViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIViewController.swift; sourceTree = \"<group>\"; };\n\t\tBB0B85E51CC7CC79008CA4A4 /* Log.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Log.swift; sourceTree = \"<group>\"; };\n\t\tBB0D4A2C1CE0724500C96B62 /* Repo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Repo.swift; sourceTree = \"<group>\"; };\n\t\tBB0D4A2E1CE0729000C96B62 /* Gist.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Gist.swift; sourceTree = \"<group>\"; };\n\t\tBB0D4A301CE078D100C96B62 /* GistTable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GistTable.swift; sourceTree = \"<group>\"; };\n\t\tBB0D4A331CE0E13200C96B62 /* CodeEngine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CodeEngine.swift; sourceTree = \"<group>\"; };\n\t\tBB124DAE1CAE58E1002CAE2A /* ContactInfoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContactInfoViewController.swift; sourceTree = \"<group>\"; };\n\t\tBB124DB01CAE6531002CAE2A /* QRCode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QRCode.swift; sourceTree = \"<group>\"; };\n\t\tBB124DB21CAE83F1002CAE2A /* RCChatViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RCChatViewController.swift; sourceTree = \"<group>\"; };\n\t\tBB14E6EF1C79DFC60043C9EB /* MusicViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MusicViewController.swift; sourceTree = \"<group>\"; };\n\t\tBB14E6F21C79FEEC0043C9EB /* MusicWave.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MusicWave.m; sourceTree = \"<group>\"; };\n\t\tBB14E6F41C79FF260043C9EB /* MusicWave.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MusicWave.h; sourceTree = \"<group>\"; };\n\t\tBB1643CB1CDCA06000BF5348 /* DonateViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DonateViewController.swift; sourceTree = \"<group>\"; };\n\t\tBB1643D31CDE2FCE00BF5348 /* 山外小楼夜听雨.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = \"山外小楼夜听雨.m4a\"; sourceTree = \"<group>\"; };\n\t\tBB17D8A11C7AE1920026FA59 /* PDFViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PDFViewController.swift; sourceTree = \"<group>\"; };\n\t\tBB191D7E1CE4AA5F0015DA2F /* libWeChatSDK.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libWeChatSDK.a; sourceTree = \"<group>\"; };\n\t\tBB191D801CE4AA5F0015DA2F /* WechatAuthSDK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WechatAuthSDK.h; sourceTree = \"<group>\"; };\n\t\tBB191D811CE4AA5F0015DA2F /* WXApi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXApi.h; sourceTree = \"<group>\"; };\n\t\tBB191D821CE4AA5F0015DA2F /* WXApiObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXApiObject.h; sourceTree = \"<group>\"; };\n\t\tBB1C6AA81CCF3F82002517E2 /* Constant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Constant.swift; sourceTree = \"<group>\"; };\n\t\tBB1C6AAA1CCF3FAD002517E2 /* Configure.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Configure.swift; sourceTree = \"<group>\"; };\n\t\tBB3BCFA51CA030C0003D2CB0 /* RongCloudIMKit.LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = RongCloudIMKit.LICENSE; sourceTree = \"<group>\"; };\n\t\tBB3F6CF11C929B0700F303A2 /* WebServerLog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebServerLog.swift; sourceTree = \"<group>\"; };\n\t\tBB5213181C9EE32F008108E7 /* libstdc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = \"libstdc++.tbd\"; path = \"usr/lib/libstdc++.tbd\"; sourceTree = SDKROOT; };\n\t\tBB5B8C5D1C745CD1008F8CDB /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };\n\t\tBB5B8C621C757F0E008F8CDB /* ShareToWeixin.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShareToWeixin.swift; sourceTree = \"<group>\"; };\n\t\tBB5B8C641C7593A5008F8CDB /* File.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = File.swift; sourceTree = \"<group>\"; };\n\t\tBB5B8C661C75957F008F8CDB /* UnitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnitTest.swift; sourceTree = \"<group>\"; };\n\t\tBB6B7BE91C76226200889708 /* VideoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoViewController.swift; sourceTree = \"<group>\"; };\n\t\tBB6DDC9B1CA2DE6E00E1665F /* RCIM.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RCIM.swift; sourceTree = \"<group>\"; };\n\t\tBB6E08E71CB4C464007239A4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = \"<group>\"; };\n\t\tBB6E08E91CB4C468007239A4 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = \"zh-Hans\"; path = \"zh-Hans.lproj/Localizable.strings\"; sourceTree = \"<group>\"; };\n\t\tBB6E08EA1CB4E7EB007239A4 /* ExploreTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExploreTableViewController.swift; sourceTree = \"<group>\"; };\n\t\tBB6E08EC1CB51D41007239A4 /* qrcode_scan.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = qrcode_scan.wav; sourceTree = \"<group>\"; };\n\t\tBB6FAAB31CB558BF001ED62C /* AlamofireRSSParser.LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = AlamofireRSSParser.LICENSE; sourceTree = \"<group>\"; };\n\t\tBB6FAB131CB6348A001ED62C /* Cycript.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Cycript.framework; sourceTree = \"<group>\"; };\n\t\tBB6FAB151CB634B1001ED62C /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };\n\t\tBB6FAB171CB634D3001ED62C /* libstdc++.6.0.9.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = \"libstdc++.6.0.9.tbd\"; path = \"usr/lib/libstdc++.6.0.9.tbd\"; sourceTree = SDKROOT; };\n\t\tBB6FAB1A1CB63976001ED62C /* ConfigTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfigTableViewController.swift; sourceTree = \"<group>\"; };\n\t\tBB6FAB1C1CB64D30001ED62C /* RSSListTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RSSListTableViewController.swift; sourceTree = \"<group>\"; };\n\t\tBB6FAB1F1CB654E8001ED62C /* RSSItemListTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RSSItemListTableViewController.swift; sourceTree = \"<group>\"; };\n\t\tBB74E9241C918ED10037AE83 /* SublimeServer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SublimeServer.swift; sourceTree = \"<group>\"; };\n\t\tBB74E9261C918F6F0037AE83 /* CustomServer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomServer.swift; sourceTree = \"<group>\"; };\n\t\tBB7B25001CD89A43000A8F1E /* RearrangeTable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RearrangeTable.swift; sourceTree = \"<group>\"; };\n\t\tBB7B25041CD8ACBE000A8F1E /* VideoPlayerTimeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoPlayerTimeView.swift; sourceTree = \"<group>\"; };\n\t\tBB7B25061CD8AD31000A8F1E /* NumberedTextView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NumberedTextView.swift; sourceTree = \"<group>\"; };\n\t\tBB7B25081CD8B051000A8F1E /* PopupMenu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PopupMenu.swift; sourceTree = \"<group>\"; };\n\t\tBB7B250A1CD8B527000A8F1E /* ActionSheet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionSheet.swift; sourceTree = \"<group>\"; };\n\t\tBB8AC7FC1C97F1100029B686 /* Web */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Web; sourceTree = \"<group>\"; };\n\t\tBB8EF8381C7C460400C01A60 /* SettingTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingTableViewController.swift; sourceTree = \"<group>\"; };\n\t\tBB8EF83B1C7C766000C01A60 /* HTTPServerTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTTPServerTableViewController.swift; sourceTree = \"<group>\"; };\n\t\tBBA04DF41C743DD800FADAD2 /* Sublime-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"Sublime-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\tBBA04E011C74435E00FADAD2 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; };\n\t\tBBA2956C1CBFBAA00096294B /* GomokuViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GomokuViewController.swift; sourceTree = \"<group>\"; };\n\t\tBBA2956E1CBFC5050096294B /* BoardView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardView.swift; sourceTree = \"<group>\"; };\n\t\tBBA295711CC0AFA80096294B /* shake.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = shake.wav; sourceTree = \"<group>\"; };\n\t\tBBA295731CC0BDAE0096294B /* BoardModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoardModel.swift; sourceTree = \"<group>\"; };\n\t\tBBA295771CC0CCF40096294B /* GomokuAI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GomokuAI.swift; sourceTree = \"<group>\"; };\n\t\tBBA46E781C7D92DE008AFBEB /* AppInfoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppInfoViewController.swift; sourceTree = \"<group>\"; };\n\t\tBBA46E7A1C7D9D35008AFBEB /* LicenseTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LicenseTableViewController.swift; sourceTree = \"<group>\"; };\n\t\tBBA46E9D1C7DB8E8008AFBEB /* Alamofire.LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Alamofire.LICENSE; sourceTree = \"<group>\"; };\n\t\tBBA46E9E1C7DB8E8008AFBEB /* CYRTextView.LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CYRTextView.LICENSE; sourceTree = \"<group>\"; };\n\t\tBBA46E9F1C7DB8E8008AFBEB /* EZAudio.LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = EZAudio.LICENSE; sourceTree = \"<group>\"; };\n\t\tBBA46EA01C7DB8E8008AFBEB /* SJCSimplePDFView.LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SJCSimplePDFView.LICENSE; sourceTree = \"<group>\"; };\n\t\tBBA46EA11C7DB8E8008AFBEB /* Swifter.LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Swifter.LICENSE; sourceTree = \"<group>\"; };\n\t\tBBA46EA21C7DB8E8008AFBEB /* SwiftyJSON.LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SwiftyJSON.LICENSE; sourceTree = \"<group>\"; };\n\t\tBBA46EA31C7DB8E8008AFBEB /* ZLMusicFlowWaveView.LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ZLMusicFlowWaveView.LICENSE; sourceTree = \"<group>\"; };\n\t\tBBA46EA41C7DB8E8008AFBEB /* ZLSinusWaveView.LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ZLSinusWaveView.LICENSE; sourceTree = \"<group>\"; };\n\t\tBBA46EAD1C7DD4EA008AFBEB /* Github.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Github.swift; path = Utils/Github.swift; sourceTree = \"<group>\"; };\n\t\tBBA46EAF1C7DDB52008AFBEB /* GithubAccountTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GithubAccountTableViewController.swift; sourceTree = \"<group>\"; };\n\t\tBBAC80171CA8F928001A5F5D /* NMSSH.LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NMSSH.LICENSE; sourceTree = \"<group>\"; };\n\t\tBBB473ED1CA6C8200049621E /* MobileVLCKit.LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = MobileVLCKit.LICENSE; sourceTree = \"<group>\"; };\n\t\tBBBBDD141CDB82E900906981 /* Charts.LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Charts.LICENSE; sourceTree = \"<group>\"; };\n\t\tBBBBDD161CDB848100906981 /* StorageViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StorageViewController.swift; sourceTree = \"<group>\"; };\n\t\tBBC16D0D1C9FB329008F877B /* Gifu.LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Gifu.LICENSE; sourceTree = \"<group>\"; };\n\t\tBBC548D21C6DCAB1003679DB /* MainTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainTableViewController.swift; sourceTree = \"<group>\"; };\n\t\tBBC7BBEC1C9FD75F00F2B0EA /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };\n\t\tBBC7BBEE1C9FD78700F2B0EA /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; };\n\t\tBBC7BBF21C9FD7B500F2B0EA /* libiconv.2.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = libiconv.2.tbd; path = usr/lib/libiconv.2.tbd; sourceTree = SDKROOT; };\n\t\tBBC7BBF41C9FDE2000F2B0EA /* MessageListViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageListViewController.swift; sourceTree = \"<group>\"; };\n\t\tBBC7BBF61C9FED8900F2B0EA /* ContactTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContactTableViewController.swift; sourceTree = \"<group>\"; };\n\t\tBBD070F21C842036006710D4 /* AASquaresLoading.LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = AASquaresLoading.LICENSE; sourceTree = \"<group>\"; };\n\t\tBBD070F41C84204C006710D4 /* DGElasticPullToRefresh.LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = DGElasticPullToRefresh.LICENSE; sourceTree = \"<group>\"; };\n\t\tBBD070F61C8437E6006710D4 /* Network.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = \"<group>\"; };\n\t\tBBD070FA1C84540D006710D4 /* ReposTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReposTableViewController.swift; sourceTree = \"<group>\"; };\n\t\tBBD4D1CA1CD9DA270098DFB6 /* UIColor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIColor.swift; sourceTree = \"<group>\"; };\n\t\tBBD77FA21CDA45E900071B5E /* QRCodeReader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QRCodeReader.swift; sourceTree = \"<group>\"; };\n\t\tBBD77FA41CDB727100071B5E /* SublimeTable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SublimeTable.swift; sourceTree = \"<group>\"; };\n\t\tBBD9ADD91CA6E80800D90A93 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; };\n\t\tBBD9ADDB1CA6E81600D90A93 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };\n\t\tBBD9ADDD1CA6E82200D90A93 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };\n\t\tBBD9ADDF1CA6E82D00D90A93 /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; };\n\t\tBBD9ADE11CA6E83900D90A93 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; };\n\t\tBBD9ADE31CA6E84500D90A93 /* VideoToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VideoToolbox.framework; path = System/Library/Frameworks/VideoToolbox.framework; sourceTree = SDKROOT; };\n\t\tBBD9ADE51CA6E84F00D90A93 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };\n\t\tBBD9ADE81CA6E8BC00D90A93 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = \"libc++.tbd\"; path = \"usr/lib/libc++.tbd\"; sourceTree = SDKROOT; };\n\t\tBBD9ADEA1CA6E8D500D90A93 /* libbz2.1.0.tbd */ = {isa = PBXFileReference; lastKnownFileType = \"sourcecode.text-based-dylib-definition\"; name = libbz2.1.0.tbd; path = usr/lib/libbz2.1.0.tbd; sourceTree = SDKROOT; };\n\t\tBBDF9D4B1C85CA6E0015FD97 /* SSZipArchive.LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SSZipArchive.LICENSE; sourceTree = \"<group>\"; };\n\t\tBBEA5CF71CDC59A500C44F95 /* LogoView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LogoView.xib; sourceTree = \"<group>\"; };\n\t\tBBEA5CF91CDC704100C44F95 /* Device.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Device.swift; sourceTree = \"<group>\"; };\n\t\tBBEA5CFB1CDC747800C44F95 /* ObjC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjC.m; sourceTree = \"<group>\"; };\n\t\tBBEA5CFD1CDC749100C44F95 /* ObjC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ObjC.h; sourceTree = \"<group>\"; };\n\t\tBBECEAE91C74527700887945 /* Social.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Social.framework; path = System/Library/Frameworks/Social.framework; sourceTree = SDKROOT; };\n\t\tBBEDAD8F1CAD01BD0062A175 /* Plist.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Plist.swift; sourceTree = \"<group>\"; };\n\t\tBBF248BE1C6B7198003148B6 /* Sublime.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Sublime.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tBBF248C11C6B7198003148B6 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\tBBF248C81C6B7198003148B6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\tBBF248CA1C6B7198003148B6 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\tBBF248CD1C6B7198003148B6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\tBBF248CF1C6B7198003148B6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tBBFC29541CCDE12300F2CE4E /* Date.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Date.swift; sourceTree = \"<group>\"; };\n\t\tBBFEEDFC1CA903D3004C19C3 /* SSHServerListTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSHServerListTableViewController.swift; sourceTree = \"<group>\"; };\n\t\tBBFEEDFE1CA9115F004C19C3 /* SSHAddNewServerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSHAddNewServerViewController.swift; sourceTree = \"<group>\"; };\n\t\tBBFEEE001CA91290004C19C3 /* SSHTerminalViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSHTerminalViewController.swift; sourceTree = \"<group>\"; };\n\t\tBBFEEE021CA97A03004C19C3 /* animation.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = animation.gif; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tBBF248BB1C6B7198003148B6 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tBB6FAB181CB634D3001ED62C /* libstdc++.6.0.9.tbd in Frameworks */,\n\t\t\t\tBB6FAB161CB634B1001ED62C /* JavaScriptCore.framework in Frameworks */,\n\t\t\t\tBBD9ADEB1CA6E8D500D90A93 /* libbz2.1.0.tbd in Frameworks */,\n\t\t\t\tBBD9ADE91CA6E8BC00D90A93 /* libc++.tbd in Frameworks */,\n\t\t\t\tBBD9ADE61CA6E84F00D90A93 /* AudioToolbox.framework in Frameworks */,\n\t\t\t\tBBD9ADE41CA6E84500D90A93 /* VideoToolbox.framework in Frameworks */,\n\t\t\t\tBBD9ADE21CA6E83900D90A93 /* CoreMedia.framework in Frameworks */,\n\t\t\t\tBBD9ADE01CA6E82D00D90A93 /* CoreVideo.framework in Frameworks */,\n\t\t\t\tBBD9ADDE1CA6E82200D90A93 /* CoreAudio.framework in Frameworks */,\n\t\t\t\tBB6FAB141CB6348A001ED62C /* Cycript.framework in Frameworks */,\n\t\t\t\tBBD9ADDC1CA6E81600D90A93 /* AVFoundation.framework in Frameworks */,\n\t\t\t\tBBD9ADDA1CA6E80800D90A93 /* MediaPlayer.framework in Frameworks */,\n\t\t\t\tBBC7BBF31C9FD7B500F2B0EA /* libiconv.2.tbd in Frameworks */,\n\t\t\t\tBBC7BBEF1C9FD78700F2B0EA /* libsqlite3.tbd in Frameworks */,\n\t\t\t\tBB191D831CE4AA5F0015DA2F /* libWeChatSDK.a in Frameworks */,\n\t\t\t\tBBC7BBED1C9FD75F00F2B0EA /* libz.tbd in Frameworks */,\n\t\t\t\tBB5213191C9EE32F008108E7 /* libstdc++.tbd in Frameworks */,\n\t\t\t\tBB5B8C5C1C745C51008F8CDB /* CoreTelephony.framework in Frameworks */,\n\t\t\t\tBBECEAEA1C74527700887945 /* Social.framework in Frameworks */,\n\t\t\t\tBB5B8C5E1C745CD1008F8CDB /* SystemConfiguration.framework in Frameworks */,\n\t\t\t\t0EB377D160AA7E843C727C1F /* Pods.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\t8F0B72F410424E7FB809EF0E /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBB6FAB191CB6352A001ED62C /* Cycript */,\n\t\t\t\tBBD9ADE71CA6E86600D90A93 /* VLC */,\n\t\t\t\tBBC7BBF21C9FD7B500F2B0EA /* libiconv.2.tbd */,\n\t\t\t\tBBC7BBEE1C9FD78700F2B0EA /* libsqlite3.tbd */,\n\t\t\t\tBBC7BBEC1C9FD75F00F2B0EA /* libz.tbd */,\n\t\t\t\tBB5213181C9EE32F008108E7 /* libstdc++.tbd */,\n\t\t\t\tBBA04E011C74435E00FADAD2 /* CoreTelephony.framework */,\n\t\t\t\tBBECEAE91C74527700887945 /* Social.framework */,\n\t\t\t\tBB5B8C5D1C745CD1008F8CDB /* SystemConfiguration.framework */,\n\t\t\t\t8924B9FA7AD15AAC2FBDBC46 /* Pods.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBB056C951C6B7790007D935F /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBBF248CA1C6B7198003148B6 /* Assets.xcassets */,\n\t\t\t\tBB0B85C71CC5F4C8008CA4A4 /* Storyboard & xib */,\n\t\t\t\tBB0B85C61CC5F491008CA4A4 /* Image */,\n\t\t\t\tBBA295701CC0AF860096294B /* Audio */,\n\t\t\t\tBB0B85C81CC5F4F4008CA4A4 /* Other */,\n\t\t\t\tBBA46E9C1C7DB8E8008AFBEB /* LICENSE */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBB0B85C51CC5F413008CA4A4 /* Github */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBBA46EAD1C7DD4EA008AFBEB /* Github.swift */,\n\t\t\t\tBB0D4A2C1CE0724500C96B62 /* Repo.swift */,\n\t\t\t\tBB0D4A2E1CE0729000C96B62 /* Gist.swift */,\n\t\t\t\tBB0D4A301CE078D100C96B62 /* GistTable.swift */,\n\t\t\t\tBB0905091C704DE0007EBC53 /* GithubTableViewController.swift */,\n\t\t\t\tBBA46EAF1C7DDB52008AFBEB /* GithubAccountTableViewController.swift */,\n\t\t\t\tBBD070FA1C84540D006710D4 /* ReposTableViewController.swift */,\n\t\t\t);\n\t\t\tname = Github;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBB0B85C61CC5F491008CA4A4 /* Image */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBBFEEE021CA97A03004C19C3 /* animation.gif */,\n\t\t\t);\n\t\t\tname = Image;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBB0B85C71CC5F4C8008CA4A4 /* Storyboard & xib */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBBF248C71C6B7198003148B6 /* Main.storyboard */,\n\t\t\t\tBBF248CC1C6B7198003148B6 /* LaunchScreen.storyboard */,\n\t\t\t\tBBEA5CF71CDC59A500C44F95 /* LogoView.xib */,\n\t\t\t);\n\t\t\tname = \"Storyboard & xib\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBB0B85C81CC5F4F4008CA4A4 /* Other */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBB6E08E81CB4C464007239A4 /* Localizable.strings */,\n\t\t\t\tBBF248CF1C6B7198003148B6 /* Info.plist */,\n\t\t\t\tBBA04DF41C743DD800FADAD2 /* Sublime-Bridging-Header.h */,\n\t\t\t);\n\t\t\tname = Other;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBB0B85CC1CC7C4AA008CA4A4 /* Extension */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBB0B85CD1CC7C506008CA4A4 /* String.swift */,\n\t\t\t\tBB0B85CF1CC7C5CD008CA4A4 /* Operation.swift */,\n\t\t\t\tBB0B85D11CC7C62A008CA4A4 /* Array.swift */,\n\t\t\t\tBB0B85D31CC7C64C008CA4A4 /* Number.swift */,\n\t\t\t\tBB071E1F1CDF36C3004A2E38 /* UIImage.swift */,\n\t\t\t\tBB0B85D51CC7C705008CA4A4 /* UIImageView.swift */,\n\t\t\t\tBBD4D1CA1CD9DA270098DFB6 /* UIColor.swift */,\n\t\t\t\tBB0B85D71CC7C94D008CA4A4 /* UIView.swift */,\n\t\t\t\tBB0B85DB1CC7C9F8008CA4A4 /* UIApplication.swift */,\n\t\t\t\tBB0B85DD1CC7CA21008CA4A4 /* UITextView.swift */,\n\t\t\t\tBB0B85DF1CC7CA59008CA4A4 /* UITableView.swift */,\n\t\t\t\tBB0B85E31CC7CAB5008CA4A4 /* UIViewController.swift */,\n\t\t\t\tBBFC29541CCDE12300F2CE4E /* Date.swift */,\n\t\t\t\tBB0B85D91CC7C9BF008CA4A4 /* Other.swift */,\n\t\t\t);\n\t\t\tpath = Extension;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBB0D4A321CE0E0E000C96B62 /* Code */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBB0D4A331CE0E13200C96B62 /* CodeEngine.swift */,\n\t\t\t\tBB0AD49A1CE1F38300CDFC95 /* Code.swift */,\n\t\t\t);\n\t\t\tname = Code;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBB14E6F11C79FE3D0043C9EB /* Obj-C */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBB14E6F41C79FF260043C9EB /* MusicWave.h */,\n\t\t\t\tBB14E6F21C79FEEC0043C9EB /* MusicWave.m */,\n\t\t\t\tBBEA5CFD1CDC749100C44F95 /* ObjC.h */,\n\t\t\t\tBBEA5CFB1CDC747800C44F95 /* ObjC.m */,\n\t\t\t);\n\t\t\tpath = \"Obj-C\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBB5B8C521C745A3C008F8CDB /* SDK */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBB5B8C531C745A3C008F8CDB /* Weixin */,\n\t\t\t);\n\t\t\tpath = SDK;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBB5B8C531C745A3C008F8CDB /* Weixin */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBB191D7E1CE4AA5F0015DA2F /* libWeChatSDK.a */,\n\t\t\t\tBB191D801CE4AA5F0015DA2F /* WechatAuthSDK.h */,\n\t\t\t\tBB191D811CE4AA5F0015DA2F /* WXApi.h */,\n\t\t\t\tBB191D821CE4AA5F0015DA2F /* WXApiObject.h */,\n\t\t\t);\n\t\t\tpath = Weixin;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBB5B8C5F1C757DFF008F8CDB /* Utils */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBB7B25031CD8AC8C000A8F1E /* Views */,\n\t\t\t\tBB7B25021CD8AB0D000A8F1E /* Controllers */,\n\t\t\t\tBB0B85CC1CC7C4AA008CA4A4 /* Extension */,\n\t\t\t\tBB14E6F11C79FE3D0043C9EB /* Obj-C */,\n\t\t\t\tBB124DB01CAE6531002CAE2A /* QRCode.swift */,\n\t\t\t\tBBEDAD8F1CAD01BD0062A175 /* Plist.swift */,\n\t\t\t\tBB5B8C621C757F0E008F8CDB /* ShareToWeixin.swift */,\n\t\t\t\tBB5B8C641C7593A5008F8CDB /* File.swift */,\n\t\t\t\tBB0661671C75A1B000D1A434 /* Function.swift */,\n\t\t\t\tBB5B8C661C75957F008F8CDB /* UnitTest.swift */,\n\t\t\t\tBBD070F61C8437E6006710D4 /* Network.swift */,\n\t\t\t\tBB6DDC9B1CA2DE6E00E1665F /* RCIM.swift */,\n\t\t\t\tBB0B85E51CC7CC79008CA4A4 /* Log.swift */,\n\t\t\t\tBB7B25081CD8B051000A8F1E /* PopupMenu.swift */,\n\t\t\t\tBB7B250A1CD8B527000A8F1E /* ActionSheet.swift */,\n\t\t\t\tBBEA5CF91CDC704100C44F95 /* Device.swift */,\n\t\t\t);\n\t\t\tpath = Utils;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBB6FAB191CB6352A001ED62C /* Cycript */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBB6FAB171CB634D3001ED62C /* libstdc++.6.0.9.tbd */,\n\t\t\t\tBB6FAB151CB634B1001ED62C /* JavaScriptCore.framework */,\n\t\t\t\tBB6FAB131CB6348A001ED62C /* Cycript.framework */,\n\t\t\t);\n\t\t\tname = Cycript;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBB6FAB1E1CB64D37001ED62C /* RSS */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBB6FAB1C1CB64D30001ED62C /* RSSListTableViewController.swift */,\n\t\t\t\tBB6FAB1F1CB654E8001ED62C /* RSSItemListTableViewController.swift */,\n\t\t\t);\n\t\t\tname = RSS;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBB74E9201C9156EF0037AE83 /* Global */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBB09050B1C706881007EBC53 /* Global.swift */,\n\t\t\t\tBB1C6AA81CCF3F82002517E2 /* Constant.swift */,\n\t\t\t\tBB1C6AAA1CCF3FAD002517E2 /* Configure.swift */,\n\t\t\t);\n\t\t\tname = Global;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBB74E9231C918D670037AE83 /* LocalServer */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBB8EF83B1C7C766000C01A60 /* HTTPServerTableViewController.swift */,\n\t\t\t\tBB74E9241C918ED10037AE83 /* SublimeServer.swift */,\n\t\t\t\tBB74E9261C918F6F0037AE83 /* CustomServer.swift */,\n\t\t\t\tBB3F6CF11C929B0700F303A2 /* WebServerLog.swift */,\n\t\t\t);\n\t\t\tname = LocalServer;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBB7B25021CD8AB0D000A8F1E /* Controllers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBB0B85CA1CC60192008CA4A4 /* SublimeSafari.swift */,\n\t\t\t\tBB7B25001CD89A43000A8F1E /* RearrangeTable.swift */,\n\t\t\t\tBBD77FA21CDA45E900071B5E /* QRCodeReader.swift */,\n\t\t\t\tBBD77FA41CDB727100071B5E /* SublimeTable.swift */,\n\t\t\t);\n\t\t\tname = Controllers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBB7B25031CD8AC8C000A8F1E /* Views */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBB7B25041CD8ACBE000A8F1E /* VideoPlayerTimeView.swift */,\n\t\t\t\tBB7B25061CD8AD31000A8F1E /* NumberedTextView.swift */,\n\t\t\t);\n\t\t\tname = Views;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBB87E0641CAD341A0072E9F4 /* Messages */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBBC7BBF41C9FDE2000F2B0EA /* MessageListViewController.swift */,\n\t\t\t\tBBC7BBF61C9FED8900F2B0EA /* ContactTableViewController.swift */,\n\t\t\t\tBB124DAE1CAE58E1002CAE2A /* ContactInfoViewController.swift */,\n\t\t\t\tBB124DB21CAE83F1002CAE2A /* RCChatViewController.swift */,\n\t\t\t);\n\t\t\tname = Messages;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBB8EF83A1C7C515800C01A60 /* FileHandlers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBB0905071C704B3F007EBC53 /* FolderTableViewController.swift */,\n\t\t\t\tBB066DE41C6F90A50059B48C /* NewFileViewController.swift */,\n\t\t\t\tBB0905051C704A86007EBC53 /* CodeViewController.swift */,\n\t\t\t\tBB0905131C71E4A0007EBC53 /* ImagePageViewController.swift */,\n\t\t\t\tBB0905111C71DF8E007EBC53 /* ImageFileViewController.swift */,\n\t\t\t\tBB6B7BE91C76226200889708 /* VideoViewController.swift */,\n\t\t\t\tBB14E6EF1C79DFC60043C9EB /* MusicViewController.swift */,\n\t\t\t\tBB17D8A11C7AE1920026FA59 /* PDFViewController.swift */,\n\t\t\t);\n\t\t\tname = FileHandlers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBBA2956B1CBFBA730096294B /* GameOfGomoku */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBBA2956C1CBFBAA00096294B /* GomokuViewController.swift */,\n\t\t\t\tBBA2956E1CBFC5050096294B /* BoardView.swift */,\n\t\t\t\tBBA295731CC0BDAE0096294B /* BoardModel.swift */,\n\t\t\t\tBBA295771CC0CCF40096294B /* GomokuAI.swift */,\n\t\t\t);\n\t\t\tname = GameOfGomoku;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBBA295701CC0AF860096294B /* Audio */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBBA295711CC0AFA80096294B /* shake.wav */,\n\t\t\t\tBB6E08EC1CB51D41007239A4 /* qrcode_scan.wav */,\n\t\t\t\tBB1643D31CDE2FCE00BF5348 /* 山外小楼夜听雨.m4a */,\n\t\t\t);\n\t\t\tname = Audio;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBBA46E9C1C7DB8E8008AFBEB /* LICENSE */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBBBBDD141CDB82E900906981 /* Charts.LICENSE */,\n\t\t\t\tBB6FAAB31CB558BF001ED62C /* AlamofireRSSParser.LICENSE */,\n\t\t\t\tBBAC80171CA8F928001A5F5D /* NMSSH.LICENSE */,\n\t\t\t\tBBDF9D4B1C85CA6E0015FD97 /* SSZipArchive.LICENSE */,\n\t\t\t\tBBD070F21C842036006710D4 /* AASquaresLoading.LICENSE */,\n\t\t\t\tBB3BCFA51CA030C0003D2CB0 /* RongCloudIMKit.LICENSE */,\n\t\t\t\tBBA46E9D1C7DB8E8008AFBEB /* Alamofire.LICENSE */,\n\t\t\t\tBBA46E9E1C7DB8E8008AFBEB /* CYRTextView.LICENSE */,\n\t\t\t\tBBD070F41C84204C006710D4 /* DGElasticPullToRefresh.LICENSE */,\n\t\t\t\tBBA46E9F1C7DB8E8008AFBEB /* EZAudio.LICENSE */,\n\t\t\t\tBBC16D0D1C9FB329008F877B /* Gifu.LICENSE */,\n\t\t\t\tBBB473ED1CA6C8200049621E /* MobileVLCKit.LICENSE */,\n\t\t\t\tBBA46EA01C7DB8E8008AFBEB /* SJCSimplePDFView.LICENSE */,\n\t\t\t\tBBA46EA11C7DB8E8008AFBEB /* Swifter.LICENSE */,\n\t\t\t\tBBA46EA21C7DB8E8008AFBEB /* SwiftyJSON.LICENSE */,\n\t\t\t\tBBA46EA31C7DB8E8008AFBEB /* ZLMusicFlowWaveView.LICENSE */,\n\t\t\t\tBBA46EA41C7DB8E8008AFBEB /* ZLSinusWaveView.LICENSE */,\n\t\t\t);\n\t\t\tpath = LICENSE;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBBD9ADE71CA6E86600D90A93 /* VLC */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBBD9ADEA1CA6E8D500D90A93 /* libbz2.1.0.tbd */,\n\t\t\t\tBBD9ADE81CA6E8BC00D90A93 /* libc++.tbd */,\n\t\t\t\tBBD9ADE51CA6E84F00D90A93 /* AudioToolbox.framework */,\n\t\t\t\tBBD9ADE31CA6E84500D90A93 /* VideoToolbox.framework */,\n\t\t\t\tBBD9ADE11CA6E83900D90A93 /* CoreMedia.framework */,\n\t\t\t\tBBD9ADDF1CA6E82D00D90A93 /* CoreVideo.framework */,\n\t\t\t\tBBD9ADDD1CA6E82200D90A93 /* CoreAudio.framework */,\n\t\t\t\tBBD9ADDB1CA6E81600D90A93 /* AVFoundation.framework */,\n\t\t\t\tBBD9ADD91CA6E80800D90A93 /* MediaPlayer.framework */,\n\t\t\t);\n\t\t\tname = VLC;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBBF248B51C6B7198003148B6 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBBF248C01C6B7198003148B6 /* Sublime */,\n\t\t\t\tBBF248BF1C6B7198003148B6 /* Products */,\n\t\t\t\tECC2E72DDD79413AE0AC8842 /* Pods */,\n\t\t\t\t8F0B72F410424E7FB809EF0E /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBBF248BF1C6B7198003148B6 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBBF248BE1C6B7198003148B6 /* Sublime.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBBF248C01C6B7198003148B6 /* Sublime */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBB8AC7FC1C97F1100029B686 /* Web */,\n\t\t\t\tBB0B85C51CC5F413008CA4A4 /* Github */,\n\t\t\t\tBBA2956B1CBFBA730096294B /* GameOfGomoku */,\n\t\t\t\tBB6FAB1E1CB64D37001ED62C /* RSS */,\n\t\t\t\tBB87E0641CAD341A0072E9F4 /* Messages */,\n\t\t\t\tBBFEEDFB1CA903B0004C19C3 /* SSH */,\n\t\t\t\tBB74E9231C918D670037AE83 /* LocalServer */,\n\t\t\t\tBB74E9201C9156EF0037AE83 /* Global */,\n\t\t\t\tBB0D4A321CE0E0E000C96B62 /* Code */,\n\t\t\t\tBB8EF83A1C7C515800C01A60 /* FileHandlers */,\n\t\t\t\tBB5B8C5F1C757DFF008F8CDB /* Utils */,\n\t\t\t\tBB5B8C521C745A3C008F8CDB /* SDK */,\n\t\t\t\tBB056C951C6B7790007D935F /* Support Files */,\n\t\t\t\tBBF248C11C6B7198003148B6 /* AppDelegate.swift */,\n\t\t\t\tBBC548D21C6DCAB1003679DB /* MainTableViewController.swift */,\n\t\t\t\tBB8EF8381C7C460400C01A60 /* SettingTableViewController.swift */,\n\t\t\t\tBBA46E781C7D92DE008AFBEB /* AppInfoViewController.swift */,\n\t\t\t\tBBA46E7A1C7D9D35008AFBEB /* LicenseTableViewController.swift */,\n\t\t\t\tBB6E08EA1CB4E7EB007239A4 /* ExploreTableViewController.swift */,\n\t\t\t\tBB6FAB1A1CB63976001ED62C /* ConfigTableViewController.swift */,\n\t\t\t\tBBBBDD161CDB848100906981 /* StorageViewController.swift */,\n\t\t\t\tBB1643CB1CDCA06000BF5348 /* DonateViewController.swift */,\n\t\t\t\tBB0AD49C1CE204A700CDFC95 /* ReadingViewController.swift */,\n\t\t\t);\n\t\t\tpath = Sublime;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBBFEEDFB1CA903B0004C19C3 /* SSH */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBBFEEDFC1CA903D3004C19C3 /* SSHServerListTableViewController.swift */,\n\t\t\t\tBBFEEDFE1CA9115F004C19C3 /* SSHAddNewServerViewController.swift */,\n\t\t\t\tBBFEEE001CA91290004C19C3 /* SSHTerminalViewController.swift */,\n\t\t\t);\n\t\t\tname = SSH;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tECC2E72DDD79413AE0AC8842 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t637A844DDC75B0CAC7C68338 /* Pods.debug.xcconfig */,\n\t\t\t\t2E036C58ACB2EE5D20127B26 /* Pods.release.xcconfig */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tBBF248BD1C6B7198003148B6 /* Sublime */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = BBF248D21C6B7198003148B6 /* Build configuration list for PBXNativeTarget \"Sublime\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tAFF9B26082F2AC15E6FECA1C /* Check Pods Manifest.lock */,\n\t\t\t\tBBF248BA1C6B7198003148B6 /* Sources */,\n\t\t\t\tBBF248BB1C6B7198003148B6 /* Frameworks */,\n\t\t\t\tBBF248BC1C6B7198003148B6 /* Resources */,\n\t\t\t\t7EFCBC0948FA71C4A863F9C4 /* Embed Pods Frameworks */,\n\t\t\t\t3FA2A0AB24F564CC523A077A /* Copy Pods Resources */,\n\t\t\t\tBB85556D1C7417E3005A1E22 /* Embed App Extensions */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Sublime;\n\t\t\tproductName = Sublime;\n\t\t\tproductReference = BBF248BE1C6B7198003148B6 /* Sublime.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tBBF248B61C6B7198003148B6 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0720;\n\t\t\t\tORGANIZATIONNAME = Eular;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tBBF248BD1C6B7198003148B6 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2.1;\n\t\t\t\t\t\tDevelopmentTeam = 952J324HNJ;\n\t\t\t\t\t\tSystemCapabilities = {\n\t\t\t\t\t\t\tcom.apple.BackgroundModes = {\n\t\t\t\t\t\t\t\tenabled = 0;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t};\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = BBF248B91C6B7198003148B6 /* Build configuration list for PBXProject \"Sublime\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t\t\"zh-Hans\",\n\t\t\t);\n\t\t\tmainGroup = BBF248B51C6B7198003148B6;\n\t\t\tproductRefGroup = BBF248BF1C6B7198003148B6 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tBBF248BD1C6B7198003148B6 /* Sublime */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tBBF248BC1C6B7198003148B6 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tBBA46EA81C7DB8E8008AFBEB /* SJCSimplePDFView.LICENSE in Resources */,\n\t\t\t\tBB1643D41CDE2FCE00BF5348 /* 山外小楼夜听雨.m4a in Resources */,\n\t\t\t\tBBFEEE031CA97A03004C19C3 /* animation.gif in Resources */,\n\t\t\t\tBBA46EA91C7DB8E8008AFBEB /* Swifter.LICENSE in Resources */,\n\t\t\t\tBBD070F31C842036006710D4 /* AASquaresLoading.LICENSE in Resources */,\n\t\t\t\tBBDF9D4C1C85CA6E0015FD97 /* SSZipArchive.LICENSE in Resources */,\n\t\t\t\tBB41CBC41C6E37EE000B2954 /* Assets.xcassets in Resources */,\n\t\t\t\tBBB473EE1CA6C8200049621E /* MobileVLCKit.LICENSE in Resources */,\n\t\t\t\tBBA46EA71C7DB8E8008AFBEB /* EZAudio.LICENSE in Resources */,\n\t\t\t\tBB3BCFA61CA030C0003D2CB0 /* RongCloudIMKit.LICENSE in Resources */,\n\t\t\t\tBBBBDD151CDB82E900906981 /* Charts.LICENSE in Resources */,\n\t\t\t\tBBF248CE1C6B7198003148B6 /* LaunchScreen.storyboard in Resources */,\n\t\t\t\tBBA46EAA1C7DB8E8008AFBEB /* SwiftyJSON.LICENSE in Resources */,\n\t\t\t\tBBC16D0E1C9FB329008F877B /* Gifu.LICENSE in Resources */,\n\t\t\t\tBBA46EAB1C7DB8E8008AFBEB /* ZLMusicFlowWaveView.LICENSE in Resources */,\n\t\t\t\tBB6E08E61CB4C464007239A4 /* Localizable.strings in Resources */,\n\t\t\t\tBB8AC7FD1C97F1100029B686 /* Web in Resources */,\n\t\t\t\tBBA46EA61C7DB8E8008AFBEB /* CYRTextView.LICENSE in Resources */,\n\t\t\t\tBBAC80181CA8F928001A5F5D /* NMSSH.LICENSE in Resources */,\n\t\t\t\tBBA295721CC0AFA80096294B /* shake.wav in Resources */,\n\t\t\t\tBBEA5CF81CDC59A500C44F95 /* LogoView.xib in Resources */,\n\t\t\t\tBB6FAAB41CB558BF001ED62C /* AlamofireRSSParser.LICENSE in Resources */,\n\t\t\t\tBBD070F51C84204C006710D4 /* DGElasticPullToRefresh.LICENSE in Resources */,\n\t\t\t\tBB6E08ED1CB51D41007239A4 /* qrcode_scan.wav in Resources */,\n\t\t\t\tBBF248C91C6B7198003148B6 /* Main.storyboard in Resources */,\n\t\t\t\tBBA46EAC1C7DB8E8008AFBEB /* ZLSinusWaveView.LICENSE in Resources */,\n\t\t\t\tBBA46EA51C7DB8E8008AFBEB /* Alamofire.LICENSE in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t3FA2A0AB24F564CC523A077A /* Copy Pods Resources */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Copy Pods Resources\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t7EFCBC0948FA71C4A863F9C4 /* 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);\n\t\t\tname = \"Embed Pods Frameworks\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\tAFF9B26082F2AC15E6FECA1C /* 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);\n\t\t\tname = \"Check Pods Manifest.lock\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_ROOT}/../Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [[ $? != 0 ]] ; then\\n    cat << EOM\\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\nEOM\\n    exit 1\\nfi\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tBBF248BA1C6B7198003148B6 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tBB0905081C704B3F007EBC53 /* FolderTableViewController.swift in Sources */,\n\t\t\t\tBBBBDD171CDB848100906981 /* StorageViewController.swift in Sources */,\n\t\t\t\tBBFEEDFD1CA903D3004C19C3 /* SSHServerListTableViewController.swift in Sources */,\n\t\t\t\tBB6DDC9C1CA2DE6E00E1665F /* RCIM.swift in Sources */,\n\t\t\t\tBB17D8A21C7AE1920026FA59 /* PDFViewController.swift in Sources */,\n\t\t\t\tBB74E9271C918F6F0037AE83 /* CustomServer.swift in Sources */,\n\t\t\t\tBB3F6CF21C929B0700F303A2 /* WebServerLog.swift in Sources */,\n\t\t\t\tBB0B85D61CC7C705008CA4A4 /* UIImageView.swift in Sources */,\n\t\t\t\tBB124DB11CAE6531002CAE2A /* QRCode.swift in Sources */,\n\t\t\t\tBB0B85D21CC7C62A008CA4A4 /* Array.swift in Sources */,\n\t\t\t\tBB0B85CB1CC60192008CA4A4 /* SublimeSafari.swift in Sources */,\n\t\t\t\tBB5B8C651C7593A5008F8CDB /* File.swift in Sources */,\n\t\t\t\tBB0905061C704A86007EBC53 /* CodeViewController.swift in Sources */,\n\t\t\t\tBB0D4A2F1CE0729000C96B62 /* Gist.swift in Sources */,\n\t\t\t\tBB8EF8391C7C460400C01A60 /* SettingTableViewController.swift in Sources */,\n\t\t\t\tBBA46E791C7D92DE008AFBEB /* AppInfoViewController.swift in Sources */,\n\t\t\t\tBB0905141C71E4A0007EBC53 /* ImagePageViewController.swift in Sources */,\n\t\t\t\tBBFC29551CCDE12300F2CE4E /* Date.swift in Sources */,\n\t\t\t\tBB09050C1C706881007EBC53 /* Global.swift in Sources */,\n\t\t\t\tBB0B85E01CC7CA59008CA4A4 /* UITableView.swift in Sources */,\n\t\t\t\tBB5B8C671C75957F008F8CDB /* UnitTest.swift in Sources */,\n\t\t\t\tBB6FAB1B1CB63976001ED62C /* ConfigTableViewController.swift in Sources */,\n\t\t\t\tBBA46E7B1C7D9D35008AFBEB /* LicenseTableViewController.swift in Sources */,\n\t\t\t\tBB0B85D41CC7C64C008CA4A4 /* Number.swift in Sources */,\n\t\t\t\tBBD77FA51CDB727100071B5E /* SublimeTable.swift in Sources */,\n\t\t\t\tBB0B85DC1CC7C9F8008CA4A4 /* UIApplication.swift in Sources */,\n\t\t\t\tBB7B25091CD8B051000A8F1E /* PopupMenu.swift in Sources */,\n\t\t\t\tBB1C6AAB1CCF3FAD002517E2 /* Configure.swift in Sources */,\n\t\t\t\tBB14E6F31C79FEEC0043C9EB /* MusicWave.m in Sources */,\n\t\t\t\tBB6E08EB1CB4E7EB007239A4 /* ExploreTableViewController.swift in Sources */,\n\t\t\t\tBB7B25071CD8AD31000A8F1E /* NumberedTextView.swift in Sources */,\n\t\t\t\tBB0B85D81CC7C94D008CA4A4 /* UIView.swift in Sources */,\n\t\t\t\tBBA46EB01C7DDB52008AFBEB /* GithubAccountTableViewController.swift in Sources */,\n\t\t\t\tBBFEEE011CA91290004C19C3 /* SSHTerminalViewController.swift in Sources */,\n\t\t\t\tBB0B85D01CC7C5CD008CA4A4 /* Operation.swift in Sources */,\n\t\t\t\tBBFEEDFF1CA9115F004C19C3 /* SSHAddNewServerViewController.swift in Sources */,\n\t\t\t\tBB7B25051CD8ACBE000A8F1E /* VideoPlayerTimeView.swift in Sources */,\n\t\t\t\tBB8EF83C1C7C766000C01A60 /* HTTPServerTableViewController.swift in Sources */,\n\t\t\t\tBBEA5CFC1CDC747800C44F95 /* ObjC.m in Sources */,\n\t\t\t\tBBC7BBF71C9FED8900F2B0EA /* ContactTableViewController.swift in Sources */,\n\t\t\t\tBB5B8C631C757F0E008F8CDB /* ShareToWeixin.swift in Sources */,\n\t\t\t\tBBEA5CFA1CDC704100C44F95 /* Device.swift in Sources */,\n\t\t\t\tBBD77FA31CDA45E900071B5E /* QRCodeReader.swift in Sources */,\n\t\t\t\tBBEDAD901CAD01BD0062A175 /* Plist.swift in Sources */,\n\t\t\t\tBB0B85DA1CC7C9BF008CA4A4 /* Other.swift in Sources */,\n\t\t\t\tBB6FAB201CB654E8001ED62C /* RSSItemListTableViewController.swift in Sources */,\n\t\t\t\tBBD070FB1C84540D006710D4 /* ReposTableViewController.swift in Sources */,\n\t\t\t\tBB0905121C71DF8E007EBC53 /* ImageFileViewController.swift in Sources */,\n\t\t\t\tBB6B7BEA1C76226200889708 /* VideoViewController.swift in Sources */,\n\t\t\t\tBB7B250B1CD8B527000A8F1E /* ActionSheet.swift in Sources */,\n\t\t\t\tBBC7BBF51C9FDE2000F2B0EA /* MessageListViewController.swift in Sources */,\n\t\t\t\tBB14E6F01C79DFC60043C9EB /* MusicViewController.swift in Sources */,\n\t\t\t\tBB071E201CDF36C3004A2E38 /* UIImage.swift in Sources */,\n\t\t\t\tBBA46EAE1C7DD4EA008AFBEB /* Github.swift in Sources */,\n\t\t\t\tBBA295781CC0CCF40096294B /* GomokuAI.swift in Sources */,\n\t\t\t\tBB0661681C75A1B000D1A434 /* Function.swift in Sources */,\n\t\t\t\tBB124DAF1CAE58E1002CAE2A /* ContactInfoViewController.swift in Sources */,\n\t\t\t\tBB0D4A311CE078D100C96B62 /* GistTable.swift in Sources */,\n\t\t\t\tBBA2956F1CBFC5050096294B /* BoardView.swift in Sources */,\n\t\t\t\tBB0D4A341CE0E13200C96B62 /* CodeEngine.swift in Sources */,\n\t\t\t\tBB6FAB1D1CB64D30001ED62C /* RSSListTableViewController.swift in Sources */,\n\t\t\t\tBBC548D31C6DCAB1003679DB /* MainTableViewController.swift in Sources */,\n\t\t\t\tBB7B25011CD89A43000A8F1E /* RearrangeTable.swift in Sources */,\n\t\t\t\tBB1C6AA91CCF3F82002517E2 /* Constant.swift in Sources */,\n\t\t\t\tBB0AD49B1CE1F38300CDFC95 /* Code.swift in Sources */,\n\t\t\t\tBBA2956D1CBFBAA00096294B /* GomokuViewController.swift in Sources */,\n\t\t\t\tBBD070F71C8437E6006710D4 /* Network.swift in Sources */,\n\t\t\t\tBBD4D1CB1CD9DA270098DFB6 /* UIColor.swift in Sources */,\n\t\t\t\tBBF248C21C6B7198003148B6 /* AppDelegate.swift in Sources */,\n\t\t\t\tBB124DB31CAE83F1002CAE2A /* RCChatViewController.swift in Sources */,\n\t\t\t\tBB0B85DE1CC7CA21008CA4A4 /* UITextView.swift in Sources */,\n\t\t\t\tBBA295741CC0BDAE0096294B /* BoardModel.swift in Sources */,\n\t\t\t\tBB1643CC1CDCA06000BF5348 /* DonateViewController.swift in Sources */,\n\t\t\t\tBB09050A1C704DE0007EBC53 /* GithubTableViewController.swift in Sources */,\n\t\t\t\tBB0B85E41CC7CAB5008CA4A4 /* UIViewController.swift in Sources */,\n\t\t\t\tBB0B85E61CC7CC79008CA4A4 /* Log.swift in Sources */,\n\t\t\t\tBB0B85CE1CC7C506008CA4A4 /* String.swift in Sources */,\n\t\t\t\tBB0AD49D1CE204A700CDFC95 /* ReadingViewController.swift in Sources */,\n\t\t\t\tBB74E9251C918ED10037AE83 /* SublimeServer.swift in Sources */,\n\t\t\t\tBB066DE51C6F90A50059B48C /* NewFileViewController.swift in Sources */,\n\t\t\t\tBB0D4A2D1CE0724500C96B62 /* Repo.swift 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\tBB6E08E81CB4C464007239A4 /* Localizable.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tBB6E08E71CB4C464007239A4 /* en */,\n\t\t\t\tBB6E08E91CB4C468007239A4 /* zh-Hans */,\n\t\t\t);\n\t\t\tname = Localizable.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBBF248C71C6B7198003148B6 /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tBBF248C81C6B7198003148B6 /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBBF248CC1C6B7198003148B6 /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tBBF248CD1C6B7198003148B6 /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\tBBF248D01C6B7198003148B6 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = 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_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\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\tIPHONEOS_DEPLOYMENT_TARGET = 9.2;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tBBF248D11C6B7198003148B6 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = 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_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\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\tIPHONEOS_DEPLOYMENT_TARGET = 9.2;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tBBF248D31C6B7198003148B6 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 2E036C58ACB2EE5D20127B26 /* Pods.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 = \"iPhone Developer\";\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/MobileVLCKit\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Sublime/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\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\"$(PROJECT_DIR)/Sublime/SDK/Weixin\",\n\t\t\t\t);\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"Alamofire\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"CYRTextView\\\"\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.eular.Sublime;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Sublime/Sublime-Bridging-Header.h\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tBBF248D41C6B7198003148B6 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 2E036C58ACB2EE5D20127B26 /* Pods.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 = \"iPhone Developer\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/MobileVLCKit\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Sublime/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\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\"$(PROJECT_DIR)/Sublime/SDK/Weixin\",\n\t\t\t\t);\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"Alamofire\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"CYRTextView\\\"\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.eular.Sublime;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Sublime/Sublime-Bridging-Header.h\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tBBF248B91C6B7198003148B6 /* Build configuration list for PBXProject \"Sublime\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tBBF248D01C6B7198003148B6 /* Debug */,\n\t\t\t\tBBF248D11C6B7198003148B6 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tBBF248D21C6B7198003148B6 /* Build configuration list for PBXNativeTarget \"Sublime\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tBBF248D31C6B7198003148B6 /* Debug */,\n\t\t\t\tBBF248D41C6B7198003148B6 /* 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 = BBF248B61C6B7198003148B6 /* Project object */;\n}\n"
  },
  {
    "path": "Sublime/Sublime.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Sublime.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Sublime/Sublime.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Sublime.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Pods/Pods.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  }
]