[
  {
    "path": ".gitignore",
    "content": "build/Slate.build\nbuild/Release/Slate.app.dSYM\nbuild/debug_paths.json\nbuild/release_paths.json\nbuild/output\nbuild/Release/*.tar.gz\nbuild/Release/VERSION\nbuild/Release/appcast.xml\nSlate.xcodeproj/jigish.mode1v3\nSlate.xcodeproj/jigish.pbxuser\nSlate.xcodeproj/project.xcworkspace/xcuserdata/jigish.xcuserdatad/\nSlate.xcodeproj/xcuserdata/jigish.xcuserdatad/\n# don't version xcode artifacts\n*.xcuserdatad\ntmp\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"script/create-dmg\"]\n\tpath = script/create-dmg\n\turl = https://github.com/andreyvit/yoursway-create-dmg.git\n"
  },
  {
    "path": ".rbenv-version",
    "content": "1.9.3-p286\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.md",
    "content": "# About Slate #\n\nSlate is a window management application similar to Divvy and SizeUp (except better and free!). Originally written to replace them due to some limitations in how each work, it attempts to overcome them by simply being extremely configurable. As a result, it may be a bit daunting to get configured, but once it is done, the benefit is huge.\n\nSlate currently works on Mac OS X 10.6 and above\n\n## Summary of Features ##\n\n* Highly customizable\n* Bind keystrokes to:\n  * move and/or resize windows\n  * directionally focus windows\n  * activate preset layouts\n  * create, delete, and activate snapshots of the current state of windows\n* Set default layouts for different monitor configurations which will activate when that configuration is detected.\n* Window Hints: an intuitive way to change window focus\n* \\[Beta\\] A better, more customizable, application switcher.\n\n## Credits ##\n\nBig thanks to [philc](https://github.com/philc) for the Window Hints idea (and initial implementation) as well as plenty of other suggestions and improvement ideas.\n\n# Using Slate #\n\n## Installing Slate ##\n\n**NEW Installation Instructions**\n\n**Note:** You must turn on the Accessibility API by checking System Preferences > Universal Access > Enable access for assistive devices\n\n### Direct Download ###\n\n* [`.dmg`](http://slate.ninjamonkeysoftware.com/Slate.dmg)\n* [`.tar.gz`](http://slate.ninjamonkeysoftware.com/versions/slate-latest.tar.gz)\n\n### Terminal ###\n\nJust run this in your terminal:\n\n    cd /Applications && curl http://www.ninjamonkeysoftware.com/slate/versions/slate-latest.tar.gz | tar -xz\n\n## Configuring Slate ##\n\n**NEW:** You may now use a \".slate.js\" file to configure slate using JavaScript. This allows for much more complex and dynamic configurations than the normal slate configuration style below. You can check out the documentation for this [here](https://github.com/jigish/slate/wiki/JavaScript-Configs).\n\nSlate is configured using a \".slate\" file in the current user's home directory. Configuration is loaded upon running Slate. You can also re-load the config using the \"Load Config\" menu option on the status menu (use this at your own risk. It is better to simply restart Slate).\n\n**Note:** If no \".slate\" file exists in the current user's home directory, the [default config file](https://github.com/jigish/slate/blob/master/Slate/default.slate) will be used.\n\nConfiguration is split into the following directives:\n\n* `config` (for global configurations)\n* `alias` (to create alias variables)\n* `layout` (to configure layouts)\n* `default` (to default certain screen configurations to layouts)\n* `bind` (for key bindings)\n* `source` (to load configs from another file)\n\n**Note:** `#` is the comment character. Anything after a `#` will be ignored.\n\n###Expressions###\n\nSome directives allow parameters that can be expressions. The following strings will be replaced with the appropriate values when using expressions:\n\n    screenOriginX = target screen's top left x coordinate (should not be used in Window Hints configs)\n    screenOriginY = target screen's top left y coordinate (should not be used in Window Hints configs)\n    screenSizeX = target screen's width\n    screenSizeY = target screen's height\n    windowTopLeftX = window's current top left x coordinate (should not be used in Window Hints configs)\n    windowTopLeftY = window's current top left y coordinate (should not be used in Window Hints configs)\n    windowSizeX = window's width\n    windowSizeY = window's height\n    newWindowSizeX = window's new width (after resize, only usable in topLeftX and topLeftY, should not be\n                     used in configs)\n    newWindowSizeY = window's new height (after resize, only usable in topLeftX and topLeftY, should not be\n                     used in configs)\n    windowHintsWidth = the value of the windowHintsWidth config (only usable in windowHintsTopLeftX and\n                       windowHintsTopLeftY)\n    windowHintsHeight = the value of the windowHintsHeight config (only usable in windowHintsTopLeftX and\n                        windowHintsTopLeftY)\n\nIn addition to the variables above, expressions can be used with the following functions and operators:\n\n    +          e.g. 1+1 = 2\n    -          e.g. 1-1 = 0\n    *          e.g. 2*2 = 4\n    /          e.g. 4/2 = 2\n    **         e.g. 3**2 = 9\n    sum        e.g. sum({1,2,3}) = 6\n    count      e.g. count({4,5,6}) = 3\n    min        e.g. min({1,3,5}) = 1\n    max        e.g. max({1,3,5}) = 5\n    average    e.g. average({1,2,3,4}) = 2.5\n    median     e.g. median({1,2,3,10,15}) = 3\n    stddev     e.g. stddev({1,2,3,4,5}) = 1.4142135623730951\n    sqrt       e.g. sqrt(9) = 3.0\n    log        e.g. log(100) = 2.0\n    ln         e.g. ln(8) = 2.0794415416798357\n    exp        e.g. exp(2) = 7.3890560989306504 (this is \"e**parameter\")\n    floor      e.g. floor(1.9) = 1.0\n    ceiling    e.g. ceiling(1.1) = 2.0\n    abs        e.g. abs(-1) = 1\n    trunc      e.g. trunc(1.1123123123) = 1.0\n    random     e.g. random() = 0.20607629744336009 (random float between 0 and 1)\n    randomn    e.g. randomn(10) = 4 (random integer between 0 and parameter-1)\n\n**Note:** When using expressions spaces are *not* allowed!\n\n### The `config` Directive ###\n\nThe `config` directive follows the following format:\n\n    config name value\n\n[List of allowed configs](https://github.com/jigish/slate/wiki/Global-Configs)\n\nExample:\n\n    config defaultToCurrentScreen true\n\n**Note:** the `.slate` file is read top-down directives that come before `config` directives may not have the `config` applied. As such, it is best to put `config` directives at the top of your `.slate` file.\n\n### The `alias` Directive ###\n\nThe `alias` directive follows the following format:\n\n    alias name value\n\nWhen you set an alias, you can refer to it in any directive (sequentially after that alias directive) by referencing like `${name}`.\n\nExample:\n\n    alias bot-right-2nd-mon move screenOriginX+2*screenSizeX/3;screenOriginY+screenSizeY/2 screenSizeX/3;screenSizeY/2 1\n\nWill allow you to use `${bot-right-2nd-mon}` as a reference to `move screenOriginX+2*screenSizeX/3;screenOriginY+screenSizeY/2 screenSizeX/3;screenSizeY/2 1` in any directive following the alias (including other alias directives)\n\n### The `layout` Directive ###\n\nThe `layout` directive follows the following format:\n\n    layout name 'app name':OPTIONS operations\n\nWhere:\n\n    name = the name you want to use to reference the layout\n    'app name' = single-quoted name of the application to add to the layout **or** BEFORE or AFTER\n    OPTIONS = a comma separated list of options for this application (cannot be used with BEFORE or AFTER)\n    operations = a pipe separated list of operations (move, resize, push, nudge, throw, or corner)\n\nPossible Options:\n\n| Name | Function |\n|:-----|:---------|\n| `IGNORE_FAIL` | This will let slate move to the next operation if the current operation fails to resize/move on the current window |\n| `REPEAT` | This will repeat the list of operations if the number of windows is larger than the number of operations |\n| `REPEAT_LAST` | This will repeat the last operation in the list if the number of windows is larger than the number of operations |\n| `MAIN_FIRST` | This will cause the main window to always use the first operation |\n| `MAIN_LAST` | This will cause the main window to always use the last operation (mutally exclusive with `MAIN_FIRST`) |\n| `SORT_TITLE` | This will cause the window operations to be triggered on the windows in sorted order by the window title (can be used with `MAIN_FIRST` or `MAIN_LAST`) |\n| `TITLE_ORDER=order` | This will cause the operations to be triggered on the windows starting with order which is a semi-colon separated list of window titles |\n| `TITLE_ORDER_REGEX=order` | This will cause the operations to be triggered on the windows starting with the order which is a semi-colon separated list of window title regexes to match. Note that once a match is seen, the next regex will be used to match. This means if you have two windows that match the same regex, only the first one seen will be matched. The second will not. |\n\n\nYou can have multiple layout directives that point to the same name in order to link any number of applications to the same layout.\n\nExample:\n\n    layout myLayout 'iTerm' push up bar-resize:screenSizeY/2 | push down bar-resize:screenSizeY/2\n    layout myLayout 'Google Chrome' push left bar-resize:screenSizeX/2 | push right bar-resize:screenSizeX/2\n    layout myLayout BEFORE shell path:~/ '/opt/local/bin/mvim before'\n    layout myLayout AFTER shell path:~/ '/opt/local/bin/mvim after'\n\nWill create a layout called `myLayout` with two operations for iTerm and two operations for Google Chrome. When activated, the first window of iTerm will be moved using the first operation in the first list and the second window of iTerm will be moved using the second operation in the first list. In addition, the first window of Google Chrome will be moved using the first operation in the second list and the second window of Google Chrome will be moved using the second operation in the second list. Finally, the operation `shell path:~/ '/opt/local/bin/mvim before'` will be run before any Applications are moved and the operation `shell path:~/ '/opt/local/bin/mvim after'` will be run after any Applications are moved. BEFORE and AFTER may also be used if the layout doesn't have any applications tied to it. Also, you may specify multiple BEFORE or AFTER lines (they will be run in the order that they appear). More information on how to actually use these layouts can be found under the `layout` operation in the `bind` directive section.\n\n### The `default` Directive ###\n\nThe `default` directive follows the following format (tokens may be separated by any number of spaces):\n\n    default layout-or-snapshot-name screen-configuration\n\nWhere:\n\n    layout-or-snapshot-name = the name of the layout or snapshot you want to default to\n    screen-configuration = either \"count:NUMBER_OF_SCREENS\" or\n                                  \"resolutions:SEMICOLON_SEPARATED_LIST_OF_RESOLUTIONS\"\n\nThis directive will cause any screen configuration change (add monitor, remove monitor, screen resolution change) to trigger a search for a default layout or snapshot. If the screen configuration matches one of the defaults set, the layout or snapshot matching `layout-or-snapshot-name` will be triggered. For example:\n\n    default myLayout count:2\n\nWill trigger `myLayout` anytime the screen configuration changes to have 2 monitors. Also:\n\n    default myLayout2 resolutions:1440x900;1024x768;1680x1050\n\nWill trigger `myLayout2` anytime the screen configuration changes to have exactly 3 monitors with resolutions `1440x900`, `1024x768`, and `1680x1050`.\n\n### The `bind` Directive ###\n\nThe `bind` directive follows one of the following formats (tokens may be separated by any number of spaces):\n\n    bind key:modifiers operation parameter+\n    bind key:modal-key operation parameter+\n\n#### Key ####\n\n`key` is a reference to a key on the keyboard. See Allowed Keys for a complete list. For example: the `s` key would simply be `s` while the `1` key on the number pad would be `pad1`.\n\n#### Modifiers ####\n\n`modifiers` is a comma or semicolon separated list of standard modifier keys. Allowed modifiers are:\n\n* Control: `ctrl`\n* Option/Alt: `alt`\n* Command: `cmd`\n* Shift: `shift`\n\n**Note:** If you bind any binding to cmd-tab or cmd-shift-tab, Slate will completely disable the default Mac OS X Application switcher!\n\n**Note:** Bindings that are used by Mac OS X spaces, expose, and mission control will override Slate bindings. Be sure to turn these bindings off if you want to use them in Slate.\n\n#### Modal Key ####\n\n`modal-key` is any one of the Allowed Keys. If using a `modal-key`, pressing that key will cause the Slate menu bar icon to change indicating modal mode is activated. then clicking `key` will activate the binding. Modal mode will remain active until `key` has been pressed or `modal-key` is pressed again. You may specify multiple bindings with the same `modal-key` as long as `key` is different. Also, `modal-key` can accompany a comma or semicolon separated list of modifier keys listed above. This will cause that entire keystroke to be considered the modal activation binding. For example: `bind 1:f4,ctrl,alt` will result in the modal keystroke being `ctrl+alt+f4`. After pressing that keystroke, modal mode will be activated and pressing `1` after that will activate the binding.\n\n##### Modal Toggle Behavior #####\n\nIf you add `:toggle` to the end of a modal binding it will cause that binding to not end the modal mode. For example with the binding `1:ctrl,f4`, you press `ctrl+f4` and then press `1` to activate the binding. Once that binding is activated, modal mode will end and you have to press `ctrl+f4` again to activate it. However, with the binding `1:ctrl,f4:toggle` pressing `ctrl+f4` will toggle modal mode. pressing `1` will activate the binding but not end modal mode. To end modal mode, press `ctrl+f4` again or use the config `modalEscapeKey`.\n\n#### Operation ####\n\nOperations define what to actually do to the focused window.\n\n**Screens**\n\nSome operations allow you to specify a screen. Here are the list of possible values for screen:\n\n* Integer representing the screen ID (indexed at 0). Screens are ordered from left to right (by X coordinate of the origin which is the top-left point). If `orderScreensLeftToRight` is set to false, the screen ID is the Mac OS internal ID (indexed at 0). If `orderScreensLeftToRight` is set to false but you still want to reference screens in the default ordered mode, prefix the screen ID with `ordered:`.\n* Screen resolution in the format `WIDTHxHEIGHT` (e.g. `1440x900`)\n* Screen direction relative to the current screen (`left|right|up|above|down|below`)\n* `next` or `previous` (represents the `currentID+1` or `currentID-1` screen)\n\n**Allowed operations are:**\n\n##### move #####\nMove/Resize the window any which way: `move topLeftX;topLeftY sizeX;sizeY screen`\n\n        topLeftX = top left x coordinate of the window's desired position (can be an expression)\n        topLeftY = top left y coordinate of the window's desired position (can be an expression)\n        sizeX = width of the window's desired position (can be an expression)\n        sizeY = height of the window's desired position (can be an expression)\n        screen = (optional) the reference to the screen of the window's desired position.\n                 If this is not specified, it will default to the screen the window is currently on.\n                 See the table at the beginning of the Operation section for more information.\n\n    Example:\n\n        bind pad1:ctrl move 0;0 100;100 1\n\n    Will bind the keystroke ctrl-numpad1 to moving the window to the screen at index `1` with top-left coordinate `0,0` and size `100,100`\n\n    **Note:** Remember to offset with `screenOriginX` in your `topLeftX` and `screenOriginY` in your `topLeftY` when using the `screen` option (or when using multiple screens in general) or your move operation will offset from the default origin `(0,0)` which is the origin of screen `0`.\n\n##### resize #####\nResize the window (keeping top-left the same): `resize x y anchor`\n\n        x = amount to resize width either as a percent or a hard value (+10% or -100)\n        y = amount to resize height either as a percent or a hard value (+10% or -100)\n        anchor = (optional) which corner to anchor on top-left|top-right|bottom-left|bottom-right (default is top-left)\n\n    Example:\n\n        bind right:ctrl resize +10% +0\n\n    Will bind the keystroke ctrl-rightarrow to increase the width the current window by `10%`.\n\n    **Note:** ctrl-rightarrow is used by default in Mac OS X by spaces. Be sure to turn these bindings off if you want to use them in Slate.\n\n##### push #####\nPush the window to the edge of the screen: `push direction style`\n\n        direction = top|up|bottom|down|left|right\n        style = (optional) none|center|bar|bar-resize:expression (default is none)\n        screen = (optional) the reference to the screen of the window's desired position.\n                 If this is not specified, it will default to the screen the window is currently on.\n                 See the table at the beginning of the Operation section for more information.\n\n    Example:\n\n        bind up:alt,ctrl push up\n\n    Will bind the keystroke alt-ctrl-uparrow to push the window so that it is aligned with the top of the screen\n\n##### nudge #####\nNudge the window in any direction: `nudge x y`\n\n        x = amount to nudge x either as a percent or a hard value (+10% or -100)\n        y = amount to nudge y either as a percent or a hard value (+10% or -100)\n\n    Example:\n\n        bind left:ctrl,shift nudge -100 +0\n\n    Will bind the keystroke ctrl-shift-leftarrow to nudge the window `100` pixels to the left\n\n##### throw #####\nThrow the window to any screen's origin: `throw screen style`\n\n        screen = the screen you want to throw the window to (0 indexed)\n        style = (optional) resize|resize:x-expression;y-expression (default will not resize)\n\n    Example:\n\n        bind pad1:alt,ctrl throw 1 resize\n\n    Will bind the keystroke alt-ctrl-numpad1 to throw the window to the 2nd screen and resize it to fit that screen\n\n##### corner #####\nMove/Resize the window into a corner: `corner direction style`\n\n        direction = top-left|top-right|bottom-left|bottom-right\n        style = (optional) resize:x-expression;y-expression (default will not resize)\n        screen = (optional) the reference to the screen of the window's desired position.\n                 If this is not specified, it will default to the screen the window is currently on.\n                 See the table at the beginning of the Operation section for more information.\n\n    Example:\n\n        bind 1:ctrl corner top-left resize:screenSizeX/2;screenSizeY/2\n\n    Will bind the keystroke ctrl-1 to move the window to the top-left corner and resize it to 1/4 of the screen\n\n##### shell #####\nExecute a shell command: `shell options 'command'`\n\n        command = (required) the command to run. note that it is a quoted string.\n        options = (optional) a space separated list of:\n                   wait  - block slate until the shell command exits. Useful when using shell commands in a\n                           sequence binding\n                   path: - the inital working directory to use when starting the command. For example\n                           path:~/code would set the inital working directory to ~/code\n\n    Example:\n\n        bind 1:ctrl wait path:~/code '/opt/local/bin/mvim'\n\n    Will bind the keystroke ctrl-1 to run the command `/opt/local/bin/mvim` with the current working directory of `~/code`. Slate will also block until the command is done. Note that you may **not** use the tilda home directory shortcut within the command itself, it is only allowed within the path.\n\n##### hide #####\nHide one or more applications: `hide applications`\n\n        applications = a comma separated list of application names. Individual application names must be\n                       surrounded by quotes. You can also specify `current`, `all`, or `all-but:` for the\n                       Application name (no quotes). `current` will apply to the currently focused\n                       application, `all` will apply to all open applications and `all-but:'APP_NAME'` will\n                       apply to all open applications except `APP_NAME`. Note that when trying to hide `all`\n                       it will not work as intended because OS X will not allow every visible app to be\n                       hidden. Hiding `all` will hide all apps but OS X will auto-show one of the apps that\n                       were hidden.\n\n    Example:\n\n        bind 1:ctrl hide 'iTerm','Google Chrome'\n\n    Will bind the keystroke ctrl-1 to hide iTerm and Google Chrome.\n\n##### show #####\nShow one or more applications: `show applications`\n\n        applications = a comma separated list of application names. Individual application names must be\n                       surrounded by quotes. You can also specify `current`, `all`, or `all-but:` for the\n                       Application name (no quotes). `current` will apply to the currently focused\n                       application, `all` will apply to all open applications and `all-but:'APP_NAME'` will\n                       apply to all open applications except `APP_NAME`.\n\n    Example:\n\n        bind 1:ctrl show 'iTerm','Google Chrome'\n\n    Will bind the keystroke ctrl-1 to show (unhide) iTerm and Google Chrome.\n\n##### toggle #####\nToggle one or more applications: `toggle applications`\n\n        applications = a comma separated list of application names. Individual application names must be\n                       surrounded by quotes. You can also specify `current`, `all`, or `all-but:` for the\n                       Application name (no quotes). `current` will apply to the currently focused\n                       application, `all` will apply to all open applications and `all-but:'APP_NAME'` will\n                       apply to all open applications except `APP_NAME`. Note that when trying to toggle `all`\n                       it will may not work as intended because OS X will not allow every visible app to be\n                       hidden. If at any point during the toggling all apps become hidden, OS X will auto-show\n                       one of the apps that were hidden.\n\n    Example:\n\n        bind 1:ctrl toggle 'iTerm','Google Chrome'\n\n    Will bind the keystroke ctrl-1 to toggle iTerm and Google Chrome. Toggle meaning if the individual\n    application is currently hidden it will be shown and if it is currently shown it will be hidden.\n\n    **Note:** If you specify current in this toggle operation it will not toggle properly because after the current application is hidden, it is no longer the current application anymore.\n\n##### chain #####\nChain multiple operations to one binding: `chain opAndParams1 | opAndParams2 ...`\n\n        opAndParamsX = any operation string (except sequence, hint and grid)\n\n    Example:\n\n        bind 1:ctrl chain push up | push right | push down | push left\n\n    Will bind the keystroke ctrl-1 to push up on the first press, then push right on the second press, then push down on the third press, the push left on the fourth press and rotate back to pushing up on the fifth press (etc).\n\n##### sequence #####\nActivate a sequence of operations in one binding: `sequence opAndParams1 separator opAndParams 2 ...`\n\n        opAndParamsX = any of the above operation strings (except chain and grid. hint must be last if present)\n        separator = | or >. | will cause the next operation to be performed on the window focused at the time of\n                    execution of that operation, > will cause the next operation to be performed on the window\n                    focused at the start of the > chain.\n\n    Example:\n\n        bind 1:ctrl sequence focus right > push left | push right\n\n    Will bind the keystroke ctrl-1 to first focus the window to the right, then push the previously focused window to the left, then push the newly focused window to the right. Obviously Hint will ignore `>` and `|` and just display because it doesn't care which window was focused.\n\n\n##### layout #####\nActivate a layout: `layout name`\n\n        name = the name of the layout to activate (set using the layout directive)\n\n    Example:\n\n        bind 1:ctrl layout myLayout\n\n    Will bind the keystroke ctrl-l to activate the layout called `myLayout`. Note that the layout **must** be created before you bind it.\n\n##### focus #####\nFocus a window in a direction or from an application: `focus direction|app`\n\n        direction = right|left|up|above|down|below|behind\n        app = an app name surrounded by quotes\n\n    Example:\n\n        bind 1:ctrl focus above\n\n    Will bind the keystroke ctrl-1 to focus the window Slate finds to be above the currently focused window (from any application). Minimized and hidden windows are ignored. A couple global configuration options set using the `config` directive exist to tweak this. Also, up and above are the same. Down and below are also the same.\n\n        bind 1:ctrl focus 'iTerm'\n\n    Will bind the keystroke ctrl-1 to focus the main window of the application iTerm. The main window is the last focused window of that application.\n\n##### snapshot #####\nCreate a snapshot of your current window locations: `snapshot name options`\n\n        name = the name of the snapshot to create (used in delete-snapshot and activate-snapshot)\n        options = (optional) a semicolon separated list of any of the following options:\n          save-to-disk -> saves the snapshot to disk so Slate will load it when it starts up next\n          stack -> treats this snapshot as stack so you can use this binding multiple times to push snapshots on the stack\n\n    Example:\n\n         bind 1:ctrl snapshot theName save-to-disk;stack\n\n    Will bind the keystroke ctrl-1 to create a snapshot called `theName`, save that snapshot to disk, and treat it as a stack so you can hit the keystroke multiple times to push snapshots onto the stack.\n\n    **Note:** There is a menu option to take a snapshot of the current screen configuration.\n\n##### delete-snapshot #####\nDelete a snapshot: `delete-snapshot name options`\n\n        name = the name of the snapshot to delete\n        options = (optional) a semicolon separated list of any of the following options:\n          all -> if the snapshot is a stack (if it isn't, this option is useless), this will delete all snapshots in the\n                 stack (if this option is not specified, the default is to only delete the top snapshot of the stack).\n\n    Example:\n\n        bind 1:ctrl delete-snapshot theName all\n\n    Will bind the keystroke ctrl-1 to delete the snapshot called `theName` if it exists. This will delete all instances of theName meaning if you have pushed multiple snapshots on the stack, it will completely clear them all.\n\n##### activate-snapshot #####\nActivate a snapshot: `activate-snapshot name options`\n\n        name = the name of the snapshot to activate\n        options = (optional) a semicolon separated list of any of the following options:\n          delete -> this will delete the snapshot after activating it (if the snapshot is a stack, it will pop the top\n                    snapshot off and keep the rest)\n\n    Example:\n\n        bind 1:ctrl activate-snapshot theName delete\n\n    Will bind the keystroke ctrl-1 to activate the snapshot called `theName` if it exists. This will also delete the snapshot (or pop it off the stack if the snapshot is a stack).\n\n    **Note:** There is a menu option to activate the snapshot that you may have created using the menu option.\n\n##### hint #####\nShow Window Hints (similar to Link Hints in Vimium except for Windows): `hint characters`\n\n        characters = (optional) a simple string of characters to be used for the hints. each hint consists of one\n                     character. if there are more windows than characters then some windows will not get hints.\n                     this string can contain any of the single character Allowed Keys. Letters may be upper case or\n                     lower case, but both will be bound to the lowercase letter for the hint. Using upper or lower\n                     case only changes how they are displayed. The default string of characters is\n                     \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\"\n\n    Example:\n\n        bind 1:ctrl hint QWERTYUIOP\n\n    Will bind the keystroke ctrl-1 to show Window Hints using the letters `Q`, `W`, `E`, `R`, `T`, `Y`, `U`, `I`, `O`, and `P`.  This will show an overlay in the top-left corner of every window on screen containing one of those letters. While the overlays are showing, if one of those letters is pressed, the corresponding window will be focused. If there are more than 10 windows, some windows will not get hints. Pressing ESC will dismiss the hints.\n\n    **Note:** There are *tons* of config options to tweak this.\n\n##### grid #####\nShow a Grid to one-off resize and move windows: `grid options`\n\n        options is a whitespace separated list of:\n          padding:<integer> = the padding between cells\n          screenRef:width,height = width and height are integers specifying the width and height of the grid\n                                   (number of cells, not absolute size). screenRef is either the screenID or\n                                   screen resolution (widthxheight)\n\n    Example:\n\n        bind 1:ctrl grid padding:5 1680x1050:16,9 1050x1680:9,16\n\n    Will bind the keystroke ctrl-1 to show Grids on each screen. The default width and height are 12. This will set the padding between the cells to be 5. Also, this will change the width and height of the grid on the monitor with the resolution 1680x1050 to 16 and 9 respectively. For the monitor with the resolution 1050x1680, it will set the width to 9 and height to 16. If you have multiple monitors, the Grid that is on the same screen as your mouse pointer will be focused. If you want to use a grid on a different monitor you **must** click it first and then click+drag.\n\n    **Note:** There are a bunch of config options to tweak how this looks.\n\n##### relaunch #####\nRelaunch Slate: `relaunch`\n\n    Example:\n\n        bind 1:ctrl relaunch\n\n    Will bind the keystroke ctrl-1 to relaunch Slate. This will also reload the `.slate` file from scratch.\n\n##### undo #####\nUndo an Operation: `undo`\n\n    Example\n\n        bind 1:ctrl undo\n\n    Will bind the keystroke ctrl-1 to undo the last binding that was triggered. By default you can undo up to the last 10 commands. This can be changed using the `undoMaxStackSize` config. Also, you can only undo movement-based operations. Focus-related operations will not undo.\n\n##### switch #####\n\\[Beta\\] A Better Application Switcher: `switch`\n\n    If you bind any binding to cmd-tab or cmd-shift-tab, Slate will completely disable the default Mac OS X Application switcher!\n\n    Example:\n\n        bind tab:cmd switch\n\n    Will disable the default Mac OS X Application switcher and bind the keystroke cmd-tab to a better application switcher.\n\n     **Note:** There are *tons* of config options to tweak this.\n\n### The `source` Directive ###\n\nThe source directive follows the following format (tokens may be separated by any number of spaces):\n\n    source filename optional:if_exists\n\nWhere `filename` is the name of a file containing any of the directives above (including source). If no absolute path is specified, the user's home directory will be prepended to `filename`. If the user specifies the option `if_exists` as the second argument, Slate will not complain if it cannot find the file.\n\nFor Example:\n\n    source ~/.slate.test if_exists\n\nWill append all of the configurations from the file `~/.slate.test` to the current configuration if the file `~/.slate.test` exists.\n\n**Note:** You may use any aliases, layouts, etc that you specify before the source directive in the file you source. Any aliases, layouts, etc specified after cannot be used. Additionally, any aliases, layouts, etc that you specify in the file you source can be used after the source directive.\n\n### Example Config ###\n\nYou can check out my own config [here](https://github.com/jigish/dotfiles/blob/master/slate).\n\n### Useful Stuff ###\n\n- [kvs](https://github.com/kvs) has created a [Sublime Text 2](http://www.sublimetext.com/2) preference for `.slate` files [here](https://github.com/kvs/ST2Slate).\n- [trishume](https://github.com/trishume) has done a really nice writeup on getting started with Slate [here](http://thume.ca/howto/2012/11/19/using-slate/)\n\n# Contact #\n\nPlease send all questions, bug reports, suggestions, or general commentary to [Jigish Patel](mailto:slate.issues@gmail.com) or [create an issue](https://github.com/jigish/slate/issues/new) on github.\n\n# Allowed Keys #\n\n**Note:** If you bind any binding to cmd-tab or cmd-shift-tab, Slate will completely disable the default Mac OS X Application switcher!\n\n    '\n    ,\n    -\n    .\n    /\n    0\n    1\n    2\n    3\n    4\n    5\n    6\n    7\n    8\n    9\n    ;\n    =\n    `\n    a\n    b\n    backslash\n    c\n    caps\n    d\n    delete\n    down\n    e\n    end\n    esc\n    f\n    f1\n    f10\n    f11\n    f12\n    f13\n    f14\n    f15\n    f16\n    f17\n    f18\n    f19\n    f2\n    f20\n    f3\n    f4\n    f5\n    f6\n    f7\n    f8\n    f9\n    g\n    h\n    help\n    home\n    i\n    j\n    k\n    l\n    left\n    m\n    mute\n    n\n    o\n    p\n    pad*\n    pad+\n    pad-\n    pad.\n    pad/\n    pad0\n    pad1\n    pad2\n    pad3\n    pad4\n    pad5\n    pad6\n    pad7\n    pad8\n    pad9\n    pad=\n    padClear\n    padEnter\n    pageDown\n    pageUp\n    q\n    r\n    return\n    right\n    s\n    space\n    t\n    tab\n    u\n    up\n    v\n    w\n    x\n    y\n    z\n    [\n    ]\n\n"
  },
  {
    "path": "Slate/ASCIIToCode.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>&apos;</key>\n\t<integer>39</integer>\n\t<key>,</key>\n\t<integer>43</integer>\n\t<key>-</key>\n\t<integer>27</integer>\n\t<key>.</key>\n\t<integer>47</integer>\n\t<key>/</key>\n\t<integer>44</integer>\n\t<key>0</key>\n\t<integer>29</integer>\n\t<key>1</key>\n\t<integer>18</integer>\n\t<key>2</key>\n\t<integer>19</integer>\n\t<key>3</key>\n\t<integer>20</integer>\n\t<key>4</key>\n\t<integer>21</integer>\n\t<key>5</key>\n\t<integer>23</integer>\n\t<key>6</key>\n\t<integer>22</integer>\n\t<key>7</key>\n\t<integer>26</integer>\n\t<key>8</key>\n\t<integer>28</integer>\n\t<key>9</key>\n\t<integer>25</integer>\n\t<key>;</key>\n\t<integer>41</integer>\n\t<key>=</key>\n\t<integer>24</integer>\n\t<key>`</key>\n\t<integer>50</integer>\n\t<key>a</key>\n\t<integer>0</integer>\n\t<key>b</key>\n\t<integer>11</integer>\n\t<key>backslash</key>\n\t<integer>42</integer>\n\t<key>c</key>\n\t<integer>8</integer>\n\t<key>caps</key>\n\t<integer>57</integer>\n\t<key>d</key>\n\t<integer>2</integer>\n\t<key>delete</key>\n\t<integer>51</integer>\n\t<key>down</key>\n\t<integer>125</integer>\n\t<key>e</key>\n\t<integer>14</integer>\n\t<key>end</key>\n\t<integer>119</integer>\n\t<key>esc</key>\n\t<integer>53</integer>\n\t<key>f</key>\n\t<integer>3</integer>\n\t<key>f1</key>\n\t<integer>122</integer>\n\t<key>f10</key>\n\t<integer>109</integer>\n\t<key>f11</key>\n\t<integer>103</integer>\n\t<key>f12</key>\n\t<integer>111</integer>\n\t<key>f13</key>\n\t<integer>105</integer>\n\t<key>f14</key>\n\t<integer>107</integer>\n\t<key>f15</key>\n\t<integer>113</integer>\n\t<key>f16</key>\n\t<integer>106</integer>\n\t<key>f17</key>\n\t<integer>64</integer>\n\t<key>f18</key>\n\t<integer>79</integer>\n\t<key>f19</key>\n\t<integer>80</integer>\n\t<key>f2</key>\n\t<integer>120</integer>\n\t<key>f20</key>\n\t<integer>90</integer>\n\t<key>f3</key>\n\t<integer>99</integer>\n\t<key>f4</key>\n\t<integer>118</integer>\n\t<key>f5</key>\n\t<integer>96</integer>\n\t<key>f6</key>\n\t<integer>97</integer>\n\t<key>f7</key>\n\t<integer>98</integer>\n\t<key>f8</key>\n\t<integer>100</integer>\n\t<key>f9</key>\n\t<integer>101</integer>\n\t<key>g</key>\n\t<integer>5</integer>\n\t<key>h</key>\n\t<integer>4</integer>\n\t<key>help</key>\n\t<integer>114</integer>\n\t<key>home</key>\n\t<integer>115</integer>\n\t<key>i</key>\n\t<integer>34</integer>\n\t<key>j</key>\n\t<integer>38</integer>\n\t<key>k</key>\n\t<integer>40</integer>\n\t<key>l</key>\n\t<integer>37</integer>\n\t<key>left</key>\n\t<integer>123</integer>\n\t<key>m</key>\n\t<integer>46</integer>\n\t<key>mute</key>\n\t<integer>74</integer>\n\t<key>n</key>\n\t<integer>45</integer>\n\t<key>o</key>\n\t<integer>31</integer>\n\t<key>p</key>\n\t<integer>35</integer>\n\t<key>pad*</key>\n\t<integer>67</integer>\n\t<key>pad+</key>\n\t<integer>69</integer>\n\t<key>pad-</key>\n\t<integer>78</integer>\n\t<key>pad.</key>\n\t<integer>65</integer>\n\t<key>pad/</key>\n\t<integer>75</integer>\n\t<key>pad0</key>\n\t<integer>82</integer>\n\t<key>pad1</key>\n\t<integer>83</integer>\n\t<key>pad2</key>\n\t<integer>84</integer>\n\t<key>pad3</key>\n\t<integer>85</integer>\n\t<key>pad4</key>\n\t<integer>86</integer>\n\t<key>pad5</key>\n\t<integer>87</integer>\n\t<key>pad6</key>\n\t<integer>88</integer>\n\t<key>pad7</key>\n\t<integer>89</integer>\n\t<key>pad8</key>\n\t<integer>91</integer>\n\t<key>pad9</key>\n\t<integer>92</integer>\n\t<key>pad=</key>\n\t<integer>81</integer>\n\t<key>padClear</key>\n\t<integer>71</integer>\n\t<key>padEnter</key>\n\t<integer>76</integer>\n\t<key>pageDown</key>\n\t<integer>121</integer>\n\t<key>pageUp</key>\n\t<integer>116</integer>\n\t<key>q</key>\n\t<integer>12</integer>\n\t<key>r</key>\n\t<integer>15</integer>\n\t<key>return</key>\n\t<integer>36</integer>\n\t<key>right</key>\n\t<integer>124</integer>\n\t<key>s</key>\n\t<integer>1</integer>\n\t<key>space</key>\n\t<integer>49</integer>\n\t<key>t</key>\n\t<integer>17</integer>\n\t<key>tab</key>\n\t<integer>48</integer>\n\t<key>u</key>\n\t<integer>32</integer>\n\t<key>up</key>\n\t<integer>126</integer>\n\t<key>v</key>\n\t<integer>9</integer>\n\t<key>w</key>\n\t<integer>13</integer>\n\t<key>x</key>\n\t<integer>7</integer>\n\t<key>y</key>\n\t<integer>16</integer>\n\t<key>z</key>\n\t<integer>6</integer>\n\t<key>[</key>\n\t<integer>33</integer>\n\t<key>]</key>\n\t<integer>30</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Slate/ASCIIToCode_Azerty.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>help</key>\n\t<integer>114</integer>\n\t<key>mute</key>\n\t<integer>74</integer>\n\t<key>pageUp</key>\n\t<integer>116</integer>\n\t<key>f13</key>\n\t<integer>105</integer>\n\t<key>down</key>\n\t<integer>125</integer>\n\t<key>f3</key>\n\t<integer>99</integer>\n\t<key>padClear</key>\n\t<integer>71</integer>\n\t<key>&apos;</key>\n\t<integer>39</integer>\n\t<key>]</key>\n\t<integer>30</integer>\n\t<key>,</key>\n\t<integer>46</integer>\n\t<key>.</key>\n\t<integer>47</integer>\n\t<key>0</key>\n\t<integer>29</integer>\n\t<key>2</key>\n\t<integer>19</integer>\n\t<key>4</key>\n\t<integer>21</integer>\n\t<key>6</key>\n\t<integer>22</integer>\n\t<key>8</key>\n\t<integer>28</integer>\n\t<key>return</key>\n\t<integer>36</integer>\n\t<key>caps</key>\n\t<integer>57</integer>\n\t<key>pageDown</key>\n\t<integer>121</integer>\n\t<key>f19</key>\n\t<integer>80</integer>\n\t<key>`</key>\n\t<integer>50</integer>\n\t<key>b</key>\n\t<integer>11</integer>\n\t<key>d</key>\n\t<integer>2</integer>\n\t<key>f</key>\n\t<integer>3</integer>\n\t<key>h</key>\n\t<integer>4</integer>\n\t<key>j</key>\n\t<integer>38</integer>\n\t<key>l</key>\n\t<integer>37</integer>\n\t<key>n</key>\n\t<integer>45</integer>\n\t<key>p</key>\n\t<integer>35</integer>\n\t<key>f18</key>\n\t<integer>79</integer>\n\t<key>r</key>\n\t<integer>15</integer>\n\t<key>t</key>\n\t<integer>17</integer>\n\t<key>v</key>\n\t<integer>9</integer>\n\t<key>f12</key>\n\t<integer>111</integer>\n\t<key>x</key>\n\t<integer>7</integer>\n\t<key>f10</key>\n\t<integer>109</integer>\n\t<key>z</key>\n\t<integer>13</integer>\n\t<key>f16</key>\n\t<integer>106</integer>\n\t<key>f17</key>\n\t<integer>64</integer>\n\t<key>f14</key>\n\t<integer>107</integer>\n\t<key>delete</key>\n\t<integer>51</integer>\n\t<key>f1</key>\n\t<integer>122</integer>\n\t<key>f2</key>\n\t<integer>120</integer>\n\t<key>right</key>\n\t<integer>124</integer>\n\t<key>f4</key>\n\t<integer>118</integer>\n\t<key>f5</key>\n\t<integer>96</integer>\n\t<key>f6</key>\n\t<integer>97</integer>\n\t<key>f7</key>\n\t<integer>98</integer>\n\t<key>f8</key>\n\t<integer>100</integer>\n\t<key>f9</key>\n\t<integer>101</integer>\n\t<key>backslash</key>\n\t<integer>42</integer>\n\t<key>up</key>\n\t<integer>126</integer>\n\t<key>tab</key>\n\t<integer>48</integer>\n\t<key>home</key>\n\t<integer>115</integer>\n\t<key>5</key>\n\t<integer>23</integer>\n\t<key>end</key>\n\t<integer>119</integer>\n\t<key>space</key>\n\t<integer>49</integer>\n\t<key>-</key>\n\t<integer>27</integer>\n\t<key>/</key>\n\t<integer>44</integer>\n\t<key>1</key>\n\t<integer>18</integer>\n\t<key>3</key>\n\t<integer>20</integer>\n\t<key>f20</key>\n\t<integer>90</integer>\n\t<key>esc</key>\n\t<integer>53</integer>\n\t<key>7</key>\n\t<integer>26</integer>\n\t<key>9</key>\n\t<integer>25</integer>\n\t<key>;</key>\n\t<integer>41</integer>\n\t<key>=</key>\n\t<integer>24</integer>\n\t<key>padEnter</key>\n\t<integer>76</integer>\n\t<key>pad+</key>\n\t<integer>69</integer>\n\t<key>pad*</key>\n\t<integer>67</integer>\n\t<key>pad-</key>\n\t<integer>78</integer>\n\t<key>pad/</key>\n\t<integer>75</integer>\n\t<key>pad.</key>\n\t<integer>65</integer>\n\t<key>pad1</key>\n\t<integer>83</integer>\n\t<key>pad0</key>\n\t<integer>82</integer>\n\t<key>pad3</key>\n\t<integer>85</integer>\n\t<key>pad2</key>\n\t<integer>84</integer>\n\t<key>pad5</key>\n\t<integer>87</integer>\n\t<key>pad4</key>\n\t<integer>86</integer>\n\t<key>pad7</key>\n\t<integer>89</integer>\n\t<key>pad6</key>\n\t<integer>88</integer>\n\t<key>pad9</key>\n\t<integer>92</integer>\n\t<key>pad8</key>\n\t<integer>91</integer>\n\t<key>[</key>\n\t<integer>33</integer>\n\t<key>pad=</key>\n\t<integer>81</integer>\n\t<key>a</key>\n\t<integer>12</integer>\n\t<key>c</key>\n\t<integer>8</integer>\n\t<key>f11</key>\n\t<integer>103</integer>\n\t<key>e</key>\n\t<integer>14</integer>\n\t<key>g</key>\n\t<integer>5</integer>\n\t<key>i</key>\n\t<integer>34</integer>\n\t<key>k</key>\n\t<integer>40</integer>\n\t<key>m</key>\n\t<integer>41</integer>\n\t<key>o</key>\n\t<integer>31</integer>\n\t<key>q</key>\n\t<integer>0</integer>\n\t<key>s</key>\n\t<integer>1</integer>\n\t<key>u</key>\n\t<integer>32</integer>\n\t<key>w</key>\n\t<integer>6</integer>\n\t<key>y</key>\n\t<integer>16</integer>\n\t<key>f15</key>\n\t<integer>113</integer>\n\t<key>left</key>\n\t<integer>123</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Slate/ASCIIToCode_Colemak.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>help</key>\n\t<integer>114</integer>\n\t<key>mute</key>\n\t<integer>74</integer>\n\t<key>pageUp</key>\n\t<integer>116</integer>\n\t<key>f13</key>\n\t<integer>105</integer>\n\t<key>down</key>\n\t<integer>125</integer>\n\t<key>f3</key>\n\t<integer>99</integer>\n\t<key>padClear</key>\n\t<integer>71</integer>\n\t<key>&apos;</key>\n\t<integer>39</integer>\n\t<key>]</key>\n\t<integer>30</integer>\n\t<key>,</key>\n\t<integer>43</integer>\n\t<key>.</key>\n\t<integer>47</integer>\n\t<key>0</key>\n\t<integer>29</integer>\n\t<key>2</key>\n\t<integer>19</integer>\n\t<key>4</key>\n\t<integer>21</integer>\n\t<key>6</key>\n\t<integer>22</integer>\n\t<key>8</key>\n\t<integer>28</integer>\n\t<key>return</key>\n\t<integer>36</integer>\n\t<key>caps</key>\n\t<integer>57</integer>\n\t<key>pageDown</key>\n\t<integer>121</integer>\n\t<key>f19</key>\n\t<integer>80</integer>\n\t<key>`</key>\n\t<integer>50</integer>\n\t<key>b</key>\n\t<integer>11</integer>\n\t<key>d</key>\n\t<integer>5</integer>\n\t<key>f</key>\n\t<integer>14</integer>\n\t<key>h</key>\n\t<integer>4</integer>\n\t<key>j</key>\n\t<integer>16</integer>\n\t<key>l</key>\n\t<integer>32</integer>\n\t<key>n</key>\n\t<integer>38</integer>\n\t<key>p</key>\n\t<integer>15</integer>\n\t<key>f18</key>\n\t<integer>79</integer>\n\t<key>r</key>\n\t<integer>1</integer>\n\t<key>t</key>\n\t<integer>3</integer>\n\t<key>v</key>\n\t<integer>9</integer>\n\t<key>f12</key>\n\t<integer>111</integer>\n\t<key>x</key>\n\t<integer>7</integer>\n\t<key>f10</key>\n\t<integer>109</integer>\n\t<key>z</key>\n\t<integer>6</integer>\n\t<key>f16</key>\n\t<integer>106</integer>\n\t<key>f17</key>\n\t<integer>64</integer>\n\t<key>f14</key>\n\t<integer>107</integer>\n\t<key>delete</key>\n\t<integer>51</integer>\n\t<key>f1</key>\n\t<integer>122</integer>\n\t<key>f2</key>\n\t<integer>120</integer>\n\t<key>right</key>\n\t<integer>124</integer>\n\t<key>f4</key>\n\t<integer>118</integer>\n\t<key>f5</key>\n\t<integer>96</integer>\n\t<key>f6</key>\n\t<integer>97</integer>\n\t<key>f7</key>\n\t<integer>98</integer>\n\t<key>f8</key>\n\t<integer>100</integer>\n\t<key>f9</key>\n\t<integer>101</integer>\n\t<key>backslash</key>\n\t<integer>42</integer>\n\t<key>up</key>\n\t<integer>126</integer>\n\t<key>tab</key>\n\t<integer>48</integer>\n\t<key>home</key>\n\t<integer>115</integer>\n\t<key>5</key>\n\t<integer>23</integer>\n\t<key>end</key>\n\t<integer>119</integer>\n\t<key>space</key>\n\t<integer>49</integer>\n\t<key>-</key>\n\t<integer>27</integer>\n\t<key>/</key>\n\t<integer>44</integer>\n\t<key>1</key>\n\t<integer>18</integer>\n\t<key>3</key>\n\t<integer>20</integer>\n\t<key>f20</key>\n\t<integer>90</integer>\n\t<key>esc</key>\n\t<integer>53</integer>\n\t<key>7</key>\n\t<integer>26</integer>\n\t<key>9</key>\n\t<integer>25</integer>\n\t<key>;</key>\n\t<integer>35</integer>\n\t<key>=</key>\n\t<integer>24</integer>\n\t<key>padEnter</key>\n\t<integer>76</integer>\n\t<key>pad+</key>\n\t<integer>69</integer>\n\t<key>pad*</key>\n\t<integer>67</integer>\n\t<key>pad-</key>\n\t<integer>78</integer>\n\t<key>pad/</key>\n\t<integer>75</integer>\n\t<key>pad.</key>\n\t<integer>65</integer>\n\t<key>pad1</key>\n\t<integer>83</integer>\n\t<key>pad0</key>\n\t<integer>82</integer>\n\t<key>pad3</key>\n\t<integer>85</integer>\n\t<key>pad2</key>\n\t<integer>84</integer>\n\t<key>pad5</key>\n\t<integer>87</integer>\n\t<key>pad4</key>\n\t<integer>86</integer>\n\t<key>pad7</key>\n\t<integer>89</integer>\n\t<key>pad6</key>\n\t<integer>88</integer>\n\t<key>pad9</key>\n\t<integer>92</integer>\n\t<key>pad8</key>\n\t<integer>91</integer>\n\t<key>[</key>\n\t<integer>33</integer>\n\t<key>pad=</key>\n\t<integer>81</integer>\n\t<key>a</key>\n\t<integer>0</integer>\n\t<key>c</key>\n\t<integer>8</integer>\n\t<key>f11</key>\n\t<integer>103</integer>\n\t<key>e</key>\n\t<integer>40</integer>\n\t<key>g</key>\n\t<integer>17</integer>\n\t<key>i</key>\n\t<integer>37</integer>\n\t<key>k</key>\n\t<integer>45</integer>\n\t<key>m</key>\n\t<integer>46</integer>\n\t<key>o</key>\n\t<integer>41</integer>\n\t<key>q</key>\n\t<integer>12</integer>\n\t<key>s</key>\n\t<integer>2</integer>\n\t<key>u</key>\n\t<integer>34</integer>\n\t<key>w</key>\n\t<integer>13</integer>\n\t<key>y</key>\n\t<integer>31</integer>\n\t<key>f15</key>\n\t<integer>113</integer>\n\t<key>left</key>\n\t<integer>123</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Slate/ASCIIToCode_Dvorak.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>-</key>\n\t<integer>39</integer>\n\t<key>w</key>\n\t<integer>43</integer>\n\t<key>[</key>\n\t<integer>27</integer>\n\t<key>v</key>\n\t<integer>47</integer>\n\t<key>z</key>\n\t<integer>44</integer>\n\t<key>0</key>\n\t<integer>29</integer>\n\t<key>1</key>\n\t<integer>18</integer>\n\t<key>2</key>\n\t<integer>19</integer>\n\t<key>3</key>\n\t<integer>20</integer>\n\t<key>4</key>\n\t<integer>21</integer>\n\t<key>5</key>\n\t<integer>23</integer>\n\t<key>6</key>\n\t<integer>22</integer>\n\t<key>7</key>\n\t<integer>26</integer>\n\t<key>8</key>\n\t<integer>28</integer>\n\t<key>9</key>\n\t<integer>25</integer>\n\t<key>s</key>\n\t<integer>41</integer>\n\t<key>]</key>\n\t<integer>24</integer>\n\t<key>`</key>\n\t<integer>50</integer>\n\t<key>a</key>\n\t<integer>0</integer>\n\t<key>x</key>\n\t<integer>11</integer>\n\t<key>backslash</key>\n\t<integer>42</integer>\n\t<key>j</key>\n\t<integer>8</integer>\n\t<key>caps</key>\n\t<integer>57</integer>\n\t<key>e</key>\n\t<integer>2</integer>\n\t<key>delete</key>\n\t<integer>51</integer>\n\t<key>down</key>\n\t<integer>125</integer>\n\t<key>.</key>\n\t<integer>14</integer>\n\t<key>end</key>\n\t<integer>119</integer>\n\t<key>esc</key>\n\t<integer>53</integer>\n\t<key>u</key>\n\t<integer>3</integer>\n\t<key>f1</key>\n\t<integer>122</integer>\n\t<key>f10</key>\n\t<integer>109</integer>\n\t<key>f11</key>\n\t<integer>103</integer>\n\t<key>f12</key>\n\t<integer>111</integer>\n\t<key>f13</key>\n\t<integer>105</integer>\n\t<key>f14</key>\n\t<integer>107</integer>\n\t<key>f15</key>\n\t<integer>113</integer>\n\t<key>f16</key>\n\t<integer>106</integer>\n\t<key>f17</key>\n\t<integer>64</integer>\n\t<key>f18</key>\n\t<integer>79</integer>\n\t<key>f19</key>\n\t<integer>80</integer>\n\t<key>f2</key>\n\t<integer>120</integer>\n\t<key>f20</key>\n\t<integer>90</integer>\n\t<key>f3</key>\n\t<integer>99</integer>\n\t<key>f4</key>\n\t<integer>118</integer>\n\t<key>f5</key>\n\t<integer>96</integer>\n\t<key>f6</key>\n\t<integer>97</integer>\n\t<key>f7</key>\n\t<integer>98</integer>\n\t<key>f8</key>\n\t<integer>100</integer>\n\t<key>f9</key>\n\t<integer>101</integer>\n\t<key>i</key>\n\t<integer>5</integer>\n\t<key>d</key>\n\t<integer>4</integer>\n\t<key>help</key>\n\t<integer>114</integer>\n\t<key>home</key>\n\t<integer>115</integer>\n\t<key>c</key>\n\t<integer>34</integer>\n\t<key>h</key>\n\t<integer>38</integer>\n\t<key>t</key>\n\t<integer>40</integer>\n\t<key>n</key>\n\t<integer>37</integer>\n\t<key>left</key>\n\t<integer>123</integer>\n\t<key>m</key>\n\t<integer>46</integer>\n\t<key>mute</key>\n\t<integer>74</integer>\n\t<key>b</key>\n\t<integer>45</integer>\n\t<key>r</key>\n\t<integer>31</integer>\n\t<key>l</key>\n\t<integer>35</integer>\n\t<key>pad*</key>\n\t<integer>67</integer>\n\t<key>pad+</key>\n\t<integer>69</integer>\n\t<key>pad-</key>\n\t<integer>78</integer>\n\t<key>pad.</key>\n\t<integer>65</integer>\n\t<key>pad/</key>\n\t<integer>75</integer>\n\t<key>pad0</key>\n\t<integer>82</integer>\n\t<key>pad1</key>\n\t<integer>83</integer>\n\t<key>pad2</key>\n\t<integer>84</integer>\n\t<key>pad3</key>\n\t<integer>85</integer>\n\t<key>pad4</key>\n\t<integer>86</integer>\n\t<key>pad5</key>\n\t<integer>87</integer>\n\t<key>pad6</key>\n\t<integer>88</integer>\n\t<key>pad7</key>\n\t<integer>89</integer>\n\t<key>pad8</key>\n\t<integer>91</integer>\n\t<key>pad9</key>\n\t<integer>92</integer>\n\t<key>pad=</key>\n\t<integer>81</integer>\n\t<key>padClear</key>\n\t<integer>71</integer>\n\t<key>padEnter</key>\n\t<integer>76</integer>\n\t<key>pageDown</key>\n\t<integer>121</integer>\n\t<key>pageUp</key>\n\t<integer>116</integer>\n\t<key>&apos;</key>\n\t<integer>12</integer>\n\t<key>p</key>\n\t<integer>15</integer>\n\t<key>return</key>\n\t<integer>36</integer>\n\t<key>right</key>\n\t<integer>124</integer>\n\t<key>o</key>\n\t<integer>1</integer>\n\t<key>space</key>\n\t<integer>49</integer>\n\t<key>y</key>\n\t<integer>17</integer>\n\t<key>tab</key>\n\t<integer>48</integer>\n\t<key>g</key>\n\t<integer>32</integer>\n\t<key>up</key>\n\t<integer>126</integer>\n\t<key>k</key>\n\t<integer>9</integer>\n\t<key>,</key>\n\t<integer>13</integer>\n\t<key>q</key>\n\t<integer>7</integer>\n\t<key>f</key>\n\t<integer>16</integer>\n\t<key>;</key>\n\t<integer>6</integer>\n\t<key>/</key>\n\t<integer>33</integer>\n\t<key>=</key>\n\t<integer>30</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "Slate/AccessibilityWrapper.h",
    "content": "//\n//  AccessibilityWrapper.h\n//  Slate\n//\n//  Created by Jigish Patel on 6/10/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n\n\n@interface AccessibilityWrapper : NSObject {\n@private\n  AXUIElementRef app;\n  AXUIElementRef window;\n  BOOL inited;\n}\n\n@property (assign) AXUIElementRef app;\n@property (assign) AXUIElementRef window;\n@property (assign) BOOL inited;\n\n- (id)initWithApp:(AXUIElementRef)appRef window:(AXUIElementRef)windowRef;\n\n+ (NSPoint)getTopLeftForWindow:(AXUIElementRef)window;\n- (NSPoint)getCurrentTopLeft;\n+ (NSSize)getSizeForWindow:(AXUIElementRef)window;\n- (NSSize)getCurrentSize;\n- (BOOL)moveWindow:(NSPoint)thePoint;\n- (BOOL)resizeWindow:(NSSize)theSize;\n- (BOOL)focus;\n- (BOOL)isMinimizedOrHidden;\n- (NSString *)getTitle;\n- (pid_t)processIdentifier;\n+ (BOOL)focusWindow:(AXUIElementRef)window;\n+ (BOOL)focusMainWindow:(NSRunningApplication *)app;\n+ (BOOL)focusApp:(NSRunningApplication *)app;\n+ (pid_t)processIdentifierOfUIElement:(AXUIElementRef)element;\n+ (CFArrayRef)windowsInApp:(AXUIElementRef)app;\n+ (CFArrayRef)windowsInRunningApp:(NSRunningApplication *)app;\n+ (AXUIElementRef)focusedWindowInRunningApp:(NSRunningApplication *)app;\n+ (BOOL)isMainWindow:(AXUIElementRef)window;\n+ (NSString *)getTitle:(AXUIElementRef)window;\n- (BOOL)isMovable;\n- (BOOL)isResizable;\n+ (BOOL)isWindowMinimizedOrHidden:(AXUIElementRef)window inApp:(AXUIElementRef)app;\n+ (AXUIElementRef)windowUnderPoint:(NSPoint)point;\n+ (void)createSystemWideElement;\n+ (AXUIElementRef)applicationForElement:(AXUIElementRef)element;\n+ (BOOL)isWindow:(AXUIElementRef)element;\n+ (NSString *)getRole:(AXUIElementRef)element;\n\n@end\n"
  },
  {
    "path": "Slate/AccessibilityWrapper.m",
    "content": "//\n//  AccessibilityWrapper.m\n//  Slate\n//\n//  Created by Jigish Patel on 6/10/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"AccessibilityWrapper.h\"\n#import \"Constants.h\"\n#import \"SlateLogger.h\"\n\nstatic AXUIElementRef systemWideElement = NULL;\nstatic NSDictionary *unselectableApps = nil;\n\n@implementation AccessibilityWrapper\n\n@synthesize app;\n@synthesize window;\n@synthesize inited;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [AccessibilityWrapper createSystemWideElement];\n\n    // Get App that has focus\n    CFTypeRef _app;\n    AXUIElementCopyAttributeValue(systemWideElement, (CFStringRef)kAXFocusedApplicationAttribute, (CFTypeRef *)&_app);\n    [self setApp:(AXUIElementRef)_app];\n\n    // Get Window that has focus\n    CFTypeRef _window;\n    if (AXUIElementCopyAttributeValue(app, (CFStringRef)NSAccessibilityFocusedWindowAttribute, (CFTypeRef *)&_window) == kAXErrorSuccess) {\n      [self setWindow:(AXUIElementRef)_window];\n      [self setInited:YES];\n    } else {\n      [self setInited:NO];\n      SlateLogger(@\"ERROR: Could not fetch focused window\");\n    }\n  }\n\n  return self;\n}\n\n- (id)initWithApp:(AXUIElementRef)appRef window:(AXUIElementRef)windowRef {\n  self = [super init];\n  if (self) {\n    [AccessibilityWrapper createSystemWideElement];\n    [self setApp:appRef];\n    [self setWindow:windowRef];\n    [self setInited:YES];\n  }\n\n  return self;\n}\n\n+ (NSPoint)getTopLeftForWindow:(AXUIElementRef)window {\n  CFTypeRef _cPosition;\n  NSPoint cTopLeft;\n\n  if (AXUIElementCopyAttributeValue(window, (CFStringRef)NSAccessibilityPositionAttribute, (CFTypeRef *)&_cPosition) == kAXErrorSuccess) {\n    if (!AXValueGetValue(_cPosition, kAXValueCGPointType, (void *)&cTopLeft)) {\n      SlateLogger(@\"ERROR: Could not decode position\");\n      cTopLeft = NSMakePoint(0, 0);\n    }\n  } else {\n    SlateLogger(@\"ERROR: Could not fetch position\");\n    cTopLeft = NSMakePoint(0, 0);\n  }\n  if (_cPosition != NULL) CFRelease(_cPosition);\n\n  return cTopLeft;\n}\n\n- (NSPoint)getCurrentTopLeft {\n  return [AccessibilityWrapper getTopLeftForWindow:window];\n}\n\n+ (NSSize)getSizeForWindow:(AXUIElementRef)window {\n  CFTypeRef _cSize;\n  NSSize cSize;\n\n  if (AXUIElementCopyAttributeValue(window, (CFStringRef)NSAccessibilitySizeAttribute, (CFTypeRef *)&_cSize) == kAXErrorSuccess) {\n    if (!AXValueGetValue(_cSize, kAXValueCGSizeType, (void *)&cSize)) {\n      SlateLogger(@\"ERROR: Could not decode size\");\n      cSize = NSMakeSize(0, 0);\n    }\n  } else {\n    SlateLogger(@\"ERROR: Could not fetch size\");\n    cSize = NSMakeSize(0, 0);\n  }\n  if (_cSize != NULL) CFRelease(_cSize);\n\n  return cSize;\n}\n\n- (NSSize)getCurrentSize {\n  return [AccessibilityWrapper getSizeForWindow:window];\n}\n\n- (BOOL)moveWindow:(NSPoint)thePoint {\n  CFTypeRef _position;\n  _position = (CFTypeRef)(AXValueCreate(kAXValueCGPointType, (const void *)&thePoint));\n  if (AXUIElementSetAttributeValue(window, (CFStringRef)NSAccessibilityPositionAttribute, (CFTypeRef *)_position) != kAXErrorSuccess) {\n    SlateLogger(@\"ERROR: Could not change position\");\n    if (_position != NULL) CFRelease(_position);\n    return NO;\n  }\n  if (_position != NULL) CFRelease(_position);\n  return YES;\n}\n\n- (BOOL)resizeWindow:(NSSize)theSize {\n  CFTypeRef _size;\n  _size = (CFTypeRef)(AXValueCreate(kAXValueCGSizeType, (const void *)&theSize));\n  if (AXUIElementSetAttributeValue(window, (CFStringRef)NSAccessibilitySizeAttribute, (CFTypeRef *)_size) != kAXErrorSuccess) {\n    SlateLogger(@\"ERROR: Could not change size\");\n    if (_size != NULL) CFRelease(_size);\n    return NO;\n  }\n  if (_size != NULL) CFRelease(_size);\n  return YES;\n}\n\n- (BOOL)focus {\n  return [AccessibilityWrapper focusWindow:[self window]];\n}\n\n- (BOOL)isMinimizedOrHidden {\n  return [AccessibilityWrapper isWindowMinimizedOrHidden:[self window] inApp:[self app]];\n}\n\n- (BOOL)isMovable {\n  return [self moveWindow:[self getCurrentTopLeft]];\n}\n\n- (BOOL)isResizable {\n  return [self resizeWindow:[self getCurrentSize]];\n}\n\n- (NSString *)getTitle {\n  return [AccessibilityWrapper getTitle:[self window]];\n}\n\n- (pid_t)processIdentifier {\n  return [AccessibilityWrapper processIdentifierOfUIElement:[self app]];\n}\n\n+ (BOOL)focusApp:(NSRunningApplication *)app {\n  SlateLogger(@\"Focusing app: '%@'\", [app localizedName]);\n  AXUIElementRef appRef = AXUIElementCreateApplication([app processIdentifier]);\n  if (AXUIElementSetAttributeValue(appRef, (CFStringRef)NSAccessibilityFrontmostAttribute, kCFBooleanTrue) != kAXErrorSuccess) {\n    SlateLogger(@\"ERROR: Could not change focus to app\");\n    if (appRef != NULL) CFRelease(appRef);\n    return NO;\n  }\n  if (appRef != NULL) CFRelease(appRef);\n  return YES;\n}\n\n+ (BOOL)focusMainWindow:(NSRunningApplication *)app {\n  BOOL couldFocus = YES;\n  CFTypeRef _window;\n  pid_t focusPID = [app processIdentifier];\n  AXUIElementCopyAttributeValue(AXUIElementCreateApplication(focusPID), (CFStringRef)NSAccessibilityFocusedWindowAttribute, (CFTypeRef *)&_window);\n  if (_window == NULL) return [AccessibilityWrapper focusApp:app];\n  if (AXUIElementSetAttributeValue((AXUIElementRef)_window, (CFStringRef)NSAccessibilityMainAttribute, kCFBooleanTrue) != kAXErrorSuccess) {\n    SlateLogger(@\"ERROR: Could not change focus to window\");\n    couldFocus = NO;\n  }\n  ProcessSerialNumber psn;\n  GetProcessForPID(focusPID, &psn);\n  SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly);\n  if (_window != NULL) CFRelease(_window);\n  return couldFocus;\n}\n\n+ (BOOL)focusWindow:(AXUIElementRef)window {\n  BOOL couldFocus = YES;\n  if (AXUIElementSetAttributeValue(window, (CFStringRef)NSAccessibilityMainAttribute, kCFBooleanTrue) != kAXErrorSuccess) {\n    SlateLogger(@\"ERROR: Could not change focus to window\");\n    couldFocus = NO;\n  }\n  pid_t focusPID = [AccessibilityWrapper processIdentifierOfUIElement:window];\n  ProcessSerialNumber psn;\n  GetProcessForPID(focusPID, &psn);\n  SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly);\n  return couldFocus;\n}\n\n+ (pid_t)processIdentifierOfUIElement:(AXUIElementRef)element {\n  [AccessibilityWrapper createSystemWideElement];\n  pid_t pid = 0;\n  if (AXUIElementGetPid (element, &pid) == kAXErrorSuccess) {\n    return pid;\n  } else {\n    return 0;\n  }\n}\n\n+ (CFArrayRef)windowsInApp:(AXUIElementRef)app {\n  [AccessibilityWrapper createSystemWideElement];\n  CFArrayRef _windows;\n  if (AXUIElementCopyAttributeValues(app, kAXWindowsAttribute, 0, 100, &_windows) == kAXErrorSuccess) {\n    return _windows;\n  }\n  return nil;\n}\n\n+ (CFArrayRef)windowsInRunningApp:(NSRunningApplication *)app {\n  return [AccessibilityWrapper windowsInApp:AXUIElementCreateApplication([app processIdentifier])];\n}\n\n+ (AXUIElementRef)focusedWindowInRunningApp:(NSRunningApplication *)app {\n  CFTypeRef _window;\n  AXUIElementCopyAttributeValue(AXUIElementCreateApplication([app processIdentifier]), (CFStringRef)NSAccessibilityFocusedWindowAttribute, (CFTypeRef *)&_window);\n  return _window;\n}\n\n+ (BOOL)isMainWindow:(AXUIElementRef)window {\n  [AccessibilityWrapper createSystemWideElement];\n  CFTypeRef _isMain;\n  if (AXUIElementCopyAttributeValue(window, (CFStringRef)NSAccessibilityMainAttribute, (CFTypeRef *)&_isMain) == kAXErrorSuccess) {\n    NSNumber *isMain = (__bridge NSNumber *) _isMain;\n    return [isMain boolValue];\n  }\n  return NO;\n}\n\n+ (NSString *)getTitle:(AXUIElementRef)window {\n  [AccessibilityWrapper createSystemWideElement];\n  CFTypeRef _title;\n  if (AXUIElementCopyAttributeValue(window, (CFStringRef)NSAccessibilityTitleAttribute, (CFTypeRef *)&_title) == kAXErrorSuccess) {\n    NSString *title = (__bridge NSString *) _title;\n    if (_title != NULL) CFRelease(_title);\n    return title;\n  }\n  if (_title != NULL) CFRelease(_title);\n  return @\"\";\n}\n\n+ (BOOL)isWindowMinimizedOrHidden:(AXUIElementRef)window inApp:(AXUIElementRef)app {\n  [AccessibilityWrapper createSystemWideElement];\n  CFTypeRef _isMinimized;\n  CFTypeRef _isHidden;\n  BOOL isMinimized = NO;\n  BOOL isHidden = NO;\n  if (AXUIElementCopyAttributeValue(app, (CFStringRef)NSAccessibilityHiddenAttribute, (CFTypeRef *)&_isHidden) == kAXErrorSuccess) {\n    NSNumber *isHiddenNum = (__bridge NSNumber *) _isHidden;\n    isHidden = [isHiddenNum boolValue];\n  }\n  if (AXUIElementCopyAttributeValue(window, (CFStringRef)NSAccessibilityMinimizedAttribute, (CFTypeRef *)&_isMinimized) == kAXErrorSuccess) {\n    NSNumber *isMinimizedNum = (__bridge NSNumber *) _isMinimized;\n    isMinimized = [isMinimizedNum boolValue];\n  }\n  return isMinimized || isHidden;\n}\n\n+ (AXUIElementRef)windowUnderPoint:(NSPoint)point {\n  [AccessibilityWrapper createSystemWideElement];\n  AXUIElementRef _element;\n  if ((AXUIElementCopyElementAtPosition(systemWideElement, point.x, point.y, &_element) == kAXErrorSuccess) && _element) {\n    CFTypeRef _role;\n    if (AXUIElementCopyAttributeValue(_element, (CFStringRef)NSAccessibilityRoleAttribute, (CFTypeRef *)&_role) == kAXErrorSuccess) {\n      if ([(__bridge NSString *)_role isEqualToString:NSAccessibilityWindowRole]) {\n        if (_role != NULL) CFRelease(_role);\n        return _element;\n      }\n      if (_role != NULL) CFRelease(_role);\n    }\n    CFTypeRef _window;\n    if (AXUIElementCopyAttributeValue(_element, (CFStringRef)NSAccessibilityWindowAttribute, (CFTypeRef *)&_window) == kAXErrorSuccess) {\n      if (_element != NULL) CFRelease(_element);\n      return (AXUIElementRef)_window;\n    }\n  }\n  SlateLogger(@\"Returning null\");\n  return NULL;\n}\n\n+ (AXUIElementRef)applicationForElement:(AXUIElementRef)element {\n  return AXUIElementCreateApplication([AccessibilityWrapper processIdentifierOfUIElement:element]);\n}\n\n+ (void)createSystemWideElement {\n  if (systemWideElement == NULL) {\n    systemWideElement = AXUIElementCreateSystemWide();\n    unselectableApps = [NSDictionary dictionaryWithObjectsAndKeys:@\"SystemUIServer\", @\"SystemUIServer\",\n                                                                  @\"Slate\", @\"Slate\",\n                                                                  @\"Dropbox\", @\"Dropbox\",\n                                                                  @\"loginwindow\", @\"loginwindow\", nil];\n  }\n}\n\n+ (BOOL)isWindow:(AXUIElementRef)element {\n  CFTypeRef _role;\n  AXUIElementCopyAttributeValue(element, (CFStringRef)NSAccessibilityRoleAttribute, &_role);\n  BOOL isWindow = [NSAccessibilityWindowRole isEqualToString:(__bridge NSString *)_role];\n  if (_role != NULL) CFRelease(_role);\n  return isWindow;\n}\n\n+ (NSString *)getRole:(AXUIElementRef)element {\n  if (element == NULL || element == nil) return nil;\n  CFTypeRef _role;\n  if (AXUIElementCopyAttributeValue(element, (CFStringRef)NSAccessibilityRoleAttribute, &_role) == kAXErrorSuccess) {\n    NSString *role =  (__bridge NSString *)_role;\n    if (_role != NULL) CFRelease(_role);\n    return role;\n  }\n  return nil;\n}\n\n@end\n"
  },
  {
    "path": "Slate/ActivateSnapshotOperation.h",
    "content": "//\n//  ActivateSnapshotOperation.h\n//  Slate\n//\n//  Created by Jigish Patel on 3/1/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"Operation.h\"\n\n@interface ActivateSnapshotOperation : Operation {\n@private\n  NSString *name;\n  BOOL del;\n}\n\n@property  NSString *name;\n@property (assign) BOOL del;\n\n- (id)initWithName:(NSString *)theName options:(NSString *)options;\n\n+ (BOOL)activateSnapshot:(NSString *)name remove:(BOOL)del;\n\n+ (id)activateSnapshotOperation;\n+ (id)activateSnapshotOperationFromString:(NSString *)activateSnapshotOperation;\n\n@end\n"
  },
  {
    "path": "Slate/ActivateSnapshotOperation.m",
    "content": "//\n//  ActivateSnapshotOperation.m\n//  Slate\n//\n//  Created by Jigish Patel on 3/1/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"ActivateSnapshotOperation.h\"\n#import \"Constants.h\"\n#import \"Snapshot.h\"\n#import \"SlateConfig.h\"\n#import \"WindowSnapshot.h\"\n#import \"NSString+Levenshtein.h\"\n#import \"StringTokenizer.h\"\n#import \"SlateLogger.h\"\n#import \"RunningApplications.h\"\n\n@implementation ActivateSnapshotOperation\n\n@synthesize name, del;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    del = NO;\n    [self setName:nil];\n  }\n  return self;\n}\n\n- (id)initWithName:(NSString *)theName options:(NSString *)_options {\n  self = [self init];\n  if (self) {\n    [self setName:theName];\n    if (_options) {\n      NSArray *optionsTokens = [_options componentsSeparatedByString:SEMICOLON];\n      for (NSInteger i = 0; i < [optionsTokens count]; i++) {\n        NSString *option = [optionsTokens objectAtIndex:i];\n        if ([DELETE isEqualToString:option]) {\n          del = YES;\n        }\n      }\n    }\n  }\n  return self;\n}\n\n- (BOOL)doOperation {\n  SlateLogger(@\"----------------- Begin Snapshot Operation -----------------\");\n  BOOL success = [self doOperationWithAccessibilityWrapper:nil screenWrapper:nil];\n  SlateLogger(@\"-----------------  End Snapshot Operation  -----------------\");\n  return success;\n}\n\n- (BOOL)doOperationWithAccessibilityWrapper:(AccessibilityWrapper *)iamnil screenWrapper:(ScreenWrapper *)iamalsonil {\n  [self evalOptionsWithAccessibilityWrapper:iamnil screenWrapper:iamalsonil];\n  return [ActivateSnapshotOperation activateSnapshot:name remove:del];\n}\n\n- (BOOL)testOperation {\n  return YES;\n}\n\n- (NSArray *)requiredOptions {\n  return [NSArray arrayWithObject:OPT_NAME];\n}\n\n- (void)parseOption:(NSString *)_name value:(id)value {\n  if (value == nil) { return; }\n  if ([_name isEqualToString:OPT_NAME]) {\n    if (![value isKindOfClass:[NSString class]]) {\n      @throw([NSException exceptionWithName:[NSString stringWithFormat:@\"Invalid %@\", _name] reason:[NSString stringWithFormat:@\"Invalid %@ '%@'\", _name, value] userInfo:nil]);\n      return;\n    }\n    [self setName:_name];\n  } else if ([_name isEqualToString:OPT_DELETE]) {\n    if (![value isKindOfClass:[NSValue class]] && ![value isKindOfClass:[NSString class]] && ![value isKindOfClass:[NSNumber class]]) {\n      @throw([NSException exceptionWithName:[NSString stringWithFormat:@\"Invalid %@\", _name] reason:[NSString stringWithFormat:@\"Invalid %@ '%@'\", _name, value] userInfo:nil]);\n      return;\n    }\n    [self setDel:[value boolValue]];\n  }\n}\n\n+ (BOOL)activateSnapshot:(NSString *)name remove:(BOOL)del {\n  Snapshot *snapshot = [[SlateConfig getInstance] popSnapshot:name remove:del];\n  if (snapshot == nil) return YES;\n  for (NSRunningApplication *app in [RunningApplications getInstance]) {\n    NSString *appName = [app localizedName];\n    pid_t appPID = [app processIdentifier];\n    SlateLogger(@\"I see application '%@' with pid '%d'\", appName, appPID);\n    AXUIElementRef appRef = AXUIElementCreateApplication(appPID);\n    CFArrayRef windowsArrRef = [AccessibilityWrapper windowsInApp:appRef];\n    if (!windowsArrRef || CFArrayGetCount(windowsArrRef) == 0) continue;\n    CFMutableArrayRef windowsArr = CFArrayCreateMutableCopy(kCFAllocatorDefault, 0, windowsArrRef);\n    NSArray *windowSnapshots = [[snapshot apps] objectForKey:appName];\n    // Check windows\n    for (NSInteger i = 0; i < CFArrayGetCount(windowsArr); i++) {\n      SlateLogger(@\" Checking Window: %@\", [AccessibilityWrapper getTitle:CFArrayGetValueAtIndex(windowsArr, i)]);\n      NSString *title = [AccessibilityWrapper getTitle:CFArrayGetValueAtIndex(windowsArr, i)];\n      if ([title isEqualToString:@\"\"]) continue;\n      AccessibilityWrapper *aw = [[AccessibilityWrapper alloc] initWithApp:appRef window:CFArrayGetValueAtIndex(windowsArr, i)];\n      // Find best snapshot\n      WindowSnapshot *bestSnapshot = nil;\n      if ([[[SlateConfig getInstance] getConfig:SNAPSHOT_TITLE_MATCH app:appName] isEqualToString:SEQUENTIAL]) {\n        float bestDistance = 0.0;\n        for (WindowSnapshot *ws in windowSnapshots) {\n          float sDistance = [title sequentialDistance:[ws title]];\n          if (sDistance > bestDistance || bestSnapshot == nil) {\n            bestDistance = sDistance;\n            bestSnapshot = ws;\n          }\n        }\n      } else {\n        float bestDistance = 1000.0;\n        for (WindowSnapshot *ws in windowSnapshots) {\n          float lDistance = [title levenshteinDistance:[ws title]];\n          if (lDistance < bestDistance || bestSnapshot == nil) {\n            bestDistance = lDistance;\n            bestSnapshot = ws;\n          }\n        }\n      }\n      if (bestSnapshot == nil) continue;\n      [aw moveWindow:[bestSnapshot topLeft]];\n      [aw resizeWindow:[bestSnapshot size]];\n    }\n  }\n  return YES;\n}\n\n+ (id)activateSnapshotOperation {\n  return [[ActivateSnapshotOperation alloc] init];\n}\n\n+ (id)activateSnapshotOperationFromString:(NSString *)activateSnapshotOperation {\n  // activate-snapshot name options\n  NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n  [StringTokenizer tokenize:activateSnapshotOperation into:tokens maxTokens:3];\n\n  if ([tokens count] < 2) {\n    SlateLogger(@\"ERROR: Invalid Parameters '%@'\", activateSnapshotOperation);\n    @throw([NSException exceptionWithName:@\"Invalid Parameters\" reason:[NSString stringWithFormat:@\"Invalid Parameters in '%@'. Activate Snapshot operations require the following format: 'delete-snapshot name options'\", activateSnapshotOperation] userInfo:nil]);\n  }\n\n  Operation *op = [[ActivateSnapshotOperation alloc] initWithName:[tokens objectAtIndex:1] options:([tokens count] > 2 ? [tokens objectAtIndex:2] : nil)];\n  return op;\n}\n\n@end\n"
  },
  {
    "path": "Slate/ApplicationOptions.h",
    "content": "//\n//  ApplicationOptions.h\n//  Slate\n//\n//  Created by Jigish Patel on 6/14/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n\n\n@interface ApplicationOptions : NSObject {\n@private\n  BOOL ignoreFail;\n  BOOL repeat;\n  BOOL repeatLast;\n  BOOL mainFirst;\n  BOOL mainLast;\n  BOOL sortTitle;\n  NSArray *titleOrder;\n  NSArray *titleOrderRegex;\n}\n\n@property (assign) BOOL ignoreFail;\n@property (assign) BOOL repeat;\n@property (assign) BOOL repeatLast;\n@property (assign) BOOL mainFirst;\n@property (assign) BOOL mainLast;\n@property (assign) BOOL sortTitle;\n@property NSArray *titleOrder;\n@property NSArray *titleOrderRegex;\n\n@end\n"
  },
  {
    "path": "Slate/ApplicationOptions.m",
    "content": "//\n//  ApplicationOptions.m\n//  Slate\n//\n//  Created by Jigish Patel on 6/14/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"ApplicationOptions.h\"\n\n\n@implementation ApplicationOptions\n\n@synthesize ignoreFail;\n@synthesize repeat;\n@synthesize repeatLast;\n@synthesize mainFirst;\n@synthesize mainLast;\n@synthesize sortTitle;\n@synthesize titleOrder;\n@synthesize titleOrderRegex;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [self setIgnoreFail:NO];\n    [self setRepeat:NO];\n    [self setRepeatLast:NO];\n    [self setMainFirst:NO];\n    [self setMainLast:NO];\n    [self setSortTitle:NO];\n    [self setTitleOrder:nil];\n    [self setTitleOrderRegex:nil];\n  }\n  return self;\n}\n\n@end\n"
  },
  {
    "path": "Slate/Binding.h",
    "content": "//\n//  Binding.h\n//  Slate\n//\n//  Created by Jigish Patel on 5/18/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <Carbon/Carbon.h>\n#import <Foundation/Foundation.h>\n\n@class Operation;\n\n@interface Binding : NSObject {\n@private\n  Operation *op;\n  UInt32 keyCode;\n  UInt32 modifiers;\n  NSNumber *modalKey;\n  EventHotKeyRef hotKeyRef;\n  BOOL repeat;\n  BOOL toggle;\n}\n\n@property  Operation *op;\n@property (assign) UInt32 keyCode;\n@property (assign) UInt32 modifiers;\n@property NSNumber *modalKey;\n@property (assign) EventHotKeyRef hotKeyRef;\n@property (assign) BOOL repeat;\n@property (assign) BOOL toggle;\n\n+ (NSDictionary *)asciiToCodeDict;\n- (id)initWithString:(NSString *)binding;\n- (id)initWithKeystroke:(NSString*)keystroke operation:(Operation*)op_ repeat:(BOOL)repeat_;\n- (BOOL)doOperation;\n- (NSString *)modalHashKey;\n+ (NSArray *)modalHashKeyToKeyAndModifiers:(NSString *)modalHashKey;\n+ (NSArray *)getKeystrokeFromString:(NSString *)keystroke;\n\n@end\n"
  },
  {
    "path": "Slate/Binding.m",
    "content": "//\n//  Binding.m\n//  Slate\n//\n//  Created by Jigish Patel on 5/18/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"Binding.h\"\n#import \"Constants.h\"\n#import \"SlateConfig.h\"\n#import \"StringTokenizer.h\"\n#import \"SlateLogger.h\"\n#import \"Operation.h\"\n#import \"SwitchOperation.h\"\n#import \"SlateAppDelegate.h\"\n#import \"SnapshotOperation.h\"\n\n@implementation Binding\n\n@synthesize op;\n@synthesize keyCode;\n@synthesize modifiers;\n@synthesize modalKey;\n@synthesize hotKeyRef;\n@synthesize repeat;\n@synthesize toggle;\n\nstatic NSDictionary *dictionary = nil;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [self setRepeat:NO];\n    [self setToggle:NO];\n    [self setModalKey:nil];\n  }\n  return self;\n}\n\n// Yes, this method is huge. Deal with it.\n- (id)initWithString:(NSString *)binding {\n  self = [self init];\n  if (self) {\n    // bind <key:modifiers|modal-key> <op> <parameters>\n    NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n    [StringTokenizer tokenize:binding into:tokens maxTokens:3];\n    if ([tokens count] <=2) {\n      @throw([NSException exceptionWithName:@\"Unrecognized Bind\" reason:binding userInfo:nil]);\n    }\n    [self setKeystrokeFromString:[tokens objectAtIndex:1]];\n    [self setOperationAndRepeatFromString:[tokens objectAtIndex:2]];\n  }\n\n  return self;\n}\n\n- (id)initWithKeystroke:(NSString *)keystroke operation:(Operation *)op_ repeat:(BOOL)repeat_ {\n  self = [self init];\n  if (self) {\n    [self setKeystrokeFromString:keystroke];\n    [self setOp:op_];\n    if ([self op] == nil) {\n      SlateLogger(@\"ERROR: Unable to create binding\");\n      @throw([NSException exceptionWithName:@\"Unable To Create Binding\" reason:[NSString stringWithFormat:@\"Unable to create %@\", keystroke] userInfo:nil]);\n    }\n\n    @try {\n      AccessibilityWrapper *awTest = [[AccessibilityWrapper alloc] init];\n      ScreenWrapper *swTest = [[ScreenWrapper alloc] init];\n      [[self op] testOperationWithAccessibilityWrapper:awTest screenWrapper:swTest];\n    } @catch (NSException *ex) {\n      SlateLogger(@\"ERROR: Unable to test binding\");\n      @throw([NSException exceptionWithName:@\"Unable To Parse Binding\" reason:[NSString stringWithFormat:@\"Unable to parse '%@' in '%@'\", [ex reason], [[self op] opName]] userInfo:nil]);\n    }\n    if ([[self op] isKindOfClass:[SwitchOperation class]]) {\n      [(SwitchOperation *)op setModifiers:modifiers];\n    }\n    [self setRepeat:repeat_];\n  }\n  return self;\n}\n\n+ (UInt32)modifierFromString:(NSString *)mod {\n  if ([mod isEqualToString:CONTROL]) {\n    return controlKey;\n  } else if ([mod isEqualToString:OPTION]) {\n    return optionKey;\n  } else if ([mod isEqualToString:COMMAND]) {\n    return cmdKey;\n  } else if ([mod isEqualToString:SHIFT]) {\n   return shiftKey;\n  } else if ([mod isEqualToString:FUNCTION]) {\n    return FUNCTION_KEY;\n  } else {\n    SlateLogger(@\"ERROR: Unrecognized modifier '%@'\", mod);\n    @throw([NSException exceptionWithName:@\"Unrecognized Modifier\" reason:[NSString stringWithFormat:@\"Unrecognized modifier '%@'\", mod] userInfo:nil]);\n  }\n}\n\n+ (NSArray *)getKeystrokeFromString:(NSString *)keystroke {\n  NSNumber *theKeyCode = [NSNumber numberWithUnsignedInt:0];\n  UInt32 theModifiers = 0;\n  NSNumber *theModalKey = nil;\n  NSArray *keyAndModifiers = [keystroke componentsSeparatedByString:COLON];\n  if ([keyAndModifiers count] >= 1) {\n    NSString *theKey = [keyAndModifiers objectAtIndex:0];\n    theKeyCode = [[Binding asciiToCodeDict] objectForKey:theKey];\n    if (theKeyCode == nil) {\n      SlateLogger(@\"ERROR: Unrecognized key \\\"%@\\\" in \\\"%@\\\"\", theKey, keystroke);\n      @throw([NSException exceptionWithName:@\"Unrecognized Key\" reason:[NSString stringWithFormat:@\"Unrecognized key \\\"%@\\\" in \\\"%@\\\"\", theKey, keystroke] userInfo:nil]);\n    }\n    if ([keyAndModifiers count] >= 2) {\n      theModalKey = [[Binding asciiToCodeDict] objectForKey:[keyAndModifiers objectAtIndex:1]];\n      if (theModalKey == nil) {\n        // normal case\n        NSArray *modifiersArray = [[keyAndModifiers objectAtIndex:1] componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@\",;\"]];\n        NSEnumerator *modEnum = [modifiersArray objectEnumerator];\n        NSString *mod = [modEnum nextObject];\n        while (mod) {\n          NSNumber *_theModalKey = [[Binding asciiToCodeDict] objectForKey:mod];\n          if (_theModalKey != nil) {\n            theModalKey = _theModalKey;\n          } else {\n            theModifiers += [Binding modifierFromString:mod];\n          }\n          mod = [modEnum nextObject];\n        }\n      }\n    }\n  }\n  return [NSArray arrayWithObjects:theKeyCode, [NSNumber numberWithInteger:theModifiers], theModalKey, nil];\n}\n\n- (void)setKeystrokeFromString:(NSString*)keystroke {\n  NSArray *modalAndKey = [keystroke componentsSeparatedByString:COLON];\n  if ([modalAndKey count] > 0) {\n    NSArray *keyarr = [Binding getKeystrokeFromString:keystroke];\n    keyCode = [[keyarr objectAtIndex:0] unsignedIntValue];\n    modifiers = [[keyarr objectAtIndex:1] unsignedIntValue];\n    if ([keyarr count] >= 3 ) {\n      [self setModalKey:[keyarr objectAtIndex:2]];\n    }\n  }\n  if ([modalAndKey count] >= 3){ // modal toggle\n    if ([[modalAndKey objectAtIndex:2] isEqualToString:TOGGLE]) {\n      [self setToggle:YES];\n    }\n  }\n}\n\n- (void)setOperationAndRepeatFromString:(NSString*)token {\n  NSMutableString *opStr = [[NSMutableString alloc] initWithCapacity:10];\n  [StringTokenizer firstToken:token into:opStr];\n  BOOL theRepeat = [Operation isRepeatOnHoldOp:opStr];\n\n  Operation *theOp = [Operation operationFromString:token];\n\n  if (theOp == nil) {\n    SlateLogger(@\"ERROR: Unable to create binding\");\n    @throw([NSException exceptionWithName:@\"Unable To Create Binding\" reason:[NSString stringWithFormat:@\"Unable to create '%@'\", token] userInfo:nil]);\n  }\n\n  @try {\n    [theOp testOperation];\n  } @catch (NSException *ex) {\n    SlateLogger(@\"ERROR: Unable to test binding '%@'\", token);\n    @throw([NSException exceptionWithName:@\"Unable To Parse Binding\" reason:[NSString stringWithFormat:@\"Unable to parse '%@' in '%@'\", [ex reason], token] userInfo:nil]);\n  }\n\n  if ([theOp isKindOfClass:[SwitchOperation class]]) {\n    [(SwitchOperation *)op setModifiers:modifiers];\n  }\n\n  op = theOp;\n  repeat = theRepeat;\n}\n\n- (BOOL)doOperation {\n  if ([(SlateAppDelegate *)[NSApp delegate] hasUndoOperation] && [op shouldTakeUndoSnapshot]) {\n    [[(SlateAppDelegate *)[NSApp delegate] undoSnapshotOperation] doOperation];\n  }\n  @try {\n    return [op doOperation];\n  } @catch (NSException *ex) {\n    SlateLogger(@\"   ERROR %@\",[ex name]);\n    NSAlert *alert = [SlateConfig warningAlertWithKeyEquivalents: [NSArray arrayWithObjects:@\"Quit\", @\"Skip\", nil]];\n    [alert setMessageText:[ex name]];\n    [alert setInformativeText:[ex reason]];\n    if ([alert runModal] == NSAlertFirstButtonReturn) {\n      SlateLogger(@\"User selected exit\");\n      [NSApp terminate:nil];\n    }\n  }\n  return NO;\n}\n\n- (NSString *)modalHashKey {\n  if ([self modalKey] == nil) {\n    return nil;\n  }\n  return [NSString stringWithFormat:@\"%@%@%u\", [self modalKey], PLUS, [self modifiers]];\n}\n\n+ (NSArray *)modalHashKeyToKeyAndModifiers:(NSString *)modalHashKey {\n  NSArray *modalKeyArr = [modalHashKey componentsSeparatedByString:PLUS];\n  NSNumberFormatter *nf = [[NSNumberFormatter alloc] init];\n  NSNumber *theKey = [nf numberFromString:[modalKeyArr objectAtIndex:0]];\n  NSNumber *theModifiers = [nf numberFromString:[modalKeyArr objectAtIndex:1]];\n  return [NSArray arrayWithObjects:theKey, theModifiers, nil];\n}\n\n- (void)dealloc {\n  [self setHotKeyRef:nil];\n}\n\n// This returns a dictionary containing mappings from ASCII to keyCode\n+ (NSDictionary *)asciiToCodeDict {\n  if (dictionary == nil) {\n    NSString *configLayout = [[SlateConfig getInstance] getConfig:KEYBOARD_LAYOUT];\n    NSString *filename;\n    if ([configLayout isEqualToString:KEYBOARD_LAYOUT_DVORAK]) {\n      filename = @\"ASCIIToCode_Dvorak\";\n    } else if ([configLayout isEqualToString:KEYBOARD_LAYOUT_COLEMAK]) {\n      filename = @\"ASCIIToCode_Colemak\";\n    } else if ([configLayout isEqualToString:KEYBOARD_LAYOUT_AZERTY]) {\n      filename = @\"ASCIIToCode_Azerty\";\n    } else {\n      filename = @\"ASCIIToCode\";\n    }\n    dictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:filename ofType:@\"plist\"]];\n  }\n  return dictionary;\n}\n\n@end\n"
  },
  {
    "path": "Slate/ChainOperation.h",
    "content": "//\n//  ChainOperation.h\n//  Slate\n//\n//  Created by Jigish Patel on 5/28/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n#import \"Operation.h\"\n\n@interface ChainOperation : Operation {\n@private\n  NSArray *operations;\n  NSMutableDictionary *currentOp;\n}\n\n@property NSArray *operations;\n@property NSMutableDictionary *currentOp;\n\n- (BOOL)testOperation:(NSInteger)op;\n- (void)afterComplete:(AccessibilityWrapper *)aw opRun:(NSInteger)op ;\n- (id)initWithArray:(NSArray *)opArray;\n- (NSInteger)getNextOperation:(AccessibilityWrapper *)aw;\n- (void)setNextOperation:(AccessibilityWrapper *)aw nextOp:(NSNumber *)op;\n\n+ (id)chainOperation;\n+ (id)chainOperationFromString:(NSString *)chainOperation;\n\n@end\n"
  },
  {
    "path": "Slate/ChainOperation.m",
    "content": "//\n//  ChainOperation.m\n//  Slate\n//\n//  Created by Jigish Patel on 5/28/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"ChainOperation.h\"\n#import \"ScreenWrapper.h\"\n#import \"WindowState.h\"\n#import \"StringTokenizer.h\"\n#import \"Constants.h\"\n#import \"SlateLogger.h\"\n#import \"JSController.h\"\n#import <WebKit/WebKit.h>\n#import \"JSOperation.h\"\n\n@implementation ChainOperation\n\n@synthesize operations;\n@synthesize currentOp;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [self setCurrentOp:[[NSMutableDictionary alloc] initWithCapacity:10]];\n    [self setOperations:[NSArray array]];\n  }\n  return self;\n}\n\n- (id)initWithArray:(NSArray *)opArray {\n  self = [self init];\n  if (self) {\n    [self setCurrentOp:[[NSMutableDictionary alloc] initWithCapacity:10]];\n    [self setOperations:opArray];\n  }\n  return self;\n}\n\n- (BOOL)doOperation {\n  SlateLogger(@\"----------------- Begin Chain Operation -----------------\");\n  AccessibilityWrapper *aw = [[AccessibilityWrapper alloc] init];\n  ScreenWrapper *sw = [[ScreenWrapper alloc] init];\n  BOOL success = NO;\n  if ([aw inited]) success = [self doOperationWithAccessibilityWrapper:aw screenWrapper:sw];\n  SlateLogger(@\"-----------------  End Chain Operation  -----------------\");\n  return success;\n}\n\n- (BOOL) doOperationWithAccessibilityWrapper:(AccessibilityWrapper *)aw screenWrapper:(ScreenWrapper *)sw {\n  BOOL success = NO;\n  [self evalOptionsWithAccessibilityWrapper:aw screenWrapper:sw];\n  NSInteger opRun = 0;\n  if ([aw inited]) {\n    opRun = [self getNextOperation:aw];\n    success = [[operations objectAtIndex:opRun] doOperationWithAccessibilityWrapper:aw screenWrapper:sw];\n    if (success)\n      [self afterComplete:aw opRun:opRun];\n  }\n  return success;\n}\n\n- (BOOL)testOperation:(NSInteger)op {\n  BOOL success = [[operations objectAtIndex:op] testOperation];\n  return success;\n}\n\n- (BOOL)testOperation {\n  BOOL success = YES;\n  for (NSInteger op = 0; op < [operations count]; op++) {\n    success = [self testOperation:op] && success;\n  }\n  return success;\n}\n\n- (void)afterComplete:(AccessibilityWrapper *)aw opRun:(NSInteger)op {\n  NSInteger nextOpInt = 0;\n  if (op+1 < [operations count])\n    nextOpInt = op+1;\n  NSNumber *nextOp = [NSNumber numberWithInteger:nextOpInt];\n\n  if (aw != nil) {\n    [self setNextOperation:aw nextOp:nextOp];\n  }\n}\n\n- (NSInteger)getNextOperation:(AccessibilityWrapper *)aw {\n  WindowState *ws = [[WindowState alloc] init:aw];\n  NSNumber *nextOp = [currentOp objectForKey:ws];\n  if (nextOp != nil)\n    return [nextOp integerValue];\n  return 0;\n}\n\n- (void)setNextOperation:(AccessibilityWrapper *)aw nextOp:(NSNumber *)op {\n  WindowState *ws = [[WindowState alloc] init:aw];\n  [currentOp setObject:op forKey:ws];\n}\n\n- (NSArray *)requiredOptions {\n  return [NSArray arrayWithObject:OPT_OPERATIONS];\n}\n\n- (void)parseOption:(NSString *)_name value:(id)value {\n  if (value == nil) { return; }\n  if ([_name isEqualToString:OPT_OPERATIONS]) {\n    if (![value isKindOfClass:[NSArray class]]) {\n      @throw([NSException exceptionWithName:[NSString stringWithFormat:@\"Invalid %@\", _name] reason:[NSString stringWithFormat:@\"Invalid %@ '%@'\", _name, value] userInfo:nil]);\n      return;\n    }\n    NSMutableArray *ops = [NSMutableArray array];\n    for (id key in value) {\n      Operation *op = nil;\n      if ([key isKindOfClass:[WebScriptObject class]]) {\n        op = [JSOperation jsOperationWithFunction:key];\n      } else if ([key isKindOfClass:[Operation class]]) {\n        op = key;\n      }\n\n      if (op == nil) {\n        @throw([NSException exceptionWithName:[NSString stringWithFormat:@\"Invalid %@\", _name] reason:[NSString stringWithFormat:@\"Invalid %@ '%@'\", _name, value] userInfo:nil]);\n        continue;\n      }\n      [ops addObject:op];\n    }\n    [self setOperations:ops];\n  }\n}\n\n+ (id)chainOperation {\n  return [[ChainOperation alloc] init];\n}\n\n+ (id)chainOperationFromString:(NSString *)chainOperation {\n  // chain op[ | op]+\n  NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n  [StringTokenizer tokenize:chainOperation into:tokens maxTokens:2];\n\n  if ([tokens count] < 2) {\n    SlateLogger(@\"ERROR: Invalid Parameters '%@'\", chainOperation);\n    @throw([NSException exceptionWithName:@\"Invalid Parameters\" reason:[NSString stringWithFormat:@\"Invalid Parameters in '%@'. Chain operations require the following format: 'chain op[|op]+'\", chainOperation] userInfo:nil]);\n  }\n\n  NSString *opsString = [tokens objectAtIndex:1];\n  NSArray *ops = [opsString componentsSeparatedByString:PIPE_PADDED];\n  NSMutableArray *opArray = [[NSMutableArray alloc] initWithCapacity:10];\n  for (NSInteger i = 0; i < [ops count]; i++) {\n    Operation *op = [Operation operationFromString:[ops objectAtIndex:i]];\n    if (op != nil) {\n      [opArray addObject:op];\n    } else {\n      SlateLogger(@\"ERROR: Invalid Operation in Chain: '%@'\", [ops objectAtIndex:i]);\n      @throw([NSException exceptionWithName:@\"Invalid Operation in Chain\" reason:[NSString stringWithFormat:@\"Invalid operation '%@' in chain.\", [ops objectAtIndex:i]] userInfo:nil]);\n    }\n  }\n\n  Operation *op = [[ChainOperation alloc] initWithArray:opArray];\n  return op;\n}\n\n@end\n"
  },
  {
    "path": "Slate/ConfigurationHelperView.h",
    "content": "//\n//  ConfigurationHelperView.h\n//  Slate\n//\n//  Created by Jigish Patel on 3/5/12.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <Cocoa/Cocoa.h>\n\n@interface ConfigurationHelperView : NSView {\n@private\n  NSTextField *directiveLabel;\n  NSPopUpButton *directive;\n  NSButton *save;\n  NSMutableDictionary *configs;\n}\n\n@property NSTextField *directiveLabel;\n@property NSPopUpButton *directive;\n@property NSButton *save;\n@property NSMutableDictionary *configs;\n\n- (void)directiveChanged;\n- (void)updateDirectiveSpecificUI:(NSString *)str;\n- (void)addDirectiveSpecificUIs;\n- (void)addConfigUI;\n- (void)hideAll:(NSArray *)theThings;\n- (void)showAll:(NSArray *)theThings;\n- (void)hide:(NSTextField *)theThings;\n- (void)show:(NSTextField *)theThings;\n- (void)saveToConfig;\n\n@end\n"
  },
  {
    "path": "Slate/ConfigurationHelperView.m",
    "content": "//\n//  ConfigurationHelperView.m\n//  Slate\n//\n//  Created by Jigish Patel on 3/5/12.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"ConfigurationHelperView.h\"\n#import \"SlateLogger.h\"\n#import \"Constants.h\"\n#import \"SlateConfig.h\"\n\n@implementation ConfigurationHelperView\n\n@synthesize directiveLabel, directive, save, configs;\n\n- (NSTextField *)createLabel:(NSString *)text frame:(NSRect)frame {\n  NSTextField *label = [[NSTextField alloc] initWithFrame:frame];\n  [label setStringValue:text];\n  [label setFont:[NSFont fontWithName:@\"Menlo\" size:11]];\n  [label setSelectable:NO];\n  [label setEnabled:NO];\n  [label setDrawsBackground:NO];\n  [label setBordered:NO];\n  [label setBezeled:NO];\n  return label;\n}\n\n- (NSTextField *)createTextField:(NSString *)text frame:(NSRect)frame {\n  NSTextField *field = [[NSTextField alloc] initWithFrame:frame];\n  [field setStringValue:text];\n  [field setFont:[NSFont fontWithName:@\"Menlo\" size:11]];\n  return field;\n}\n\n- (id)initWithFrame:(NSRect)frame {\n    self = [super initWithFrame:frame];\n    if (self) {\n      configs = [NSMutableDictionary dictionary];\n      directiveLabel = [self createLabel:@\"Choose a Directive:\" frame:NSMakeRect(5, frame.size.height - 25, 150, 20)];\n      [self addSubview:directiveLabel];\n      directive = [[NSPopUpButton alloc] initWithFrame:NSMakeRect(150, frame.size.height - 25, 100, 22)];\n      [directive addItemsWithTitles:[NSArray arrayWithObjects:EMPTY, CONFIG, LAYOUT, DEFAULT, BIND, nil]];\n      [directive setTarget:self];\n      [directive setAction:@selector(directiveChanged)];\n      save = [[NSButton alloc] initWithFrame:NSMakeRect(frame.size.width/2 - 50, 30, 100, 25)];\n      [save setTitle:@\"Save\"];\n      [save setTarget:self];\n      [save setAction:@selector(saveToConfig)];\n      [save setBezelStyle:NSRoundedBezelStyle];\n      [self addSubview:directive];\n      [self addSubview:save];\n      [self addDirectiveSpecificUIs];\n      [self updateDirectiveSpecificUI:[[directive selectedItem] title]];\n    }\n    return self;\n}\n\n- (void)directiveChanged {\n  NSString *title = [[directive selectedItem] title];\n  SlateLogger(@\"Directive Changed: %@\", title);\n  [self updateDirectiveSpecificUI:title];\n}\n\n- (void)addDirectiveSpecificUIs {\n   SlateLogger(@\"addDirectiveSpecificUIs\");\n  [self addConfigUI];\n}\n\n- (void)hideDirectiveSpecificUIs {\n  [self hideConfigUI];\n}\n\n- (void)addConfigUI {\n  SlateLogger(@\"addConfigUI\");\n  NSInteger i = 0;\n  for (NSString *configName in [[[SlateConfig getInstance] configs] allKeys]) {\n    if ([configs objectForKey:configName]) continue;\n    SlateLogger(@\"ADDING CONFIG %@\", configName);\n    NSTextField *configLabel = [self createLabel:configName frame:NSMakeRect(5, [self frame].size.height - 25 * (i+2), 215, 20)];\n    NSTextField *configField = [self createTextField:[[SlateConfig getInstance] getConfig:configName] frame:NSMakeRect(220, [self frame].size.height - 25 * (i+2) + 1, 200, 20)];\n    NSTextField *configDefault = [self createLabel:[NSString stringWithFormat:@\"Default: %@\", [[SlateConfig getInstance] getConfigDefault:configName]] frame:NSMakeRect(420, [self frame].size.height - 25 * (i+2), 200, 20)];\n    NSArray *objects = [NSArray arrayWithObjects:configLabel, configField, configDefault, nil];\n    [configs setObject:objects forKey:configName];\n    [self performSelectorOnMainThread:@selector(hideAll:) withObject:objects waitUntilDone:YES];\n    [self addSubview:configLabel];\n    [self addSubview:configField];\n    [self addSubview:configDefault];\n    i++;\n  }\n}\n\n- (void)updateConfigUI {\n  for (NSString *configName in [configs allKeys]) {\n    [[[configs objectForKey:configName] objectAtIndex:1] setStringValue:[[SlateConfig getInstance] getConfig:configName]];\n  }\n}\n\n- (void)hideConfigUI {\n  for (NSString *configName in [configs allKeys]) {\n    SlateLogger(@\"HIDING CONFIG %@\", configName);\n    [self performSelectorOnMainThread:@selector(hideAll:) withObject:[configs objectForKey:configName] waitUntilDone:YES];\n  }\n}\n\n- (void)showConfigUI {\n  [self updateConfigUI];\n  for (NSString *configName in [configs allKeys]) {\n    SlateLogger(@\"HIDING CONFIG %@\", configName);\n    [self performSelectorOnMainThread:@selector(showAll:) withObject:[configs objectForKey:configName] waitUntilDone:YES];\n  }\n}\n\n- (void)hideAll:(NSArray *)theThings {\n  for (NSTextField *field in theThings) {\n    [self hide:field];\n  }\n}\n\n- (void)showAll:(NSArray *)theThings {\n  for (NSTextField *field in theThings) {\n    [self show:field];\n    [field needsDisplay];\n  }\n}\n\n- (void)hide:(NSTextField *)field {\n  [field setHidden:YES];\n}\n\n- (void)show:(NSTextField *)field {\n  [field setHidden:NO];\n}\n\n- (void)updateDirectiveSpecificUI:(NSString *)str {\n  // Remove everything first\n  [self hideDirectiveSpecificUIs];\n  if ([str isEqualToString:CONFIG]) {\n    SlateLogger(@\"IN CONFIG\");\n    [self showConfigUI];\n  } else if ([str isEqualToString:ALIAS]) {\n\n  } else if ([str isEqualToString:LAYOUT]) {\n\n  } else if ([str isEqualToString:DEFAULT]) {\n\n  } else if ([str isEqualToString:BIND]) {\n\n  } else if ([str isEqualToString:SOURCE]) {\n\n  } else if ([str isEqualToString:EMPTY]) {\n    // do nothing\n  }\n  [self setNeedsDisplay:YES];\n}\n\n- (void)drawRect:(NSRect)dirtyRect {\n  [super drawRect:dirtyRect];// Drawing code here.\n}\n\n- (void)saveConfig {\n  // Update SlateConfig\n\n\n\n  // Save to file\n}\n\n- (void)saveToConfig {\n  if ([[[directive selectedItem] title] isEqualToString:CONFIG]) {\n    [self saveConfig];\n  }\n}\n\n@end\n"
  },
  {
    "path": "Slate/Constants.h",
    "content": "//\n//  Constants.h\n//  Slate\n//\n//  Created by Jigish Patel on 5/26/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\nextern NSString *const SNAPSHOTS_FILE;\n\n#define MODAL_BEGIN_ID 20000;\n#define CURRENT_MODAL_BEGIN_ID 30000;\nextern NSInteger const MODAL_ESCAPE_ID;\n\n// Directive Keys\nextern NSString *const BIND;\nextern NSString *const CONFIG;\nextern NSString *const DEFAULT;\nextern NSString *const LAYOUT;\nextern NSString *const ALIAS;\nextern NSString *const SOURCE;\n\n// Source Option Keys\nextern NSString *const IF_EXISTS;\n\n// Config Keys\nextern NSString *const DEFAULT_TO_CURRENT_SCREEN;\nextern NSString *const DEFAULT_TO_CURRENT_SCREEN_DEFAULT;\nextern NSString *const NUDGE_PERCENT_OF;\nextern NSString *const NUDGE_PERCENT_OF_DEFAULT;\nextern NSString *const RESIZE_PERCENT_OF;\nextern NSString *const RESIZE_PERCENT_OF_DEFAULT;\nextern NSString *const REPEAT_ON_HOLD_OPS;\nextern NSString *const REPEAT_ON_HOLD_OPS_DEFAULT;\nextern NSString *const SECONDS_BEFORE_REPEAT;\nextern NSString *const SECONDS_BEFORE_REPEAT_DEFAULT;\nextern NSString *const SECONDS_BETWEEN_REPEAT;\nextern NSString *const SECONDS_BETWEEN_REPEAT_DEFAULT;\nextern NSString *const CHECK_DEFAULTS_ON_LOAD;\nextern NSString *const CHECK_DEFAULTS_ON_LOAD_DEFAULT;\nextern NSString *const FOCUS_CHECK_WIDTH;\nextern NSString *const FOCUS_CHECK_WIDTH_DEFAULT;\nextern NSString *const FOCUS_CHECK_WIDTH_MAX;\nextern NSString *const FOCUS_CHECK_WIDTH_MAX_DEFAULT;\nextern NSString *const FOCUS_PREFER_SAME_APP;\nextern NSString *const FOCUS_PREFER_SAME_APP_DEFAULT;\nextern NSString *const ORDER_SCREENS_LEFT_TO_RIGHT;\nextern NSString *const ORDER_SCREENS_LEFT_TO_RIGHT_DEFAULT;\nextern NSString *const WINDOW_HINTS_FONT_NAME;\nextern NSString *const WINDOW_HINTS_FONT_NAME_DEFAULT;\nextern NSString *const WINDOW_HINTS_FONT_SIZE;\nextern NSString *const WINDOW_HINTS_FONT_SIZE_DEFAULT;\nextern NSString *const WINDOW_HINTS_FONT_COLOR;\nextern NSString *const WINDOW_HINTS_FONT_COLOR_DEFAULT;\nextern NSString *const WINDOW_HINTS_WIDTH;\nextern NSString *const WINDOW_HINTS_WIDTH_DEFAULT;\nextern NSString *const WINDOW_HINTS_HEIGHT;\nextern NSString *const WINDOW_HINTS_HEIGHT_DEFAULT;\nextern NSString *const WINDOW_HINTS_BACKGROUND_COLOR;\nextern NSString *const WINDOW_HINTS_BACKGROUND_COLOR_DEFAULT;\nextern NSString *const WINDOW_HINTS_DURATION;\nextern NSString *const WINDOW_HINTS_DURATION_DEFAULT;\nextern NSString *const WINDOW_HINTS_ROUNDED_CORNER_SIZE;\nextern NSString *const WINDOW_HINTS_ROUNDED_CORNER_SIZE_DEFAULT;\nextern NSString *const WINDOW_HINTS_IGNORE_HIDDEN_WINDOWS;\nextern NSString *const WINDOW_HINTS_IGNORE_HIDDEN_WINDOWS_DEFAULT;\nextern NSString *const WINDOW_HINTS_TOP_LEFT_X;\nextern NSString *const WINDOW_HINTS_TOP_LEFT_X_DEFAULT;\nextern NSString *const WINDOW_HINTS_TOP_LEFT_Y;\nextern NSString *const WINDOW_HINTS_TOP_LEFT_Y_DEFAULT;\nextern NSString *const WINDOW_HINTS_ORDER;\nextern NSString *const WINDOW_HINTS_ORDER_DEFAULT;\nextern NSString *const WINDOW_HINTS_SHOW_ICONS;\nextern NSString *const WINDOW_HINTS_SHOW_ICONS_DEFAULT;\nextern NSString *const WINDOW_HINTS_ICON_ALPHA;\nextern NSString *const WINDOW_HINTS_ICON_ALPHA_DEFAULT;\nextern NSString *const WINDOW_HINTS_SPREAD;\nextern NSString *const WINDOW_HINTS_SPREAD_DEFAULT;\nextern NSString *const WINDOW_HINTS_SPREAD_SEARCH_WIDTH;\nextern NSString *const WINDOW_HINTS_SPREAD_SEARCH_WIDTH_DEFAULT;\nextern NSString *const WINDOW_HINTS_SPREAD_SEARCH_HEIGHT;\nextern NSString *const WINDOW_HINTS_SPREAD_SEARCH_HEIGHT_DEFAULT;\nextern NSString *const WINDOW_HINTS_SPREAD_PADDING;\nextern NSString *const WINDOW_HINTS_SPREAD_PADDING_DEFAULT;\nextern NSString *const SWITCH_ICON_SIZE;\nextern NSString *const SWITCH_ICON_SIZE_DEFAULT;\nextern NSString *const SWITCH_ICON_PADDING;\nextern NSString *const SWITCH_ICON_PADDING_DEFAULT;\nextern NSString *const SWITCH_BACKGROUND_COLOR;\nextern NSString *const SWITCH_BACKGROUND_COLOR_DEFAULT;\nextern NSString *const SWITCH_SELECTED_BACKGROUND_COLOR;\nextern NSString *const SWITCH_SELECTED_BACKGROUND_COLOR_DEFAULT;\nextern NSString *const SWITCH_SELECTED_BORDER_COLOR;\nextern NSString *const SWITCH_SELECTED_BORDER_COLOR_DEFAULT;\nextern NSString *const SWITCH_SELECTED_BORDER_SIZE;\nextern NSString *const SWITCH_SELECTED_BORDER_SIZE_DEFAULT;\nextern NSString *const SWITCH_ROUNDED_CORNER_SIZE;\nextern NSString *const SWITCH_ROUNDED_CORNER_SIZE_DEFAULT;\nextern NSString *const SWITCH_ORIENTATION;\nextern NSString *const SWITCH_ORIENTATION_DEFAULT;\nextern NSString *const SWITCH_SECONDS_BEFORE_REPEAT;\nextern NSString *const SWITCH_SECONDS_BEFORE_REPEAT_DEFAULT;\nextern NSString *const SWITCH_SECONDS_BETWEEN_REPEAT;\nextern NSString *const SWITCH_SECONDS_BETWEEN_REPEAT_DEFAULT;\nextern NSString *const SWITCH_STOP_REPEAT_AT_EDGE;\nextern NSString *const SWITCH_STOP_REPEAT_AT_EDGE_DEFAULT;\nextern NSString *const SWITCH_ONLY_FOCUS_MAIN_WINDOW;\nextern NSString *const SWITCH_ONLY_FOCUS_MAIN_WINDOW_DEFAULT;\nextern NSString *const SWITCH_FONT_SIZE;\nextern NSString *const SWITCH_FONT_SIZE_DEFAULT;\nextern NSString *const SWITCH_FONT_COLOR;\nextern NSString *const SWITCH_FONT_COLOR_DEFAULT;\nextern NSString *const SWITCH_FONT_NAME;\nextern NSString *const SWITCH_FONT_NAME_DEFAULT;\nextern NSString *const SWITCH_SHOW_TITLES;\nextern NSString *const SWITCH_SHOW_TITLES_DEFAULT;\nextern NSString *const SWITCH_TYPE;\nextern NSString *const SWITCH_TYPE_DEFAULT;\nextern NSString *const SWITCH_SELECTED_PADDING;\nextern NSString *const SWITCH_SELECTED_PADDING_DEFAULT;\nextern NSString *const KEYBOARD_LAYOUT;\nextern NSString *const KEYBOARD_LAYOUT_DEFAULT;\nextern NSString *const SNAPSHOT_TITLE_MATCH;\nextern NSString *const SNAPSHOT_TITLE_MATCH_DEFAULT;\nextern NSString *const LEVENSHTEIN;\nextern NSString *const SEQUENTIAL;\nextern NSString *const SNAPSHOT_MAX_STACK_SIZE;\nextern NSString *const SNAPSHOT_MAX_STACK_SIZE_DEFAULT;\nextern NSString *const UNDO_MAX_STACK_SIZE;\nextern NSString *const UNDO_MAX_STACK_SIZE_DEFAULT;\nextern NSString *const UNDO_OPS;\nextern NSString *const UNDO_OPS_DEFAULT;\nextern NSString *const GRID_BACKGROUND_COLOR;\nextern NSString *const GRID_BACKGROUND_COLOR_DEFAULT;\nextern NSString *const GRID_ROUNDED_CORNER_SIZE;\nextern NSString *const GRID_ROUNDED_CORNER_SIZE_DEFAULT;\nextern NSString *const GRID_CELL_BACKGROUND_COLOR;\nextern NSString *const GRID_CELL_BACKGROUND_COLOR_DEFAULT;\nextern NSString *const GRID_CELL_SELECTED_COLOR;\nextern NSString *const GRID_CELL_SELECTED_COLOR_DEFAULT;\nextern NSString *const GRID_CELL_ROUNDED_CORNER_SIZE;\nextern NSString *const GRID_CELL_ROUNDED_CORNER_SIZE_DEFAULT;\nextern NSString *const LAYOUT_FOCUS_ON_ACTIVATE;\nextern NSString *const LAYOUT_FOCUS_ON_ACTIVATE_DEFAULT;\nextern NSString *const MODAL_ESCAPE_KEY;\nextern NSString *const MODAL_ESCAPE_KEY_DEFAULT;\nextern NSString *const JS_RECEIVE_MOVE_EVENT;\nextern NSString *const JS_RECEIVE_MOVE_EVENT_DEFAULT;\nextern NSString *const JS_RECEIVE_RESIZE_EVENT;\nextern NSString *const JS_RECEIVE_RESIZE_EVENT_DEFAULT;\n\n// Application Option Keys\nextern NSString *const IGNORE_FAIL;\nextern NSString *const REPEAT;\nextern NSString *const REPEAT_LAST;\nextern NSString *const SORT_TITLE;\nextern NSString *const MAIN_FIRST;\nextern NSString *const MAIN_LAST;\nextern NSString *const TITLE_ORDER;\nextern NSString *const TITLE_ORDER_REGEX;\n\n// Modifier Keys\nextern NSString *const CONTROL;\nextern NSString *const COMMAND;\nextern NSString *const OPTION;\nextern NSString *const SHIFT;\nextern NSString *const FUNCTION;\nextern UInt32 const FUNCTION_KEY;\n\n// Expression Keys\nextern NSString *const SCREEN_ORIGIN_X;\nextern NSString *const SCREEN_ORIGIN_Y;\nextern NSString *const SCREEN_SIZE;\nextern NSString *const SCREEN_SIZE_X;\nextern NSString *const SCREEN_SIZE_Y;\nextern NSString *const WINDOW_TOP_LEFT_X;\nextern NSString *const WINDOW_TOP_LEFT_Y;\nextern NSString *const WINDOW_SIZE_X;\nextern NSString *const WINDOW_SIZE_Y;\nextern NSString *const NEW_WINDOW_SIZE;\nextern NSString *const NEW_WINDOW_SIZE_X;\nextern NSString *const NEW_WINDOW_SIZE_Y;\n\n// Operations\nextern NSString *const MOVE;\nextern NSString *const RESIZE;\nextern NSString *const PUSH;\nextern NSString *const NUDGE;\nextern NSString *const THROW;\nextern NSString *const CORNER;\nextern NSString *const CHAIN;\nextern NSString *const FOCUS;\nextern NSString *const SNAPSHOT;\nextern NSString *const ACTIVATE_SNAPSHOT;\nextern NSString *const DELETE_SNAPSHOT;\nextern NSString *const HINT;\nextern NSString *const SWITCH;\nextern NSString *const GRID;\nextern NSString *const SEQUENCE;\nextern NSString *const HIDE;\nextern NSString *const SHOW;\nextern NSString *const TOGGLE;\nextern NSString *const RELAUNCH;\nextern NSString *const SHELL;\nextern NSString *const UNDO;\n\n// Parameters and Options\nextern NSString *const CENTER;\nextern NSString *const BAR;\nextern NSString *const BAR_RESIZE_WITH_VALUE;\nextern NSString *const NONE;\nextern NSString *const NORESIZE;\nextern NSString *const RESIZE_WITH_VALUE;\nextern NSString *const SAVE_TO_DISK;\nextern NSString *const STACK;\nextern NSString *const NAME;\nextern NSString *const SNAPSHOTS;\nextern NSString *const APPS;\nextern NSString *const APP_NAME;\nextern NSString *const TITLE;\nextern NSString *const SIZE;\nextern NSString *const ALL;\nextern NSString *const DELETE;\nextern NSString *const BACK;\nextern NSString *const QUIT;\nextern NSString *const FORCE_QUIT;\nextern NSString *const WINDOW_HINTS_ORDER_NONE;\nextern NSString *const WINDOW_HINTS_ORDER_PERSIST;\nextern NSString *const WINDOW_HINTS_ORDER_LEFT_TO_RIGHT;\nextern NSString *const WINDOW_HINTS_ORDER_RIGHT_TO_LEFT;\nextern NSString *const SWITCH_ORIENTATION_HORIZONTAL;\nextern NSString *const SWITCH_ORIENTATION_VERTICAL;\nextern NSString *const KEYBOARD_LAYOUT_DVORAK;\nextern NSString *const KEYBOARD_LAYOUT_COLEMAK;\nextern NSString *const KEYBOARD_LAYOUT_AZERTY;\nextern NSString *const PADDING;\nextern NSString *const CURRENT;\nextern NSString *const ALL_BUT;\nextern NSString *const WAIT;\nextern NSString *const PATH;\nextern NSString *const APP_NAME_BEFORE;\nextern NSString *const APP_NAME_AFTER;\n\n// Directions and Anchors\nextern NSString *const UP;\nextern NSString *const DOWN;\nextern NSString *const LEFT;\nextern NSString *const RIGHT;\nextern NSString *const TOP;\nextern NSString *const BOTTOM;\nextern NSString *const ABOVE;\nextern NSString *const BELOW;\nextern NSString *const NEXT;\nextern NSString *const PREVIOUS;\nextern NSString *const PREV;\nextern NSString *const BEHIND;\nextern NSString *const TOP_LEFT;\nextern NSString *const TOP_RIGHT;\nextern NSString *const BOTTOM_LEFT;\nextern NSString *const BOTTOM_RIGHT;\nextern NSInteger const DIRECTION_UNKNOWN;\nextern NSInteger const DIRECTION_UP;\nextern NSInteger const DIRECTION_DOWN;\nextern NSInteger const DIRECTION_LEFT;\nextern NSInteger const DIRECTION_RIGHT;\nextern NSInteger const DIRECTION_TOP;\nextern NSInteger const DIRECTION_BOTTOM;\nextern NSInteger const DIRECTION_ABOVE;\nextern NSInteger const DIRECTION_BELOW;\nextern NSInteger const DIRECTION_BEHIND;\nextern NSInteger const ANCHOR_TOP_LEFT;\nextern NSInteger const ANCHOR_TOP_RIGHT;\nextern NSInteger const ANCHOR_BOTTOM_LEFT;\nextern NSInteger const ANCHOR_BOTTOM_RIGHT;\n\n// Seperators and such\nextern unichar const COMMENT_CHARACTER;\nextern NSString *const COMMA;\nextern NSString *const COLON;\nextern NSString *const SEMICOLON;\nextern NSString *const MINUS;\nextern NSString *const PLUS;\nextern NSString *const PERCENT;\nextern NSString *const EMPTY;\nextern NSString *const PIPE_PADDED;\nextern NSString *const GREATER_THAN_PADDED;\nextern NSString *const QUOTES;\nextern NSString *const EQUALS;\nextern NSString *const TILDA;\nextern NSString *const SLASH;\nextern NSString *const X;\nextern NSString *const Y;\nextern NSString *const WIDTH;\nextern NSString *const HEIGHT;\nextern NSString *const WHITESPACE;\n\n// Screen constants\nextern NSString *const REF_CURRENT_SCREEN;\nextern NSInteger const ID_MAIN_SCREEN;\nextern NSInteger const ID_CURRENT_SCREEN;\nextern NSInteger const ID_IGNORE_SCREEN;\nextern NSInteger const TYPE_UNKNOWN;\nextern NSInteger const TYPE_COUNT;\nextern NSInteger const TYPE_RESOLUTIONS;\nextern NSString *const COUNT;\nextern NSString *const RESOLUTIONS;\nextern NSString *const ORDERED;\n\n// Notifications\nextern NSString *const NOTIFICATION_SCREEN_CHANGE;\nextern NSString *const NOTIFICATION_SCREEN_CHANGE_LION;\n\n// Applications\nextern NSString *const FINDER;\n\n// Window Hint\nextern NSInteger const HINT_X_PADDING;\nextern NSString *const HINT_CHARACTERS;\nextern NSInteger const MAIN_MENU_HEIGHT;\n\n// Internal Snapshots\nextern NSString *const MENU_SNAPSHOT;\nextern NSString *const UNDO_SNAPSHOT;\n\n// File Extensions\nextern NSString *const EXT_JS;\n\n// Javascript Operation Options Hash Keys\nextern NSString *const OPT_STYLE;\nextern NSString *const OPT_DIRECTION;\nextern NSString *const OPT_SCREEN;\nextern NSString *const OPT_X;\nextern NSString *const OPT_Y;\nextern NSString *const OPT_WIDTH;\nextern NSString *const OPT_HEIGHT;\nextern NSString *const OPT_ANCHOR;\nextern NSString *const OPT_APP;\nextern NSString *const OPT_COMMAND;\nextern NSString *const OPT_WAIT;\nextern NSString *const OPT_PATH;\nextern NSString *const OPT_NAME;\nextern NSString *const OPT_CHARACTERS;\nextern NSString *const OPT_PADDING;\nextern NSString *const OPT_GRIDS;\nextern NSString *const OPT_BACK;\nextern NSString *const OPT_QUIT;\nextern NSString *const OPT_FORCE_QUIT;\nextern NSString *const OPT_HIDE;\nextern NSString *const OPT_DELETE;\nextern NSString *const OPT_ALL;\nextern NSString *const OPT_SAVE;\nextern NSString *const OPT_STACK;\nextern NSString *const OPT_OPERATIONS;\nextern NSString *const OPT_IGNORE_FAIL;\nextern NSString *const OPT_REPEAT;\nextern NSString *const OPT_REPEAT_LAST;\nextern NSString *const OPT_SORT_TITLE;\nextern NSString *const OPT_MAIN_FIRST;\nextern NSString *const OPT_MAIN_LAST;\nextern NSString *const OPT_TITLE_ORDER;\nextern NSString *const OPT_TITLE_ORDER_REGEX;\nextern NSString *const OPT_BEFORE;\nextern NSString *const OPT_AFTER;"
  },
  {
    "path": "Slate/Constants.m",
    "content": "//\n//  Constants.m\n//  Slate\n//\n//  Created by Jigish Patel on 5/26/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"Constants.h\"\n\nNSInteger const MODAL_ESCAPE_ID = 40000;\n\nNSString *const SNAPSHOTS_FILE = @\"snapshots\";\n\n// Directive Keys\nNSString *const BIND = @\"bind\";\nNSString *const CONFIG = @\"config\";\nNSString *const LAYOUT = @\"layout\";\nNSString *const DEFAULT = @\"default\";\nNSString *const ALIAS = @\"alias\";\nNSString *const SOURCE = @\"source\";\n\n// Source Option Keys\nNSString *const IF_EXISTS = @\"if_exists\";\n\n// Config Keys\nNSString *const DEFAULT_TO_CURRENT_SCREEN = @\"defaultToCurrentScreen\";\nNSString *const DEFAULT_TO_CURRENT_SCREEN_DEFAULT = @\"false\";\nNSString *const NUDGE_PERCENT_OF = @\"nudgePercentOf\";\nNSString *const NUDGE_PERCENT_OF_DEFAULT = @\"screenSize\";\nNSString *const RESIZE_PERCENT_OF = @\"resizePercentOf\";\nNSString *const RESIZE_PERCENT_OF_DEFAULT = @\"screenSize\";\nNSString *const REPEAT_ON_HOLD_OPS = @\"repeatOnHoldOps\";\nNSString *const REPEAT_ON_HOLD_OPS_DEFAULT = @\"resize,nudge\";\nNSString *const SECONDS_BEFORE_REPEAT = @\"secondsBeforeRepeat\";\nNSString *const SECONDS_BEFORE_REPEAT_DEFAULT = @\"0.4\";\nNSString *const SECONDS_BETWEEN_REPEAT = @\"secondsBetweenRepeat\";\nNSString *const SECONDS_BETWEEN_REPEAT_DEFAULT = @\"0.2\";\nNSString *const CHECK_DEFAULTS_ON_LOAD = @\"checkDefaultsOnLoad\";\nNSString *const CHECK_DEFAULTS_ON_LOAD_DEFAULT = @\"false\";\nNSString *const FOCUS_CHECK_WIDTH = @\"focusCheckWidth\";\nNSString *const FOCUS_CHECK_WIDTH_DEFAULT = @\"100\";\nNSString *const FOCUS_CHECK_WIDTH_MAX = @\"focusCheckWidthMax\";\nNSString *const FOCUS_CHECK_WIDTH_MAX_DEFAULT = @\"100\";\nNSString *const FOCUS_PREFER_SAME_APP = @\"focusPreferSameApp\";\nNSString *const FOCUS_PREFER_SAME_APP_DEFAULT = @\"true\";\nNSString *const ORDER_SCREENS_LEFT_TO_RIGHT = @\"orderScreensLeftToRight\";\nNSString *const ORDER_SCREENS_LEFT_TO_RIGHT_DEFAULT = @\"true\";\nNSString *const WINDOW_HINTS_FONT_NAME = @\"windowHintsFontName\";\nNSString *const WINDOW_HINTS_FONT_NAME_DEFAULT = @\"Helvetica\";\nNSString *const WINDOW_HINTS_FONT_SIZE = @\"windowHintsFontSize\";\nNSString *const WINDOW_HINTS_FONT_SIZE_DEFAULT = @\"40\";\nNSString *const WINDOW_HINTS_FONT_COLOR = @\"windowHintsFontColor\";\nNSString *const WINDOW_HINTS_FONT_COLOR_DEFAULT = @\"255;255;255;1.0\";\nNSString *const WINDOW_HINTS_WIDTH = @\"windowHintsWidth\";\nNSString *const WINDOW_HINTS_WIDTH_DEFAULT = @\"100\";\nNSString *const WINDOW_HINTS_HEIGHT = @\"windowHintsHeight\";\nNSString *const WINDOW_HINTS_HEIGHT_DEFAULT = @\"100\";\nNSString *const WINDOW_HINTS_BACKGROUND_COLOR = @\"windowHintsBackgroundColor\";\nNSString *const WINDOW_HINTS_BACKGROUND_COLOR_DEFAULT = @\"50;53;58;0.9\";\nNSString *const WINDOW_HINTS_DURATION = @\"windowHintsDuration\";\nNSString *const WINDOW_HINTS_DURATION_DEFAULT = @\"3\";\nNSString *const WINDOW_HINTS_ROUNDED_CORNER_SIZE = @\"windowHintsRoundedCornerSize\";\nNSString *const WINDOW_HINTS_ROUNDED_CORNER_SIZE_DEFAULT = @\"5\";\nNSString *const WINDOW_HINTS_IGNORE_HIDDEN_WINDOWS = @\"windowHintsIgnoreHiddenWindows\";\nNSString *const WINDOW_HINTS_IGNORE_HIDDEN_WINDOWS_DEFAULT = @\"true\";\nNSString *const WINDOW_HINTS_TOP_LEFT_X = @\"windowHintsTopLeftX\";\nNSString *const WINDOW_HINTS_TOP_LEFT_X_DEFAULT = @\"(windowSizeX/2)-(windowHintsWidth/2);0\";\nNSString *const WINDOW_HINTS_TOP_LEFT_Y = @\"windowHintsTopLeftY\";\nNSString *const WINDOW_HINTS_TOP_LEFT_Y_DEFAULT = @\"(windowSizeY/2)-(windowHintsHeight/2);0\";\nNSString *const WINDOW_HINTS_ORDER = @\"windowHintsOrder\";\nNSString *const WINDOW_HINTS_ORDER_DEFAULT = @\"leftToRight\";\nNSString *const WINDOW_HINTS_SHOW_ICONS = @\"windowHintsShowIcons\";\nNSString *const WINDOW_HINTS_SHOW_ICONS_DEFAULT = @\"false\";\nNSString *const WINDOW_HINTS_ICON_ALPHA = @\"windowHintsIconAlpha\";\nNSString *const WINDOW_HINTS_ICON_ALPHA_DEFAULT = @\"1.0\";\nNSString *const WINDOW_HINTS_SPREAD = @\"windowHintsSpread\";\nNSString *const WINDOW_HINTS_SPREAD_DEFAULT = @\"false\";\nNSString *const WINDOW_HINTS_SPREAD_SEARCH_WIDTH = @\"windowHintsSpreadSearchWidth\";\nNSString *const WINDOW_HINTS_SPREAD_SEARCH_WIDTH_DEFAULT = @\"40\";\nNSString *const WINDOW_HINTS_SPREAD_SEARCH_HEIGHT = @\"windowHintsSpreadSearchHeight\";\nNSString *const WINDOW_HINTS_SPREAD_SEARCH_HEIGHT_DEFAULT = @\"40\";\nNSString *const WINDOW_HINTS_SPREAD_PADDING = @\"windowHintsSpreadPadding\";\nNSString *const WINDOW_HINTS_SPREAD_PADDING_DEFAULT = @\"20\";\nNSString *const SWITCH_ICON_SIZE = @\"switchIconSize\";\nNSString *const SWITCH_ICON_SIZE_DEFAULT = @\"100\";\nNSString *const SWITCH_ICON_PADDING = @\"switchIconPadding\";\nNSString *const SWITCH_ICON_PADDING_DEFAULT = @\"5\";\nNSString *const SWITCH_BACKGROUND_COLOR = @\"switchBackgroundColor\";\nNSString *const SWITCH_BACKGROUND_COLOR_DEFAULT = @\"50;53;58;0.3\";\nNSString *const SWITCH_SELECTED_BACKGROUND_COLOR = @\"switchSelectedBackgroundColor\";\nNSString *const SWITCH_SELECTED_BACKGROUND_COLOR_DEFAULT = @\"50;53;58;0.9\";\nNSString *const SWITCH_SELECTED_BORDER_COLOR = @\"switchSelectedBorderColor\";\nNSString *const SWITCH_SELECTED_BORDER_COLOR_DEFAULT = @\"230;230;230;0.9\";\nNSString *const SWITCH_SELECTED_BORDER_SIZE = @\"switchSelectedBorderSize\";\nNSString *const SWITCH_SELECTED_BORDER_SIZE_DEFAULT = @\"2\";\nNSString *const SWITCH_ROUNDED_CORNER_SIZE = @\"switchRoundedCornerSize\";\nNSString *const SWITCH_ROUNDED_CORNER_SIZE_DEFAULT = @\"5\";\nNSString *const SWITCH_ORIENTATION = @\"switchOrientation\";\nNSString *const SWITCH_ORIENTATION_DEFAULT = @\"horizontal\";\nNSString *const SWITCH_SECONDS_BEFORE_REPEAT = @\"switchSecondsBeforeRepeat\";\nNSString *const SWITCH_SECONDS_BEFORE_REPEAT_DEFAULT = @\"0.3\";\nNSString *const SWITCH_SECONDS_BETWEEN_REPEAT = @\"switchSecondsBetweenRepeat\";\nNSString *const SWITCH_SECONDS_BETWEEN_REPEAT_DEFAULT = @\"0.03\";\nNSString *const SWITCH_STOP_REPEAT_AT_EDGE = @\"switchStopRepeatAtEdge\";\nNSString *const SWITCH_STOP_REPEAT_AT_EDGE_DEFAULT = @\"true\";\nNSString *const SWITCH_ONLY_FOCUS_MAIN_WINDOW = @\"switchOnlyFocusMainWindow\";\nNSString *const SWITCH_ONLY_FOCUS_MAIN_WINDOW_DEFAULT = @\"true\";\nNSString *const SWITCH_FONT_SIZE = @\"switchFontSize\";\nNSString *const SWITCH_FONT_SIZE_DEFAULT = @\"14\";\nNSString *const SWITCH_FONT_COLOR = @\"switchFontColor\";\nNSString *const SWITCH_FONT_COLOR_DEFAULT = @\"255;255;255;1.0\";\nNSString *const SWITCH_FONT_NAME = @\"switchFontName\";\nNSString *const SWITCH_FONT_NAME_DEFAULT = @\"Helvetica\";\nNSString *const SWITCH_SHOW_TITLES = @\"switchShowTitles\";\nNSString *const SWITCH_SHOW_TITLES_DEFAULT = @\"false\";\nNSString *const SWITCH_TYPE = @\"switchType\";\nNSString *const SWITCH_TYPE_DEFAULT = @\"app\";\nNSString *const SWITCH_SELECTED_PADDING = @\"switchSelectedPadding\";\nNSString *const SWITCH_SELECTED_PADDING_DEFAULT = @\"10\";\nNSString *const KEYBOARD_LAYOUT = @\"keyboardLayout\";\nNSString *const KEYBOARD_LAYOUT_DEFAULT = @\"qwerty\";\nNSString *const SNAPSHOT_TITLE_MATCH = @\"snapshotTitleMatch\";\nNSString *const SNAPSHOT_TITLE_MATCH_DEFAULT = @\"levenshtein\";\nNSString *const LEVENSHTEIN = @\"levenshtein\";\nNSString *const SEQUENTIAL = @\"sequential\";\nNSString *const SNAPSHOT_MAX_STACK_SIZE = @\"snapshotMaxStackSize\";\nNSString *const SNAPSHOT_MAX_STACK_SIZE_DEFAULT = @\"0\";\nNSString *const UNDO_MAX_STACK_SIZE = @\"undoMaxStackSize\";\nNSString *const UNDO_MAX_STACK_SIZE_DEFAULT = @\"10\";\nNSString *const UNDO_OPS = @\"undoOps\";\nNSString *const UNDO_OPS_DEFAULT = @\"activate-snapshot,chain,grid,layout,move,push,nudge,corner,throw,resize,sequence,shell\";\nNSString *const GRID_BACKGROUND_COLOR = @\"gridBackgroundColor\";\nNSString *const GRID_BACKGROUND_COLOR_DEFAULT = @\"75;77;81;1.0\";\nNSString *const GRID_ROUNDED_CORNER_SIZE = @\"gridRoundedCornerSize\";\nNSString *const GRID_ROUNDED_CORNER_SIZE_DEFAULT = @\"5\";\nNSString *const GRID_CELL_BACKGROUND_COLOR = @\"gridCellBackgroundColor\";\nNSString *const GRID_CELL_BACKGROUND_COLOR_DEFAULT = @\"100;106;116;0.8\";\nNSString *const GRID_CELL_SELECTED_COLOR = @\"gridCellSelectedColor\";\nNSString *const GRID_CELL_SELECTED_COLOR_DEFAULT = @\"50;53;58;0.8\";\nNSString *const GRID_CELL_ROUNDED_CORNER_SIZE = @\"gridCellRoundedCornerSize\";\nNSString *const GRID_CELL_ROUNDED_CORNER_SIZE_DEFAULT = @\"5\";\nNSString *const LAYOUT_FOCUS_ON_ACTIVATE = @\"layoutFocusOnActivate\";\nNSString *const LAYOUT_FOCUS_ON_ACTIVATE_DEFAULT = @\"false\";\nNSString *const MODAL_ESCAPE_KEY = @\"modalEscapeKey\";\nNSString *const MODAL_ESCAPE_KEY_DEFAULT = @\"\";\nNSString *const JS_RECEIVE_MOVE_EVENT = @\"jsReceiveMoveEvent\";\nNSString *const JS_RECEIVE_MOVE_EVENT_DEFAULT = @\"false\";\nNSString *const JS_RECEIVE_RESIZE_EVENT = @\"jsReceiveResizeEvent\";\nNSString *const JS_RECEIVE_RESIZE_EVENT_DEFAULT = @\"false\";\n\n// Application Option Keys\nNSString *const IGNORE_FAIL = @\"IGNORE_FAIL\";\nNSString *const REPEAT = @\"REPEAT\";\nNSString *const REPEAT_LAST = @\"REPEAT_LAST\";\nNSString *const SORT_TITLE = @\"SORT_TITLE\";\nNSString *const MAIN_FIRST = @\"MAIN_FIRST\";\nNSString *const MAIN_LAST = @\"MAIN_LAST\";\nNSString *const TITLE_ORDER = @\"TITLE_ORDER=\";\nNSString *const TITLE_ORDER_REGEX = @\"TITLE_ORDER_REGEX=\";\n\n// Modifier Keys\nNSString *const CONTROL = @\"ctrl\";\nNSString *const COMMAND = @\"cmd\";\nNSString *const OPTION = @\"alt\";\nNSString *const SHIFT = @\"shift\";\nNSString *const FUNCTION = @\"fn\";\nUInt32 const FUNCTION_KEY = 0x800000;\n\n// Expression Keys\nNSString *const SCREEN_ORIGIN_X = @\"screenOriginX\";\nNSString *const SCREEN_ORIGIN_Y = @\"screenOriginY\";\nNSString *const SCREEN_SIZE = @\"screenSize\";\nNSString *const SCREEN_SIZE_X = @\"screenSizeX\";\nNSString *const SCREEN_SIZE_Y = @\"screenSizeY\";\nNSString *const WINDOW_TOP_LEFT_X = @\"windowTopLeftX\";\nNSString *const WINDOW_TOP_LEFT_Y = @\"windowTopLeftY\";\nNSString *const WINDOW_SIZE_X = @\"windowSizeX\";\nNSString *const WINDOW_SIZE_Y = @\"windowSizeY\";\nNSString *const NEW_WINDOW_SIZE = @\"newWindowSize\";\nNSString *const NEW_WINDOW_SIZE_X = @\"newWindowSizeX\";\nNSString *const NEW_WINDOW_SIZE_Y = @\"newWindowSizeY\";\n\n// Operations\nNSString *const MOVE = @\"move\";\nNSString *const RESIZE = @\"resize\";\nNSString *const PUSH = @\"push\";\nNSString *const NUDGE = @\"nudge\";\nNSString *const THROW = @\"throw\";\nNSString *const CORNER = @\"corner\";\nNSString *const CHAIN = @\"chain\";\nNSString *const FOCUS = @\"focus\";\nNSString *const SNAPSHOT = @\"snapshot\";\nNSString *const ACTIVATE_SNAPSHOT = @\"activate-snapshot\";\nNSString *const DELETE_SNAPSHOT = @\"delete-snapshot\";\nNSString *const HINT = @\"hint\";\nNSString *const SWITCH = @\"switch\";\nNSString *const GRID = @\"grid\";\nNSString *const SEQUENCE = @\"sequence\";\nNSString *const HIDE = @\"hide\";\nNSString *const SHOW = @\"show\";\nNSString *const TOGGLE = @\"toggle\";\nNSString *const RELAUNCH = @\"relaunch\";\nNSString *const SHELL = @\"shell\";\nNSString *const UNDO = @\"undo\";\n\n// Parameters and Options\nNSString *const CENTER = @\"center\";\nNSString *const BAR = @\"bar\";\nNSString *const BAR_RESIZE_WITH_VALUE = @\"bar-resize:\";\nNSString *const NONE = @\"none\";\nNSString *const NORESIZE = @\"noresize\";\nNSString *const RESIZE_WITH_VALUE = @\"resize:\";\nNSString *const SAVE_TO_DISK = @\"save-to-disk\";\nNSString *const STACK = @\"stack\";\nNSString *const NAME = @\"name\";\nNSString *const SNAPSHOTS = @\"snapshots\";\nNSString *const APPS = @\"apps\";\nNSString *const APP_NAME = @\"app-name\";\nNSString *const TITLE = @\"title\";\nNSString *const SIZE = @\"size\";\nNSString *const ALL = @\"all\";\nNSString *const DELETE = @\"delete\";\nNSString *const BACK = @\"back\";\nNSString *const QUIT = @\"quit\";\nNSString *const FORCE_QUIT = @\"force-quit\";\nNSString *const WINDOW_HINTS_ORDER_NONE = @\"none\";\nNSString *const WINDOW_HINTS_ORDER_PERSIST = @\"persist\";\nNSString *const WINDOW_HINTS_ORDER_LEFT_TO_RIGHT = @\"leftToRight\";\nNSString *const WINDOW_HINTS_ORDER_RIGHT_TO_LEFT = @\"rightToLeft\";\nNSString *const SWITCH_ORIENTATION_HORIZONTAL = @\"horizontal\";\nNSString *const SWITCH_ORIENTATION_VERTICAL = @\"vertical\";\nNSString *const KEYBOARD_LAYOUT_DVORAK = @\"dvorak\";\nNSString *const KEYBOARD_LAYOUT_COLEMAK = @\"colemak\";\nNSString *const KEYBOARD_LAYOUT_AZERTY = @\"azerty\";\nNSString *const PADDING = @\"padding\";\nNSString *const CURRENT = @\"current\";\nNSString *const ALL_BUT = @\"all-but:\";\nNSString *const WAIT = @\"wait\";\nNSString *const PATH = @\"path:\";\nNSString *const APP_NAME_BEFORE = @\"BEFORE\";\nNSString *const APP_NAME_AFTER = @\"AFTER\";\n\n// Directions and Anchors\nNSString *const UP = @\"up\";\nNSString *const DOWN = @\"down\";\nNSString *const LEFT = @\"left\";\nNSString *const RIGHT = @\"right\";\nNSString *const TOP = @\"top\";\nNSString *const BOTTOM = @\"bottom\";\nNSString *const ABOVE = @\"above\";\nNSString *const BELOW = @\"below\";\nNSString *const NEXT = @\"next\";\nNSString *const PREVIOUS = @\"previous\";\nNSString *const PREV = @\"prev\";\nNSString *const BEHIND = @\"behind\";\nNSString *const TOP_LEFT = @\"top-left\";\nNSString *const TOP_RIGHT = @\"top-right\";\nNSString *const BOTTOM_LEFT = @\"bottom-left\";\nNSString *const BOTTOM_RIGHT = @\"bottom-right\";\nNSInteger const DIRECTION_UNKNOWN = -1;\nNSInteger const DIRECTION_UP = 0;\nNSInteger const DIRECTION_DOWN = 1;\nNSInteger const DIRECTION_LEFT = 2;\nNSInteger const DIRECTION_RIGHT = 3;\nNSInteger const DIRECTION_TOP = 4;\nNSInteger const DIRECTION_BOTTOM = 5;\nNSInteger const DIRECTION_ABOVE = 6;\nNSInteger const DIRECTION_BELOW = 7;\nNSInteger const DIRECTION_BEHIND = 8;\nNSInteger const ANCHOR_TOP_LEFT = 0;\nNSInteger const ANCHOR_TOP_RIGHT = 1;\nNSInteger const ANCHOR_BOTTOM_LEFT = 2;\nNSInteger const ANCHOR_BOTTOM_RIGHT = 3;\n\n// Seperators and such\nunichar const COMMENT_CHARACTER = '#';\nNSString *const COMMA = @\",\";\nNSString *const COLON = @\":\";\nNSString *const SEMICOLON = @\";\";\nNSString *const MINUS = @\"-\";\nNSString *const PLUS = @\"+\";\nNSString *const PERCENT = @\"%\";\nNSString *const EMPTY = @\"\";\nNSString *const PIPE_PADDED = @\" | \";\nNSString *const GREATER_THAN_PADDED = @\" > \";\nNSString *const QUOTES = @\"'\\\"\";\nNSString *const EQUALS = @\"=\";\nNSString *const TILDA = @\"~\";\nNSString *const SLASH = @\"/\";\nNSString *const X = @\"x\";\nNSString *const Y = @\"y\";\nNSString *const WIDTH = @\"width\";\nNSString *const HEIGHT = @\"height\";\nNSString *const WHITESPACE = @\" \\t\";\n\n// Screen constants\nNSString *const REF_CURRENT_SCREEN = @\"-1\";\nNSInteger const ID_MAIN_SCREEN = 0;\nNSInteger const ID_CURRENT_SCREEN = -1;\nNSInteger const ID_IGNORE_SCREEN = -2;\nNSInteger const TYPE_UNKNOWN = -1;\nNSInteger const TYPE_COUNT = 0;\nNSInteger const TYPE_RESOLUTIONS = 1;\nNSString *const COUNT = @\"count\";\nNSString *const RESOLUTIONS = @\"resolutions\";\nNSString *const ORDERED = @\"ordered\";\n\n// Notifications\nNSString *const NOTIFICATION_SCREEN_CHANGE = @\"O3DeviceTimingChanged\";\nNSString *const NOTIFICATION_SCREEN_CHANGE_LION = @\" com.apple.BezelServices.BMDisplayHWReconfiguredEvent\";\n\n// Applications\nNSString *const FINDER = @\"Finder\";\n\n// Window Hints\nNSInteger const HINT_X_PADDING = 4;\nNSString *const HINT_CHARACTERS = @\"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\nNSInteger const MAIN_MENU_HEIGHT = 22;\n\n// Internal Snapshots\nNSString *const MENU_SNAPSHOT = @\"menuSnapshot\"; // need to change this name.\nNSString *const UNDO_SNAPSHOT = @\"_internal_UndoSnapshot\";\n\n// File Extensions\nNSString *const EXT_JS = @\".js\";\n\n// Javascript Operation Options Hash Keys\nNSString *const OPT_STYLE = @\"style\";\nNSString *const OPT_DIRECTION = @\"direction\";\nNSString *const OPT_SCREEN = @\"screen\";\nNSString *const OPT_X = @\"x\";\nNSString *const OPT_Y = @\"y\";\nNSString *const OPT_WIDTH = @\"width\";\nNSString *const OPT_HEIGHT = @\"height\";\nNSString *const OPT_ANCHOR = @\"anchor\";\nNSString *const OPT_APP = @\"app\";\nNSString *const OPT_COMMAND = @\"command\";\nNSString *const OPT_WAIT = @\"wait\";\nNSString *const OPT_PATH = @\"path\";\nNSString *const OPT_NAME = @\"name\";\nNSString *const OPT_CHARACTERS = @\"characters\";\nNSString *const OPT_PADDING = @\"padding\";\nNSString *const OPT_GRIDS = @\"grids\";\nNSString *const OPT_BACK = @\"back\";\nNSString *const OPT_QUIT = @\"quit\";\nNSString *const OPT_FORCE_QUIT = @\"force-quit\";\nNSString *const OPT_HIDE = @\"hide\";\nNSString *const OPT_DELETE = @\"delete\";\nNSString *const OPT_ALL = @\"all\";\nNSString *const OPT_SAVE = @\"save\";\nNSString *const OPT_STACK = @\"stack\";\nNSString *const OPT_OPERATIONS = @\"operations\";\nNSString *const OPT_IGNORE_FAIL = @\"ignore-fail\";\nNSString *const OPT_REPEAT = @\"repeat\";\nNSString *const OPT_REPEAT_LAST = @\"repeat-last\";\nNSString *const OPT_SORT_TITLE = @\"sort-title\";\nNSString *const OPT_MAIN_FIRST = @\"main-first\";\nNSString *const OPT_MAIN_LAST = @\"main-last\";\nNSString *const OPT_TITLE_ORDER = @\"title-order\";\nNSString *const OPT_TITLE_ORDER_REGEX = @\"title-order-regex\";\nNSString *const OPT_BEFORE = @\"_before_\";\nNSString *const OPT_AFTER = @\"_after_\";"
  },
  {
    "path": "Slate/CornerOperation.h",
    "content": "//\n//  CornerOperation.h\n//  Slate\n//\n//  Created by Jigish Patel on 1/20/13.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"MoveOperation.h\"\n\n@interface CornerOperation : MoveOperation\n\n+ (id)cornerOperation;\n+ (id)cornerOperationFromString:(NSString *)cornerOperation;\n\n@end\n"
  },
  {
    "path": "Slate/CornerOperation.m",
    "content": "//\n//  CornerOperation.m\n//  Slate\n//\n//  Created by Jigish Patel on 1/20/13.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"CornerOperation.h\"\n#import \"StringTokenizer.h\"\n#import \"Constants.h\"\n#import \"SlateLogger.h\"\n\n@implementation CornerOperation\n\n- (NSArray *)requiredOptions {\n  return [NSArray arrayWithObjects:OPT_DIRECTION, nil];\n}\n\n- (void)afterEvalOptions {\n  NSString *width = [[self options] objectForKey:OPT_WIDTH];\n  if (width == nil) { width = @\"windowSizeX\"; }\n  NSString *height = [[self options] objectForKey:OPT_HEIGHT];\n  if (height == nil) { height = @\"windowSizeY\"; }\n  [self setDimensions:[[ExpressionPoint alloc] initWithX:width y:height]];\n  NSString *screen = [[self options] objectForKey:OPT_SCREEN];\n  if (screen == nil) { screen = REF_CURRENT_SCREEN; }\n  [self setMonitor:screen];\n  NSString *direction = [[self options] objectForKey:OPT_DIRECTION];\n  if ([direction isEqualToString:TOP_LEFT]) {\n    [self setTopLeft:[[ExpressionPoint alloc] initWithX:@\"screenOriginX\" y:@\"screenOriginY\"]];\n  } else if ([direction isEqualToString:TOP_RIGHT]) {\n    [self setTopLeft:[[ExpressionPoint alloc] initWithX:[NSString stringWithFormat:@\"screenOriginX+screenSizeX-(%@)\", [[self dimensions] x]] y:@\"screenOriginY\"]];\n  } else if ([direction isEqualToString:BOTTOM_LEFT]) {\n    [self setTopLeft:[[ExpressionPoint alloc] initWithX:@\"screenOriginX\" y:[NSString stringWithFormat:@\"screenOriginY+screenSizeY-(%@)\", [[self dimensions] y]]]];\n  } else if ([direction isEqualToString:BOTTOM_RIGHT]) {\n    [self setTopLeft:[[ExpressionPoint alloc] initWithX:[NSString stringWithFormat:@\"screenOriginX+screenSizeX-(%@)\", [[self dimensions] x]] y:[NSString stringWithFormat:@\"screenOriginY+screenSizeY-(%@)\", [[self dimensions] y]]]];\n  } else {\n    SlateLogger(@\"ERROR: Unrecognized corner '%@'\", direction);\n    @throw([NSException exceptionWithName:@\"Unrecognized Corner\" reason:[NSString stringWithFormat:@\"Unrecognized corner '%@'\", direction] userInfo:nil]);\n  }\n}\n\n+ (id)cornerOperation {\n  return [[CornerOperation alloc] init];\n}\n\n+ (id)cornerOperationFromString:(NSString *)cornerOperation {\n  // corner <top-left|top-right|bottom-left|bottom-right> <optional:resize:expression> <optional:monitor>\n  NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n  [StringTokenizer tokenize:cornerOperation into:tokens];\n\n  if ([tokens count] < 2) {\n    SlateLogger(@\"ERROR: Invalid Parameters '%@'\", cornerOperation);\n    @throw([NSException exceptionWithName:@\"Invalid Parameters\" reason:[NSString stringWithFormat:@\"Invalid Parameters in '%@'. Corner operations require the following format: 'corner direction [optional:style]'\", cornerOperation] userInfo:nil]);\n  }\n\n  NSString *tl = nil;\n  NSString *dim = @\"windowSizeX;windowSizeY\";\n  NSString *direction = [tokens objectAtIndex:1];\n\n  if ([tokens count] >= 3) {\n    NSString *style = [tokens objectAtIndex:2];\n    if ([style hasPrefix:RESIZE_WITH_VALUE]) {\n      dim = [[style componentsSeparatedByString:COLON] objectAtIndex:1];\n    }\n  }\n\n  if ([direction isEqualToString:TOP_LEFT]) {\n    tl = @\"screenOriginX;screenOriginY\";\n  } else if ([direction isEqualToString:TOP_RIGHT]) {\n    tl = [[@\"screenOriginX+screenSizeX-\" stringByAppendingString:[[dim componentsSeparatedByString:SEMICOLON] objectAtIndex:0]] stringByAppendingString:@\";screenOriginY\"];\n  } else if ([direction isEqualToString:BOTTOM_LEFT]) {\n    tl = [@\"screenOriginX;screenOriginY+screenSizeY-\" stringByAppendingString:[[dim componentsSeparatedByString:SEMICOLON] objectAtIndex:1]];\n  } else if ([direction isEqualToString:BOTTOM_RIGHT]) {\n    tl = [[[@\"screenOriginX+screenSizeX-\" stringByAppendingString:[[dim componentsSeparatedByString:SEMICOLON] objectAtIndex:0]] stringByAppendingString:@\";screenOriginY+screenSizeY-\"] stringByAppendingString:[[dim componentsSeparatedByString:SEMICOLON] objectAtIndex:1]];\n  } else {\n    SlateLogger(@\"ERROR: Unrecognized corner '%@'\", direction);\n    @throw([NSException exceptionWithName:@\"Unrecognized Corner\" reason:[NSString stringWithFormat:@\"Unrecognized corner '%@' in '%@'\", direction, cornerOperation] userInfo:nil]);\n  }\n\n  Operation *op = [[MoveOperation alloc] initWithTopLeft:tl dimensions:dim monitor:([tokens count] >=4 ? [tokens objectAtIndex:3] : REF_CURRENT_SCREEN)];\n  return op;\n}\n\n@end\n"
  },
  {
    "path": "Slate/DeleteSnapshotOperation.h",
    "content": "//\n//  DeleteSnapshotOperation.h\n//  Slate\n//\n//  Created by Jigish Patel on 2/28/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"Operation.h\"\n\n@interface DeleteSnapshotOperation : Operation {\n@private\n  NSString *name;\n  BOOL pop;\n}\n\n@property  NSString *name;\n@property (assign) BOOL pop;\n\n- (id)initWithName:(NSString *)theName options:(NSString *)options;\n\n+ (id)deleteSnapshotOperation;\n+ (id)deleteSnapshotOperationFromString:(NSString *)deleteSnapshotOperation;\n\n@end\n"
  },
  {
    "path": "Slate/DeleteSnapshotOperation.m",
    "content": "//\n//  DeleteSnapshotOperation.m\n//  Slate\n//\n//  Created by Jigish Patel on 2/28/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"DeleteSnapshotOperation.h\"\n#import \"Constants.h\"\n#import \"SlateConfig.h\"\n#import \"StringTokenizer.h\"\n#import \"SlateLogger.h\"\n\n@implementation DeleteSnapshotOperation\n\n@synthesize name, pop;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    pop = YES;\n  }\n  return self;\n}\n\n- (id)initWithName:(NSString *)theName options:(NSString *)_options {\n  self = [self init];\n  if (self) {\n    [self setName:theName];\n    if (_options) {\n      NSArray *optionsTokens = [_options componentsSeparatedByString:SEMICOLON];\n      for (NSInteger i = 0; i < [optionsTokens count]; i++) {\n        NSString *option = [optionsTokens objectAtIndex:i];\n        if ([ALL isEqualToString:option]) {\n          pop = NO;\n        }\n      }\n    }\n  }\n  return self;\n}\n\n- (BOOL)doOperation {\n  SlateLogger(@\"----------------- Begin Delete Snapshot Operation -----------------\");\n  BOOL success = [self doOperationWithAccessibilityWrapper:nil screenWrapper:nil];\n  SlateLogger(@\"-----------------  End Delete Snapshot Operation  -----------------\");\n  return success;\n}\n\n- (BOOL)doOperationWithAccessibilityWrapper:(AccessibilityWrapper *)iamnil screenWrapper:(ScreenWrapper *)iamalsonil {\n  [self evalOptionsWithAccessibilityWrapper:iamnil screenWrapper:iamalsonil];\n  [[SlateConfig getInstance] deleteSnapshot:name pop:pop];\n  return YES;\n}\n\n- (BOOL)testOperation {\n  return YES;\n}\n\n- (NSArray *)requiredOptions {\n  return [NSArray arrayWithObject:OPT_NAME];\n}\n\n- (void)parseOption:(NSString *)_name value:(id)value {\n  if (value == nil) { return; }\n  if ([_name isEqualToString:OPT_NAME]) {\n    if (![value isKindOfClass:[NSString class]]) {\n      @throw([NSException exceptionWithName:[NSString stringWithFormat:@\"Invalid %@\", _name] reason:[NSString stringWithFormat:@\"Invalid %@ '%@'\", _name, value] userInfo:nil]);\n      return;\n    }\n    [self setName:_name];\n  } else if ([_name isEqualToString:OPT_ALL]) {\n    if (![value isKindOfClass:[NSValue class]] && ![value isKindOfClass:[NSString class]] && ![value isKindOfClass:[NSNumber class]]) {\n      @throw([NSException exceptionWithName:[NSString stringWithFormat:@\"Invalid %@\", _name] reason:[NSString stringWithFormat:@\"Invalid %@ '%@'\", _name, value] userInfo:nil]);\n      return;\n    }\n    [self setPop:![value boolValue]];\n  }\n}\n\n+ (id)deleteSnapshotOperation {\n  return [[DeleteSnapshotOperation alloc] init];\n}\n\n+ (id)deleteSnapshotOperationFromString:(NSString *)deleteSnapshotOperation {\n  // delete-snapshot name options\n  NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n  [StringTokenizer tokenize:deleteSnapshotOperation into:tokens maxTokens:3];\n\n  if ([tokens count] < 2) {\n    SlateLogger(@\"ERROR: Invalid Parameters '%@'\", deleteSnapshotOperation);\n    @throw([NSException exceptionWithName:@\"Invalid Parameters\" reason:[NSString stringWithFormat:@\"Invalid Parameters in '%@'. Delete Snapshot operations require the following format: 'delete-snapshot name options'\", deleteSnapshotOperation] userInfo:nil]);\n  }\n\n  Operation *op = [[DeleteSnapshotOperation alloc] initWithName:[tokens objectAtIndex:1] options:([tokens count] > 2 ? [tokens objectAtIndex:2] : nil)];\n  return op;\n}\n\n@end\n"
  },
  {
    "path": "Slate/ExpressionPoint.h",
    "content": "//\n//  ExpressionPoint.h\n//  Slate\n//\n//  Created by Jigish Patel on 5/18/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n\n\n@interface ExpressionPoint : NSObject {\n@private\n  NSString *x;\n  NSString *y;\n}\n\n@property (copy) NSString *x;\n@property (copy) NSString *y;\n\n- (id)initWithX:(NSString *)xVal y:(NSString *)yVal;\n\n- (NSPoint)getPointWithDict:(NSDictionary *)values;\n- (NSSize)getSizeWithDict:(NSDictionary *)values;\n\n+ (float)expToFloat:(NSString *)exp withDict:(NSDictionary *)values;\n\n@end\n"
  },
  {
    "path": "Slate/ExpressionPoint.m",
    "content": "//\n//  ExpressionPoint.m\n//  Slate\n//\n//  Created by Jigish Patel on 5/18/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"ExpressionPoint.h\"\n\n\n@implementation ExpressionPoint\n\n@synthesize x;\n@synthesize y;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [self setX:@\"0\"];\n    [self setY:@\"0\"];\n  }\n\n  return self;\n}\n\n- (id)initWithX:(NSString *)xVal y:(NSString *)yVal {\n  self = [super init];\n  if (self) {\n    [self setX:xVal];\n    [self setY:yVal];\n  }\n\n  return self;\n}\n\n\n- (NSPoint)getPointWithDict:(NSDictionary *)values {\n  return NSMakePoint([ExpressionPoint expToFloat:x withDict:values],[ExpressionPoint expToFloat:y withDict:values]);\n}\n\n- (NSSize)getSizeWithDict:(NSDictionary *)values {\n  return NSMakeSize([ExpressionPoint expToFloat:x withDict:values],[ExpressionPoint expToFloat:y withDict:values]);\n}\n\n+ (float)expToFloat:(NSString *)exp withDict:(NSDictionary *)values {\n  if (exp != nil) {\n    // then do the normal predicate stuff\n    NSComparisonPredicate *pred = (NSComparisonPredicate *)[NSPredicate predicateWithFormat:[exp stringByAppendingString:@\" == 42\"]];\n    NSExpression *lexp = [pred leftExpression];\n    NSNumber *result = [lexp expressionValueWithObject:values context:nil];\n    if (result == nil)\n      @throw([NSException exceptionWithName:@\"Unable to compute result\" reason:exp userInfo:nil]);\n    return [result floatValue];\n  }\n  @throw([NSException exceptionWithName:@\"Expression is nil\" reason:exp userInfo:nil]);\n}\n\n@end\n"
  },
  {
    "path": "Slate/FocusOperation.h",
    "content": "//\n//  FocusOperation.h\n//  Slate\n//\n//  Created by Jigish Patel on 6/21/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n#import \"Operation.h\"\n\n\n@interface FocusOperation : Operation {\n@private\n  NSInteger direction;\n  NSString *app;\n}\n\n@property (assign) NSInteger direction;\n@property NSString *app;\n\n- (id)initWithDirectionOrApp:(NSString *)s;\n\n+ (id)focusOperation;\n+ (id)focusOperationFromString:(NSString *)focusOperation;\n\n@end\n"
  },
  {
    "path": "Slate/FocusOperation.m",
    "content": "//\n//  FocusOperation.m\n//  Slate\n//\n//  Created by Jigish Patel on 6/21/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"Constants.h\"\n#import \"FocusOperation.h\"\n#import \"MathUtils.h\"\n#import \"SlateConfig.h\"\n#import \"StringTokenizer.h\"\n#import \"SlateLogger.h\"\n#import \"RunningApplications.h\"\n\n@implementation FocusOperation\n\n@synthesize direction, app;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [self setDirection:DIRECTION_UNKNOWN];\n    [self setApp:nil];\n  }\n  return self;\n}\n\n- (id)initWithDirectionOrApp:(NSString *)s {\n  self = [super init];\n  if (self) {\n    [self setDirection:DIRECTION_UNKNOWN];\n    [self setApp:nil];\n    if ([s length] <= 1) {\n      // fail\n    } else if ([s isEqualToString:UP] || [s isEqualToString:ABOVE]) {\n      [self setDirection:DIRECTION_UP];\n    } else if ([s isEqualToString:DOWN] || [s isEqualToString:BELOW]) {\n      [self setDirection:DIRECTION_DOWN];\n    } else if ([s isEqualToString:LEFT]) {\n      [self setDirection:DIRECTION_LEFT];\n    } else if ([s isEqualToString:RIGHT]) {\n      [self setDirection:DIRECTION_RIGHT];\n    } else if ([s isEqualToString:BEHIND]) {\n      [self setDirection:DIRECTION_BEHIND];\n    } else if ([[NSCharacterSet characterSetWithCharactersInString:QUOTES] characterIsMember:[s characterAtIndex:0]] &&\n               [[NSCharacterSet characterSetWithCharactersInString:QUOTES] characterIsMember:[s characterAtIndex:([s length] - 1)]]) {\n      // App name\n      [self setApp:[s substringWithRange:NSMakeRange(1, [s length]-2)]];\n    }\n  }\n  return self;\n}\n\n- (BOOL)doOperation {\n  SlateLogger(@\"----------------- Begin Focus Operation -----------------\");\n  // We don't use the passed in AccessibilityWrapper or ScreenWrapper so they are nil. No need to waste time creating them here.\n  BOOL success = [self doOperationWithAccessibilityWrapper:nil screenWrapper:nil];\n  SlateLogger(@\"-----------------  End Focus Operation  -----------------\");\n  return success;\n}\n\n- (BOOL)doOperationWithAccessibilityWrapper:(AccessibilityWrapper *)iamnil screenWrapper:(ScreenWrapper *)iamalsonil {\n  [self evalOptionsWithAccessibilityWrapper:iamnil screenWrapper:iamalsonil];\n  // App case\n  if ([self app] != nil) {\n    for (NSRunningApplication *runningApp in [RunningApplications getInstance]) {\n      if ([[self app] isEqualToString:[runningApp localizedName]]) {\n        // Match!\n        if ([AccessibilityWrapper focusMainWindow:runningApp]) {\n          return YES;\n        }\n        return NO;\n      }\n    }\n    return NO;\n  }\n\n  // Direction case\n  AccessibilityWrapper *caAW = [[AccessibilityWrapper alloc] init];\n  if (![caAW inited]) return NO;\n  NSPoint cwTL = [caAW getCurrentTopLeft];\n  NSSize cwSize = [caAW getCurrentSize];\n  NSRect cwRect = NSMakeRect(cwTL.x, cwTL.y, cwSize.width, cwSize.height);\n  NSString *cwTitle = [AccessibilityWrapper getTitle:[caAW window]];\n  NSRect checkRect;\n  NSInteger focusCheckWidth = [[SlateConfig getInstance] getIntegerConfig:FOCUS_CHECK_WIDTH];\n  while (focusCheckWidth <= [[SlateConfig getInstance] getIntegerConfig:FOCUS_CHECK_WIDTH_MAX]) {\n    SlateLogger(@\"Checking for adjacent windows with width=%i\",(int)focusCheckWidth);\n    if (direction == DIRECTION_UP) checkRect = NSMakeRect(cwTL.x, cwTL.y-focusCheckWidth, cwSize.width, focusCheckWidth);\n    else if (direction == DIRECTION_DOWN) checkRect = NSMakeRect(cwTL.x, cwTL.y+cwSize.height, cwSize.width, focusCheckWidth);\n    else if (direction == DIRECTION_LEFT) checkRect = NSMakeRect(cwTL.x-focusCheckWidth, cwTL.y, focusCheckWidth, cwSize.height);\n    else if (direction == DIRECTION_RIGHT) checkRect = NSMakeRect(cwTL.x+cwSize.width, cwTL.y, focusCheckWidth, cwSize.height);\n    else if (direction == DIRECTION_BEHIND) checkRect = NSMakeRect(cwTL.x, cwTL.y, cwSize.width, cwSize.height);\n    else {\n      return NO;\n    }\n    NSRect biggestIntersection = NSZeroRect;\n    AXUIElementRef windowToFocus;\n    AXUIElementRef appToFocus;\n    BOOL foundFocus = NO;\n    BOOL foundFocusInSameApp = NO;\n    for (NSRunningApplication *runningApp in [RunningApplications getInstance]) {\n      pid_t appPID = [runningApp processIdentifier];\n      SlateLogger(@\"I see application '%@' with pid '%d'\", [runningApp localizedName], appPID);\n\n      AXUIElementRef appRef = AXUIElementCreateApplication(appPID);\n      CFArrayRef windows = [AccessibilityWrapper windowsInApp:appRef];\n      if (!windows || CFArrayGetCount(windows) == 0) continue;\n\n      for (NSInteger i = 0; i < CFArrayGetCount(windows); i++) {\n        AccessibilityWrapper *aw = [[AccessibilityWrapper alloc] initWithApp:appRef window:CFArrayGetValueAtIndex(windows, i)];\n\n        if ([aw isMinimizedOrHidden]) {\n          SlateLogger(@\" Window is minimized, skipping\");\n          continue;\n        }\n\n        NSString *wTitle = [aw getTitle];\n        if ([wTitle isEqualToString:@\"\"]){\n          SlateLogger(@\" Title is empty, skipping\");\n          continue; // Chrome and Finder have invisible windows for some reason\n        }\n\n        NSPoint wTL = [aw getCurrentTopLeft];\n        NSSize wSize = [aw getCurrentSize];\n        SlateLogger(@\" Checking window in %@ in direction %i with rect: (%f,%f %f,%f), title: [%@]\",[runningApp localizedName],(int)direction,wTL.x,wTL.y,wSize.width,wSize.height,wTitle);\n        NSRect windowRect = NSMakeRect(wTL.x, wTL.y, wSize.width, wSize.height);\n\n        if ([wTitle isEqualToString:cwTitle] && NSEqualRects(windowRect, cwRect) && NSEqualPoints(wTL, cwTL)) {\n          SlateLogger(@\" Ignoring current window\");\n          continue;\n        }\n        NSRect intersection = NSIntersectionRect(checkRect, windowRect);\n        if ([MathUtils isRect:intersection biggerThan:NSZeroRect] && [AccessibilityWrapper processIdentifierOfUIElement:[caAW app]] == appPID) {\n          SlateLogger(@\"  Found window in same app in direction %i\",(int)direction);\n          if ([[SlateConfig getInstance] getBoolConfig:FOCUS_PREFER_SAME_APP]\n              && (!foundFocusInSameApp || [MathUtils isRect:intersection biggerThan:biggestIntersection])) {\n            SlateLogger(@\"   Preferring same app.\");\n            appToFocus = appRef;\n            windowToFocus = CFArrayGetValueAtIndex(windows, i);\n            biggestIntersection = intersection;\n            foundFocus = YES;\n            foundFocusInSameApp = YES;\n          } else if ([MathUtils isRect:intersection biggerThan:biggestIntersection]) {\n            appToFocus = appRef;\n            windowToFocus = CFArrayGetValueAtIndex(windows, i);\n            biggestIntersection = intersection;\n            foundFocus = YES;\n          }\n        } else if ([MathUtils isRect:intersection biggerThan:biggestIntersection]) {\n          SlateLogger(@\"  Found window in %@ in direction %i (intersection: %f,%f %f,%f)\",[runningApp localizedName],(int)direction,intersection.origin.x,intersection.origin.y,intersection.size.width,intersection.size.height);\n          appToFocus = appRef;\n          windowToFocus = CFArrayGetValueAtIndex(windows, i);\n          biggestIntersection = intersection;\n          foundFocus = YES;\n        }\n      }\n      // check if same app && foundFocus && prefer_same_app\n      if(foundFocusInSameApp && [AccessibilityWrapper processIdentifierOfUIElement:[caAW app]] == appPID && [[SlateConfig getInstance] getBoolConfig:FOCUS_PREFER_SAME_APP]) {\n        AccessibilityWrapper *aw = [[AccessibilityWrapper alloc] initWithApp:appToFocus window:windowToFocus];\n        [aw focus];\n        return YES;\n      }\n    }\n    if (foundFocus) {\n      AccessibilityWrapper *aw = [[AccessibilityWrapper alloc] initWithApp:appToFocus window:windowToFocus];\n      [aw focus];\n      return YES;\n    }\n    focusCheckWidth += [[SlateConfig getInstance] getIntegerConfig:FOCUS_CHECK_WIDTH];\n  }\n  return NO;\n}\n\n- (BOOL)testOperation {\n  if ([self direction] == DIRECTION_UNKNOWN && [self app] == nil)\n    @throw [NSException exceptionWithName:@\"Unknown Direction\" reason:@\"direction\" userInfo:nil];\n  return YES;\n}\n\n- (NSString *)checkRequiredOptions:(NSDictionary *)_options {\n  if ([_options objectForKey:OPT_APP] == nil && [_options objectForKey:OPT_DIRECTION] == nil) {\n    return [[NSArray arrayWithObjects:OPT_APP, OPT_DIRECTION, nil] componentsJoinedByString:@\" or \"];\n  }\n  return nil;\n}\n\n- (void)parseOption:(NSString *)name value:(id)value {\n  if (value == nil) { return; }\n  if ([name isEqualToString:OPT_APP]) {\n    // should be string\n    if (![value isKindOfClass:[NSString class]]) {\n      @throw([NSException exceptionWithName:@\"Invalid App\" reason:[NSString stringWithFormat:@\"Invalid App %@\", value] userInfo:nil]);\n      return;\n    }\n    [self setApp:value];\n  } else if ([name isEqualToString:OPT_DIRECTION]) {\n    // should be a string\n    if (![value isKindOfClass:[NSString class]]) {\n      @throw([NSException exceptionWithName:@\"Invalid Direction\" reason:[NSString stringWithFormat:@\"Invalid Direction %@\", value] userInfo:nil]);\n      return;\n    }\n    if ([value isEqualToString:UP] || [value isEqualToString:ABOVE]) {\n      [self setDirection:DIRECTION_UP];\n    } else if ([value isEqualToString:DOWN] || [value isEqualToString:BELOW]) {\n      [self setDirection:DIRECTION_DOWN];\n    } else if ([value isEqualToString:LEFT]) {\n      [self setDirection:DIRECTION_LEFT];\n    } else if ([value isEqualToString:RIGHT]) {\n      [self setDirection:DIRECTION_RIGHT];\n    } else if ([value isEqualToString:BEHIND]) {\n      [self setDirection:DIRECTION_BEHIND];\n    } else {\n      @throw([NSException exceptionWithName:@\"Invalid Direction\" reason:[NSString stringWithFormat:@\"Invalid Direction %@\", value] userInfo:nil]);\n      return;\n    }\n  }\n}\n\n+ (id)focusOperation {\n  return [[FocusOperation alloc] init];\n}\n\n+ (id)focusOperationFromString:(NSString *)focusOperation {\n  // focus direction\n  NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n  [StringTokenizer tokenize:focusOperation into:tokens maxTokens:2];\n\n  if ([tokens count] < 2) {\n    SlateLogger(@\"ERROR: Invalid Parameters '%@'\", focusOperation);\n    @throw([NSException exceptionWithName:@\"Invalid Parameters\" reason:[NSString stringWithFormat:@\"Invalid Parameters in '%@'. Focus operations require the following format: 'focus direction'\", focusOperation] userInfo:nil]);\n  }\n\n  Operation *op = [[FocusOperation alloc] initWithDirectionOrApp:[tokens objectAtIndex:1]];\n  return op;\n}\n\n@end\n"
  },
  {
    "path": "Slate/GridCellView.h",
    "content": "//\n//  GridCellView.h\n//  Slate\n//\n//  Created by Jigish Patel on 9/10/12.\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\n#import <Cocoa/Cocoa.h>\n\n@interface GridCellView : NSView\n\n@property NSColor *inactiveBg;\n@property NSColor *activeBg;\n@property NSColor *bg;\n@property float cornerSize;\n\n- (void)activate;\n- (void)deactivate;\n\n@end\n"
  },
  {
    "path": "Slate/GridCellView.m",
    "content": "//\n//  GridCellView.m\n//  Slate\n//\n//  Created by Jigish Patel on 9/10/12.\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\n#import \"GridCellView.h\"\n#import \"SlateConfig.h\"\n#import \"Constants.h\"\n\n@implementation GridCellView\n\n@synthesize bg, inactiveBg, activeBg, cornerSize;\n\n- (id)initWithFrame:(NSRect)frame {\n  self = [super initWithFrame:frame];\n  if (self) {\n    [self setWantsLayer:YES];\n    NSArray *bgColorArr = [[SlateConfig getInstance] getArrayConfig:GRID_CELL_BACKGROUND_COLOR];\n    if ([bgColorArr count] < 4) bgColorArr = [GRID_CELL_BACKGROUND_COLOR_DEFAULT componentsSeparatedByString:SEMICOLON];\n    NSColor *backgroundColor = [NSColor colorWithDeviceRed:[[bgColorArr objectAtIndex:0] floatValue]/255.0\n                                                     green:[[bgColorArr objectAtIndex:1] floatValue]/255.0\n                                                      blue:[[bgColorArr objectAtIndex:2] floatValue]/255.0\n                                                     alpha:[[bgColorArr objectAtIndex:3] floatValue]];\n    [self setBg:backgroundColor];\n    [self setInactiveBg:backgroundColor];\n    NSArray *activeColorArr = [[SlateConfig getInstance] getArrayConfig:GRID_CELL_SELECTED_COLOR];\n    if ([activeColorArr count] < 4) activeColorArr = [GRID_CELL_SELECTED_COLOR_DEFAULT componentsSeparatedByString:SEMICOLON];\n    NSColor *activeColor = [NSColor colorWithDeviceRed:[[activeColorArr objectAtIndex:0] floatValue]/255.0\n                                                 green:[[activeColorArr objectAtIndex:1] floatValue]/255.0\n                                                  blue:[[activeColorArr objectAtIndex:2] floatValue]/255.0\n                                                 alpha:[[activeColorArr objectAtIndex:3] floatValue]];\n    [self setActiveBg:activeColor];\n    [self setCornerSize:[[SlateConfig getInstance] getFloatConfig:GRID_CELL_ROUNDED_CORNER_SIZE]];\n  }\n  return self;\n}\n\n- (void)activate {\n  [self setBg:[self activeBg]];\n  [self setNeedsDisplay:YES];\n}\n\n- (void)deactivate {\n  [self setBg:[self inactiveBg]];\n  [self setNeedsDisplay:YES];\n}\n\n- (void)drawRect:(NSRect)dirtyRect {\n  [[self bg] set];\n  NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:[self bounds] xRadius:[self cornerSize] yRadius:[self cornerSize]];\n  [path fill];\n}\n\n@end\n"
  },
  {
    "path": "Slate/GridOperation.h",
    "content": "//\n//  GridOperation.h\n//  Slate\n//\n//  Created by Jigish Patel on 9/7/12.\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\n#import <Carbon/Carbon.h>\n#import \"Operation.h\"\n\n@class ExpressionPoint;\n\n@interface GridOperation : Operation {\n  NSDictionary *screenConfigs;\n  NSMutableArray *grids;\n  EventHotKeyRef escHotKeyRef;\n  AccessibilityWrapper *focusedWindow;\n  NSInteger padding;\n}\n\n@property NSDictionary *screenConfigs;\n@property NSMutableArray *grids;\n@property AccessibilityWrapper *focusedWindow;\n@property NSInteger padding;\n\n- (id)initWithScreenConfigs:(NSDictionary *)myScreenConfigs padding:(NSInteger)myPadding;\n- (void)killGrids;\n- (void)activateGridKey:(NSInteger)hintId;\n- (void)activateLayoutWithOrigin:(ExpressionPoint *)origin size:(ExpressionPoint *)size screenId:(NSInteger)screenId;\n\n+ (id)gridOperation;\n+ (id)gridOperationFromString:(NSString *) gridOperation;\n\n@end\n"
  },
  {
    "path": "Slate/GridOperation.m",
    "content": "//\n//  GridOperation.m\n//  Slate\n//\n//  Created by Jigish Patel on 9/7/12.\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\n#import \"GridOperation.h\"\n#import \"StringTokenizer.h\"\n#import \"SlateLogger.h\"\n#import \"Constants.h\"\n#import \"GridWindow.h\"\n#import \"GridView.h\"\n#import \"Binding.h\"\n#import \"SlateAppDelegate.h\"\n#import \"ExpressionPoint.h\"\n#import \"MoveOperation.h\"\n\n@interface ScreenConfig : NSObject {\n  NSInteger width;\n  NSInteger height;\n  NSString *key;\n}\n\n@property NSInteger width;\n@property NSInteger height;\n@property NSString *key;\n\n+ (ScreenConfig *)screenConfigFromDictionary:(NSDictionary *)dict key:(NSString *)key;\n\n@end\n\n@implementation ScreenConfig\n\n@synthesize width, height, key;\n\n+ (ScreenConfig *)screenConfigFromDictionary:(NSDictionary *)dict key:(NSString *)key {\n  if ([dict objectForKey:WIDTH] == nil || [dict objectForKey:HEIGHT] == nil || key == nil) {\n    @throw([NSException exceptionWithName:@\"Invalid Grid\" reason:[NSString stringWithFormat:@\"Invalid Grid '%@'\", key] userInfo:nil]);\n  }\n  ScreenConfig *sc = [[ScreenConfig alloc] init];\n  [sc setWidth:[[dict objectForKey:WIDTH] integerValue]];\n  [sc setHeight:[[dict objectForKey:HEIGHT] integerValue]];\n  [sc setKey:key];\n  return sc;\n}\n\n@end\n\n@implementation GridOperation\n\n@synthesize screenConfigs, grids, focusedWindow, padding;\n\nstatic const UInt32 ESC_GRID_ID = 10002;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [self setScreenConfigs:[NSMutableDictionary dictionary]];\n    [self setGrids:[NSMutableArray array]];\n    [self setPadding:2];\n  }\n  return self;\n}\n\n- (id)initWithScreenConfigs:(NSDictionary *)myScreenConfigs padding:(NSInteger)myPadding {\n  self = [super init];\n  if (self) {\n    [self setScreenConfigs:myScreenConfigs];\n    [self setGrids:[NSMutableArray array]];\n    [self setPadding:myPadding];\n  }\n  return self;\n}\n\n- (BOOL)doOperation {\n  SlateLogger(@\"----------------- Begin Grid Operation -----------------\");\n  ScreenWrapper *sw = [[ScreenWrapper alloc] init];\n  BOOL success = [self doOperationWithAccessibilityWrapper:nil screenWrapper:sw];\n  SlateLogger(@\"-----------------  End Grid Operation  -----------------\");\n  return success;\n}\n\n- (BOOL)doOperationWithAccessibilityWrapper:(AccessibilityWrapper *)aw screenWrapper:(ScreenWrapper *)sw {\n  [self evalOptionsWithAccessibilityWrapper:aw screenWrapper:sw];\n  [self setFocusedWindow:[[AccessibilityWrapper alloc] init]];\n  NSInteger currentScreenId = [sw getScreenIdForPoint:[NSEvent mouseLocation]];\n  [(SlateAppDelegate *)[NSApp delegate] setCurrentGridOperation:self];\n  NSInteger screenId = 0;\n  NSWindow *toFocus = nil;\n  for (NSScreen *screen in [sw screens]) {\n    NSRect frame;\n    frame = NSMakeRect([screen frame].size.width/2-[screen frame].size.width/8,\n                       [screen frame].size.height/2-[screen frame].size.height/8,\n                       [screen frame].size.width/4,\n                       [screen frame].size.height/4);\n    NSWindow *window = [[GridWindow alloc] initWithContentRect:frame\n                                                     styleMask:NSBorderlessWindowMask\n                                                       backing:NSBackingStoreBuffered\n                                                         defer:NO\n                                                        screen:screen];\n    [window setReleasedWhenClosed:NO];\n    [window setOpaque:NO];\n    [window setBackgroundColor:[NSColor colorWithDeviceRed:0.0 green:0.0 blue:0.0 alpha:0.0]];\n    [window makeKeyAndOrderFront:NSApp];\n    [window setLevel:(NSScreenSaverWindowLevel - 1)];\n    GridView *view = [[GridView alloc] initWithFrame:frame];\n    NSInteger width = 12;\n    NSInteger height = 12;\n    NSString *resolution = [NSString stringWithFormat:@\"%ldx%ld\", [[NSNumber numberWithFloat:[screen frame].size.width] integerValue], [[NSNumber numberWithFloat:[screen frame].size.height] integerValue]];\n    ScreenConfig *myConfig = [[self screenConfigs] objectForKey:resolution];\n    if (myConfig == nil) {\n      NSInteger screenRefId = [sw convertDefaultOrderToLeftToRightOrderIfNeeded:screenId];\n      myConfig = [[self screenConfigs] objectForKey:[NSString stringWithFormat:@\"%ld\",screenRefId]];\n    }\n    if (myConfig != nil) {\n      height = [myConfig height];\n      width = [myConfig width];\n    }\n    [view addGridWithWidth:width height:height padding:[self padding]];\n    [view setOp:self];\n    [window setContentView:view];\n    NSWindowController *wc = [[NSWindowController alloc] initWithWindow:window];\n    [grids addObject:wc];\n    if (screenId == currentScreenId) { toFocus = window; }\n    screenId++;\n  }\n  if (toFocus != nil) {\n    [[NSApplication sharedApplication] activateIgnoringOtherApps:YES];\n    [toFocus makeKeyAndOrderFront:self];\n  }\n\n  // Register the escape hotkey\n  NSNumber *keyCode = [[Binding asciiToCodeDict] objectForKey:@\"esc\"];\n  EventHotKeyID myHotKeyID;\n  EventHotKeyRef myHotKeyRef;\n  myHotKeyID.signature = *[@\"hotkeyESC\" cStringUsingEncoding:NSASCIIStringEncoding];\n  myHotKeyID.id = (UInt32)(ESC_GRID_ID);\n  RegisterEventHotKey([keyCode unsignedIntValue], 0, myHotKeyID, GetEventMonitorTarget(), 0, &myHotKeyRef);\n  escHotKeyRef = myHotKeyRef;\n\n  return YES;\n}\n\n- (void)killGrids {\n  for (NSWindowController *controller in grids) {\n    [controller close];\n  }\n  UnregisterEventHotKey(escHotKeyRef);\n  [grids removeAllObjects];\n  [(SlateAppDelegate *)[NSApp delegate] setCurrentGridOperation:nil];\n}\n\n- (void)activateGridKey:(NSInteger)hintId {\n  [self killGrids];\n}\n\n- (BOOL)testOperation {\n  return YES;\n}\n\n- (void)activateLayoutWithOrigin:(ExpressionPoint *)origin size:(ExpressionPoint *)size screenId:(NSInteger)screenId {\n  SlateLogger(@\"Activate Layout: %@, %@, %@, %@\", origin.x, origin.y, size.x, size.y);\n  MoveOperation *mo = [[MoveOperation alloc] initWithTopLeftEP:origin dimensionsEP:size screenId:screenId];\n  [focusedWindow focus];\n  [mo doOperation];\n}\n\n- (void)parseOption:(NSString *)name value:(id)value {\n  if (value == nil) { return; }\n  if ([name isEqualToString:OPT_PADDING]) {\n    // should be a string or integer\n    if (![value isKindOfClass:[NSString class]] && ![value isKindOfClass:[NSValue class]] && ![value isKindOfClass:[NSNumber class]]) {\n      @throw([NSException exceptionWithName:@\"Invalid Padding\" reason:[NSString stringWithFormat:@\"Invalid Padding '%@'\", value] userInfo:nil]);\n    }\n    [self setPadding:[value integerValue]];\n  } else if ([name isEqualToString:OPT_GRIDS]) {\n    // should be a dictionary\n    if (![value isKindOfClass:[NSDictionary class]]) {\n      @throw([NSException exceptionWithName:@\"Invalid Grids\" reason:[NSString stringWithFormat:@\"Invalid Grids '%@'\", value] userInfo:nil]);\n    }\n    NSMutableDictionary *configs = [NSMutableDictionary dictionary];\n    for (NSString *screen in [value allKeys]) {\n      id dict = [value objectForKey:screen];\n      if (![dict isKindOfClass:[NSDictionary class]]) {\n        @throw([NSException exceptionWithName:@\"Invalid Grid\" reason:[NSString stringWithFormat:@\"Invalid Grid '%@'\", value] userInfo:nil]);\n      }\n      [configs setObject:[ScreenConfig screenConfigFromDictionary:dict key:screen] forKey:screen];\n    }\n    [self setScreenConfigs:configs];\n  }\n}\n\n+ (id)gridOperation {\n  return [[GridOperation alloc] init];\n}\n\n+ (id)gridOperationFromString:(NSString *) gridOperation {\n  // grid padding:<padding> <screenNumber or resolution>:<width>,<height> ...\n  NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n  [StringTokenizer tokenize:gridOperation into:tokens];\n\n  if ([tokens count] < 1) {\n    SlateLogger(@\"ERROR: Invalid Parameters '%@'\", gridOperation);\n    @throw([NSException exceptionWithName:@\"Invalid Parameters\" reason:[NSString stringWithFormat:@\"Invalid Parameters in '%@'. Grid operations require the following format: 'grid <screenNumber or resolution>:<width>,<height> ...'\", gridOperation] userInfo:nil]);\n  }\n\n  NSMutableDictionary *screenConfigs = [NSMutableDictionary dictionary];\n  NSInteger padding = 2;\n  if ([tokens count] > 1) {\n    for (NSInteger i = 1; i < [tokens count]; i++) {\n      NSArray *split = [[tokens objectAtIndex:i] componentsSeparatedByString:COLON];\n      if ([split count] != 2) { continue; }\n      NSString *key = [split objectAtIndex:0];\n      if ([key isEqualToString:PADDING]) {\n        padding = [[split objectAtIndex:1] integerValue];\n        continue;\n      }\n      NSArray *widthHeight = [[split objectAtIndex:1] componentsSeparatedByString:COMMA];\n      if ([widthHeight count] != 2) { continue; }\n      ScreenConfig *screenConfig = [[ScreenConfig alloc] init];\n      [screenConfig setKey:key];\n      [screenConfig setWidth:[[widthHeight objectAtIndex:0] integerValue]];\n      [screenConfig setHeight:[[widthHeight objectAtIndex:1] integerValue]];\n      [screenConfigs setObject:screenConfig forKey:key];\n    }\n  }\n\n  Operation *op = [[GridOperation alloc] initWithScreenConfigs:screenConfigs padding:padding];\n  return op;\n}\n\n@end\n"
  },
  {
    "path": "Slate/GridView.h",
    "content": "//\n//  GridView.h\n//  Slate\n//\n//  Created by Jigish Patel on 9/7/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import <Cocoa/Cocoa.h>\n\n@class GridOperation;\n\n@interface GridView : NSView\n\n@property GridOperation *op;\n@property NSInteger width;\n@property NSInteger height;\n@property float padding;\n@property float cellWidth;\n@property float cellHeight;\n@property NSMutableArray *grid;\n@property NSRect previousActiveRect;\n\n- (void)addGridWithWidth:(NSInteger)width height:(NSInteger)height padding:(float)myPadding;\n\n@end\n"
  },
  {
    "path": "Slate/GridView.m",
    "content": "//\n//  GridView.m\n//  Slate\n//\n//  Created by Jigish Patel on 9/7/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"GridView.h\"\n#import \"GridCellView.h\"\n#import \"SlateConfig.h\"\n#import \"Constants.h\"\n#import \"GridOperation.h\"\n#import \"ExpressionPoint.h\"\n#import \"SlateLogger.h\"\n\n@implementation GridView\n\n@synthesize op, width, height, padding, cellWidth, cellHeight, previousActiveRect;\n\n- (id)initWithFrame:(NSRect)frame {\n  self = [super initWithFrame:frame];\n  if (self) {\n    [self setGrid:[NSMutableArray array]];\n    [self setWantsLayer:YES];\n  }\n  return self;\n}\n\n- (void)drawRect:(NSRect)dirtyRect {\n  NSArray *bgColorArr = [[SlateConfig getInstance] getArrayConfig:GRID_BACKGROUND_COLOR];\n  if ([bgColorArr count] < 4) bgColorArr = [GRID_BACKGROUND_COLOR_DEFAULT componentsSeparatedByString:SEMICOLON];\n  NSColor *backgroundColor = [NSColor colorWithDeviceRed:[[bgColorArr objectAtIndex:0] floatValue]/255.0\n                                                   green:[[bgColorArr objectAtIndex:1] floatValue]/255.0\n                                                    blue:[[bgColorArr objectAtIndex:2] floatValue]/255.0\n                                                   alpha:[[bgColorArr objectAtIndex:3] floatValue]];\n  [backgroundColor set];\n  float cornerSize = [[SlateConfig getInstance] getFloatConfig:GRID_ROUNDED_CORNER_SIZE];\n  NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:[self bounds] xRadius:cornerSize yRadius:cornerSize];\n  [path fill];\n}\n\n- (void)addGridWithWidth:(NSInteger)myWidth height:(NSInteger)myHeight padding:(float)myPadding {\n  [self setWidth:myWidth];\n  [self setHeight:myHeight];\n  [self setPadding:myPadding];\n  float usableHeight = self.frame.size.height - [self padding]*2;\n  float usableWidth = self.frame.size.width - [self padding]*2;\n  float x = [self padding];\n  float y = [self padding];\n  [self setCellHeight:(usableHeight - (height-1)*[self padding])/height];\n  [self setCellWidth:(usableWidth - (width-1)*[self padding])/width];\n  for (NSInteger r = 0; r < height; r++) {\n    NSMutableArray *rowArr = [NSMutableArray array];\n    for (NSInteger c = 0; c < width; c++) {\n      GridCellView *newView = [[GridCellView alloc] initWithFrame:NSMakeRect(x,y,[self cellWidth],[self cellHeight])];\n      [self addSubview:newView];\n      x += [self padding]+[self cellWidth];\n      [rowArr addObject:newView];\n    }\n    x = [self padding];\n    y += [self padding]+[self cellHeight];\n    [[self grid] addObject:rowArr];\n  }\n}\n\n- (NSRect)rectFromBegin:(NSPoint)begin end:(NSPoint)end {\n  // 0,0 is bottom left\n  float myWidth = self.bounds.size.width;\n  float myHeight = self.bounds.size.height;\n  float bX = begin.x < 0 ? 0 : (begin.x > myWidth ? myWidth : begin.x);\n  float bY = begin.y < 0 ? 0 : (begin.y > myHeight ? myHeight : begin.y);\n  float eX = end.x < 0 ? 0 : (end.x > myWidth ? myWidth : end.x);\n  float eY = end.y < 0 ? 0 : (end.y > myHeight ? myHeight : end.y);\n  float blX = 0;\n  float blY = 0;\n  float trX = 0;\n  float trY = 0;\n  if (bX <= eX) {\n    blX = bX;\n    trX = eX;\n  } else { // bX > eX\n    blX = eX;\n    trX = bX;\n  }\n  if (bY <= eY) {\n    blY = bY;\n    trY = eY;\n  } else { // bY > eY\n    blY = eY;\n    trY = bY;\n  }\n  SlateLogger(@\"POINTS: %f,%f -> %f,%f\", bX,bY,eX,eY);\n  NSInteger cellX = [self linearPosToCell:blX cellLength:[self cellWidth] totalCells:[self width]];\n  if (cellX >= [self width]) { cellX = [self width] - 1; }\n  NSInteger cellY = [self linearPosToCell:blY cellLength:[self cellHeight] totalCells:[self height]];\n  if (cellY >= [self height]) { cellY = [self height] - 1; }\n  NSInteger endCellX = [self linearPosToCell:trX cellLength:[self cellWidth] totalCells:[self width]];\n  if (endCellX >= [self width]) { endCellX = [self width] - 1; }\n  NSInteger endCellY = [self linearPosToCell:trY cellLength:[self cellHeight] totalCells:[self height]];\n  if (endCellY >= [self height]) { endCellY = [self height] - 1; }\n  SlateLogger(@\"CELLS: %ld,%ld -> %ld,%ld\", cellX,cellY,endCellX,endCellY);\n  return NSMakeRect(cellX, cellY, endCellX-cellX, endCellY-cellY);\n}\n\n- (NSInteger)linearPosToCell:(float)pos cellLength:(float)cellLength totalCells:(NSInteger)totalCells {\n  return [[NSNumber numberWithFloat:totalCells*(pos/(cellLength*totalCells + [self padding]*(totalCells+1)))] integerValue];\n}\n\n- (void)activateCellsInRect:(NSRect)rect {\n  if (NSEqualRects(rect, [self previousActiveRect])) {\n    [self setPreviousActiveRect:rect];\n    return;\n  }\n  [self setPreviousActiveRect:rect];\n  SlateLogger(@\"activate cells in: %f,%f,%f,%f\", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height);\n  for (NSInteger r = 0; r < height; r++) {\n    for (NSInteger c = 0; c < width; c++) {\n      if (r < rect.origin.y) {\n        [[[[self grid] objectAtIndex:r] objectAtIndex:c] deactivate];\n      } else if (c < rect.origin.x) {\n        [[[[self grid] objectAtIndex:r] objectAtIndex:c] deactivate];\n      } else if (r > rect.origin.y+rect.size.height) {\n        [[[[self grid] objectAtIndex:r] objectAtIndex:c] deactivate];\n      } else if (c > rect.origin.x+rect.size.width) {\n        [[[[self grid] objectAtIndex:r] objectAtIndex:c] deactivate];\n      } else {\n        [[[[self grid] objectAtIndex:r] objectAtIndex:c] activate];\n      }\n    }\n  }\n  [self setNeedsDisplay:YES];\n}\n\n- (void)mouseDown:(NSEvent *)theEvent {\n  BOOL keepOn = YES;\n  NSPoint mouseLoc;\n  NSPoint initialMouseLoc = [self convertPoint:[theEvent locationInWindow] fromView:nil];\n  NSRect activeRect;\n\n  while (keepOn) {\n    theEvent = [[self window] nextEventMatchingMask: NSLeftMouseUpMask |\n                NSLeftMouseDraggedMask];\n    mouseLoc = [self convertPoint:[theEvent locationInWindow] fromView:self];\n    activeRect = [self rectFromBegin:initialMouseLoc end:mouseLoc];\n    NSRect flippedRect = NSMakeRect(activeRect.origin.x, [self height]-1-(activeRect.origin.y+activeRect.size.height), activeRect.size.width+1, activeRect.size.height+1);\n    switch ([theEvent type]) {\n      case NSLeftMouseDragged:\n        SlateLogger(@\"Dragged - (%f,%f) -> (%f,%f)\", initialMouseLoc.x, initialMouseLoc.y, mouseLoc.x, mouseLoc.y);\n        [self activateCellsInRect:activeRect];\n        break;\n      case NSLeftMouseUp:\n        SlateLogger(@\"Up - (%f,%f)\", mouseLoc.x, mouseLoc.y);\n        // activate shit\n        [[self op] activateLayoutWithOrigin:[[ExpressionPoint alloc] initWithX:[NSString stringWithFormat:@\"screenOriginX+(screenSizeX*%f/%ld)\", flippedRect.origin.x, [self width]]\n                                                                             y:[NSString stringWithFormat:@\"screenOriginY+(screenSizeY*%f/%ld)\", flippedRect.origin.y, [self height]]]\n                                       size:[[ExpressionPoint alloc] initWithX:[NSString stringWithFormat:@\"screenSizeX*%f/%ld\", flippedRect.size.width, [self width]]\n                                                                             y:[NSString stringWithFormat:@\"screenSizeY*%f/%ld\", flippedRect.size.height, [self height]]]\n                                   screenId:[[[ScreenWrapper alloc] init] getScreenIdForPoint:[NSEvent mouseLocation]]];\n        [[self op] performSelectorOnMainThread:@selector(killGrids) withObject:nil waitUntilDone:NO];\n        keepOn = NO;\n        break;\n      default:\n        /* Ignore any other kind of event. */\n        break;\n    }\n\n  };\n\n  return;\n}\n\n@end\n"
  },
  {
    "path": "Slate/GridWindow.h",
    "content": "//\n//  GridWindow.h\n//  Slate\n//\n//  Created by Jigish Patel on 9/7/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import <Cocoa/Cocoa.h>\n\n@interface GridWindow : NSWindow\n\n@end\n"
  },
  {
    "path": "Slate/GridWindow.m",
    "content": "//\n//  GridWindow.m\n//  Slate\n//\n//  Created by Jigish Patel on 9/7/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"GridWindow.h\"\n\n@implementation GridWindow\n\n- (BOOL)canBecomeKeyWindow {\n  return YES;\n}\n\n@end\n"
  },
  {
    "path": "Slate/HintOperation.h",
    "content": "//\n//  HintOperation.h\n//  Slate\n//\n//  Created by Jigish Patel on 3/2/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import <Carbon/Carbon.h>\n\n#import \"Operation.h\"\n\n@interface HintOperation : Operation {\n@private\n  NSMutableDictionary *hints;\n  NSMutableDictionary *windows;\n  NSMutableDictionary *apps;\n  NSMutableArray *hotkeyRefs;\n  NSMutableArray *frames;\n  NSTimer *hideTimer;\n  AccessibilityWrapper *currentWindow;\n  NSInteger currentHint;\n  NSString *hintCharacters;\n  BOOL ignoreHidden;\n\n  BOOL spreadOnCollision;\n  NSUInteger spreadSearchWidth;\n  NSUInteger spreadSearchHeight;\n  NSUInteger spreadPadding;\n}\n\n@property NSMutableDictionary *hints;\n@property NSMutableDictionary *windows;\n@property NSMutableDictionary *apps;\n@property NSMutableArray *frames;\n@property NSMutableArray *hotkeyRefs;\n@property NSTimer *hideTimer;\n@property AccessibilityWrapper *currentWindow;\n@property NSInteger currentHint;\n@property NSString *hintCharacters;\n\n- (id)initWithCharacters:(NSString *)characters;\n- (void)killHints;\n- (void)activateHintKey:(NSInteger)hintId;\n- (BOOL)collidesWithExistingHint:(NSPoint)origin;\n\n+ (id)hintOperation;\n+ (id)hintOperationFromString:(NSString *)hintOperation;\n\n@end\n"
  },
  {
    "path": "Slate/HintOperation.m",
    "content": "//\n//  HintOperation.m\n//  Slate\n//\n//  Created by Jigish Patel on 3/2/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"HintOperation.h\"\n#import \"Constants.h\"\n#import \"ScreenWrapper.h\"\n#import \"HintWindow.h\"\n#import \"HintView.h\"\n#import \"AccessibilityWrapper.h\"\n#import \"Binding.h\"\n#import \"SlateAppDelegate.h\"\n#import \"SlateConfig.h\"\n#import \"StringTokenizer.h\"\n#import \"SlateLogger.h\"\n#import \"ExpressionPoint.h\"\n#import \"RunningApplications.h\"\n\n@implementation HintOperation\n\n@synthesize hints, windows, apps, hotkeyRefs, frames, hideTimer, currentWindow, currentHint, hintCharacters;\n\nstatic const UInt32 ESC_HINT_ID = 10001;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    hints = [NSMutableDictionary dictionary];\n    windows = [NSMutableDictionary dictionary];\n    apps = [NSMutableDictionary dictionary];\n    hotkeyRefs = [NSMutableArray array];\n    frames = [NSMutableArray arrayWithCapacity:7];\n    hideTimer = nil;\n    currentHint = 0;\n    [self setHintCharacters:HINT_CHARACTERS];\n    ignoreHidden = [[SlateConfig getInstance] getBoolConfig:WINDOW_HINTS_IGNORE_HIDDEN_WINDOWS];\n\n    spreadOnCollision = [[SlateConfig getInstance] getBoolConfig:WINDOW_HINTS_SPREAD];\n    spreadPadding = [[SlateConfig getInstance] getIntegerConfig:WINDOW_HINTS_SPREAD_PADDING];\n    spreadSearchHeight = [[SlateConfig getInstance] getIntegerConfig:WINDOW_HINTS_SPREAD_SEARCH_HEIGHT];\n    spreadSearchWidth = [[SlateConfig getInstance] getIntegerConfig:WINDOW_HINTS_SPREAD_SEARCH_WIDTH];\n\n  }\n  return self;\n}\n\n- (id)initWithCharacters:(NSString *)characters {\n  self = [self init];\n  if (self) {\n    if (characters != nil) [self setHintCharacters:characters];\n  }\n  return self;\n}\n\n- (NSString *)currentHintCode {\n  NSString *code = nil;\n  if (currentHint >= [hintCharacters length]) {\n    SlateLogger(@\"    %ld > %ld, not giving code\", currentHint, [hintCharacters length]);\n    return code;\n  }\n  code = [hintCharacters substringWithRange:NSMakeRange(currentHint, 1)];\n  SlateLogger(@\"    GIVING CODE: %@\", code);\n  return code;\n}\n\n- (BOOL)doOperation {\n  SlateLogger(@\"----------------- Begin Hint Operation -----------------\");\n  ScreenWrapper *sw = [[ScreenWrapper alloc] init];\n  BOOL success = [self doOperationWithAccessibilityWrapper:nil screenWrapper:sw];\n  SlateLogger(@\"-----------------  End Hint Operation  -----------------\");\n  return success;\n}\n\n// the nsApp parameter is used to retrieve the icon if necessary.\n// if it is nil and the icon is needed, the NSRunningApplication will be retrieved via process ID\n// from the appRef.\n- (void)createHintWindowFor:(AXUIElementRef)windowRef inApp:(AXUIElementRef)appRef screenWrapper:(ScreenWrapper *)sw {\n  SlateLogger(@\"    attempting to hint\");\n  NSString *hintCode = [self currentHintCode];\n  if (hintCode == nil) {\n    SlateLogger(@\"    HINTCODE NIL!\");\n    return;\n  }\n  NSNumber *currentHintNumber = [NSNumber numberWithInteger:currentHint];\n  AccessibilityWrapper *aw = [[AccessibilityWrapper alloc] initWithApp:appRef window:windowRef];\n  NSPoint wTL = [aw getCurrentTopLeft];\n  NSSize wSize = [aw getCurrentSize];\n  // check corners and center to see which screen window is on\n  NSInteger screenId = [sw getScreenIdForPoint:wTL];\n  if (screenId < 0) screenId = [sw getScreenIdForPoint:NSMakePoint(wTL.x+wSize.width/2, wTL.y+wSize.height/2)];\n  if (screenId < 0) screenId = [sw getScreenIdForPoint:NSMakePoint(wTL.x+wSize.width, wTL.y)];\n  if (screenId < 0) screenId = [sw getScreenIdForPoint:NSMakePoint(wTL.x+wSize.width, wTL.y+wSize.height)];\n  if (screenId < 0) screenId = [sw getScreenIdForPoint:NSMakePoint(wTL.x, wTL.y+wSize.height)];\n  if (screenId < 0)  {\n    SlateLogger(@\"    Window is offscreen, not creating hint.\");\n    return;\n  }\n  NSScreen *screen = [[sw screens] objectAtIndex:screenId];\n  // convert top left to screen relative for the NSWindow\n  NSPoint tl = [sw convertTopLeftToScreenRelative:wTL screen:screenId];\n  // now need to flip y coord\n  tl.y = [screen frame].size.height - ([sw isMainScreen:screenId] ? MAIN_MENU_HEIGHT : 0) - tl.y;\n  NSMutableDictionary *values = [[sw getScreenAndWindowValues:screenId window:NSMakeRect(tl.x, tl.y, wSize.width, wSize.height) newSize:wSize] mutableCopy];\n  float whHeight = [ExpressionPoint expToFloat:[[SlateConfig getInstance] getConfig:WINDOW_HINTS_HEIGHT] withDict:values];\n  float whWidth = [ExpressionPoint expToFloat:[[SlateConfig getInstance] getConfig:WINDOW_HINTS_WIDTH] withDict:values];\n  [values setObject:[NSNumber numberWithFloat:whWidth] forKey:WINDOW_HINTS_WIDTH];\n  [values setObject:[NSNumber numberWithFloat:whHeight] forKey:WINDOW_HINTS_HEIGHT];\n  // these two arrays are guarenteed to be the same size because of testOperation\n  NSArray *whTLXArr = [[SlateConfig getInstance] getArrayConfig:WINDOW_HINTS_TOP_LEFT_X];\n  NSArray *whTLYArr = [[SlateConfig getInstance] getArrayConfig:WINDOW_HINTS_TOP_LEFT_Y];\n  NSInteger i = 0;\n  float whTLXRel = [ExpressionPoint expToFloat:[whTLXArr objectAtIndex:i] withDict:values];\n  float whTLYRel = [ExpressionPoint expToFloat:[whTLYArr objectAtIndex:i] withDict:values];\n  float whTLX = tl.x + whTLXRel;\n  float whTLY = tl.y - whTLYRel;\n  NSRect frame = NSMakeRect(whTLX, whTLY - whHeight, whWidth, whHeight);\n  // check frame boundaries to make sure it is over the window we want it to be over\n  // cycle through config for all possible locations\n  if (ignoreHidden) {\n    BOOL foundValidLocation = NO;\n    do {\n      whTLXRel = [ExpressionPoint expToFloat:[whTLXArr objectAtIndex:i] withDict:values];\n      whTLYRel = [ExpressionPoint expToFloat:[whTLYArr objectAtIndex:i] withDict:values];\n      whTLX = tl.x + whTLXRel;\n      whTLY = tl.y - whTLYRel;\n      frame = NSMakeRect(whTLX, whTLY - whHeight, whWidth, whHeight);\n      if ([[AccessibilityWrapper getTitle:[AccessibilityWrapper\n                                           windowUnderPoint:NSMakePoint(wTL.x + whTLXRel + whWidth/2,\n                                                                        wTL.y + whTLYRel + whHeight/2)]]\n           isEqualToString:[AccessibilityWrapper getTitle:windowRef]]) {\n        foundValidLocation = YES;\n      }\n      i++;\n    } while (!foundValidLocation && i < [whTLXArr count]);\n    if (!foundValidLocation) {\n      SlateLogger(@\"        No locations visible, do not show hint!\");\n      return;\n    }\n  }\n\n  if (spreadOnCollision) {\n    // if it collides, spread it down\n    while ([self collidesWithExistingHint:frame.origin]) {\n      frame = NSMakeRect(frame.origin.x, frame.origin.y - whHeight - spreadPadding,\n                         frame.size.width, frame.size.height);\n    }\n    [frames addObject:[NSValue valueWithRect:frame]];\n  }\n\n  if ([hints objectForKey:currentHintNumber] == nil) {\n    SlateLogger(@\"        New Window!\");\n    NSWindow *window = [[HintWindow alloc] initWithContentRect:frame\n                                                     styleMask:NSBorderlessWindowMask\n                                                       backing:NSBackingStoreBuffered\n                                                         defer:NO\n                                                        screen:screen];\n    [window setReleasedWhenClosed:NO];\n    [window setOpaque:NO];\n    [window setBackgroundColor:[NSColor colorWithDeviceRed:0.0 green:0.0 blue:0.0 alpha:0.0]];\n    [window makeKeyAndOrderFront:NSApp];\n    [window setLevel:(NSScreenSaverWindowLevel - 1)];\n    HintView *label = [[HintView alloc] initWithFrame:frame];\n    [label setText:hintCode];\n    [label setIconFromAppRef:appRef];\n    [window setContentView:label];\n    NSWindowController *wc = [[NSWindowController alloc] initWithWindow:window];\n    [hints setObject:wc forKey:currentHintNumber];\n  } else {\n    SlateLogger(@\"        Existing Window!\");\n    NSWindowController *wc = [hints objectForKey:currentHintNumber];\n    [[wc window] setFrame:NSMakeRect(frame.origin.x+screen.frame.origin.x, frame.origin.y+screen.frame.origin.y, frame.size.width, frame.size.height) display:NO];\n    HintView *label = (HintView*)[[wc window] contentView];\n    [label setIconFromAppRef:appRef];\n    [wc showWindow:[wc window]];\n  }\n  [windows setObject:[NSValue valueWithPointer:windowRef] forKey:currentHintNumber];\n  [apps setObject:[NSValue valueWithPointer:appRef] forKey:currentHintNumber];\n\n  // Register the hotkey\n  NSNumber *keyCode = [[Binding asciiToCodeDict] objectForKey:[hintCode lowercaseString]];\n  EventHotKeyID myHotKeyID;\n  EventHotKeyRef myHotKeyRef;\n  myHotKeyID.signature = *[[NSString stringWithFormat:@\"hotkey%ld\",currentHint] cStringUsingEncoding:NSASCIIStringEncoding];\n  myHotKeyID.id = (UInt32)currentHint;\n  RegisterEventHotKey([keyCode unsignedIntValue], 0, myHotKeyID, GetEventMonitorTarget(), 0, &myHotKeyRef);\n  [hotkeyRefs addObject:[NSValue valueWithPointer:myHotKeyRef]];\n  currentHint++;\n}\n\n// check if the origin of this hint is in\n- (BOOL)collidesWithExistingHint:(NSPoint)origin {\n  for (NSValue *rectVal in frames) {\n    NSPoint other = [rectVal rectValue].origin;\n    // make a rect of the search width and height centered on the origin of the other point\n    NSRect otherRect = NSMakeRect(other.x - spreadSearchWidth/2, other.y - spreadSearchHeight/2,\n                                  spreadSearchWidth, spreadSearchHeight);\n    if(NSPointInRect(origin, otherRect)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nCFComparisonResult leftToRightWindows(const void *val1, const void *val2, void *context) {\n  AXUIElementRef w1 = val1;\n  AXUIElementRef w2 = val2;\n  NSPoint w1TL = [AccessibilityWrapper getTopLeftForWindow:w1];\n  NSPoint w2TL = [AccessibilityWrapper getTopLeftForWindow:w2];\n  if (w1TL.x < w2TL.x) {\n    return kCFCompareLessThan;\n  } else if (w1TL.x > w2TL.x) {\n    return kCFCompareGreaterThan;\n  } else {\n    if (w1TL.y < w2TL.y) {\n      return kCFCompareLessThan;\n    } else if (w1TL.y > w2TL.y) {\n      return kCFCompareGreaterThan;\n    }\n  }\n  return kCFCompareEqualTo;\n}\n\nCFComparisonResult rightToLeftWindows(const void *val1, const void *val2, void *context) {\n  AXUIElementRef w1 = val1;\n  AXUIElementRef w2 = val2;\n  NSPoint w1TL = [AccessibilityWrapper getTopLeftForWindow:w1];\n  NSPoint w2TL = [AccessibilityWrapper getTopLeftForWindow:w2];\n  if (w1TL.x < w2TL.x) {\n    return kCFCompareGreaterThan;\n  } else if (w1TL.x > w2TL.x) {\n    return kCFCompareLessThan;\n  } else {\n    if (w1TL.y < w2TL.y) {\n      return kCFCompareLessThan;\n    } else if (w1TL.y > w2TL.y) {\n      return kCFCompareGreaterThan;\n    }\n  }\n  return kCFCompareEqualTo;\n}\n\n- (BOOL)doOperationWithAccessibilityWrapper:(AccessibilityWrapper *)iamnil screenWrapper:(ScreenWrapper *)sw {\n  if (hideTimer != nil) return YES;\n  [self evalOptionsWithAccessibilityWrapper:iamnil screenWrapper:sw];\n  [(SlateAppDelegate *)[NSApp delegate] setCurrentHintOperation:self];\n  ignoreHidden = [[SlateConfig getInstance] getBoolConfig:WINDOW_HINTS_IGNORE_HIDDEN_WINDOWS];\n  [self setCurrentHint:0];\n  [frames removeAllObjects];\n  [self setCurrentWindow:[[AccessibilityWrapper alloc] init]];\n  if ([[[SlateConfig getInstance] getConfig:WINDOW_HINTS_ORDER] isEqualToString:WINDOW_HINTS_ORDER_NONE]) {\n    // normal fast way\n    for (NSRunningApplication *app in [RunningApplications getInstance]) {\n      pid_t appPID = [app processIdentifier];\n      SlateLogger(@\"I see application '%@' with pid '%d'\", [app localizedName], appPID);\n      AXUIElementRef appRef = AXUIElementCreateApplication(appPID);\n      CFArrayRef windowsArr = [AccessibilityWrapper windowsInApp:appRef];\n      if (!windowsArr || CFArrayGetCount(windowsArr) == 0) continue;\n      for (NSInteger i = 0; i < CFArrayGetCount(windowsArr); i++) {\n        NSString *title = [AccessibilityWrapper getTitle:CFArrayGetValueAtIndex(windowsArr, i)];\n        if (title == nil || [EMPTY isEqualToString:title]) continue; // skip empty title windows because they are invisible\n        SlateLogger(@\"  Hinting Window: %@\", title);\n        [self createHintWindowFor:CFArrayGetValueAtIndex(windowsArr, i) inApp:appRef screenWrapper:sw];\n      }\n    }\n  } else if ([[[SlateConfig getInstance] getConfig:WINDOW_HINTS_ORDER] isEqualToString:WINDOW_HINTS_ORDER_PERSIST]) {\n    // same hint always\n    for (NSRunningApplication *app in [RunningApplications getInstance]) {\n      pid_t appPID = [app processIdentifier];\n      SlateLogger(@\"I see application '%@' with pid '%d'\", [app localizedName], appPID);\n      AXUIElementRef appRef = AXUIElementCreateApplication(appPID);\n      CFArrayRef windowsArr = [AccessibilityWrapper windowsInApp:appRef];\n      if (!windowsArr || CFArrayGetCount(windowsArr) == 0) continue;\n      for (NSInteger i = 0; i < CFArrayGetCount(windowsArr); i++) {\n        NSString *title = [AccessibilityWrapper getTitle:CFArrayGetValueAtIndex(windowsArr, i)];\n        if (title == nil || [EMPTY isEqualToString:title]) continue; // skip empty title windows because they are invisible\n        if ([[RunningApplications getInstance] windowIdsForTitle:title] == nil) continue;\n        SlateLogger(@\"  Hinting Window: %@\", title);\n        NSArray *possibleHints = [[RunningApplications getInstance] windowIdsForTitle:title];\n        for (NSNumber *possibleHint in possibleHints) {\n          if ([hints objectForKey:possibleHint]) continue;\n          [self setCurrentHint:[possibleHint integerValue]];\n          [self createHintWindowFor:CFArrayGetValueAtIndex(windowsArr, i) inApp:appRef screenWrapper:sw];\n          break;\n        }\n      }\n    }\n  } else {\n    // custom sort order\n    CFMutableArrayRef allWindows = CFArrayCreateMutable(kCFAllocatorDefault, 0, NULL);\n    for (NSRunningApplication *app in [RunningApplications getInstance]) {\n      pid_t appPID = [app processIdentifier];\n      SlateLogger(@\"I see application '%@' with pid '%d'\", [app localizedName], appPID);\n      AXUIElementRef appRef = AXUIElementCreateApplication(appPID);\n      CFArrayRef windowsArr = [AccessibilityWrapper windowsInApp:appRef];\n      if (windowsArr != nil && windowsArr != NULL && CFArrayGetCount(windowsArr) > 0) {\n        CFArrayAppendArray(allWindows, windowsArr, CFRangeMake(0, CFArrayGetCount(windowsArr)));\n      }\n    }\n    // check which custom order and sort accordingly. if someone was stupid and entered a bad config, do nothing.\n    if ([[[SlateConfig getInstance] getConfig:WINDOW_HINTS_ORDER] isEqualToString:WINDOW_HINTS_ORDER_LEFT_TO_RIGHT]) {\n      CFArraySortValues(allWindows, CFRangeMake(0, CFArrayGetCount(allWindows)), leftToRightWindows, NULL);\n    } else if ([[[SlateConfig getInstance] getConfig:WINDOW_HINTS_ORDER] isEqualToString:WINDOW_HINTS_ORDER_RIGHT_TO_LEFT]) {\n      CFArraySortValues(allWindows, CFRangeMake(0, CFArrayGetCount(allWindows)), rightToLeftWindows, NULL);\n    }\n    for (NSInteger i = 0; i < CFArrayGetCount(allWindows); i++) {\n      NSString *title = [AccessibilityWrapper getTitle:CFArrayGetValueAtIndex(allWindows, i)];\n      if (title == nil || [EMPTY isEqualToString:title]) continue; // skip empty title windows because they are invisible\n      SlateLogger(@\"  Hinting Window: %@\", title);\n      CFTypeRef _window = CFArrayGetValueAtIndex(allWindows, i);\n      [self createHintWindowFor:(AXUIElementRef)_window inApp:[AccessibilityWrapper applicationForElement:(AXUIElementRef)_window] screenWrapper:sw];\n    }\n  }\n\n  // Register the escape hotkey\n  NSNumber *keyCode = [[Binding asciiToCodeDict] objectForKey:@\"esc\"];\n  EventHotKeyID myHotKeyID;\n  EventHotKeyRef myHotKeyRef;\n  myHotKeyID.signature = *[@\"hotkeyESC\" cStringUsingEncoding:NSASCIIStringEncoding];\n  myHotKeyID.id = (UInt32)(ESC_HINT_ID);\n  RegisterEventHotKey([keyCode unsignedIntValue], 0, myHotKeyID, GetEventMonitorTarget(), 0, &myHotKeyRef);\n  [hotkeyRefs addObject:[NSValue valueWithPointer:myHotKeyRef]];\n\n  // Set the hide timer\n  [self setHideTimer:[NSTimer scheduledTimerWithTimeInterval:[[SlateConfig getInstance] getFloatConfig:WINDOW_HINTS_DURATION]\n                                                      target:self\n                                                    selector:@selector(killHints)\n                                                    userInfo:nil\n                                                     repeats:NO]];\n  return YES;\n}\n\n- (BOOL)testOperation {\n  NSArray *whTLXArr = [[SlateConfig getInstance] getArrayConfig:WINDOW_HINTS_TOP_LEFT_X];\n  NSArray *whTLYArr = [[SlateConfig getInstance] getArrayConfig:WINDOW_HINTS_TOP_LEFT_Y];\n  return [whTLXArr count] == [whTLYArr count] && [whTLXArr count] > 0;\n}\n\n- (void)killHints {\n  [self killHints:NO];\n}\n\n- (void)killHints:(BOOL)refocus {\n  for (NSValue *hotkeyRef in hotkeyRefs) {\n    UnregisterEventHotKey([hotkeyRef pointerValue]);\n  }\n  [hotkeyRefs removeAllObjects];\n  if ([self hideTimer]) [[self hideTimer] invalidate];\n  [self setHideTimer:nil];\n  for (NSWindowController *hint in [hints allValues]) {\n    [hint close];\n  }\n  [windows removeAllObjects];\n  [apps removeAllObjects];\n  if (refocus && currentWindow) [currentWindow focus];\n  [self setCurrentWindow:nil];\n  [(SlateAppDelegate *)[NSApp delegate] setCurrentHintOperation:nil];\n}\n\n- (void)activateHintKey:(NSInteger)hintId {\n  if (hintId == ESC_HINT_ID) {\n    // escape key\n    [self killHints];\n    return;\n  }\n  NSNumber *currentHintNumber = [NSNumber numberWithInteger:hintId];\n  if ([hints objectForKey:currentHintNumber] == nil) {\n    SlateLogger(@\"no hint window\");\n    return;\n  }\n  AccessibilityWrapper *aw = [[AccessibilityWrapper alloc] initWithApp:[[apps objectForKey:currentHintNumber] pointerValue] window:[[windows objectForKey:currentHintNumber] pointerValue]];\n  [aw focus];\n  [self killHints];\n  SlateLogger(@\"focus fail\");\n}\n\n- (void)parseOption:(NSString *)name value:(id)value {\n  if (value == nil) { return; }\n  if ([name isEqualToString:OPT_CHARACTERS]) {\n    if (![value isKindOfClass:[NSString class]]) {\n      @throw([NSException exceptionWithName:[NSString stringWithFormat:@\"Invalid %@\", name] reason:[NSString stringWithFormat:@\"Invalid %@ '%@'\", name, value] userInfo:nil]);\n      return;\n    }\n    [self setHintCharacters:value];\n  }\n}\n\n+ (id)hintOperation {\n  return [[HintOperation alloc] init];\n}\n\n+ (id)hintOperationFromString:(NSString *)hintOperation {\n  // hint characters\n  NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n  [StringTokenizer tokenize:hintOperation into:tokens maxTokens:2];\n  Operation *op = [[HintOperation alloc] initWithCharacters:([tokens count] > 1) ? [tokens objectAtIndex:1] : nil];\n  return op;\n}\n\n@end\n"
  },
  {
    "path": "Slate/HintView.h",
    "content": "//\n//  HintView.h\n//  Slate\n//\n//  Created by Jigish Patel on 3/3/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import <Cocoa/Cocoa.h>\n\n@interface HintView : NSView {\n@private\n  NSString *text;\n  NSImage *icon;\n}\n\n- (void)setIconFromAppRef:(AXUIElementRef)appRef;\n\n@property NSString *text;\n@property NSImage *icon;\n\n@end\n"
  },
  {
    "path": "Slate/HintView.m",
    "content": "//\n//  HintView.m\n//  Slate\n//\n//  Created by Jigish Patel on 3/3/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"HintView.h\"\n#import \"Constants.h\"\n#import \"SlateConfig.h\"\n\n@implementation HintView\n\n@synthesize text,icon;\n\nstatic NSColor *hintBackgroundColor = nil;\nstatic NSColor *hintFontColor = nil;\nstatic NSFont *hintFont = nil;\nstatic float hintIconAlpha = -1.0;\n\n- (id)initWithFrame:(NSRect)frame {\n  self = [super initWithFrame:frame];\n  if (self) {\n    [self setWantsLayer:YES];\n    [self setIcon:nil];\n    if (hintBackgroundColor == nil) {\n      NSArray *bgColorArr = [[SlateConfig getInstance] getArrayConfig:WINDOW_HINTS_BACKGROUND_COLOR];\n      if ([bgColorArr count] < 4) bgColorArr = [WINDOW_HINTS_BACKGROUND_COLOR_DEFAULT componentsSeparatedByString:SEMICOLON];\n      hintBackgroundColor = [NSColor colorWithDeviceRed:[[bgColorArr objectAtIndex:0] floatValue]/255.0\n                                                  green:[[bgColorArr objectAtIndex:1] floatValue]/255.0\n                                                   blue:[[bgColorArr objectAtIndex:2] floatValue]/255.0\n                                                  alpha:[[bgColorArr objectAtIndex:3] floatValue]];\n    }\n    if (hintFontColor == nil) {\n      NSArray *fColorArr = [[SlateConfig getInstance] getArrayConfig:WINDOW_HINTS_FONT_COLOR];\n      if ([fColorArr count] < 4) fColorArr = [WINDOW_HINTS_FONT_COLOR_DEFAULT componentsSeparatedByString:SEMICOLON];\n      hintFontColor = [NSColor colorWithDeviceRed:[[fColorArr objectAtIndex:0] floatValue]/255.0\n                                            green:[[fColorArr objectAtIndex:1] floatValue]/255.0\n                                             blue:[[fColorArr objectAtIndex:2] floatValue]/255.0\n                                            alpha:[[fColorArr objectAtIndex:3] floatValue]];\n    }\n    if (hintFont == nil) {\n      hintFont = [NSFont fontWithName:[[SlateConfig getInstance] getConfig:WINDOW_HINTS_FONT_NAME]\n                                 size:[[SlateConfig getInstance] getFloatConfig:WINDOW_HINTS_FONT_SIZE]];\n    }\n    if (hintIconAlpha < 0.0) {\n      hintIconAlpha = [[SlateConfig getInstance] getFloatConfig:WINDOW_HINTS_ICON_ALPHA];\n    }\n  }\n  return self;\n}\n\n- (void)setIconFromAppRef:(AXUIElementRef)appRef {\n  if ([[SlateConfig getInstance] getBoolConfig:WINDOW_HINTS_SHOW_ICONS]) {\n    pid_t pid;\n    AXUIElementGetPid(appRef, &pid);\n    NSRunningApplication *app = [NSRunningApplication runningApplicationWithProcessIdentifier:pid];\n    [self setIcon:[app icon]];\n  }\n}\n\n- (void)drawCenteredText:(NSString *)string bounds:(NSRect)rect attributes:(NSDictionary *)attributes {\n  NSSize size = [string sizeWithAttributes:attributes];\n  NSPoint origin = NSMakePoint(rect.origin.x + (rect.size.width - size.width) / 2,\n                               rect.origin.y + (rect.size.height - size.height) / 2);\n  [string drawAtPoint:origin withAttributes:attributes];\n}\n\n- (void)drawRect:(NSRect)dirtyRect {\n  [[NSGraphicsContext currentContext] saveGraphicsState];\n  [[NSGraphicsContext currentContext] setShouldAntialias:YES];\n\n  // draw the rounded rect\n  [hintBackgroundColor set];\n  float cornerSize = [[SlateConfig getInstance] getFloatConfig:WINDOW_HINTS_ROUNDED_CORNER_SIZE];\n  NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:[self bounds] xRadius:cornerSize yRadius:cornerSize];\n  [path fill];\n\n  // draw the icon on top of the rounded rect, if specified\n  if (icon != nil) {\n    [icon drawInRect:[self bounds] fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:hintIconAlpha];\n  }\n\n  // draw hint letter\n  [self drawCenteredText:text\n                  bounds:self.bounds\n              attributes:[NSDictionary dictionaryWithObjectsAndKeys:hintFont,\n                                                                    NSFontAttributeName,\n                                                                    hintFontColor,\n                                                                    NSForegroundColorAttributeName, nil]];\n  [[NSGraphicsContext currentContext] restoreGraphicsState];\n}\n\n@end\n"
  },
  {
    "path": "Slate/HintWindow.h",
    "content": "//\n//  HintWindow.h\n//  Slate\n//\n//  Created by Jigish Patel on 3/3/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import <Cocoa/Cocoa.h>\n\n@interface HintWindow : NSWindow\n\n@end\n"
  },
  {
    "path": "Slate/HintWindow.m",
    "content": "//\n//  HintWindow.m\n//  Slate\n//\n//  Created by Jigish Patel on 3/3/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"HintWindow.h\"\n\n@implementation HintWindow\n\n- (BOOL)canBecomeKeyWindow {\n  return YES;\n}\n\n@end\n"
  },
  {
    "path": "Slate/JSApplicationWrapper.h",
    "content": "//\n//  JSApplicationWrapper.h\n//  Slate\n//\n//  Created by Jigish Patel on 1/21/13.\n//  Copyright 2013 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n\n@class AccessibilityWrapper;\n@class ScreenWrapper;\n\n@interface JSApplicationWrapper : NSObject {\n  AccessibilityWrapper *aw;\n  ScreenWrapper *sw;\n  NSRunningApplication *app;\n}\n@property (strong) AccessibilityWrapper *aw;\n@property (strong) ScreenWrapper *sw;\n@property (strong) NSRunningApplication *app;\n- (id)initWithAccessibilityWrapper:(AccessibilityWrapper *)_aw screenWrapper:(ScreenWrapper *)_sw;\n- (id)initWithRunningApplication:(NSRunningApplication *)_app screenWrapper:(ScreenWrapper *)_sw;\n- (NSString *)toString;\n@end\n"
  },
  {
    "path": "Slate/JSApplicationWrapper.m",
    "content": "//\n//  JSApplicationWrapper.m\n//  Slate\n//\n//  Created by Jigish Patel on 1/21/13.\n//  Copyright 2013 Jigish Patel. All rights reserved.\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\n#import \"JSApplicationWrapper.h\"\n#import \"AccessibilityWrapper.h\"\n#import \"ScreenWrapper.h\"\n#import \"JSController.h\"\n#import \"JSWindowWrapper.h\"\n#import \"JSOperationWrapper.h\"\n\n@implementation JSApplicationWrapper\n\nstatic NSDictionary *jsawJsMethods;\n\n@synthesize aw, sw, app;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [self setAw:[[AccessibilityWrapper alloc] init]];\n    [self setSw:[[ScreenWrapper alloc] init]];\n    [self setApp:[NSRunningApplication runningApplicationWithProcessIdentifier:[aw processIdentifier]]];\n    [JSApplicationWrapper setJsMethods];\n  }\n  return self;\n}\n\n- (id)initWithAccessibilityWrapper:(AccessibilityWrapper *)_aw screenWrapper:(ScreenWrapper *)_sw {\n  self = [super init];\n  if (self) {\n    [self setAw:_aw];\n    [self setSw:_sw];\n    [self setApp:[NSRunningApplication runningApplicationWithProcessIdentifier:[aw processIdentifier]]];\n    [JSApplicationWrapper setJsMethods];\n  }\n  return self;\n}\n\n- (id)initWithRunningApplication:(NSRunningApplication *)_app screenWrapper:(ScreenWrapper *)_sw {\n  self = [super init];\n  if (self) {\n    [self setApp:_app];\n    [self setAw:nil];\n    [self setSw:_sw];\n    [JSApplicationWrapper setJsMethods];\n  }\n  return self;\n}\n\n- (pid_t)pid {\n  return [app processIdentifier];\n}\n\n- (NSString *)name {\n  return [app localizedName];\n}\n\n- (id)mwindow {\n return [self mainWindow];\n}\n\n- (id)mainWindow {\n  AccessibilityWrapper *_aw = [[AccessibilityWrapper alloc] initWithApp:AXUIElementCreateApplication([app processIdentifier])\n                                                                 window:[AccessibilityWrapper focusedWindowInRunningApp:app]];\n  return [[JSWindowWrapper alloc] initWithAccessibilityWrapper:_aw screenWrapper:sw];\n}\n\n- (void)ewindow:(id)obj {\n  [self eachWindow:obj];\n}\n\n- (void)eachWindow:(id)funcOrOp {\n  NSString *type = [[JSController getInstance] jsTypeof:funcOrOp];\n  CFArrayRef windowsArrRef = [AccessibilityWrapper windowsInRunningApp:app];\n  if (!windowsArrRef || CFArrayGetCount(windowsArrRef) == 0) return;\n  CFMutableArrayRef windowsArr = CFArrayCreateMutableCopy(kCFAllocatorDefault, 0, windowsArrRef);\n  if ([funcOrOp isKindOfClass:[Operation class]] || [funcOrOp isKindOfClass:[JSOperationWrapper class]]) {\n    for (NSInteger i = 0; i < CFArrayGetCount(windowsArr); i++) {\n      AccessibilityWrapper *_aw = [[AccessibilityWrapper alloc] initWithApp:AXUIElementCreateApplication([app processIdentifier])\n                                                                     window:CFArrayGetValueAtIndex(windowsArr, i)];\n      [funcOrOp doOperationWithAccessibilityWrapper:_aw screenWrapper:sw];\n    }\n  } else if ([@\"function\" isEqualToString:type]) {\n    for (NSInteger i = 0; i < CFArrayGetCount(windowsArr); i++) {\n      AccessibilityWrapper *_aw = [[AccessibilityWrapper alloc] initWithApp:AXUIElementCreateApplication([app processIdentifier])\n                                                                     window:CFArrayGetValueAtIndex(windowsArr, i)];\n      [[JSController getInstance] runFunction:funcOrOp withArg:[[JSWindowWrapper alloc] initWithAccessibilityWrapper:_aw screenWrapper:sw]];\n    }\n  }\n}\n\n- (NSString *)toString {\n  return [self name];\n}\n\n+ (void)setJsMethods {\n  if (jsawJsMethods == nil) {\n    jsawJsMethods = @{\n      NSStringFromSelector(@selector(pid)): @\"pid\",\n      NSStringFromSelector(@selector(name)): @\"name\",\n      NSStringFromSelector(@selector(eachWindow:)): @\"eachWindow\",\n      NSStringFromSelector(@selector(ewindow:)): @\"ewindow\",\n      NSStringFromSelector(@selector(mainWindow)): @\"mainWindow\",\n      NSStringFromSelector(@selector(mwindow)): @\"mwindow\",\n    };\n  }\n}\n\n+ (BOOL)isSelectorExcludedFromWebScript:(SEL)sel {\n  return [jsawJsMethods objectForKey:NSStringFromSelector(sel)] == NULL;\n}\n\n+ (NSString *)webScriptNameForSelector:(SEL)sel {\n  return [jsawJsMethods objectForKey:NSStringFromSelector(sel)];\n}\n\n@end\n"
  },
  {
    "path": "Slate/JSController.h",
    "content": "//\n//  JSController.h\n//  Slate\n//\n//  Created by Alex Morega on 2013-01-16.\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\n#import <Foundation/Foundation.h>\n#import <WebKit/WebKit.h>\n#import \"Operation.h\"\n\n@interface JSController : NSObject {\n  WebView *webView;\n  WebScriptObject *scriptObject;\n  NSMutableDictionary *functions;\n  BOOL inited;\n  NSMutableDictionary *eventCallbacks;\n}\n@property NSMutableDictionary *functions;\n@property NSMutableDictionary *eventCallbacks;\n\n- (BOOL)loadConfigFileWithPath:(NSString *)path;\n- (void)runCallbacks:(NSString *)what payload:(id)payload;\n- (NSString *)addCallableFunction:(WebScriptObject *)function;\n- (id)runCallableFunction:(NSString *)key;\n- (id)runFunction:(WebScriptObject*)function;\n- (id)runFunction:(WebScriptObject *)function withArg:(id)arg;\n- (id)unmarshall:(id)obj;\n- (id)marshall:(id)obj;\n- (NSString *)jsTypeof:(WebScriptObject *)obj;\n+ (JSController *)getInstance;\n\n@end"
  },
  {
    "path": "Slate/JSController.m",
    "content": "//\n//  JSController.m\n//  Slate\n//\n//  Created by Alex Morega on 2013-01-16.\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\n#import \"JSController.h\"\n#import \"Binding.h\"\n#import \"SlateLogger.h\"\n#import \"SlateConfig.h\"\n#import \"JSInfoWrapper.h\"\n#import \"JSScreenWrapper.h\"\n#import \"Constants.h\"\n#import \"JSOperation.h\"\n#import \"ShellUtils.h\"\n#import \"JSApplicationWrapper.h\"\n#import \"JSOperationWrapper.h\"\n\n@implementation JSController\n\n@synthesize functions;\n@synthesize eventCallbacks;\n\nstatic JSController *_instance = nil;\nstatic NSDictionary *jscJsMethods;\n\n- (JSController *) init {\n  self = [super init];\n  if (self) {\n    inited = NO;\n    self.functions = [NSMutableDictionary dictionary];\n    self.eventCallbacks = [NSMutableDictionary dictionary];\n    webView = [[WebView alloc] init];\n    [JSController setJsMethods];\n  }\n  return self;\n}\n\n- (id)run:(NSString*)code {\n\tNSString* script = [NSString stringWithFormat:@\"try { %@ } catch (___ex___) { 'EXCEPTION: '+___ex___; }\", code];\n\tid data = [scriptObject evaluateWebScript:script];\n\tif(![data isMemberOfClass:[WebUndefined class]]) {\n\t\tSlateLogger(@\"%@\", data);\n    if ([data isKindOfClass:[NSString class]] && [data hasPrefix:@\"EXCEPTION: \"]) {\n      @throw([NSException exceptionWithName:@\"JavaScript Error\" reason:data userInfo:nil]);\n    }\n  }\n  return [self unmarshall:data];\n}\n\n- (NSString *)genFuncKey {\n  return [NSString stringWithFormat:@\"javascript:function[%ld]\", [functions count]];\n}\n\n- (NSString *)addCallableFunction:(WebScriptObject *)function {\n  NSString *key = [self genFuncKey];\n  [functions setObject:function forKey:key];\n  return key;\n}\n\n- (id)runCallableFunction:(NSString *)key {\n  WebScriptObject *func = [functions objectForKey:key];\n  if (func == nil) { return nil; }\n  return [self runFunction:func];\n}\n\n- (id)runFunction:(WebScriptObject *)function {\n  [scriptObject setValue:function forKey:@\"_slate_callback\"];\n  return [self run:@\"window._slate_callback();\"];\n}\n\n- (id)runFunction:(WebScriptObject *)function withArg:(id)arg {\n  [scriptObject setValue:function forKey:@\"_slate_callback\"];\n  [scriptObject setValue:arg forKey:@\"_slate_callback_arg\"];\n  return [self run:@\"window._slate_callback(window._slate_callback_arg);\"];\n}\n\n- (id)runFunction:(WebScriptObject *)function withArg:(id)arg secondArg:(id)arg2 {\n  [scriptObject setValue:function forKey:@\"_slate_callback\"];\n  [scriptObject setValue:arg forKey:@\"_slate_callback_arg\"];\n  [scriptObject setValue:arg2 forKey:@\"_slate_callback_arg2\"];\n  return [self run:@\"window._slate_callback(window._slate_callback_arg, window._slate_callback_arg2);\"];\n}\n\n- (BOOL)runFile:(NSString*)path {\n  NSError *err;\n  NSString *fileString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&err];\n  if(err == nil && fileString != nil && fileString != NULL) {\n    [self run:fileString];\n    return YES;\n  }\n  return NO;\n}\n\n- (void)setInfo {\n  [scriptObject setValue:[JSInfoWrapper getInstance] forKey:@\"_info\"];\n}\n\n- (void)initializeWebView {\n  if (inited) { return; }\n  [[webView mainFrame] loadHTMLString:@\"\" baseURL:NULL];\n  scriptObject = [webView windowScriptObject];\n  [scriptObject setValue:self forKey:@\"_controller\"];\n  [self setInfo];\n  @try {\n    [self runFile:[[NSBundle mainBundle] pathForResource:@\"underscore\" ofType:@\"js\"]];\n    [self runFile:[[NSBundle mainBundle] pathForResource:@\"utils\" ofType:@\"js\"]];\n    [self runFile:[[NSBundle mainBundle] pathForResource:@\"initialize\" ofType:@\"js\"]];\n  } @catch (NSException *ex) {\n    SlateLogger(@\"   ERROR %@\",[ex name]);\n    NSAlert *alert = [SlateConfig warningAlertWithKeyEquivalents: [NSArray arrayWithObjects:@\"Quit\", @\"Skip\", nil]];\n    [alert setMessageText:[ex name]];\n    [alert setInformativeText:[ex reason]];\n    if ([alert runModal] == NSAlertFirstButtonReturn) {\n      SlateLogger(@\"User selected exit\");\n      [NSApp terminate:nil];\n    }\n  }\n  inited = YES;\n}\n\n- (BOOL)loadConfigFileWithPath:(NSString *)path {\n  [self initializeWebView];\n  @try {\n    return [self runFile:[path stringByExpandingTildeInPath]];\n  } @catch (NSException *ex) {\n    SlateLogger(@\"   ERROR %@\",[ex name]);\n    NSAlert *alert = [SlateConfig warningAlertWithKeyEquivalents: [NSArray arrayWithObjects:@\"Quit\", @\"Skip\", nil]];\n    [alert setMessageText:[ex name]];\n    [alert setInformativeText:[ex reason]];\n    if ([alert runModal] == NSAlertFirstButtonReturn) {\n      SlateLogger(@\"User selected exit\");\n      [NSApp terminate:nil];\n    }\n  }\n  return NO;\n}\n\n- (void)configFunction:(NSString *)key callback:(WebScriptObject *)callback {\n  NSString *fkey = [self addCallableFunction:callback];\n  [[[SlateConfig getInstance] configs] setValue:[NSString stringWithFormat:@\"_javascript_::%@\", fkey] forKey:key];\n}\n\n- (void)configNative:(NSString *)key callback:(id)callback {\n  [[[SlateConfig getInstance] configs] setValue:[NSString stringWithFormat:@\"%@\", callback] forKey:key];\n}\n\n- (void)bindFunction:(NSString *)hotkey callback:(WebScriptObject *)callback repeat:(id)_repeat {\n  JSOperation *op = [JSOperation jsOperationWithFunction:callback];\n  BOOL repeat = NO;\n  if (_repeat != nil && ([_repeat isKindOfClass:[NSNumber class]] || [_repeat isKindOfClass:[NSValue class]] || [_repeat isKindOfClass:[NSString class]])) {\n    repeat = [_repeat boolValue];\n  } else {\n    repeat = [Operation isRepeatOnHoldOp:[op opName]];\n  }\n  @try {\n    Binding *bind = [[Binding alloc] initWithKeystroke:hotkey operation:op repeat:repeat];\n    [[SlateConfig getInstance] addBinding:bind];\n  } @catch (NSException *ex) {\n    SlateLogger(@\"   ERROR %@\",[ex name]);\n    NSAlert *alert = [SlateConfig warningAlertWithKeyEquivalents: [NSArray arrayWithObjects:@\"Quit\", @\"Skip\", nil]];\n    [alert setMessageText:[ex name]];\n    [alert setInformativeText:[ex reason]];\n    if ([alert runModal] == NSAlertFirstButtonReturn) {\n      SlateLogger(@\"User selected exit\");\n      [NSApp terminate:nil];\n    }\n  }\n}\n\n- (void)bindNative:(NSString *)hotkey callback:(JSOperationWrapper *)opWrapper repeat:(id)_repeat {\n  Operation *op = [opWrapper op];\n  BOOL repeat = NO;\n  if (_repeat != nil && ([_repeat isKindOfClass:[NSNumber class]] || [_repeat isKindOfClass:[NSValue class]] || [_repeat isKindOfClass:[NSString class]])) {\n    repeat = [_repeat boolValue];\n  } else {\n    repeat = [Operation isRepeatOnHoldOp:[op opName]];\n  }\n  @try {\n    Binding *bind = [[Binding alloc] initWithKeystroke:hotkey operation:op repeat:repeat];\n    [[SlateConfig getInstance] addBinding:bind];\n  } @catch (NSException *ex) {\n    SlateLogger(@\"   ERROR %@\",[ex name]);\n    NSAlert *alert = [SlateConfig warningAlertWithKeyEquivalents: [NSArray arrayWithObjects:@\"Quit\", @\"Skip\", nil]];\n    [alert setMessageText:[ex name]];\n    [alert setInformativeText:[ex reason]];\n    if ([alert runModal] == NSAlertFirstButtonReturn) {\n      SlateLogger(@\"User selected exit\");\n      [NSApp terminate:nil];\n    }\n  }\n}\n\n- (NSString *)layout:(NSString *)name hash:(WebScriptObject *)hash {\n  NSMutableDictionary *dict = [[self unmarshall:hash] mutableCopy];\n  for (NSString *app in [dict allKeys]) {\n    id tmpDict = [dict objectForKey:app];\n    if (![tmpDict isKindOfClass:[NSDictionary class]]) {\n      continue;\n    }\n    NSMutableDictionary *appDict = [tmpDict mutableCopy];\n    if ([appDict objectForKey:OPT_OPERATIONS] == nil) {\n      continue;\n    }\n    id _operations = [appDict objectForKey:OPT_OPERATIONS];\n    NSMutableArray *ops = [NSMutableArray array];\n    if ([_operations isKindOfClass:[Operation class]]) {\n      // this is an operation wrapper\n      [ops addObject:_operations];\n    } else if ([_operations isKindOfClass:[WebScriptObject class]]) {\n      // this is a function\n      Operation *op = [JSOperation jsOperationWithFunction:_operations];\n      if (op == nil) { continue; }\n      [ops addObject:op];\n    } else if ([_operations isKindOfClass:[NSArray class]]) {\n      // array of operations and/or functions\n      for (id obj in _operations) {\n        if ([obj isKindOfClass:[Operation class]]) {\n          // this is an operation key\n          [ops addObject:obj];\n        } else if ([obj isKindOfClass:[WebScriptObject class]]) {\n          // this is a function\n          Operation *op = [JSOperation jsOperationWithFunction:obj];\n          if (op == nil) { continue; }\n          [ops addObject:op];\n        }\n      }\n    }\n    if ([ops count] == 0) { continue; }\n    [appDict setObject:ops forKey:OPT_OPERATIONS];\n    [dict setObject:appDict forKey:app];\n  }\n  if (![[SlateConfig getInstance] addLayout:name dict:dict]) { return nil; }\n  return name;\n}\n\n- (void)default:(id)config toAction:(id)_action {\n  id screenConfig = [self unmarshall:config];\n  if ([screenConfig isKindOfClass:[NSNumber class]] || [screenConfig isKindOfClass:[NSValue class]] || [screenConfig isKindOfClass:[NSString class]]) {\n    // count\n  } else if ([screenConfig isKindOfClass:[NSArray class]]) {\n    // resolutions\n  } else {\n    // wtf?\n    return;\n  }\n  id action = [self unmarshall:_action];\n  id name = nil;\n  if ([action isKindOfClass:[NSString class]]) {\n    name = action;\n  } else if ([action isKindOfClass:[WebScriptObject class]]) {\n    name = [JSOperation jsOperationWithFunction:action];\n  } else {\n    // wtf?\n    return;\n  }\n  [[SlateConfig getInstance] addDefault:screenConfig layout:name];\n}\n\n- (NSString *)shell:(NSString *)commandAndArgs wait:(NSNumber *)wait path:(NSString *)path {\n  if ([path isMemberOfClass:[WebUndefined class]]) {\n    return [ShellUtils run:commandAndArgs wait:[wait boolValue] path:nil];\n  }\n  return [ShellUtils run:commandAndArgs wait:[wait boolValue] path:path];\n}\n\n- (JSOperationWrapper *)operation:(NSString *)name options:(WebScriptObject *)opts {\n  @try {\n    return [JSOperationWrapper operation:name options:opts];\n  } @catch (NSException *ex) {\n    SlateLogger(@\"   ERROR %@\",[ex name]);\n    NSAlert *alert = [SlateConfig warningAlertWithKeyEquivalents: [NSArray arrayWithObjects:@\"Quit\", @\"Skip\", nil]];\n    [alert setMessageText:[ex name]];\n    [alert setInformativeText:[ex reason]];\n    if ([alert runModal] == NSAlertFirstButtonReturn) {\n      SlateLogger(@\"User selected exit\");\n      [NSApp terminate:nil];\n    }\n  }\n  return nil;\n}\n\n- (BOOL)doOperation:(NSString *)op options:(id)opts {\n  @try {\n    id options = [self unmarshall:opts];\n    if ([options isKindOfClass:[NSDictionary class]]) {\n      return [Operation doOperation:op options:options aw:[[AccessibilityWrapper alloc] init] sw:[[ScreenWrapper alloc] init]];\n    }\n  } @catch (NSException *ex) {\n    SlateLogger(@\"   ERROR %@\",[ex name]);\n    NSAlert *alert = [SlateConfig warningAlertWithKeyEquivalents: [NSArray arrayWithObjects:@\"Quit\", @\"Skip\", nil]];\n    [alert setMessageText:[ex name]];\n    [alert setInformativeText:[ex reason]];\n    if ([alert runModal] == NSAlertFirstButtonReturn) {\n      SlateLogger(@\"User selected exit\");\n      [NSApp terminate:nil];\n    }\n  }\n  return NO;\n}\n\n- (JSOperationWrapper *)operationFromString:(NSString *)opString {\n  return [JSOperationWrapper operationFromString:opString];\n}\n\n- (BOOL)source:(NSString *)path {\n  return [[SlateConfig getInstance] loadConfigFileWithPath:path];\n}\n\n- (void)log:(id)msg {\n  NSLog(@\"%@\", msg);\n}\n\n- (BOOL)isValidEvent:(NSString *)what {\n  return [what isEqualToString:@\"windowClosed\"] || [what isEqualToString:@\"windowMoved\"] || [what isEqualToString:@\"windowResized\"] ||\n         [what isEqualToString:@\"windowOpened\"] || [what isEqualToString:@\"windowFocused\"] || [what isEqualToString:@\"windowTitleChanged\"] ||\n         [what isEqualToString:@\"appClosed\"] || [what isEqualToString:@\"appOpened\"] || [what isEqualToString:@\"appHidden\"] ||\n         [what isEqualToString:@\"appUnhidden\"] || [what isEqualToString:@\"appDeactivated\"] || [what isEqualToString:@\"appActivated\"] ||\n         [what isEqualToString:@\"screenConfigurationChanged\"];\n}\n\n- (void)on:(NSString *)what do:(WebScriptObject *)callback {\n  if (![self isValidEvent:what]) {\n    SlateLogger(@\"   ERROR: Invalid Event %@\",what);\n    NSAlert *alert = [SlateConfig warningAlertWithKeyEquivalents: [NSArray arrayWithObjects:@\"Quit\", @\"Skip\", nil]];\n    [alert setMessageText:@\"ERROR: Invalid Event\"];\n    [alert setInformativeText:what];\n    if ([alert runModal] == NSAlertFirstButtonReturn) {\n      SlateLogger(@\"User selected exit\");\n      [NSApp terminate:nil];\n    }\n  }\n  if ([what isEqualToString:@\"windowMoved\"]) {\n    [[SlateConfig getInstance] setConfig:JS_RECEIVE_MOVE_EVENT to:@\"true\"];\n  } else if ([what isEqualToString:@\"windowResized\"]) {\n    [[SlateConfig getInstance] setConfig:JS_RECEIVE_RESIZE_EVENT to:@\"true\"];\n  }\n  NSMutableArray *callbacks = [[self eventCallbacks] objectForKey:what];\n  if (callbacks == nil) {\n    callbacks = [NSMutableArray array];\n    [[self eventCallbacks] setObject:callbacks forKey:what];\n  }\n  [callbacks addObject:callback];\n}\n\n- (void)runCallbacks:(NSString *)what payload:(id)payload {\n  NSArray *callbacks = [[self eventCallbacks] objectForKey:what];\n  if (callbacks == nil || [callbacks count] == 0) { return; }\n  for (WebScriptObject *callback in callbacks) {\n    [self runFunction:callback withArg:what secondArg:payload];\n  }\n}\n\n- (WebScriptObject *)getJsArray:(NSArray *)arr {\n  id type = [scriptObject callWebScriptMethod:@\"_array_with_\" withArguments:arr];\n  if (![type isKindOfClass:[WebScriptObject class]]) {\n    return nil;\n  }\n  return type;\n}\n\n- (WebScriptObject *)getJsArray {\n  id type = [scriptObject callWebScriptMethod:@\"_array_\" withArguments:[NSArray array]];\n  if ([type isKindOfClass:[WebScriptObject class]]) {\n    return type;\n  }\n  return nil;\n}\n\n- (WebScriptObject *)getJsHash {\n  id type = [scriptObject callWebScriptMethod:@\"_hash_\" withArguments:[NSArray array]];\n  if ([type isKindOfClass:[WebScriptObject class]]) {\n    return type;\n  }\n  return nil;\n}\n\n- (id)marshall:(id)obj {\n  if (obj == nil) {\n    return [WebUndefined undefined];\n  }\n  if ([obj isKindOfClass:[NSString class]] || [obj isKindOfClass:[NSValue class]] ||\n      [obj isKindOfClass:[NSNumber class]]) {\n    return obj;\n  }\n  if ([obj isKindOfClass:[NSDictionary class]]) {\n    WebScriptObject *hash = [self getJsHash];\n    for (NSString *key in [obj allKeys]) {\n      [hash setValue:[obj objectForKey:key] forKey:key];\n    }\n    return hash;\n  }\n  if ([obj isKindOfClass:[NSArray class]]) {\n    WebScriptObject *arr = [self getJsArray:obj];\n    return arr;\n  }\n  return nil;\n}\n\n- (id)unmarshall:(id)obj {\n  if (obj == nil || [obj isMemberOfClass:[WebUndefined class]]) {\n    return nil;\n  }\n  if ([obj isKindOfClass:[JSOperationWrapper class]]) {\n    return [obj op];\n  }\n  if ([obj isKindOfClass:[NSString class]] || [obj isKindOfClass:[NSValue class]] ||\n      [obj isKindOfClass:[NSNumber class]]) {\n    return obj;\n  }\n  if ([obj isKindOfClass:[JSScreenWrapper class]] || [obj isKindOfClass:[JSApplicationWrapper class]]) {\n    return [obj toString];\n  }\n  if ([obj isKindOfClass:[WebScriptObject class]]) {\n    return [self jsToSomething:obj];\n  }\n  return nil;\n}\n\n- (id)jsToSomething:(WebScriptObject *)obj {\n  if (obj == nil) { return nil; }\n  NSString *type = [self jsTypeof:obj];\n  if (type == nil) { return nil; }\n  if ([type isEqualToString:@\"array\"]) {\n    return [self jsToArray:obj];\n  }\n  if ([type isEqualToString:@\"function\"]) {\n    return obj;\n  }\n  if ([type isEqualToString:@\"object\"]) {\n    return [self jsToDictionary:obj];\n  }\n  // nothing else should be here, primitives become NSString or NSValue or NSNumber\n  return nil;\n}\n\n- (NSString *)jsTypeof:(WebScriptObject *)obj {\n  id type = [scriptObject callWebScriptMethod:@\"_typeof_\" withArguments:[NSArray arrayWithObjects:obj, nil]];\n  if ([type isKindOfClass:[NSString class]]) {\n    return type; // should be a string\n  }\n  return @\"unknown\";\n}\n\n- (NSArray *)jsToArray:(WebScriptObject *)obj {\n  UInt16 count = [[obj valueForKey:@\"length\"] unsignedIntValue];\n  NSMutableArray *a = [NSMutableArray array];\n  for (UInt16 i = 0; i < count; i++) {\n    id item = [obj webScriptValueAtIndex:i];\n    if (item == nil || [item isMemberOfClass:[WebUndefined class]]) {\n      continue;\n    }\n    [a addObject:[self unmarshall:item]];\n  }\n  return a;\n}\n\n- (NSDictionary *)jsToDictionary:(WebScriptObject *)obj {\n  NSMutableDictionary *ret = [NSMutableDictionary dictionary];\n  if (obj == nil || [obj isMemberOfClass:[WebUndefined class]]) { return ret; }\n  id keys = [scriptObject callWebScriptMethod:@\"_keys_\" withArguments:[NSArray arrayWithObjects:obj, nil]];\n  NSArray *keyArr = [self jsToArray:keys];\n  for(NSUInteger i = 0; i < [keyArr count]; i++) {\n    NSString* key = [keyArr objectAtIndex:i];\n    id ele = [obj valueForKey:key];\n    if (ele == nil || [ele isMemberOfClass:[WebUndefined class]]) { continue; }\n    [ret setObject:[self unmarshall:ele] forKey:key];\n  }\n  return ret;\n}\n\n+ (JSController *)getInstance {\n  @synchronized([JSController class]) {\n    if (!_instance)\n      _instance = [[[JSController class] alloc] init];\n    return _instance;\n  }\n}\n\n+ (void)setJsMethods {\n  jscJsMethods = @{\n    NSStringFromSelector(@selector(log:)): @\"log\",\n    NSStringFromSelector(@selector(bindFunction:callback:repeat:)): @\"bindFunction\",\n    NSStringFromSelector(@selector(bindNative:callback:repeat:)): @\"bindNative\",\n    NSStringFromSelector(@selector(configFunction:callback:)): @\"configFunction\",\n    NSStringFromSelector(@selector(configNative:callback:)): @\"configNative\",\n    NSStringFromSelector(@selector(doOperation:options:)): @\"doOperation\",\n    NSStringFromSelector(@selector(operation:options:)): @\"operation\",\n    NSStringFromSelector(@selector(operationFromString:)): @\"operationFromString\",\n    NSStringFromSelector(@selector(source:)): @\"source\",\n    NSStringFromSelector(@selector(layout:hash:)): @\"layout\",\n    NSStringFromSelector(@selector(default:toAction:)): @\"default\",\n    NSStringFromSelector(@selector(shell:wait:path:)): @\"shell\",\n    NSStringFromSelector(@selector(on:do:)): @\"on\",\n  };\n}\n\n+ (BOOL)isSelectorExcludedFromWebScript:(SEL)sel {\n  return [jscJsMethods objectForKey:NSStringFromSelector(sel)] == NULL;\n}\n\n+ (NSString *)webScriptNameForSelector:(SEL)sel {\n  return [jscJsMethods objectForKey:NSStringFromSelector(sel)];\n}\n\n@end"
  },
  {
    "path": "Slate/JSInfoWrapper.h",
    "content": "//\n//  JSInfoWrapper.h\n//  Slate\n//\n//  Created by Jigish Patel on 1/21/13.\n//  Copyright 2013 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n@class ScreenWrapper;\n@class AccessibilityWrapper;\n\n@interface JSInfoWrapper : NSObject {\n  ScreenWrapper *sw;\n  AccessibilityWrapper *aw;\n}\n\n@property (strong) ScreenWrapper *sw;\n@property (strong) AccessibilityWrapper *aw;\n\n- (id)initWithAccessibilityWrapper:(AccessibilityWrapper *)_aw screenWrapper:(ScreenWrapper *)_sw;\n\n+ (JSInfoWrapper *)getInstance;\n\n@end\n"
  },
  {
    "path": "Slate/JSInfoWrapper.m",
    "content": "//\n//  JSInfoWrapper.m\n//  Slate\n//\n//  Created by Jigish Patel on 1/21/13.\n//  Copyright 2013 Jigish Patel. All rights reserved.\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\n#import \"JSInfoWrapper.h\"\n#import \"ScreenWrapper.h\"\n#import <WebKit/WebKit.h>\n#import \"JSWindowWrapper.h\"\n#import \"JSApplicationWrapper.h\"\n#import \"AccessibilityWrapper.h\"\n#import \"JSController.h\"\n#import \"RunningApplications.h\"\n#import \"ExpressionPoint.h\"\n#import \"JSScreenWrapper.h\"\n#import \"JSWrapperUtils.h\"\n\n@implementation JSInfoWrapper\n\n@synthesize sw, aw;\n\nstatic JSInfoWrapper *_instance = nil;\nstatic NSDictionary *jsiwJsMethods;\n\n+ (JSInfoWrapper *)getInstance {\n  @synchronized([JSInfoWrapper class]) {\n    if (!_instance)\n      _instance = [[[JSInfoWrapper class] alloc] init];\n    return _instance;\n  }\n}\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [self setAw:[[AccessibilityWrapper alloc] init]];\n    [self setSw:[[ScreenWrapper alloc] init]];\n    [JSInfoWrapper setJsMethods];\n  }\n  return self;\n}\n\n- (id)initWithAccessibilityWrapper:(AccessibilityWrapper *)_aw screenWrapper:(ScreenWrapper *)_sw {\n  self = [super init];\n  if (self) {\n    [self setAw:_aw];\n    [self setSw:_sw];\n    [JSInfoWrapper setJsMethods];\n  }\n  return self;\n}\n\n- (JSWindowWrapper *)window {\n  return [[JSWindowWrapper alloc] initWithAccessibilityWrapper:aw screenWrapper:sw];\n}\n\n- (JSApplicationWrapper *)app {\n  return [[JSApplicationWrapper alloc] initWithAccessibilityWrapper:aw screenWrapper:sw];\n}\n\n- (JSWindowWrapper *)wup:(id)point {\n  return [self windowUnderPoint:point];\n}\n\n- (JSWindowWrapper *)windowUnderPoint:(id)point {\n  id pointDict = [[JSController getInstance] unmarshall:point];\n  NSValue *p = [JSWrapperUtils pointFromDict:pointDict aw:aw sw:sw];\n  if (p == nil) { return nil; }\n  AXUIElementRef win = [AccessibilityWrapper windowUnderPoint:[p pointValue]];\n  if (win == nil || win == NULL) { return nil; }\n  AXUIElementRef app = [AccessibilityWrapper applicationForElement:win];\n  AccessibilityWrapper *_aw = [[AccessibilityWrapper alloc] initWithApp:app window:win];\n  return [[JSWindowWrapper alloc] initWithAccessibilityWrapper:_aw screenWrapper:sw];\n}\n\n- (JSScreenWrapper *)sup:(id)point {\n  return [self screenUnderPoint:point];\n}\n\n- (JSScreenWrapper *)screenUnderPoint:(id)point {\n  id pointDict = [[JSController getInstance] unmarshall:point];\n  NSValue *p = [JSWrapperUtils pointFromDict:pointDict aw:aw sw:sw];\n  if (p == nil) { return nil; }\n  return [[JSScreenWrapper alloc] initWithScreenId:[sw getScreenRefIdForPoint:[p pointValue]] screenWrapper:sw];\n}\n\n- (void)eapp:(id)func {\n  [self eachApp:func];\n}\n\n- (void)eachApp:(id)func {\n  for (NSRunningApplication *runningApp in [RunningApplications getInstance]) {\n    [[JSController getInstance] runFunction:func withArg:[[JSApplicationWrapper alloc] initWithRunningApplication:runningApp\n                                                                                                    screenWrapper:sw]];\n  }\n}\n\n- (JSScreenWrapper *)screen {\n  NSPoint tl = [aw getCurrentTopLeft];\n  NSSize size = [aw getCurrentSize];\n  NSRect wRect = NSMakeRect(tl.x, tl.y, size.width, size.height);\n  return [[JSScreenWrapper alloc] initWithScreenId:[sw getScreenRefIdForRect:wRect] screenWrapper:sw];\n}\n\n- (BOOL)rectoff:(id)rect {\n  return [self isRectOffScreen:rect];\n}\n\n- (BOOL)isRectOffScreen:(id)rect {\n  id rectDict = [[JSController getInstance] unmarshall:rect];\n  NSValue *r = [JSWrapperUtils rectFromDict:rectDict aw:aw sw:sw];\n  if (r == nil) { return NO; }\n\n  return [sw isRectOffScreen:[r rectValue]];\n}\n\n- (BOOL)pntoff:(id)point {\n  return [self isPointOffScreen:point];\n}\n\n- (BOOL)isPointOffScreen:(id)point {\n  id pointDict = [[JSController getInstance] unmarshall:point];\n  NSValue *p = [JSWrapperUtils pointFromDict:pointDict aw:aw sw:sw];\n  if (p == nil) { return NO; }\n  NSPoint _point = [p pointValue];\n  return [sw isRectOffScreen:NSMakeRect(_point.x, _point.y, 0, 0)];\n}\n\n- (JSScreenWrapper *)screenr:(id)ref {\n  return [self screenForRef:ref];\n}\n\n- (JSScreenWrapper *)screenForRef:(id)ref {\n  NSString *stringRef = nil;\n  if ([ref isKindOfClass:[NSString class]]) {\n    stringRef = ref;\n  } else if ([ref isKindOfClass:[NSNumber class]]) {\n    stringRef = [ref stringValue];\n  } else {\n    return nil;\n  }\n  NSPoint tl = [aw getCurrentTopLeft];\n  NSSize size = [aw getCurrentSize];\n  NSRect wRect = NSMakeRect(tl.x, tl.y, size.width, size.height);\n  return [[JSScreenWrapper alloc] initWithScreenId:[sw getScreenRefId:stringRef windowRect:wRect] screenWrapper:sw];\n}\n\n- (NSInteger)screenc {\n  return [self screenCount];\n}\n\n- (NSInteger)screenCount {\n  return [sw getScreenCount];\n}\n\n- (void)escreen:(id)func {\n  [self eachScreen:func];\n}\n\n- (void)eachScreen:(id)func {\n  for (NSInteger i = 0; i < [sw getScreenCount]; i++) {\n    [[JSController getInstance] runFunction:func withArg:[[JSScreenWrapper alloc] initWithScreenId:i\n                                                                                     screenWrapper:sw]];\n  }\n}\n\n- (id)jsMethods {\n  NSMutableArray *methods = [[jsiwJsMethods allValues] mutableCopy];\n  [methods removeObject:@\"jsMethods\"];\n  return [[JSController getInstance] marshall:methods];\n}\n\n+ (void)setJsMethods {\n  if (jsiwJsMethods == nil) {\n    jsiwJsMethods = @{\n      NSStringFromSelector(@selector(window)): @\"window\",\n      NSStringFromSelector(@selector(app)): @\"app\",\n      NSStringFromSelector(@selector(screen)): @\"screen\",\n      NSStringFromSelector(@selector(eachApp:)): @\"eachApp\",\n      NSStringFromSelector(@selector(eapp:)): @\"eapp\",\n      NSStringFromSelector(@selector(windowUnderPoint:)): @\"windowUnderPoint\",\n      NSStringFromSelector(@selector(wup:)): @\"wup\",\n      NSStringFromSelector(@selector(isRectOffScreen:)): @\"isRectOffScreen\",\n      NSStringFromSelector(@selector(rectoff:)): @\"rectoff\",\n      NSStringFromSelector(@selector(isPointOffScreen:)): @\"isPointOffScreen\",\n      NSStringFromSelector(@selector(pntoff:)): @\"pntoff\",\n      NSStringFromSelector(@selector(screenForRef:)): @\"screenForRef\",\n      NSStringFromSelector(@selector(screenr:)): @\"screenr\",\n      NSStringFromSelector(@selector(screenCount)): @\"screenCount\",\n      NSStringFromSelector(@selector(screenc)): @\"screenc\",\n      NSStringFromSelector(@selector(screenUnderPoint:)): @\"screenUnderPoint\",\n      NSStringFromSelector(@selector(sup:)): @\"sup\",\n      NSStringFromSelector(@selector(eachScreen:)): @\"eachScreen\",\n      NSStringFromSelector(@selector(escreen:)): @\"escreen\",\n      NSStringFromSelector(@selector(jsMethods)): @\"jsMethods\",\n    };\n  }\n}\n\n+ (BOOL)isSelectorExcludedFromWebScript:(SEL)sel {\n  return [jsiwJsMethods objectForKey:NSStringFromSelector(sel)] == NULL;\n}\n\n+ (NSString *)webScriptNameForSelector:(SEL)sel {\n  return [jsiwJsMethods objectForKey:NSStringFromSelector(sel)];\n}\n\n@end\n"
  },
  {
    "path": "Slate/JSONKit/JSONKit.h",
    "content": "//\n//  JSONKit.h\n//  http://github.com/johnezang/JSONKit\n//  Dual licensed under either the terms of the BSD License, or alternatively\n//  under the terms of the Apache License, Version 2.0, as specified below.\n//\n\n/*\n Copyright (c) 2011, John Engelhart\n\n All rights reserved.\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n\n * Neither the name of the Zang Industries 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\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/*\n Copyright 2011 John Engelhart\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#include <stddef.h>\n#include <stdint.h>\n#include <limits.h>\n#include <TargetConditionals.h>\n#include <AvailabilityMacros.h>\n\n#ifdef    __OBJC__\n#import <Foundation/NSArray.h>\n#import <Foundation/NSData.h>\n#import <Foundation/NSDictionary.h>\n#import <Foundation/NSError.h>\n#import <Foundation/NSObjCRuntime.h>\n#import <Foundation/NSString.h>\n#endif // __OBJC__\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n// For Mac OS X < 10.5.\n#ifndef   NSINTEGER_DEFINED\n#define   NSINTEGER_DEFINED\n#if       defined(__LP64__) || defined(NS_BUILD_32_LIKE_64)\ntypedef long           NSInteger;\ntypedef unsigned long  NSUInteger;\n#define NSIntegerMin   LONG_MIN\n#define NSIntegerMax   LONG_MAX\n#define NSUIntegerMax  ULONG_MAX\n#else  // defined(__LP64__) || defined(NS_BUILD_32_LIKE_64)\ntypedef int            NSInteger;\ntypedef unsigned int   NSUInteger;\n#define NSIntegerMin   INT_MIN\n#define NSIntegerMax   INT_MAX\n#define NSUIntegerMax  UINT_MAX\n#endif // defined(__LP64__) || defined(NS_BUILD_32_LIKE_64)\n#endif // NSINTEGER_DEFINED\n\n\n#ifndef _JSONKIT_H_\n#define _JSONKIT_H_\n\n#if defined(__GNUC__) && (__GNUC__ >= 4) && defined(__APPLE_CC__) && (__APPLE_CC__ >= 5465)\n#define JK_DEPRECATED_ATTRIBUTE __attribute__((deprecated))\n#else\n#define JK_DEPRECATED_ATTRIBUTE\n#endif\n\n#define JSONKIT_VERSION_MAJOR 1\n#define JSONKIT_VERSION_MINOR 4\n\ntypedef NSUInteger JKFlags;\n\n/*\n  JKParseOptionComments        : Allow C style // and /_* ... *_/ (without a _, obviously) comments in JSON.\n  JKParseOptionUnicodeNewlines : Allow Unicode recommended (?:\\r\\n|[\\n\\v\\f\\r\\x85\\p{Zl}\\p{Zp}]) newlines.\n  JKParseOptionLooseUnicode    : Normally the decoder will stop with an error at any malformed Unicode.\n                                 This option allows JSON with malformed Unicode to be parsed without reporting an error.\n                                 Any malformed Unicode is replaced with \\uFFFD, or \"REPLACEMENT CHARACTER\".\n */\n\nenum {\n  JKParseOptionNone                     = 0,\n  JKParseOptionStrict                   = 0,\n  JKParseOptionComments                 = (1 << 0),\n  JKParseOptionUnicodeNewlines          = (1 << 1),\n  JKParseOptionLooseUnicode             = (1 << 2),\n  JKParseOptionPermitTextAfterValidJSON = (1 << 3),\n  JKParseOptionValidFlags               = (JKParseOptionComments | JKParseOptionUnicodeNewlines | JKParseOptionLooseUnicode | JKParseOptionPermitTextAfterValidJSON),\n};\ntypedef JKFlags JKParseOptionFlags;\n\nenum {\n  JKSerializeOptionNone                 = 0,\n  JKSerializeOptionPretty               = (1 << 0),\n  JKSerializeOptionEscapeUnicode        = (1 << 1),\n  JKSerializeOptionEscapeForwardSlashes = (1 << 4),\n  JKSerializeOptionValidFlags           = (JKSerializeOptionPretty | JKSerializeOptionEscapeUnicode | JKSerializeOptionEscapeForwardSlashes),\n};\ntypedef JKFlags JKSerializeOptionFlags;\n\n#ifdef    __OBJC__\n\ntypedef struct JKParseState JKParseState; // Opaque internal, private type.\n\n// As a general rule of thumb, if you use a method that doesn't accept a JKParseOptionFlags argument, it defaults to JKParseOptionStrict\n\n@interface JSONDecoder : NSObject {\n  JKParseState *parseState;\n}\n+ (id)decoder;\n+ (id)decoderWithParseOptions:(JKParseOptionFlags)parseOptionFlags;\n- (id)initWithParseOptions:(JKParseOptionFlags)parseOptionFlags;\n- (void)clearCache;\n\n// The parse... methods were deprecated in v1.4 in favor of the v1.4 objectWith... methods.\n- (id)parseUTF8String:(const unsigned char *)string length:(size_t)length                         JK_DEPRECATED_ATTRIBUTE; // Deprecated in JSONKit v1.4.  Use objectWithUTF8String:length:        instead.\n- (id)parseUTF8String:(const unsigned char *)string length:(size_t)length error:(NSError **)error JK_DEPRECATED_ATTRIBUTE; // Deprecated in JSONKit v1.4.  Use objectWithUTF8String:length:error:  instead.\n// The NSData MUST be UTF8 encoded JSON.\n- (id)parseJSONData:(NSData *)jsonData                                                            JK_DEPRECATED_ATTRIBUTE; // Deprecated in JSONKit v1.4.  Use objectWithData:                     instead.\n- (id)parseJSONData:(NSData *)jsonData error:(NSError **)error                                    JK_DEPRECATED_ATTRIBUTE; // Deprecated in JSONKit v1.4.  Use objectWithData:error:               instead.\n\n// Methods that return immutable collection objects.\n- (id)objectWithUTF8String:(const unsigned char *)string length:(NSUInteger)length;\n- (id)objectWithUTF8String:(const unsigned char *)string length:(NSUInteger)length error:(NSError **)error;\n// The NSData MUST be UTF8 encoded JSON.\n- (id)objectWithData:(NSData *)jsonData;\n- (id)objectWithData:(NSData *)jsonData error:(NSError **)error;\n\n// Methods that return mutable collection objects.\n- (id)mutableObjectWithUTF8String:(const unsigned char *)string length:(NSUInteger)length;\n- (id)mutableObjectWithUTF8String:(const unsigned char *)string length:(NSUInteger)length error:(NSError **)error;\n// The NSData MUST be UTF8 encoded JSON.\n- (id)mutableObjectWithData:(NSData *)jsonData;\n- (id)mutableObjectWithData:(NSData *)jsonData error:(NSError **)error;\n\n@end\n\n////////////\n#pragma mark Deserializing methods\n////////////\n\n@interface NSString (JSONKitDeserializing)\n- (id)objectFromJSONString;\n- (id)objectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags;\n- (id)objectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error;\n- (id)mutableObjectFromJSONString;\n- (id)mutableObjectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags;\n- (id)mutableObjectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error;\n@end\n\n@interface NSData (JSONKitDeserializing)\n// The NSData MUST be UTF8 encoded JSON.\n- (id)objectFromJSONData;\n- (id)objectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags;\n- (id)objectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error;\n- (id)mutableObjectFromJSONData;\n- (id)mutableObjectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags;\n- (id)mutableObjectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error;\n@end\n\n////////////\n#pragma mark Serializing methods\n////////////\n\n@interface NSString (JSONKitSerializing)\n// Convenience methods for those that need to serialize the receiving NSString (i.e., instead of having to serialize a NSArray with a single NSString, you can \"serialize to JSON\" just the NSString).\n// Normally, a string that is serialized to JSON has quotation marks surrounding it, which you may or may not want when serializing a single string, and can be controlled with includeQuotes:\n// includeQuotes:YES `a \"test\"...` -> `\"a \\\"test\\\"...\"`\n// includeQuotes:NO  `a \"test\"...` -> `a \\\"test\\\"...`\n- (NSData *)JSONData;     // Invokes JSONDataWithOptions:JKSerializeOptionNone   includeQuotes:YES\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions includeQuotes:(BOOL)includeQuotes error:(NSError **)error;\n- (NSString *)JSONString; // Invokes JSONStringWithOptions:JKSerializeOptionNone includeQuotes:YES\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions includeQuotes:(BOOL)includeQuotes error:(NSError **)error;\n@end\n\n@interface NSArray (JSONKitSerializing)\n- (NSData *)JSONData;\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error;\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error;\n- (NSString *)JSONString;\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error;\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error;\n@end\n\n@interface NSDictionary (JSONKitSerializing)\n- (NSData *)JSONData;\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error;\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error;\n- (NSString *)JSONString;\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error;\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error;\n@end\n\n#ifdef __BLOCKS__\n\n@interface NSArray (JSONKitSerializingBlockAdditions)\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingBlock:(id(^)(id object))block error:(NSError **)error;\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingBlock:(id(^)(id object))block error:(NSError **)error;\n@end\n\n@interface NSDictionary (JSONKitSerializingBlockAdditions)\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingBlock:(id(^)(id object))block error:(NSError **)error;\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingBlock:(id(^)(id object))block error:(NSError **)error;\n@end\n\n#endif\n\n\n#endif // __OBJC__\n\n#endif // _JSONKIT_H_\n\n#ifdef __cplusplus\n}  // extern \"C\"\n#endif\n"
  },
  {
    "path": "Slate/JSONKit/JSONKit.m",
    "content": "//\n//  JSONKit.m\n//  http://github.com/johnezang/JSONKit\n//  Dual licensed under either the terms of the BSD License, or alternatively\n//  under the terms of the Apache License, Version 2.0, as specified below.\n//\n\n/*\n Copyright (c) 2011, John Engelhart\n\n All rights reserved.\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n\n * Neither the name of the Zang Industries 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\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/*\n Copyright 2011 John Engelhart\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\n\n\n/*\n  Acknowledgments:\n\n  The bulk of the UTF8 / UTF32 conversion and verification comes\n  from ConvertUTF.[hc].  It has been modified from the original sources.\n\n  The original sources were obtained from http://www.unicode.org/.\n  However, the web site no longer seems to host the files.  Instead,\n  the Unicode FAQ http://www.unicode.org/faq//utf_bom.html#gen4\n  points to International Components for Unicode (ICU)\n  http://site.icu-project.org/ as an example of how to write a UTF\n  converter.\n\n  The decision to use the ConvertUTF.[ch] code was made to leverage\n  \"proven\" code.  Hopefully the local modifications are bug free.\n\n  The code in isValidCodePoint() is derived from the ICU code in\n  utf.h for the macros U_IS_UNICODE_NONCHAR and U_IS_UNICODE_CHAR.\n\n  From the original ConvertUTF.[ch]:\n\n * Copyright 2001-2004 Unicode, Inc.\n *\n * Disclaimer\n *\n * This source code is provided as is by Unicode, Inc. No claims are\n * made as to fitness for any particular purpose. No warranties of any\n * kind are expressed or implied. The recipient agrees to determine\n * applicability of information provided. If this file has been\n * purchased on magnetic or optical media from Unicode, Inc., the\n * sole remedy for any claim will be exchange of defective media\n * within 90 days of receipt.\n *\n * Limitations on Rights to Redistribute This Code\n *\n * Unicode, Inc. hereby grants the right to freely use the information\n * supplied in this file in the creation of products supporting the\n * Unicode Standard, and to make copies of this file in any form\n * for internal or external distribution as long as this notice\n * remains attached.\n\n*/\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <stdint.h>\n#include <string.h>\n#include <assert.h>\n#include <sys/errno.h>\n#include <math.h>\n#include <limits.h>\n#include <objc/runtime.h>\n\n#import \"JSONKit.h\"\n\n//#include <CoreFoundation/CoreFoundation.h>\n#include <CoreFoundation/CFString.h>\n#include <CoreFoundation/CFArray.h>\n#include <CoreFoundation/CFDictionary.h>\n#include <CoreFoundation/CFNumber.h>\n\n//#import <Foundation/Foundation.h>\n#import <Foundation/NSArray.h>\n#import <Foundation/NSAutoreleasePool.h>\n#import <Foundation/NSData.h>\n#import <Foundation/NSDictionary.h>\n#import <Foundation/NSException.h>\n#import <Foundation/NSNull.h>\n#import <Foundation/NSObjCRuntime.h>\n\n#ifndef __has_feature\n#define __has_feature(x) 0\n#endif\n\n#ifdef JK_ENABLE_CF_TRANSFER_OWNERSHIP_CALLBACKS\n#warning As of JSONKit v1.4, JK_ENABLE_CF_TRANSFER_OWNERSHIP_CALLBACKS is no longer required.  It is no longer a valid option.\n#endif\n\n#ifdef __OBJC_GC__\n#error JSONKit does not support Objective-C Garbage Collection\n#endif\n\n#if __has_feature(objc_arc)\n#error JSONKit does not support Objective-C Automatic Reference Counting (ARC)\n#endif\n\n// The following checks are really nothing more than sanity checks.\n// JSONKit technically has a few problems from a \"strictly C99 conforming\" standpoint, though they are of the pedantic nitpicking variety.\n// In practice, though, for the compilers and architectures we can reasonably expect this code to be compiled for, these pedantic nitpicks aren't really a problem.\n// Since we're limited as to what we can do with pre-processor #if checks, these checks are not nearly as through as they should be.\n\n#if (UINT_MAX != 0xffffffffU) || (INT_MIN != (-0x7fffffff-1)) || (ULLONG_MAX != 0xffffffffffffffffULL) || (LLONG_MIN != (-0x7fffffffffffffffLL-1LL))\n#error JSONKit requires the C 'int' and 'long long' types to be 32 and 64 bits respectively.\n#endif\n\n#if !defined(__LP64__) && ((UINT_MAX != ULONG_MAX) || (INT_MAX != LONG_MAX) || (INT_MIN != LONG_MIN) || (WORD_BIT != LONG_BIT))\n#error JSONKit requires the C 'int' and 'long' types to be the same on 32-bit architectures.\n#endif\n\n// Cocoa / Foundation uses NS*Integer as the type for a lot of arguments.  We make sure that NS*Integer is something we are expecting and is reasonably compatible with size_t / ssize_t\n\n#if (NSUIntegerMax != ULONG_MAX) || (NSIntegerMax != LONG_MAX) || (NSIntegerMin != LONG_MIN)\n#error JSONKit requires NSInteger and NSUInteger to be the same size as the C 'long' type.\n#endif\n\n#if (NSUIntegerMax != SIZE_MAX) || (NSIntegerMax != SSIZE_MAX)\n#error JSONKit requires NSInteger and NSUInteger to be the same size as the C 'size_t' type.\n#endif\n\n\n// For DJB hash.\n#define JK_HASH_INIT           (1402737925UL)\n\n// Use __builtin_clz() instead of trailingBytesForUTF8[] table lookup.\n#define JK_FAST_TRAILING_BYTES\n\n// JK_CACHE_SLOTS must be a power of 2.  Default size is 1024 slots.\n#define JK_CACHE_SLOTS_BITS    (10)\n#define JK_CACHE_SLOTS         (1UL << JK_CACHE_SLOTS_BITS)\n// JK_CACHE_PROBES is the number of probe attempts.\n#define JK_CACHE_PROBES        (4UL)\n// JK_INIT_CACHE_AGE must be (1 << AGE) - 1\n#define JK_INIT_CACHE_AGE      (0)\n\n// JK_TOKENBUFFER_SIZE is the default stack size for the temporary buffer used to hold \"non-simple\" strings (i.e., contains \\ escapes)\n#define JK_TOKENBUFFER_SIZE    (1024UL * 2UL)\n\n// JK_STACK_OBJS is the default number of spaces reserved on the stack for temporarily storing pointers to Obj-C objects before they can be transferred to a NSArray / NSDictionary.\n#define JK_STACK_OBJS          (1024UL * 1UL)\n\n#define JK_JSONBUFFER_SIZE     (1024UL * 4UL)\n#define JK_UTF8BUFFER_SIZE     (1024UL * 16UL)\n\n#define JK_ENCODE_CACHE_SLOTS  (1024UL)\n\n\n#if       defined (__GNUC__) && (__GNUC__ >= 4)\n#define JK_ATTRIBUTES(attr, ...)        __attribute__((attr, ##__VA_ARGS__))\n#define JK_EXPECTED(cond, expect)       __builtin_expect((long)(cond), (expect))\n#define JK_EXPECT_T(cond)               JK_EXPECTED(cond, 1U)\n#define JK_EXPECT_F(cond)               JK_EXPECTED(cond, 0U)\n#define JK_PREFETCH(ptr)                __builtin_prefetch(ptr)\n#else  // defined (__GNUC__) && (__GNUC__ >= 4)\n#define JK_ATTRIBUTES(attr, ...)\n#define JK_EXPECTED(cond, expect)       (cond)\n#define JK_EXPECT_T(cond)               (cond)\n#define JK_EXPECT_F(cond)               (cond)\n#define JK_PREFETCH(ptr)\n#endif // defined (__GNUC__) && (__GNUC__ >= 4)\n\n#define JK_STATIC_INLINE                         static __inline__ JK_ATTRIBUTES(always_inline)\n#define JK_ALIGNED(arg)                                            JK_ATTRIBUTES(aligned(arg))\n#define JK_UNUSED_ARG                                              JK_ATTRIBUTES(unused)\n#define JK_WARN_UNUSED                                             JK_ATTRIBUTES(warn_unused_result)\n#define JK_WARN_UNUSED_CONST                                       JK_ATTRIBUTES(warn_unused_result, const)\n#define JK_WARN_UNUSED_PURE                                        JK_ATTRIBUTES(warn_unused_result, pure)\n#define JK_WARN_UNUSED_SENTINEL                                    JK_ATTRIBUTES(warn_unused_result, sentinel)\n#define JK_NONNULL_ARGS(arg, ...)                                  JK_ATTRIBUTES(nonnull(arg, ##__VA_ARGS__))\n#define JK_WARN_UNUSED_NONNULL_ARGS(arg, ...)                      JK_ATTRIBUTES(warn_unused_result, nonnull(arg, ##__VA_ARGS__))\n#define JK_WARN_UNUSED_CONST_NONNULL_ARGS(arg, ...)                JK_ATTRIBUTES(warn_unused_result, const, nonnull(arg, ##__VA_ARGS__))\n#define JK_WARN_UNUSED_PURE_NONNULL_ARGS(arg, ...)                 JK_ATTRIBUTES(warn_unused_result, pure, nonnull(arg, ##__VA_ARGS__))\n\n#if       defined (__GNUC__) && (__GNUC__ >= 4) && (__GNUC_MINOR__ >= 3)\n#define JK_ALLOC_SIZE_NON_NULL_ARGS_WARN_UNUSED(as, nn, ...) JK_ATTRIBUTES(warn_unused_result, nonnull(nn, ##__VA_ARGS__), alloc_size(as))\n#else  // defined (__GNUC__) && (__GNUC__ >= 4) && (__GNUC_MINOR__ >= 3)\n#define JK_ALLOC_SIZE_NON_NULL_ARGS_WARN_UNUSED(as, nn, ...) JK_ATTRIBUTES(warn_unused_result, nonnull(nn, ##__VA_ARGS__))\n#endif // defined (__GNUC__) && (__GNUC__ >= 4) && (__GNUC_MINOR__ >= 3)\n\n\n@class JKArray, JKDictionaryEnumerator, JKDictionary;\n\nenum {\n  JSONNumberStateStart                 = 0,\n  JSONNumberStateFinished              = 1,\n  JSONNumberStateError                 = 2,\n  JSONNumberStateWholeNumberStart      = 3,\n  JSONNumberStateWholeNumberMinus      = 4,\n  JSONNumberStateWholeNumberZero       = 5,\n  JSONNumberStateWholeNumber           = 6,\n  JSONNumberStatePeriod                = 7,\n  JSONNumberStateFractionalNumberStart = 8,\n  JSONNumberStateFractionalNumber      = 9,\n  JSONNumberStateExponentStart         = 10,\n  JSONNumberStateExponentPlusMinus     = 11,\n  JSONNumberStateExponent              = 12,\n};\n\nenum {\n  JSONStringStateStart                           = 0,\n  JSONStringStateParsing                         = 1,\n  JSONStringStateFinished                        = 2,\n  JSONStringStateError                           = 3,\n  JSONStringStateEscape                          = 4,\n  JSONStringStateEscapedUnicode1                 = 5,\n  JSONStringStateEscapedUnicode2                 = 6,\n  JSONStringStateEscapedUnicode3                 = 7,\n  JSONStringStateEscapedUnicode4                 = 8,\n  JSONStringStateEscapedUnicodeSurrogate1        = 9,\n  JSONStringStateEscapedUnicodeSurrogate2        = 10,\n  JSONStringStateEscapedUnicodeSurrogate3        = 11,\n  JSONStringStateEscapedUnicodeSurrogate4        = 12,\n  JSONStringStateEscapedNeedEscapeForSurrogate   = 13,\n  JSONStringStateEscapedNeedEscapedUForSurrogate = 14,\n};\n\nenum {\n  JKParseAcceptValue      = (1 << 0),\n  JKParseAcceptComma      = (1 << 1),\n  JKParseAcceptEnd        = (1 << 2),\n  JKParseAcceptValueOrEnd = (JKParseAcceptValue | JKParseAcceptEnd),\n  JKParseAcceptCommaOrEnd = (JKParseAcceptComma | JKParseAcceptEnd),\n};\n\nenum {\n  JKClassUnknown    = 0,\n  JKClassString     = 1,\n  JKClassNumber     = 2,\n  JKClassArray      = 3,\n  JKClassDictionary = 4,\n  JKClassNull       = 5,\n};\n\nenum {\n  JKManagedBufferOnStack        = 1,\n  JKManagedBufferOnHeap         = 2,\n  JKManagedBufferLocationMask   = (0x3),\n  JKManagedBufferLocationShift  = (0),\n\n  JKManagedBufferMustFree       = (1 << 2),\n};\ntypedef JKFlags JKManagedBufferFlags;\n\nenum {\n  JKObjectStackOnStack        = 1,\n  JKObjectStackOnHeap         = 2,\n  JKObjectStackLocationMask   = (0x3),\n  JKObjectStackLocationShift  = (0),\n\n  JKObjectStackMustFree       = (1 << 2),\n};\ntypedef JKFlags JKObjectStackFlags;\n\nenum {\n  JKTokenTypeInvalid     = 0,\n  JKTokenTypeNumber      = 1,\n  JKTokenTypeString      = 2,\n  JKTokenTypeObjectBegin = 3,\n  JKTokenTypeObjectEnd   = 4,\n  JKTokenTypeArrayBegin  = 5,\n  JKTokenTypeArrayEnd    = 6,\n  JKTokenTypeSeparator   = 7,\n  JKTokenTypeComma       = 8,\n  JKTokenTypeTrue        = 9,\n  JKTokenTypeFalse       = 10,\n  JKTokenTypeNull        = 11,\n  JKTokenTypeWhiteSpace  = 12,\n};\ntypedef NSUInteger JKTokenType;\n\n// These are prime numbers to assist with hash slot probing.\nenum {\n  JKValueTypeNone             = 0,\n  JKValueTypeString           = 5,\n  JKValueTypeLongLong         = 7,\n  JKValueTypeUnsignedLongLong = 11,\n  JKValueTypeDouble           = 13,\n};\ntypedef NSUInteger JKValueType;\n\nenum {\n  JKEncodeOptionAsData              = 1,\n  JKEncodeOptionAsString            = 2,\n  JKEncodeOptionAsTypeMask          = 0x7,\n  JKEncodeOptionCollectionObj       = (1 << 3),\n  JKEncodeOptionStringObj           = (1 << 4),\n  JKEncodeOptionStringObjTrimQuotes = (1 << 5),\n\n};\ntypedef NSUInteger JKEncodeOptionType;\n\ntypedef NSUInteger JKHash;\n\ntypedef struct JKTokenCacheItem  JKTokenCacheItem;\ntypedef struct JKTokenCache      JKTokenCache;\ntypedef struct JKTokenValue      JKTokenValue;\ntypedef struct JKParseToken      JKParseToken;\ntypedef struct JKPtrRange        JKPtrRange;\ntypedef struct JKObjectStack     JKObjectStack;\ntypedef struct JKBuffer          JKBuffer;\ntypedef struct JKConstBuffer     JKConstBuffer;\ntypedef struct JKConstPtrRange   JKConstPtrRange;\ntypedef struct JKRange           JKRange;\ntypedef struct JKManagedBuffer   JKManagedBuffer;\ntypedef struct JKFastClassLookup JKFastClassLookup;\ntypedef struct JKEncodeCache     JKEncodeCache;\ntypedef struct JKEncodeState     JKEncodeState;\ntypedef struct JKObjCImpCache    JKObjCImpCache;\ntypedef struct JKHashTableEntry  JKHashTableEntry;\n\ntypedef id (*NSNumberAllocImp)(id receiver, SEL selector);\ntypedef id (*NSNumberInitWithUnsignedLongLongImp)(id receiver, SEL selector, unsigned long long value);\ntypedef id (*JKClassFormatterIMP)(id receiver, SEL selector, id object);\n#ifdef __BLOCKS__\ntypedef id (^JKClassFormatterBlock)(id formatObject);\n#endif\n\n\nstruct JKPtrRange {\n  unsigned char *ptr;\n  size_t         length;\n};\n\nstruct JKConstPtrRange {\n  const unsigned char *ptr;\n  size_t               length;\n};\n\nstruct JKRange {\n  size_t location, length;\n};\n\nstruct JKManagedBuffer {\n  JKPtrRange           bytes;\n  JKManagedBufferFlags flags;\n  size_t               roundSizeUpToMultipleOf;\n};\n\nstruct JKObjectStack {\n  void               **objects, **keys;\n  CFHashCode          *cfHashes;\n  size_t               count, index, roundSizeUpToMultipleOf;\n  JKObjectStackFlags   flags;\n};\n\nstruct JKBuffer {\n  JKPtrRange bytes;\n};\n\nstruct JKConstBuffer {\n  JKConstPtrRange bytes;\n};\n\nstruct JKTokenValue {\n  JKConstPtrRange   ptrRange;\n  JKValueType       type;\n  JKHash            hash;\n  union {\n    long long          longLongValue;\n    unsigned long long unsignedLongLongValue;\n    double             doubleValue;\n  } number;\n  JKTokenCacheItem *cacheItem;\n};\n\nstruct JKParseToken {\n  JKConstPtrRange tokenPtrRange;\n  JKTokenType     type;\n  JKTokenValue    value;\n  JKManagedBuffer tokenBuffer;\n};\n\nstruct JKTokenCacheItem {\n  void          *object;\n  JKHash         hash;\n  CFHashCode     cfHash;\n  size_t         size;\n  unsigned char *bytes;\n  JKValueType    type;\n};\n\nstruct JKTokenCache {\n  JKTokenCacheItem *items;\n  size_t            count;\n  unsigned int      prng_lfsr;\n  unsigned char     age[JK_CACHE_SLOTS];\n};\n\nstruct JKObjCImpCache {\n  Class                               NSNumberClass;\n  NSNumberAllocImp                    NSNumberAlloc;\n  NSNumberInitWithUnsignedLongLongImp NSNumberInitWithUnsignedLongLong;\n};\n\nstruct JKParseState {\n  JKParseOptionFlags  parseOptionFlags;\n  JKConstBuffer       stringBuffer;\n  size_t              atIndex, lineNumber, lineStartIndex;\n  size_t              prev_atIndex, prev_lineNumber, prev_lineStartIndex;\n  JKParseToken        token;\n  JKObjectStack       objectStack;\n  JKTokenCache        cache;\n  JKObjCImpCache      objCImpCache;\n  NSError            *error;\n  int                 errorIsPrev;\n  BOOL                mutableCollections;\n};\n\nstruct JKFastClassLookup {\n  void *stringClass;\n  void *numberClass;\n  void *arrayClass;\n  void *dictionaryClass;\n  void *nullClass;\n};\n\nstruct JKEncodeCache {\n  id object;\n  size_t offset;\n  size_t length;\n};\n\nstruct JKEncodeState {\n  JKManagedBuffer         utf8ConversionBuffer;\n  JKManagedBuffer         stringBuffer;\n  size_t                  atIndex;\n  JKFastClassLookup       fastClassLookup;\n  JKEncodeCache           cache[JK_ENCODE_CACHE_SLOTS];\n  JKSerializeOptionFlags  serializeOptionFlags;\n  JKEncodeOptionType      encodeOption;\n  size_t                  depth;\n  NSError                *error;\n  id                      classFormatterDelegate;\n  SEL                     classFormatterSelector;\n  JKClassFormatterIMP     classFormatterIMP;\n#ifdef __BLOCKS__\n  JKClassFormatterBlock   classFormatterBlock;\n#endif\n};\n\n// This is a JSONKit private class.\n@interface JKSerializer : NSObject {\n  JKEncodeState *encodeState;\n}\n\n#ifdef __BLOCKS__\n#define JKSERIALIZER_BLOCKS_PROTO id(^)(id object)\n#else\n#define JKSERIALIZER_BLOCKS_PROTO id\n#endif\n\n+ (id)serializeObject:(id)object options:(JKSerializeOptionFlags)optionFlags encodeOption:(JKEncodeOptionType)encodeOption block:(JKSERIALIZER_BLOCKS_PROTO)block delegate:(id)delegate selector:(SEL)selector error:(NSError **)error;\n- (id)serializeObject:(id)object options:(JKSerializeOptionFlags)optionFlags encodeOption:(JKEncodeOptionType)encodeOption block:(JKSERIALIZER_BLOCKS_PROTO)block delegate:(id)delegate selector:(SEL)selector error:(NSError **)error;\n- (void)releaseState;\n\n@end\n\nstruct JKHashTableEntry {\n  NSUInteger keyHash;\n  id key, object;\n};\n\n\ntypedef uint32_t UTF32; /* at least 32 bits */\ntypedef uint16_t UTF16; /* at least 16 bits */\ntypedef uint8_t  UTF8;  /* typically 8 bits */\n\ntypedef enum {\n  conversionOK,           /* conversion successful */\n  sourceExhausted,        /* partial character in source, but hit end */\n  targetExhausted,        /* insuff. room in target for conversion */\n  sourceIllegal           /* source sequence is illegal/malformed */\n} ConversionResult;\n\n#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD\n#define UNI_MAX_BMP          (UTF32)0x0000FFFF\n#define UNI_MAX_UTF16        (UTF32)0x0010FFFF\n#define UNI_MAX_UTF32        (UTF32)0x7FFFFFFF\n#define UNI_MAX_LEGAL_UTF32  (UTF32)0x0010FFFF\n#define UNI_SUR_HIGH_START   (UTF32)0xD800\n#define UNI_SUR_HIGH_END     (UTF32)0xDBFF\n#define UNI_SUR_LOW_START    (UTF32)0xDC00\n#define UNI_SUR_LOW_END      (UTF32)0xDFFF\n\n\n#if !defined(JK_FAST_TRAILING_BYTES)\nstatic const char trailingBytesForUTF8[256] = {\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\n    2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5\n};\n#endif\n\nstatic const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL, 0x03C82080UL, 0xFA082080UL, 0x82082080UL };\nstatic const UTF8  firstByteMark[7]   = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };\n\n#define JK_AT_STRING_PTR(x)  (&((x)->stringBuffer.bytes.ptr[(x)->atIndex]))\n#define JK_END_STRING_PTR(x) (&((x)->stringBuffer.bytes.ptr[(x)->stringBuffer.bytes.length]))\n\n\nstatic JKArray          *_JKArrayCreate(id *objects, NSUInteger count, BOOL mutableCollection);\nstatic void              _JKArrayInsertObjectAtIndex(JKArray *array, id newObject, NSUInteger objectIndex);\nstatic void              _JKArrayReplaceObjectAtIndexWithObject(JKArray *array, NSUInteger objectIndex, id newObject);\nstatic void              _JKArrayRemoveObjectAtIndex(JKArray *array, NSUInteger objectIndex);\n\n\nstatic NSUInteger        _JKDictionaryCapacityForCount(NSUInteger count);\nstatic JKDictionary     *_JKDictionaryCreate(id *keys, NSUInteger *keyHashes, id *objects, NSUInteger count, BOOL mutableCollection);\nstatic JKHashTableEntry *_JKDictionaryHashEntry(JKDictionary *dictionary);\nstatic NSUInteger        _JKDictionaryCapacity(JKDictionary *dictionary);\nstatic void              _JKDictionaryResizeIfNeccessary(JKDictionary *dictionary);\nstatic void              _JKDictionaryRemoveObjectWithEntry(JKDictionary *dictionary, JKHashTableEntry *entry);\nstatic void              _JKDictionaryAddObject(JKDictionary *dictionary, NSUInteger keyHash, id key, id object);\nstatic JKHashTableEntry *_JKDictionaryHashTableEntryForKey(JKDictionary *dictionary, id aKey);\n\n\nstatic void _JSONDecoderCleanup(JSONDecoder *decoder);\n\nstatic id _NSStringObjectFromJSONString(NSString *jsonString, JKParseOptionFlags parseOptionFlags, NSError **error, BOOL mutableCollection);\n\n\nstatic void jk_managedBuffer_release(JKManagedBuffer *managedBuffer);\nstatic void jk_managedBuffer_setToStackBuffer(JKManagedBuffer *managedBuffer, unsigned char *ptr, size_t length);\nstatic unsigned char *jk_managedBuffer_resize(JKManagedBuffer *managedBuffer, size_t newSize);\nstatic void jk_objectStack_release(JKObjectStack *objectStack);\nstatic void jk_objectStack_setToStackBuffer(JKObjectStack *objectStack, void **objects, void **keys, CFHashCode *cfHashes, size_t count);\nstatic int  jk_objectStack_resize(JKObjectStack *objectStack, size_t newCount);\n\nstatic void   jk_error(JKParseState *parseState, NSString *format, ...);\nstatic int    jk_parse_string(JKParseState *parseState);\nstatic int    jk_parse_number(JKParseState *parseState);\nstatic size_t jk_parse_is_newline(JKParseState *parseState, const unsigned char *atCharacterPtr);\nJK_STATIC_INLINE int jk_parse_skip_newline(JKParseState *parseState);\nJK_STATIC_INLINE void jk_parse_skip_whitespace(JKParseState *parseState);\nstatic int    jk_parse_next_token(JKParseState *parseState);\nstatic void   jk_error_parse_accept_or3(JKParseState *parseState, int state, NSString *or1String, NSString *or2String, NSString *or3String);\nstatic void  *jk_create_dictionary(JKParseState *parseState, size_t startingObjectIndex);\nstatic void  *jk_parse_dictionary(JKParseState *parseState);\nstatic void  *jk_parse_array(JKParseState *parseState);\nstatic void  *jk_object_for_token(JKParseState *parseState);\nstatic void  *jk_cachedObjects(JKParseState *parseState);\nJK_STATIC_INLINE void jk_cache_age(JKParseState *parseState);\nJK_STATIC_INLINE void jk_set_parsed_token(JKParseState *parseState, const unsigned char *ptr, size_t length, JKTokenType type, size_t advanceBy);\n\n\nstatic void jk_encode_error(JKEncodeState *encodeState, NSString *format, ...);\nstatic int jk_encode_printf(JKEncodeState *encodeState, JKEncodeCache *cacheSlot, size_t startingAtIndex, id object, const char *format, ...);\nstatic int jk_encode_write(JKEncodeState *encodeState, JKEncodeCache *cacheSlot, size_t startingAtIndex, id object, const char *format);\nstatic int jk_encode_writePrettyPrintWhiteSpace(JKEncodeState *encodeState);\nstatic int jk_encode_write1slow(JKEncodeState *encodeState, ssize_t depthChange, const char *format);\nstatic int jk_encode_write1fast(JKEncodeState *encodeState, ssize_t depthChange JK_UNUSED_ARG, const char *format);\nstatic int jk_encode_writen(JKEncodeState *encodeState, JKEncodeCache *cacheSlot, size_t startingAtIndex, id object, const char *format, size_t length);\nJK_STATIC_INLINE JKHash jk_encode_object_hash(void *objectPtr);\nJK_STATIC_INLINE void jk_encode_updateCache(JKEncodeState *encodeState, JKEncodeCache *cacheSlot, size_t startingAtIndex, id object);\nstatic int jk_encode_add_atom_to_buffer(JKEncodeState *encodeState, void *objectPtr);\n\n#define jk_encode_write1(es, dc, f)  (JK_EXPECT_F(_jk_encode_prettyPrint) ? jk_encode_write1slow(es, dc, f) : jk_encode_write1fast(es, dc, f))\n\n\nJK_STATIC_INLINE size_t jk_min(size_t a, size_t b);\nJK_STATIC_INLINE size_t jk_max(size_t a, size_t b);\nJK_STATIC_INLINE JKHash calculateHash(JKHash currentHash, unsigned char c);\n\n// JSONKit v1.4 used both a JKArray : NSArray and JKMutableArray : NSMutableArray, and the same for the dictionary collection type.\n// However, Louis Gerbarg (via cocoa-dev) pointed out that Cocoa / Core Foundation actually implements only a single class that inherits from the\n// mutable version, and keeps an ivar bit for whether or not that instance is mutable.  This means that the immutable versions of the collection\n// classes receive the mutating methods, but this is handled by having those methods throw an exception when the ivar bit is set to immutable.\n// We adopt the same strategy here.  It's both cleaner and gets rid of the method swizzling hackery used in JSONKit v1.4.\n\n\n// This is a workaround for issue #23 https://github.com/johnezang/JSONKit/pull/23\n// Basically, there seem to be a problem with using +load in static libraries on iOS.  However, __attribute__ ((constructor)) does work correctly.\n// Since we do not require anything \"special\" that +load provides, and we can accomplish the same thing using __attribute__ ((constructor)), the +load logic was moved here.\n\nstatic Class                               _JKArrayClass                           = NULL;\nstatic size_t                              _JKArrayInstanceSize                    = 0UL;\nstatic Class                               _JKDictionaryClass                      = NULL;\nstatic size_t                              _JKDictionaryInstanceSize               = 0UL;\n\n// For JSONDecoder...\nstatic Class                               _jk_NSNumberClass                       = NULL;\nstatic NSNumberAllocImp                    _jk_NSNumberAllocImp                    = NULL;\nstatic NSNumberInitWithUnsignedLongLongImp _jk_NSNumberInitWithUnsignedLongLongImp = NULL;\n\nextern void jk_collectionClassLoadTimeInitialization(void) __attribute__ ((constructor));\n\nvoid jk_collectionClassLoadTimeInitialization(void) {\n  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // Though technically not required, the run time environment at load time initialization may be less than ideal.\n\n  _JKArrayClass             = objc_getClass(\"JKArray\");\n  _JKArrayInstanceSize      = jk_max(16UL, class_getInstanceSize(_JKArrayClass));\n\n  _JKDictionaryClass        = objc_getClass(\"JKDictionary\");\n  _JKDictionaryInstanceSize = jk_max(16UL, class_getInstanceSize(_JKDictionaryClass));\n\n  // For JSONDecoder...\n  _jk_NSNumberClass = [NSNumber class];\n  _jk_NSNumberAllocImp = (NSNumberAllocImp)[NSNumber methodForSelector:@selector(alloc)];\n\n  // Hacktacular.  Need to do it this way due to the nature of class clusters.\n  id temp_NSNumber = [NSNumber alloc];\n  _jk_NSNumberInitWithUnsignedLongLongImp = (NSNumberInitWithUnsignedLongLongImp)[temp_NSNumber methodForSelector:@selector(initWithUnsignedLongLong:)];\n  [[temp_NSNumber init] release];\n  temp_NSNumber = NULL;\n\n  [pool release]; pool = NULL;\n}\n\n\n#pragma mark -\n@interface JKArray : NSMutableArray <NSCopying, NSMutableCopying, NSFastEnumeration> {\n  id         *objects;\n  NSUInteger  count, capacity, mutations;\n}\n@end\n\n@implementation JKArray\n\n+ (id)allocWithZone:(NSZone *)zone\n{\n#pragma unused(zone)\n  [NSException raise:NSInvalidArgumentException format:@\"*** - [%@ %@]: The %@ class is private to JSONKit and should not be used in this fashion.\", NSStringFromClass([self class]), NSStringFromSelector(_cmd), NSStringFromClass([self class])];\n  return(NULL);\n}\n\nstatic JKArray *_JKArrayCreate(id *objects, NSUInteger count, BOOL mutableCollection) {\n  NSCParameterAssert((objects != NULL) && (_JKArrayClass != NULL) && (_JKArrayInstanceSize > 0UL));\n  JKArray *array = NULL;\n  if(JK_EXPECT_T((array = (JKArray *)calloc(1UL, _JKArrayInstanceSize)) != NULL)) { // Directly allocate the JKArray instance via calloc.\n    array->isa      = _JKArrayClass;\n    if((array = [array init]) == NULL) { return(NULL); }\n    array->capacity = count;\n    array->count    = count;\n    if(JK_EXPECT_F((array->objects = (id *)malloc(sizeof(id) * array->capacity)) == NULL)) { [array autorelease]; return(NULL); }\n    memcpy(array->objects, objects, array->capacity * sizeof(id));\n    array->mutations = (mutableCollection == NO) ? 0UL : 1UL;\n  }\n  return(array);\n}\n\n// Note: The caller is responsible for -retaining the object that is to be added.\nstatic void _JKArrayInsertObjectAtIndex(JKArray *array, id newObject, NSUInteger objectIndex) {\n  NSCParameterAssert((array != NULL) && (array->objects != NULL) && (array->count <= array->capacity) && (objectIndex <= array->count) && (newObject != NULL));\n  if(!((array != NULL) && (array->objects != NULL) && (objectIndex <= array->count) && (newObject != NULL))) { [newObject autorelease]; return; }\n  if((array->count + 1UL) >= array->capacity) {\n    id *newObjects = NULL;\n    if((newObjects = (id *)realloc(array->objects, sizeof(id) * (array->capacity + 16UL))) == NULL) { [NSException raise:NSMallocException format:@\"Unable to resize objects array.\"]; }\n    array->objects = newObjects;\n    array->capacity += 16UL;\n    memset(&array->objects[array->count], 0, sizeof(id) * (array->capacity - array->count));\n  }\n  array->count++;\n  if((objectIndex + 1UL) < array->count) { memmove(&array->objects[objectIndex + 1UL], &array->objects[objectIndex], sizeof(id) * ((array->count - 1UL) - objectIndex)); array->objects[objectIndex] = NULL; }\n  array->objects[objectIndex] = newObject;\n}\n\n// Note: The caller is responsible for -retaining the object that is to be added.\nstatic void _JKArrayReplaceObjectAtIndexWithObject(JKArray *array, NSUInteger objectIndex, id newObject) {\n  NSCParameterAssert((array != NULL) && (array->objects != NULL) && (array->count <= array->capacity) && (objectIndex < array->count) && (array->objects[objectIndex] != NULL) && (newObject != NULL));\n  if(!((array != NULL) && (array->objects != NULL) && (objectIndex < array->count) && (array->objects[objectIndex] != NULL) && (newObject != NULL))) { [newObject autorelease]; return; }\n  CFRelease(array->objects[objectIndex]);\n  array->objects[objectIndex] = NULL;\n  array->objects[objectIndex] = newObject;\n}\n\nstatic void _JKArrayRemoveObjectAtIndex(JKArray *array, NSUInteger objectIndex) {\n  NSCParameterAssert((array != NULL) && (array->objects != NULL) && (array->count > 0UL) && (array->count <= array->capacity) && (objectIndex < array->count) && (array->objects[objectIndex] != NULL));\n  if(!((array != NULL) && (array->objects != NULL) && (array->count > 0UL) && (array->count <= array->capacity) && (objectIndex < array->count) && (array->objects[objectIndex] != NULL))) { return; }\n  CFRelease(array->objects[objectIndex]);\n  array->objects[objectIndex] = NULL;\n  if((objectIndex + 1UL) < array->count) { memmove(&array->objects[objectIndex], &array->objects[objectIndex + 1UL], sizeof(id) * ((array->count - 1UL) - objectIndex)); array->objects[array->count - 1UL] = NULL; }\n  array->count--;\n}\n\n- (void)dealloc\n{\n  if(JK_EXPECT_T(objects != NULL)) {\n    NSUInteger atObject = 0UL;\n    for(atObject = 0UL; atObject < count; atObject++) { if(JK_EXPECT_T(objects[atObject] != NULL)) { CFRelease(objects[atObject]); objects[atObject] = NULL; } }\n    free(objects); objects = NULL;\n  }\n\n  [super dealloc];\n}\n\n- (NSUInteger)count\n{\n  NSParameterAssert((objects != NULL) && (count <= capacity));\n  return(count);\n}\n\n- (void)getObjects:(id *)objectsPtr range:(NSRange)range\n{\n  NSParameterAssert((objects != NULL) && (count <= capacity));\n  if((objectsPtr     == NULL)  && (NSMaxRange(range) > 0UL))   { [NSException raise:NSRangeException format:@\"*** -[%@ %@]: pointer to objects array is NULL but range length is %lu\", NSStringFromClass([self class]), NSStringFromSelector(_cmd), NSMaxRange(range)];        }\n  if((range.location >  count) || (NSMaxRange(range) > count)) { [NSException raise:NSRangeException format:@\"*** -[%@ %@]: index (%lu) beyond bounds (%lu)\",                          NSStringFromClass([self class]), NSStringFromSelector(_cmd), NSMaxRange(range), count]; }\n  memcpy(objectsPtr, objects + range.location, range.length * sizeof(id));\n}\n\n- (id)objectAtIndex:(NSUInteger)objectIndex\n{\n  if(objectIndex >= count) { [NSException raise:NSRangeException format:@\"*** -[%@ %@]: index (%lu) beyond bounds (%lu)\", NSStringFromClass([self class]), NSStringFromSelector(_cmd), objectIndex, count]; }\n  NSParameterAssert((objects != NULL) && (count <= capacity) && (objects[objectIndex] != NULL));\n  return(objects[objectIndex]);\n}\n\n- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len\n{\n  NSParameterAssert((state != NULL) && (stackbuf != NULL) && (len > 0UL) && (objects != NULL) && (count <= capacity));\n  if(JK_EXPECT_F(state->state == 0UL))   { state->mutationsPtr = (unsigned long *)&mutations; state->itemsPtr = stackbuf; }\n  if(JK_EXPECT_F(state->state >= count)) { return(0UL); }\n\n  NSUInteger enumeratedCount  = 0UL;\n  while(JK_EXPECT_T(enumeratedCount < len) && JK_EXPECT_T(state->state < count)) { NSParameterAssert(objects[state->state] != NULL); stackbuf[enumeratedCount++] = objects[state->state++]; }\n\n  return(enumeratedCount);\n}\n\n- (void)insertObject:(id)anObject atIndex:(NSUInteger)objectIndex\n{\n  if(mutations   == 0UL)   { [NSException raise:NSInternalInconsistencyException format:@\"*** -[%@ %@]: mutating method sent to immutable object\", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; }\n  if(anObject    == NULL)  { [NSException raise:NSInvalidArgumentException       format:@\"*** -[%@ %@]: attempt to insert nil\",                    NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; }\n  if(objectIndex >  count) { [NSException raise:NSRangeException                 format:@\"*** -[%@ %@]: index (%lu) beyond bounds (%lu)\",          NSStringFromClass([self class]), NSStringFromSelector(_cmd), objectIndex, count + 1UL]; }\n#ifdef __clang_analyzer__\n  [anObject retain]; // Stupid clang analyzer...  Issue #19.\n#else\n  anObject = [anObject retain];\n#endif\n  _JKArrayInsertObjectAtIndex(self, anObject, objectIndex);\n  mutations = (mutations == NSUIntegerMax) ? 1UL : mutations + 1UL;\n}\n\n- (void)removeObjectAtIndex:(NSUInteger)objectIndex\n{\n  if(mutations   == 0UL)   { [NSException raise:NSInternalInconsistencyException format:@\"*** -[%@ %@]: mutating method sent to immutable object\", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; }\n  if(objectIndex >= count) { [NSException raise:NSRangeException                 format:@\"*** -[%@ %@]: index (%lu) beyond bounds (%lu)\",          NSStringFromClass([self class]), NSStringFromSelector(_cmd), objectIndex, count]; }\n  _JKArrayRemoveObjectAtIndex(self, objectIndex);\n  mutations = (mutations == NSUIntegerMax) ? 1UL : mutations + 1UL;\n}\n\n- (void)replaceObjectAtIndex:(NSUInteger)objectIndex withObject:(id)anObject\n{\n  if(mutations   == 0UL)   { [NSException raise:NSInternalInconsistencyException format:@\"*** -[%@ %@]: mutating method sent to immutable object\", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; }\n  if(anObject    == NULL)  { [NSException raise:NSInvalidArgumentException       format:@\"*** -[%@ %@]: attempt to insert nil\",                    NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; }\n  if(objectIndex >= count) { [NSException raise:NSRangeException                 format:@\"*** -[%@ %@]: index (%lu) beyond bounds (%lu)\",          NSStringFromClass([self class]), NSStringFromSelector(_cmd), objectIndex, count]; }\n#ifdef __clang_analyzer__\n  [anObject retain]; // Stupid clang analyzer...  Issue #19.\n#else\n  anObject = [anObject retain];\n#endif\n  _JKArrayReplaceObjectAtIndexWithObject(self, objectIndex, anObject);\n  mutations = (mutations == NSUIntegerMax) ? 1UL : mutations + 1UL;\n}\n\n- (id)copyWithZone:(NSZone *)zone\n{\n  NSParameterAssert((objects != NULL) && (count <= capacity));\n  return((mutations == 0UL) ? [self retain] : [(NSArray *)[NSArray allocWithZone:zone] initWithObjects:objects count:count]);\n}\n\n- (id)mutableCopyWithZone:(NSZone *)zone\n{\n  NSParameterAssert((objects != NULL) && (count <= capacity));\n  return([(NSMutableArray *)[NSMutableArray allocWithZone:zone] initWithObjects:objects count:count]);\n}\n\n@end\n\n\n#pragma mark -\n@interface JKDictionaryEnumerator : NSEnumerator {\n  id         collection;\n  NSUInteger nextObject;\n}\n\n- (id)initWithJKDictionary:(JKDictionary *)initDictionary;\n- (NSArray *)allObjects;\n- (id)nextObject;\n\n@end\n\n@implementation JKDictionaryEnumerator\n\n- (id)initWithJKDictionary:(JKDictionary *)initDictionary\n{\n  NSParameterAssert(initDictionary != NULL);\n  if((self = [super init]) == NULL) { return(NULL); }\n  if((collection = (id)CFRetain(initDictionary)) == NULL) { [self autorelease]; return(NULL); }\n  return(self);\n}\n\n- (void)dealloc\n{\n  if(collection != NULL) { CFRelease(collection); collection = NULL; }\n  [super dealloc];\n}\n\n- (NSArray *)allObjects\n{\n  NSParameterAssert(collection != NULL);\n  NSUInteger count = [(NSDictionary *)collection count], atObject = 0UL;\n  id         objects[count];\n\n  while((objects[atObject] = [self nextObject]) != NULL) { NSParameterAssert(atObject < count); atObject++; }\n\n  return([NSArray arrayWithObjects:objects count:atObject]);\n}\n\n- (id)nextObject\n{\n  NSParameterAssert((collection != NULL) && (_JKDictionaryHashEntry(collection) != NULL));\n  JKHashTableEntry *entry        = _JKDictionaryHashEntry(collection);\n  NSUInteger        capacity     = _JKDictionaryCapacity(collection);\n  id                returnObject = NULL;\n\n  if(entry != NULL) { while((nextObject < capacity) && ((returnObject = entry[nextObject++].key) == NULL)) { /* ... */ } }\n\n  return(returnObject);\n}\n\n@end\n\n#pragma mark -\n@interface JKDictionary : NSMutableDictionary <NSCopying, NSMutableCopying, NSFastEnumeration> {\n  NSUInteger count, capacity, mutations;\n  JKHashTableEntry *entry;\n}\n@end\n\n@implementation JKDictionary\n\n+ (id)allocWithZone:(NSZone *)zone\n{\n#pragma unused(zone)\n  [NSException raise:NSInvalidArgumentException format:@\"*** - [%@ %@]: The %@ class is private to JSONKit and should not be used in this fashion.\", NSStringFromClass([self class]), NSStringFromSelector(_cmd), NSStringFromClass([self class])];\n  return(NULL);\n}\n\n// These values are taken from Core Foundation CF-550 CFBasicHash.m.  As a bonus, they align very well with our JKHashTableEntry struct too.\nstatic const NSUInteger jk_dictionaryCapacities[] = {\n  0UL, 3UL, 7UL, 13UL, 23UL, 41UL, 71UL, 127UL, 191UL, 251UL, 383UL, 631UL, 1087UL, 1723UL,\n  2803UL, 4523UL, 7351UL, 11959UL, 19447UL, 31231UL, 50683UL, 81919UL, 132607UL,\n  214519UL, 346607UL, 561109UL, 907759UL, 1468927UL, 2376191UL, 3845119UL,\n  6221311UL, 10066421UL, 16287743UL, 26354171UL, 42641881UL, 68996069UL,\n  111638519UL, 180634607UL, 292272623UL, 472907251UL\n};\n\nstatic NSUInteger _JKDictionaryCapacityForCount(NSUInteger count) {\n  NSUInteger bottom = 0UL, top = sizeof(jk_dictionaryCapacities) / sizeof(NSUInteger), mid = 0UL, tableSize = lround(floor((count) * 1.33));\n  while(top > bottom) { mid = (top + bottom) / 2UL; if(jk_dictionaryCapacities[mid] < tableSize) { bottom = mid + 1UL; } else { top = mid; } }\n  return(jk_dictionaryCapacities[bottom]);\n}\n\nstatic void _JKDictionaryResizeIfNeccessary(JKDictionary *dictionary) {\n  NSCParameterAssert((dictionary != NULL) && (dictionary->entry != NULL) && (dictionary->count <= dictionary->capacity));\n\n  NSUInteger capacityForCount = 0UL;\n  if(dictionary->capacity < (capacityForCount = _JKDictionaryCapacityForCount(dictionary->count + 1UL))) { // resize\n    NSUInteger        oldCapacity = dictionary->capacity;\n#ifndef NS_BLOCK_ASSERTIONS\n    NSUInteger oldCount = dictionary->count;\n#endif\n    JKHashTableEntry *oldEntry    = dictionary->entry;\n    if(JK_EXPECT_F((dictionary->entry = (JKHashTableEntry *)calloc(1UL, sizeof(JKHashTableEntry) * capacityForCount)) == NULL)) { [NSException raise:NSMallocException format:@\"Unable to allocate memory for hash table.\"]; }\n    dictionary->capacity = capacityForCount;\n    dictionary->count    = 0UL;\n\n    NSUInteger idx = 0UL;\n    for(idx = 0UL; idx < oldCapacity; idx++) { if(oldEntry[idx].key != NULL) { _JKDictionaryAddObject(dictionary, oldEntry[idx].keyHash, oldEntry[idx].key, oldEntry[idx].object); oldEntry[idx].keyHash = 0UL; oldEntry[idx].key = NULL; oldEntry[idx].object = NULL; } }\n    NSCParameterAssert((oldCount == dictionary->count));\n    free(oldEntry); oldEntry = NULL;\n  }\n}\n\nstatic JKDictionary *_JKDictionaryCreate(id *keys, NSUInteger *keyHashes, id *objects, NSUInteger count, BOOL mutableCollection) {\n  NSCParameterAssert((keys != NULL) && (keyHashes != NULL) && (objects != NULL) && (_JKDictionaryClass != NULL) && (_JKDictionaryInstanceSize > 0UL));\n  JKDictionary *dictionary = NULL;\n  if(JK_EXPECT_T((dictionary = (JKDictionary *)calloc(1UL, _JKDictionaryInstanceSize)) != NULL)) { // Directly allocate the JKDictionary instance via calloc.\n    dictionary->isa      = _JKDictionaryClass;\n    if((dictionary = [dictionary init]) == NULL) { return(NULL); }\n    dictionary->capacity = _JKDictionaryCapacityForCount(count);\n    dictionary->count    = 0UL;\n\n    if(JK_EXPECT_F((dictionary->entry = (JKHashTableEntry *)calloc(1UL, sizeof(JKHashTableEntry) * dictionary->capacity)) == NULL)) { [dictionary autorelease]; return(NULL); }\n\n    NSUInteger idx = 0UL;\n    for(idx = 0UL; idx < count; idx++) { _JKDictionaryAddObject(dictionary, keyHashes[idx], keys[idx], objects[idx]); }\n\n    dictionary->mutations = (mutableCollection == NO) ? 0UL : 1UL;\n  }\n  return(dictionary);\n}\n\n- (void)dealloc\n{\n  if(JK_EXPECT_T(entry != NULL)) {\n    NSUInteger atEntry = 0UL;\n    for(atEntry = 0UL; atEntry < capacity; atEntry++) {\n      if(JK_EXPECT_T(entry[atEntry].key    != NULL)) { CFRelease(entry[atEntry].key);    entry[atEntry].key    = NULL; }\n      if(JK_EXPECT_T(entry[atEntry].object != NULL)) { CFRelease(entry[atEntry].object); entry[atEntry].object = NULL; }\n    }\n\n    free(entry); entry = NULL;\n  }\n\n  [super dealloc];\n}\n\nstatic JKHashTableEntry *_JKDictionaryHashEntry(JKDictionary *dictionary) {\n  NSCParameterAssert(dictionary != NULL);\n  return(dictionary->entry);\n}\n\nstatic NSUInteger _JKDictionaryCapacity(JKDictionary *dictionary) {\n  NSCParameterAssert(dictionary != NULL);\n  return(dictionary->capacity);\n}\n\nstatic void _JKDictionaryRemoveObjectWithEntry(JKDictionary *dictionary, JKHashTableEntry *entry) {\n  NSCParameterAssert((dictionary != NULL) && (entry != NULL) && (entry->key != NULL) && (entry->object != NULL) && (dictionary->count > 0UL) && (dictionary->count <= dictionary->capacity));\n  CFRelease(entry->key);    entry->key    = NULL;\n  CFRelease(entry->object); entry->object = NULL;\n  entry->keyHash = 0UL;\n  dictionary->count--;\n  // In order for certain invariants that are used to speed up the search for a particular key, we need to \"re-add\" all the entries in the hash table following this entry until we hit a NULL entry.\n  NSUInteger removeIdx = entry - dictionary->entry, idx = 0UL;\n  NSCParameterAssert((removeIdx < dictionary->capacity));\n  for(idx = 0UL; idx < dictionary->capacity; idx++) {\n    NSUInteger entryIdx = (removeIdx + idx + 1UL) % dictionary->capacity;\n    JKHashTableEntry *atEntry = &dictionary->entry[entryIdx];\n    if(atEntry->key == NULL) { break; }\n    NSUInteger keyHash = atEntry->keyHash;\n    id key = atEntry->key, object = atEntry->object;\n    NSCParameterAssert(object != NULL);\n    atEntry->keyHash = 0UL;\n    atEntry->key     = NULL;\n    atEntry->object  = NULL;\n    NSUInteger addKeyEntry = keyHash % dictionary->capacity, addIdx = 0UL;\n    for(addIdx = 0UL; addIdx < dictionary->capacity; addIdx++) {\n      JKHashTableEntry *atAddEntry = &dictionary->entry[((addKeyEntry + addIdx) % dictionary->capacity)];\n      if(JK_EXPECT_T(atAddEntry->key == NULL)) { NSCParameterAssert((atAddEntry->keyHash == 0UL) && (atAddEntry->object == NULL)); atAddEntry->key = key; atAddEntry->object = object; atAddEntry->keyHash = keyHash; break; }\n    }\n  }\n}\n\nstatic void _JKDictionaryAddObject(JKDictionary *dictionary, NSUInteger keyHash, id key, id object) {\n  NSCParameterAssert((dictionary != NULL) && (key != NULL) && (object != NULL) && (dictionary->count < dictionary->capacity) && (dictionary->entry != NULL));\n  NSUInteger keyEntry = keyHash % dictionary->capacity, idx = 0UL;\n  for(idx = 0UL; idx < dictionary->capacity; idx++) {\n    NSUInteger entryIdx = (keyEntry + idx) % dictionary->capacity;\n    JKHashTableEntry *atEntry = &dictionary->entry[entryIdx];\n    if(JK_EXPECT_F(atEntry->keyHash == keyHash) && JK_EXPECT_T(atEntry->key != NULL) && (JK_EXPECT_F(key == atEntry->key) || JK_EXPECT_F(CFEqual(atEntry->key, key)))) { _JKDictionaryRemoveObjectWithEntry(dictionary, atEntry); }\n    if(JK_EXPECT_T(atEntry->key == NULL)) { NSCParameterAssert((atEntry->keyHash == 0UL) && (atEntry->object == NULL)); atEntry->key = key; atEntry->object = object; atEntry->keyHash = keyHash; dictionary->count++; return; }\n  }\n\n  // We should never get here.  If we do, we -release the key / object because it's our responsibility.\n  CFRelease(key);\n  CFRelease(object);\n}\n\n- (NSUInteger)count\n{\n  return(count);\n}\n\nstatic JKHashTableEntry *_JKDictionaryHashTableEntryForKey(JKDictionary *dictionary, id aKey) {\n  NSCParameterAssert((dictionary != NULL) && (dictionary->entry != NULL) && (dictionary->count <= dictionary->capacity));\n  if((aKey == NULL) || (dictionary->capacity == 0UL)) { return(NULL); }\n  NSUInteger        keyHash = CFHash(aKey), keyEntry = (keyHash % dictionary->capacity), idx = 0UL;\n  JKHashTableEntry *atEntry = NULL;\n  for(idx = 0UL; idx < dictionary->capacity; idx++) {\n    atEntry = &dictionary->entry[(keyEntry + idx) % dictionary->capacity];\n    if(JK_EXPECT_T(atEntry->keyHash == keyHash) && JK_EXPECT_T(atEntry->key != NULL) && ((atEntry->key == aKey) || CFEqual(atEntry->key, aKey))) { NSCParameterAssert(atEntry->object != NULL); return(atEntry); break; }\n    if(JK_EXPECT_F(atEntry->key == NULL)) { NSCParameterAssert(atEntry->object == NULL); return(NULL); break; } // If the key was in the table, we would have found it by now.\n  }\n  return(NULL);\n}\n\n- (id)objectForKey:(id)aKey\n{\n  NSParameterAssert((entry != NULL) && (count <= capacity));\n  JKHashTableEntry *entryForKey = _JKDictionaryHashTableEntryForKey(self, aKey);\n  return((entryForKey != NULL) ? entryForKey->object : NULL);\n}\n\n- (void)getObjects:(id *)objects andKeys:(id *)keys\n{\n  NSParameterAssert((entry != NULL) && (count <= capacity));\n  NSUInteger atEntry = 0UL; NSUInteger arrayIdx = 0UL;\n  for(atEntry = 0UL; atEntry < capacity; atEntry++) {\n    if(JK_EXPECT_T(entry[atEntry].key != NULL)) {\n      NSCParameterAssert((entry[atEntry].object != NULL) && (arrayIdx < count));\n      if(JK_EXPECT_T(keys    != NULL)) { keys[arrayIdx]    = entry[atEntry].key;    }\n      if(JK_EXPECT_T(objects != NULL)) { objects[arrayIdx] = entry[atEntry].object; }\n      arrayIdx++;\n    }\n  }\n}\n\n- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len\n{\n  NSParameterAssert((state != NULL) && (stackbuf != NULL) && (len > 0UL) && (entry != NULL) && (count <= capacity));\n  if(JK_EXPECT_F(state->state == 0UL))      { state->mutationsPtr = (unsigned long *)&mutations; state->itemsPtr = stackbuf; }\n  if(JK_EXPECT_F(state->state >= capacity)) { return(0UL); }\n\n  NSUInteger enumeratedCount  = 0UL;\n  while(JK_EXPECT_T(enumeratedCount < len) && JK_EXPECT_T(state->state < capacity)) { if(JK_EXPECT_T(entry[state->state].key != NULL)) { stackbuf[enumeratedCount++] = entry[state->state].key; } state->state++; }\n\n  return(enumeratedCount);\n}\n\n- (NSEnumerator *)keyEnumerator\n{\n  return([[[JKDictionaryEnumerator alloc] initWithJKDictionary:self] autorelease]);\n}\n\n- (void)setObject:(id)anObject forKey:(id)aKey\n{\n  if(mutations == 0UL)  { [NSException raise:NSInternalInconsistencyException format:@\"*** -[%@ %@]: mutating method sent to immutable object\", NSStringFromClass([self class]), NSStringFromSelector(_cmd)];       }\n  if(aKey      == NULL) { [NSException raise:NSInvalidArgumentException       format:@\"*** -[%@ %@]: attempt to insert nil key\",                NSStringFromClass([self class]), NSStringFromSelector(_cmd)];       }\n  if(anObject  == NULL) { [NSException raise:NSInvalidArgumentException       format:@\"*** -[%@ %@]: attempt to insert nil value (key: %@)\",    NSStringFromClass([self class]), NSStringFromSelector(_cmd), aKey]; }\n\n  _JKDictionaryResizeIfNeccessary(self);\n#ifndef __clang_analyzer__\n  aKey     = [aKey     copy];   // Why on earth would clang complain that this -copy \"might leak\",\n  anObject = [anObject retain]; // but this -retain doesn't!?\n#endif // __clang_analyzer__\n  _JKDictionaryAddObject(self, CFHash(aKey), aKey, anObject);\n  mutations = (mutations == NSUIntegerMax) ? 1UL : mutations + 1UL;\n}\n\n- (void)removeObjectForKey:(id)aKey\n{\n  if(mutations == 0UL)  { [NSException raise:NSInternalInconsistencyException format:@\"*** -[%@ %@]: mutating method sent to immutable object\", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; }\n  if(aKey      == NULL) { [NSException raise:NSInvalidArgumentException       format:@\"*** -[%@ %@]: attempt to remove nil key\",                NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; }\n  JKHashTableEntry *entryForKey = _JKDictionaryHashTableEntryForKey(self, aKey);\n  if(entryForKey != NULL) {\n    _JKDictionaryRemoveObjectWithEntry(self, entryForKey);\n    mutations = (mutations == NSUIntegerMax) ? 1UL : mutations + 1UL;\n  }\n}\n\n- (id)copyWithZone:(NSZone *)zone\n{\n  NSParameterAssert((entry != NULL) && (count <= capacity));\n  return((mutations == 0UL) ? [self retain] : [[NSDictionary allocWithZone:zone] initWithDictionary:self]);\n}\n\n- (id)mutableCopyWithZone:(NSZone *)zone\n{\n  NSParameterAssert((entry != NULL) && (count <= capacity));\n  return([[NSMutableDictionary allocWithZone:zone] initWithDictionary:self]);\n}\n\n@end\n\n\n\n#pragma mark -\n\nJK_STATIC_INLINE size_t jk_min(size_t a, size_t b) { return((a < b) ? a : b); }\nJK_STATIC_INLINE size_t jk_max(size_t a, size_t b) { return((a > b) ? a : b); }\n\nJK_STATIC_INLINE JKHash calculateHash(JKHash currentHash, unsigned char c) { return(((currentHash << 5) + currentHash) + c); }\n\nstatic void jk_error(JKParseState *parseState, NSString *format, ...) {\n  NSCParameterAssert((parseState != NULL) && (format != NULL));\n\n  va_list varArgsList;\n  va_start(varArgsList, format);\n  NSString *formatString = [[[NSString alloc] initWithFormat:format arguments:varArgsList] autorelease];\n  va_end(varArgsList);\n\n#if 0\n  const unsigned char *lineStart      = parseState->stringBuffer.bytes.ptr + parseState->lineStartIndex;\n  const unsigned char *lineEnd        = lineStart;\n  const unsigned char *atCharacterPtr = NULL;\n\n  for(atCharacterPtr = lineStart; atCharacterPtr < JK_END_STRING_PTR(parseState); atCharacterPtr++) { lineEnd = atCharacterPtr; if(jk_parse_is_newline(parseState, atCharacterPtr)) { break; } }\n\n  NSString *lineString = @\"\", *carretString = @\"\";\n  if(lineStart < JK_END_STRING_PTR(parseState)) {\n    lineString   = [[[NSString alloc] initWithBytes:lineStart length:(lineEnd - lineStart) encoding:NSUTF8StringEncoding] autorelease];\n    carretString = [NSString stringWithFormat:@\"%*.*s^\", (int)(parseState->atIndex - parseState->lineStartIndex), (int)(parseState->atIndex - parseState->lineStartIndex), \" \"];\n  }\n#endif\n\n  if(parseState->error == NULL) {\n    parseState->error = [NSError errorWithDomain:@\"JKErrorDomain\" code:-1L userInfo:\n                                   [NSDictionary dictionaryWithObjectsAndKeys:\n                                                                              formatString,                                             NSLocalizedDescriptionKey,\n                                                                              [NSNumber numberWithUnsignedLong:parseState->atIndex],    @\"JKAtIndexKey\",\n                                                                              [NSNumber numberWithUnsignedLong:parseState->lineNumber], @\"JKLineNumberKey\",\n                                                 //lineString,   @\"JKErrorLine0Key\",\n                                                 //carretString, @\"JKErrorLine1Key\",\n                                                                              NULL]];\n  }\n}\n\n#pragma mark -\n#pragma mark Buffer and Object Stack management functions\n\nstatic void jk_managedBuffer_release(JKManagedBuffer *managedBuffer) {\n  if((managedBuffer->flags & JKManagedBufferMustFree)) {\n    if(managedBuffer->bytes.ptr != NULL) { free(managedBuffer->bytes.ptr); managedBuffer->bytes.ptr = NULL; }\n    managedBuffer->flags &= ~JKManagedBufferMustFree;\n  }\n\n  managedBuffer->bytes.ptr     = NULL;\n  managedBuffer->bytes.length  = 0UL;\n  managedBuffer->flags        &= ~JKManagedBufferLocationMask;\n}\n\nstatic void jk_managedBuffer_setToStackBuffer(JKManagedBuffer *managedBuffer, unsigned char *ptr, size_t length) {\n  jk_managedBuffer_release(managedBuffer);\n  managedBuffer->bytes.ptr     = ptr;\n  managedBuffer->bytes.length  = length;\n  managedBuffer->flags         = (managedBuffer->flags & ~JKManagedBufferLocationMask) | JKManagedBufferOnStack;\n}\n\nstatic unsigned char *jk_managedBuffer_resize(JKManagedBuffer *managedBuffer, size_t newSize) {\n  size_t roundedUpNewSize = newSize;\n\n  if(managedBuffer->roundSizeUpToMultipleOf > 0UL) { roundedUpNewSize = newSize + ((managedBuffer->roundSizeUpToMultipleOf - (newSize % managedBuffer->roundSizeUpToMultipleOf)) % managedBuffer->roundSizeUpToMultipleOf); }\n\n  if((roundedUpNewSize != managedBuffer->bytes.length) && (roundedUpNewSize > managedBuffer->bytes.length)) {\n    if((managedBuffer->flags & JKManagedBufferLocationMask) == JKManagedBufferOnStack) {\n      NSCParameterAssert((managedBuffer->flags & JKManagedBufferMustFree) == 0);\n      unsigned char *newBuffer = NULL, *oldBuffer = managedBuffer->bytes.ptr;\n\n      if((newBuffer = (unsigned char *)malloc(roundedUpNewSize)) == NULL) { return(NULL); }\n      memcpy(newBuffer, oldBuffer, jk_min(managedBuffer->bytes.length, roundedUpNewSize));\n      managedBuffer->flags        = (managedBuffer->flags & ~JKManagedBufferLocationMask) | (JKManagedBufferOnHeap | JKManagedBufferMustFree);\n      managedBuffer->bytes.ptr    = newBuffer;\n      managedBuffer->bytes.length = roundedUpNewSize;\n    } else {\n      NSCParameterAssert(((managedBuffer->flags & JKManagedBufferMustFree) != 0) && ((managedBuffer->flags & JKManagedBufferLocationMask) == JKManagedBufferOnHeap));\n      if((managedBuffer->bytes.ptr = (unsigned char *)reallocf(managedBuffer->bytes.ptr, roundedUpNewSize)) == NULL) { return(NULL); }\n      managedBuffer->bytes.length = roundedUpNewSize;\n    }\n  }\n\n  return(managedBuffer->bytes.ptr);\n}\n\n\n\nstatic void jk_objectStack_release(JKObjectStack *objectStack) {\n  NSCParameterAssert(objectStack != NULL);\n\n  NSCParameterAssert(objectStack->index <= objectStack->count);\n  size_t atIndex = 0UL;\n  for(atIndex = 0UL; atIndex < objectStack->index; atIndex++) {\n    if(objectStack->objects[atIndex] != NULL) { CFRelease(objectStack->objects[atIndex]); objectStack->objects[atIndex] = NULL; }\n    if(objectStack->keys[atIndex]    != NULL) { CFRelease(objectStack->keys[atIndex]);    objectStack->keys[atIndex]    = NULL; }\n  }\n  objectStack->index = 0UL;\n\n  if(objectStack->flags & JKObjectStackMustFree) {\n    NSCParameterAssert((objectStack->flags & JKObjectStackLocationMask) == JKObjectStackOnHeap);\n    if(objectStack->objects  != NULL) { free(objectStack->objects);  objectStack->objects  = NULL; }\n    if(objectStack->keys     != NULL) { free(objectStack->keys);     objectStack->keys     = NULL; }\n    if(objectStack->cfHashes != NULL) { free(objectStack->cfHashes); objectStack->cfHashes = NULL; }\n    objectStack->flags &= ~JKObjectStackMustFree;\n  }\n\n  objectStack->objects  = NULL;\n  objectStack->keys     = NULL;\n  objectStack->cfHashes = NULL;\n\n  objectStack->count    = 0UL;\n  objectStack->flags   &= ~JKObjectStackLocationMask;\n}\n\nstatic void jk_objectStack_setToStackBuffer(JKObjectStack *objectStack, void **objects, void **keys, CFHashCode *cfHashes, size_t count) {\n  NSCParameterAssert((objectStack != NULL) && (objects != NULL) && (keys != NULL) && (cfHashes != NULL) && (count > 0UL));\n  jk_objectStack_release(objectStack);\n  objectStack->objects  = objects;\n  objectStack->keys     = keys;\n  objectStack->cfHashes = cfHashes;\n  objectStack->count    = count;\n  objectStack->flags    = (objectStack->flags & ~JKObjectStackLocationMask) | JKObjectStackOnStack;\n#ifndef NS_BLOCK_ASSERTIONS\n  size_t idx;\n  for(idx = 0UL; idx < objectStack->count; idx++) { objectStack->objects[idx] = NULL; objectStack->keys[idx] = NULL; objectStack->cfHashes[idx] = 0UL; }\n#endif\n}\n\nstatic int jk_objectStack_resize(JKObjectStack *objectStack, size_t newCount) {\n  size_t roundedUpNewCount = newCount;\n  int    returnCode = 0;\n\n  void       **newObjects  = NULL, **newKeys = NULL;\n  CFHashCode  *newCFHashes = NULL;\n\n  if(objectStack->roundSizeUpToMultipleOf > 0UL) { roundedUpNewCount = newCount + ((objectStack->roundSizeUpToMultipleOf - (newCount % objectStack->roundSizeUpToMultipleOf)) % objectStack->roundSizeUpToMultipleOf); }\n\n  if((roundedUpNewCount != objectStack->count) && (roundedUpNewCount > objectStack->count)) {\n    if((objectStack->flags & JKObjectStackLocationMask) == JKObjectStackOnStack) {\n      NSCParameterAssert((objectStack->flags & JKObjectStackMustFree) == 0);\n\n      if((newObjects  = (void **     )calloc(1UL, roundedUpNewCount * sizeof(void *    ))) == NULL) { returnCode = 1; goto errorExit; }\n      memcpy(newObjects, objectStack->objects,   jk_min(objectStack->count, roundedUpNewCount) * sizeof(void *));\n      if((newKeys     = (void **     )calloc(1UL, roundedUpNewCount * sizeof(void *    ))) == NULL) { returnCode = 1; goto errorExit; }\n      memcpy(newKeys,     objectStack->keys,     jk_min(objectStack->count, roundedUpNewCount) * sizeof(void *));\n\n      if((newCFHashes = (CFHashCode *)calloc(1UL, roundedUpNewCount * sizeof(CFHashCode))) == NULL) { returnCode = 1; goto errorExit; }\n      memcpy(newCFHashes, objectStack->cfHashes, jk_min(objectStack->count, roundedUpNewCount) * sizeof(CFHashCode));\n\n      objectStack->flags    = (objectStack->flags & ~JKObjectStackLocationMask) | (JKObjectStackOnHeap | JKObjectStackMustFree);\n      objectStack->objects  = newObjects;  newObjects  = NULL;\n      objectStack->keys     = newKeys;     newKeys     = NULL;\n      objectStack->cfHashes = newCFHashes; newCFHashes = NULL;\n      objectStack->count    = roundedUpNewCount;\n    } else {\n      NSCParameterAssert(((objectStack->flags & JKObjectStackMustFree) != 0) && ((objectStack->flags & JKObjectStackLocationMask) == JKObjectStackOnHeap));\n      if((newObjects  = (void  **    )realloc(objectStack->objects,  roundedUpNewCount * sizeof(void *    ))) != NULL) { objectStack->objects  = newObjects;  newObjects  = NULL; } else { returnCode = 1; goto errorExit; }\n      if((newKeys     = (void  **    )realloc(objectStack->keys,     roundedUpNewCount * sizeof(void *    ))) != NULL) { objectStack->keys     = newKeys;     newKeys     = NULL; } else { returnCode = 1; goto errorExit; }\n      if((newCFHashes = (CFHashCode *)realloc(objectStack->cfHashes, roundedUpNewCount * sizeof(CFHashCode))) != NULL) { objectStack->cfHashes = newCFHashes; newCFHashes = NULL; } else { returnCode = 1; goto errorExit; }\n\n#ifndef NS_BLOCK_ASSERTIONS\n      size_t idx;\n      for(idx = objectStack->count; idx < roundedUpNewCount; idx++) { objectStack->objects[idx] = NULL; objectStack->keys[idx] = NULL; objectStack->cfHashes[idx] = 0UL; }\n#endif\n      objectStack->count = roundedUpNewCount;\n    }\n  }\n\n errorExit:\n  if(newObjects  != NULL) { free(newObjects);  newObjects  = NULL; }\n  if(newKeys     != NULL) { free(newKeys);     newKeys     = NULL; }\n  if(newCFHashes != NULL) { free(newCFHashes); newCFHashes = NULL; }\n\n  return(returnCode);\n}\n\n////////////\n#pragma mark -\n#pragma mark Unicode related functions\n\nJK_STATIC_INLINE ConversionResult isValidCodePoint(UTF32 *u32CodePoint) {\n  ConversionResult result = conversionOK;\n  UTF32            ch     = *u32CodePoint;\n\n  if(JK_EXPECT_F(ch >= UNI_SUR_HIGH_START) && (JK_EXPECT_T(ch <= UNI_SUR_LOW_END)))                                                        { result = sourceIllegal; ch = UNI_REPLACEMENT_CHAR; goto finished; }\n  if(JK_EXPECT_F(ch >= 0xFDD0U) && (JK_EXPECT_F(ch <= 0xFDEFU) || JK_EXPECT_F((ch & 0xFFFEU) == 0xFFFEU)) && JK_EXPECT_T(ch <= 0x10FFFFU)) { result = sourceIllegal; ch = UNI_REPLACEMENT_CHAR; goto finished; }\n  if(JK_EXPECT_F(ch == 0U))                                                                                                                { result = sourceIllegal; ch = UNI_REPLACEMENT_CHAR; goto finished; }\n\n finished:\n  *u32CodePoint = ch;\n  return(result);\n}\n\n\nstatic int isLegalUTF8(const UTF8 *source, size_t length) {\n  const UTF8 *srcptr = source + length;\n  UTF8 a;\n\n  switch(length) {\n    default: return(0); // Everything else falls through when \"true\"...\n    case 4: if(JK_EXPECT_F(((a = (*--srcptr)) < 0x80) || (a > 0xBF))) { return(0); }\n    case 3: if(JK_EXPECT_F(((a = (*--srcptr)) < 0x80) || (a > 0xBF))) { return(0); }\n    case 2: if(JK_EXPECT_F( (a = (*--srcptr)) > 0xBF               )) { return(0); }\n\n      switch(*source) { // no fall-through in this inner switch\n        case 0xE0: if(JK_EXPECT_F(a < 0xA0)) { return(0); } break;\n        case 0xED: if(JK_EXPECT_F(a > 0x9F)) { return(0); } break;\n        case 0xF0: if(JK_EXPECT_F(a < 0x90)) { return(0); } break;\n        case 0xF4: if(JK_EXPECT_F(a > 0x8F)) { return(0); } break;\n        default:   if(JK_EXPECT_F(a < 0x80)) { return(0); }\n      }\n\n    case 1: if(JK_EXPECT_F((JK_EXPECT_T(*source < 0xC2)) && JK_EXPECT_F(*source >= 0x80))) { return(0); }\n  }\n\n  if(JK_EXPECT_F(*source > 0xF4)) { return(0); }\n\n  return(1);\n}\n\nstatic ConversionResult ConvertSingleCodePointInUTF8(const UTF8 *sourceStart, const UTF8 *sourceEnd, UTF8 const **nextUTF8, UTF32 *convertedUTF32) {\n  ConversionResult result = conversionOK;\n  const UTF8 *source = sourceStart;\n  UTF32 ch = 0UL;\n\n#if !defined(JK_FAST_TRAILING_BYTES)\n  unsigned short extraBytesToRead = trailingBytesForUTF8[*source];\n#else\n  unsigned short extraBytesToRead = __builtin_clz(((*source)^0xff) << 25);\n#endif\n\n  if(JK_EXPECT_F((source + extraBytesToRead + 1) > sourceEnd) || JK_EXPECT_F(!isLegalUTF8(source, extraBytesToRead + 1))) {\n    source++;\n    while((source < sourceEnd) && (((*source) & 0xc0) == 0x80) && ((source - sourceStart) < (extraBytesToRead + 1))) { source++; }\n    NSCParameterAssert(source <= sourceEnd);\n    result = ((source < sourceEnd) && (((*source) & 0xc0) != 0x80)) ? sourceIllegal : ((sourceStart + extraBytesToRead + 1) > sourceEnd) ? sourceExhausted : sourceIllegal;\n    ch = UNI_REPLACEMENT_CHAR;\n    goto finished;\n  }\n\n  switch(extraBytesToRead) { // The cases all fall through.\n    case 5: ch += *source++; ch <<= 6;\n    case 4: ch += *source++; ch <<= 6;\n    case 3: ch += *source++; ch <<= 6;\n    case 2: ch += *source++; ch <<= 6;\n    case 1: ch += *source++; ch <<= 6;\n    case 0: ch += *source++;\n  }\n  ch -= offsetsFromUTF8[extraBytesToRead];\n\n  result = isValidCodePoint(&ch);\n\n finished:\n  *nextUTF8       = source;\n  *convertedUTF32 = ch;\n\n  return(result);\n}\n\n\nstatic ConversionResult ConvertUTF32toUTF8 (UTF32 u32CodePoint, UTF8 **targetStart, UTF8 *targetEnd) {\n  const UTF32       byteMask     = 0xBF, byteMark = 0x80;\n  ConversionResult  result       = conversionOK;\n  UTF8             *target       = *targetStart;\n  UTF32             ch           = u32CodePoint;\n  unsigned short    bytesToWrite = 0;\n\n  result = isValidCodePoint(&ch);\n\n  // Figure out how many bytes the result will require. Turn any illegally large UTF32 things (> Plane 17) into replacement chars.\n       if(ch < (UTF32)0x80)          { bytesToWrite = 1; }\n  else if(ch < (UTF32)0x800)         { bytesToWrite = 2; }\n  else if(ch < (UTF32)0x10000)       { bytesToWrite = 3; }\n  else if(ch <= UNI_MAX_LEGAL_UTF32) { bytesToWrite = 4; }\n  else {                               bytesToWrite = 3; ch = UNI_REPLACEMENT_CHAR; result = sourceIllegal; }\n\n  target += bytesToWrite;\n  if (target > targetEnd) { target -= bytesToWrite; result = targetExhausted; goto finished; }\n\n  switch (bytesToWrite) { // note: everything falls through.\n    case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n    case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n    case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n    case 1: *--target = (UTF8) (ch | firstByteMark[bytesToWrite]);\n  }\n\n  target += bytesToWrite;\n\n finished:\n  *targetStart = target;\n  return(result);\n}\n\nJK_STATIC_INLINE int jk_string_add_unicodeCodePoint(JKParseState *parseState, uint32_t unicodeCodePoint, size_t *tokenBufferIdx, JKHash *stringHash) {\n  UTF8             *u8s = &parseState->token.tokenBuffer.bytes.ptr[*tokenBufferIdx];\n  ConversionResult  result;\n\n  if((result = ConvertUTF32toUTF8(unicodeCodePoint, &u8s, (parseState->token.tokenBuffer.bytes.ptr + parseState->token.tokenBuffer.bytes.length))) != conversionOK) { if(result == targetExhausted) { return(1); } }\n  size_t utf8len = u8s - &parseState->token.tokenBuffer.bytes.ptr[*tokenBufferIdx], nextIdx = (*tokenBufferIdx) + utf8len;\n\n  while(*tokenBufferIdx < nextIdx) { *stringHash = calculateHash(*stringHash, parseState->token.tokenBuffer.bytes.ptr[(*tokenBufferIdx)++]); }\n\n  return(0);\n}\n\n////////////\n#pragma mark -\n#pragma mark Decoding / parsing / deserializing functions\n\nstatic int jk_parse_string(JKParseState *parseState) {\n  NSCParameterAssert((parseState != NULL) && (JK_AT_STRING_PTR(parseState) <= JK_END_STRING_PTR(parseState)));\n  const unsigned char *stringStart       = JK_AT_STRING_PTR(parseState) + 1;\n  const unsigned char *endOfBuffer       = JK_END_STRING_PTR(parseState);\n  const unsigned char *atStringCharacter = stringStart;\n  unsigned char       *tokenBuffer       = parseState->token.tokenBuffer.bytes.ptr;\n  size_t               tokenStartIndex   = parseState->atIndex;\n  size_t               tokenBufferIdx    = 0UL;\n\n  int      onlySimpleString        = 1,  stringState     = JSONStringStateStart;\n  uint16_t escapedUnicode1         = 0U, escapedUnicode2 = 0U;\n  uint32_t escapedUnicodeCodePoint = 0U;\n  JKHash   stringHash              = JK_HASH_INIT;\n\n  while(1) {\n    unsigned long currentChar;\n\n    if(JK_EXPECT_F(atStringCharacter == endOfBuffer)) { /* XXX Add error message */ stringState = JSONStringStateError; goto finishedParsing; }\n\n    if(JK_EXPECT_F((currentChar = *atStringCharacter++) >= 0x80UL)) {\n      const unsigned char *nextValidCharacter = NULL;\n      UTF32                u32ch              = 0U;\n      ConversionResult     result;\n\n      if(JK_EXPECT_F((result = ConvertSingleCodePointInUTF8(atStringCharacter - 1, endOfBuffer, (UTF8 const **)&nextValidCharacter, &u32ch)) != conversionOK)) { goto switchToSlowPath; }\n      stringHash = calculateHash(stringHash, currentChar);\n      while(atStringCharacter < nextValidCharacter) { NSCParameterAssert(JK_AT_STRING_PTR(parseState) <= JK_END_STRING_PTR(parseState)); stringHash = calculateHash(stringHash, *atStringCharacter++); }\n      continue;\n    } else {\n      if(JK_EXPECT_F(currentChar == (unsigned long)'\"')) { stringState = JSONStringStateFinished; goto finishedParsing; }\n\n      if(JK_EXPECT_F(currentChar == (unsigned long)'\\\\')) {\n      switchToSlowPath:\n        onlySimpleString = 0;\n        stringState      = JSONStringStateParsing;\n        tokenBufferIdx   = (atStringCharacter - stringStart) - 1L;\n        if(JK_EXPECT_F((tokenBufferIdx + 16UL) > parseState->token.tokenBuffer.bytes.length)) { if((tokenBuffer = jk_managedBuffer_resize(&parseState->token.tokenBuffer, tokenBufferIdx + 1024UL)) == NULL) { jk_error(parseState, @\"Internal error: Unable to resize temporary buffer. %@ line #%ld\", [NSString stringWithUTF8String:__FILE__], (long)__LINE__); stringState = JSONStringStateError; goto finishedParsing; } }\n        memcpy(tokenBuffer, stringStart, tokenBufferIdx);\n        goto slowMatch;\n      }\n\n      if(JK_EXPECT_F(currentChar < 0x20UL)) { jk_error(parseState, @\"Invalid character < 0x20 found in string: 0x%2.2x.\", currentChar); stringState = JSONStringStateError; goto finishedParsing; }\n\n      stringHash = calculateHash(stringHash, currentChar);\n    }\n  }\n\n slowMatch:\n\n  for(atStringCharacter = (stringStart + ((atStringCharacter - stringStart) - 1L)); (atStringCharacter < endOfBuffer) && (tokenBufferIdx < parseState->token.tokenBuffer.bytes.length); atStringCharacter++) {\n    if((tokenBufferIdx + 16UL) > parseState->token.tokenBuffer.bytes.length) { if((tokenBuffer = jk_managedBuffer_resize(&parseState->token.tokenBuffer, tokenBufferIdx + 1024UL)) == NULL) { jk_error(parseState, @\"Internal error: Unable to resize temporary buffer. %@ line #%ld\", [NSString stringWithUTF8String:__FILE__], (long)__LINE__); stringState = JSONStringStateError; goto finishedParsing; } }\n\n    NSCParameterAssert(tokenBufferIdx < parseState->token.tokenBuffer.bytes.length);\n\n    unsigned long currentChar = (*atStringCharacter), escapedChar;\n\n    if(JK_EXPECT_T(stringState == JSONStringStateParsing)) {\n      if(JK_EXPECT_T(currentChar >= 0x20UL)) {\n        if(JK_EXPECT_T(currentChar < (unsigned long)0x80)) { // Not a UTF8 sequence\n          if(JK_EXPECT_F(currentChar == (unsigned long)'\"'))  { stringState = JSONStringStateFinished; atStringCharacter++; goto finishedParsing; }\n          if(JK_EXPECT_F(currentChar == (unsigned long)'\\\\')) { stringState = JSONStringStateEscape; continue; }\n          stringHash = calculateHash(stringHash, currentChar);\n          tokenBuffer[tokenBufferIdx++] = currentChar;\n          continue;\n        } else { // UTF8 sequence\n          const unsigned char *nextValidCharacter = NULL;\n          UTF32                u32ch              = 0U;\n          ConversionResult     result;\n\n          if(JK_EXPECT_F((result = ConvertSingleCodePointInUTF8(atStringCharacter, endOfBuffer, (UTF8 const **)&nextValidCharacter, &u32ch)) != conversionOK)) {\n            if((result == sourceIllegal) && ((parseState->parseOptionFlags & JKParseOptionLooseUnicode) == 0)) { jk_error(parseState, @\"Illegal UTF8 sequence found in \\\"\\\" string.\");              stringState = JSONStringStateError; goto finishedParsing; }\n            if(result == sourceExhausted)                                                                      { jk_error(parseState, @\"End of buffer reached while parsing UTF8 in \\\"\\\" string.\"); stringState = JSONStringStateError; goto finishedParsing; }\n            if(jk_string_add_unicodeCodePoint(parseState, u32ch, &tokenBufferIdx, &stringHash))                { jk_error(parseState, @\"Internal error: Unable to add UTF8 sequence to internal string buffer. %@ line #%ld\", [NSString stringWithUTF8String:__FILE__], (long)__LINE__); stringState = JSONStringStateError; goto finishedParsing; }\n            atStringCharacter = nextValidCharacter - 1;\n            continue;\n          } else {\n            while(atStringCharacter < nextValidCharacter) { tokenBuffer[tokenBufferIdx++] = *atStringCharacter; stringHash = calculateHash(stringHash, *atStringCharacter++); }\n            atStringCharacter--;\n            continue;\n          }\n        }\n      } else { // currentChar < 0x20\n        jk_error(parseState, @\"Invalid character < 0x20 found in string: 0x%2.2x.\", currentChar); stringState = JSONStringStateError; goto finishedParsing;\n      }\n\n    } else { // stringState != JSONStringStateParsing\n      int isSurrogate = 1;\n\n      switch(stringState) {\n        case JSONStringStateEscape:\n          switch(currentChar) {\n            case 'u': escapedUnicode1 = 0U; escapedUnicode2 = 0U; escapedUnicodeCodePoint = 0U; stringState = JSONStringStateEscapedUnicode1; break;\n\n            case 'b':  escapedChar = '\\b'; goto parsedEscapedChar;\n            case 'f':  escapedChar = '\\f'; goto parsedEscapedChar;\n            case 'n':  escapedChar = '\\n'; goto parsedEscapedChar;\n            case 'r':  escapedChar = '\\r'; goto parsedEscapedChar;\n            case 't':  escapedChar = '\\t'; goto parsedEscapedChar;\n            case '\\\\': escapedChar = '\\\\'; goto parsedEscapedChar;\n            case '/':  escapedChar = '/';  goto parsedEscapedChar;\n            case '\"':  escapedChar = '\"';  goto parsedEscapedChar;\n\n            parsedEscapedChar:\n              stringState = JSONStringStateParsing;\n              stringHash  = calculateHash(stringHash, escapedChar);\n              tokenBuffer[tokenBufferIdx++] = escapedChar;\n              break;\n\n            default: jk_error(parseState, @\"Invalid escape sequence found in \\\"\\\" string.\"); stringState = JSONStringStateError; goto finishedParsing; break;\n          }\n          break;\n\n        case JSONStringStateEscapedUnicode1:\n        case JSONStringStateEscapedUnicode2:\n        case JSONStringStateEscapedUnicode3:\n        case JSONStringStateEscapedUnicode4:           isSurrogate = 0;\n        case JSONStringStateEscapedUnicodeSurrogate1:\n        case JSONStringStateEscapedUnicodeSurrogate2:\n        case JSONStringStateEscapedUnicodeSurrogate3:\n        case JSONStringStateEscapedUnicodeSurrogate4:\n          {\n            uint16_t hexValue = 0U;\n\n            switch(currentChar) {\n              case '0' ... '9': hexValue =  currentChar - '0';        goto parsedHex;\n              case 'a' ... 'f': hexValue = (currentChar - 'a') + 10U; goto parsedHex;\n              case 'A' ... 'F': hexValue = (currentChar - 'A') + 10U; goto parsedHex;\n\n              parsedHex:\n              if(!isSurrogate) { escapedUnicode1 = (escapedUnicode1 << 4) | hexValue; } else { escapedUnicode2 = (escapedUnicode2 << 4) | hexValue; }\n\n              if(stringState == JSONStringStateEscapedUnicode4) {\n                if(((escapedUnicode1 >= 0xD800U) && (escapedUnicode1 < 0xE000U))) {\n                  if((escapedUnicode1 >= 0xD800U) && (escapedUnicode1 < 0xDC00U)) { stringState = JSONStringStateEscapedNeedEscapeForSurrogate; }\n                  else if((escapedUnicode1 >= 0xDC00U) && (escapedUnicode1 < 0xE000U)) {\n                    if((parseState->parseOptionFlags & JKParseOptionLooseUnicode)) { escapedUnicodeCodePoint = UNI_REPLACEMENT_CHAR; }\n                    else { jk_error(parseState, @\"Illegal \\\\u Unicode escape sequence.\"); stringState = JSONStringStateError; goto finishedParsing; }\n                  }\n                }\n                else { escapedUnicodeCodePoint = escapedUnicode1; }\n              }\n\n              if(stringState == JSONStringStateEscapedUnicodeSurrogate4) {\n                if((escapedUnicode2 < 0xdc00) || (escapedUnicode2 > 0xdfff)) {\n                  if((parseState->parseOptionFlags & JKParseOptionLooseUnicode)) { escapedUnicodeCodePoint = UNI_REPLACEMENT_CHAR; }\n                  else { jk_error(parseState, @\"Illegal \\\\u Unicode escape sequence.\"); stringState = JSONStringStateError; goto finishedParsing; }\n                }\n                else { escapedUnicodeCodePoint = ((escapedUnicode1 - 0xd800) * 0x400) + (escapedUnicode2 - 0xdc00) + 0x10000; }\n              }\n\n              if((stringState == JSONStringStateEscapedUnicode4) || (stringState == JSONStringStateEscapedUnicodeSurrogate4)) {\n                if((isValidCodePoint(&escapedUnicodeCodePoint) == sourceIllegal) && ((parseState->parseOptionFlags & JKParseOptionLooseUnicode) == 0)) { jk_error(parseState, @\"Illegal \\\\u Unicode escape sequence.\"); stringState = JSONStringStateError; goto finishedParsing; }\n                stringState = JSONStringStateParsing;\n                if(jk_string_add_unicodeCodePoint(parseState, escapedUnicodeCodePoint, &tokenBufferIdx, &stringHash)) { jk_error(parseState, @\"Internal error: Unable to add UTF8 sequence to internal string buffer. %@ line #%ld\", [NSString stringWithUTF8String:__FILE__], (long)__LINE__); stringState = JSONStringStateError; goto finishedParsing; }\n              }\n              else if((stringState >= JSONStringStateEscapedUnicode1) && (stringState <= JSONStringStateEscapedUnicodeSurrogate4)) { stringState++; }\n              break;\n\n              default: jk_error(parseState, @\"Unexpected character found in \\\\u Unicode escape sequence.  Found '%c', expected [0-9a-fA-F].\", currentChar); stringState = JSONStringStateError; goto finishedParsing; break;\n            }\n          }\n          break;\n\n        case JSONStringStateEscapedNeedEscapeForSurrogate:\n          if(currentChar == '\\\\') { stringState = JSONStringStateEscapedNeedEscapedUForSurrogate; }\n          else {\n            if((parseState->parseOptionFlags & JKParseOptionLooseUnicode) == 0) { jk_error(parseState, @\"Required a second \\\\u Unicode escape sequence following a surrogate \\\\u Unicode escape sequence.\"); stringState = JSONStringStateError; goto finishedParsing; }\n            else { stringState = JSONStringStateParsing; atStringCharacter--;    if(jk_string_add_unicodeCodePoint(parseState, UNI_REPLACEMENT_CHAR, &tokenBufferIdx, &stringHash)) { jk_error(parseState, @\"Internal error: Unable to add UTF8 sequence to internal string buffer. %@ line #%ld\", [NSString stringWithUTF8String:__FILE__], (long)__LINE__); stringState = JSONStringStateError; goto finishedParsing; } }\n          }\n          break;\n\n        case JSONStringStateEscapedNeedEscapedUForSurrogate:\n          if(currentChar == 'u') { stringState = JSONStringStateEscapedUnicodeSurrogate1; }\n          else {\n            if((parseState->parseOptionFlags & JKParseOptionLooseUnicode) == 0) { jk_error(parseState, @\"Required a second \\\\u Unicode escape sequence following a surrogate \\\\u Unicode escape sequence.\"); stringState = JSONStringStateError; goto finishedParsing; }\n            else { stringState = JSONStringStateParsing; atStringCharacter -= 2; if(jk_string_add_unicodeCodePoint(parseState, UNI_REPLACEMENT_CHAR, &tokenBufferIdx, &stringHash)) { jk_error(parseState, @\"Internal error: Unable to add UTF8 sequence to internal string buffer. %@ line #%ld\", [NSString stringWithUTF8String:__FILE__], (long)__LINE__); stringState = JSONStringStateError; goto finishedParsing; } }\n          }\n          break;\n\n        default: jk_error(parseState, @\"Internal error: Unknown stringState. %@ line #%ld\", [NSString stringWithUTF8String:__FILE__], (long)__LINE__); stringState = JSONStringStateError; goto finishedParsing; break;\n      }\n    }\n  }\n\nfinishedParsing:\n\n  if(JK_EXPECT_T(stringState == JSONStringStateFinished)) {\n    NSCParameterAssert((parseState->stringBuffer.bytes.ptr + tokenStartIndex) < atStringCharacter);\n\n    parseState->token.tokenPtrRange.ptr    = parseState->stringBuffer.bytes.ptr + tokenStartIndex;\n    parseState->token.tokenPtrRange.length = (atStringCharacter - parseState->token.tokenPtrRange.ptr);\n\n    if(JK_EXPECT_T(onlySimpleString)) {\n      NSCParameterAssert(((parseState->token.tokenPtrRange.ptr + 1) < endOfBuffer) && (parseState->token.tokenPtrRange.length >= 2UL) && (((parseState->token.tokenPtrRange.ptr + 1) + (parseState->token.tokenPtrRange.length - 2)) < endOfBuffer));\n      parseState->token.value.ptrRange.ptr    = parseState->token.tokenPtrRange.ptr    + 1;\n      parseState->token.value.ptrRange.length = parseState->token.tokenPtrRange.length - 2UL;\n    } else {\n      parseState->token.value.ptrRange.ptr    = parseState->token.tokenBuffer.bytes.ptr;\n      parseState->token.value.ptrRange.length = tokenBufferIdx;\n    }\n\n    parseState->token.value.hash = stringHash;\n    parseState->token.value.type = JKValueTypeString;\n    parseState->atIndex          = (atStringCharacter - parseState->stringBuffer.bytes.ptr);\n  }\n\n  if(JK_EXPECT_F(stringState != JSONStringStateFinished)) { jk_error(parseState, @\"Invalid string.\"); }\n  return(JK_EXPECT_T(stringState == JSONStringStateFinished) ? 0 : 1);\n}\n\nstatic int jk_parse_number(JKParseState *parseState) {\n  NSCParameterAssert((parseState != NULL) && (JK_AT_STRING_PTR(parseState) <= JK_END_STRING_PTR(parseState)));\n  const unsigned char *numberStart       = JK_AT_STRING_PTR(parseState);\n  const unsigned char *endOfBuffer       = JK_END_STRING_PTR(parseState);\n  const unsigned char *atNumberCharacter = NULL;\n  int                  numberState       = JSONNumberStateWholeNumberStart, isFloatingPoint = 0, isNegative = 0, backup = 0;\n  size_t               startingIndex     = parseState->atIndex;\n\n  for(atNumberCharacter = numberStart; (JK_EXPECT_T(atNumberCharacter < endOfBuffer)) && (JK_EXPECT_T(!(JK_EXPECT_F(numberState == JSONNumberStateFinished) || JK_EXPECT_F(numberState == JSONNumberStateError)))); atNumberCharacter++) {\n    unsigned long currentChar = (unsigned long)(*atNumberCharacter), lowerCaseCC = currentChar | 0x20UL;\n\n    switch(numberState) {\n      case JSONNumberStateWholeNumberStart: if   (currentChar == '-')                                                                              { numberState = JSONNumberStateWholeNumberMinus;      isNegative      = 1; break; }\n      case JSONNumberStateWholeNumberMinus: if   (currentChar == '0')                                                                              { numberState = JSONNumberStateWholeNumberZero;                            break; }\n                                       else if(  (currentChar >= '1') && (currentChar <= '9'))                                                     { numberState = JSONNumberStateWholeNumber;                                break; }\n                                       else                                                     { /* XXX Add error message */                        numberState = JSONNumberStateError;                                      break; }\n      case JSONNumberStateExponentStart:    if(  (currentChar == '+') || (currentChar == '-'))                                                     { numberState = JSONNumberStateExponentPlusMinus;                          break; }\n      case JSONNumberStateFractionalNumberStart:\n      case JSONNumberStateExponentPlusMinus:if(!((currentChar >= '0') && (currentChar <= '9'))) { /* XXX Add error message */                        numberState = JSONNumberStateError;                                      break; }\n                                       else {                                              if(numberState == JSONNumberStateFractionalNumberStart) { numberState = JSONNumberStateFractionalNumber; }\n                                                                                           else                                                    { numberState = JSONNumberStateExponent;         }                         break; }\n      case JSONNumberStateWholeNumberZero:\n      case JSONNumberStateWholeNumber:      if   (currentChar == '.')                                                                              { numberState = JSONNumberStateFractionalNumberStart; isFloatingPoint = 1; break; }\n      case JSONNumberStateFractionalNumber: if   (lowerCaseCC == 'e')                                                                              { numberState = JSONNumberStateExponentStart;         isFloatingPoint = 1; break; }\n      case JSONNumberStateExponent:         if(!((currentChar >= '0') && (currentChar <= '9')) || (numberState == JSONNumberStateWholeNumberZero)) { numberState = JSONNumberStateFinished;              backup          = 1; break; }\n        break;\n      default:                                                                                    /* XXX Add error message */                        numberState = JSONNumberStateError;                                      break;\n    }\n  }\n\n  parseState->token.tokenPtrRange.ptr    = parseState->stringBuffer.bytes.ptr + startingIndex;\n  parseState->token.tokenPtrRange.length = (atNumberCharacter - parseState->token.tokenPtrRange.ptr) - backup;\n  parseState->atIndex                    = (parseState->token.tokenPtrRange.ptr + parseState->token.tokenPtrRange.length) - parseState->stringBuffer.bytes.ptr;\n\n  if(JK_EXPECT_T(numberState == JSONNumberStateFinished)) {\n    unsigned char  numberTempBuf[parseState->token.tokenPtrRange.length + 4UL];\n    unsigned char *endOfNumber = NULL;\n\n    memcpy(numberTempBuf, parseState->token.tokenPtrRange.ptr, parseState->token.tokenPtrRange.length);\n    numberTempBuf[parseState->token.tokenPtrRange.length] = 0;\n\n    errno = 0;\n\n    // Treat \"-0\" as a floating point number, which is capable of representing negative zeros.\n    if(JK_EXPECT_F(parseState->token.tokenPtrRange.length == 2UL) && JK_EXPECT_F(numberTempBuf[1] == '0') && JK_EXPECT_F(isNegative)) { isFloatingPoint = 1; }\n\n    if(isFloatingPoint) {\n      parseState->token.value.number.doubleValue = strtod((const char *)numberTempBuf, (char **)&endOfNumber); // strtod is documented to return U+2261 (identical to) 0.0 on an underflow error (along with setting errno to ERANGE).\n      parseState->token.value.type               = JKValueTypeDouble;\n      parseState->token.value.ptrRange.ptr       = (const unsigned char *)&parseState->token.value.number.doubleValue;\n      parseState->token.value.ptrRange.length    = sizeof(double);\n      parseState->token.value.hash               = (JK_HASH_INIT + parseState->token.value.type);\n    } else {\n      if(isNegative) {\n        parseState->token.value.number.longLongValue = strtoll((const char *)numberTempBuf, (char **)&endOfNumber, 10);\n        parseState->token.value.type                 = JKValueTypeLongLong;\n        parseState->token.value.ptrRange.ptr         = (const unsigned char *)&parseState->token.value.number.longLongValue;\n        parseState->token.value.ptrRange.length      = sizeof(long long);\n        parseState->token.value.hash                 = (JK_HASH_INIT + parseState->token.value.type) + (JKHash)parseState->token.value.number.longLongValue;\n      } else {\n        parseState->token.value.number.unsignedLongLongValue = strtoull((const char *)numberTempBuf, (char **)&endOfNumber, 10);\n        parseState->token.value.type                         = JKValueTypeUnsignedLongLong;\n        parseState->token.value.ptrRange.ptr                 = (const unsigned char *)&parseState->token.value.number.unsignedLongLongValue;\n        parseState->token.value.ptrRange.length              = sizeof(unsigned long long);\n        parseState->token.value.hash                         = (JK_HASH_INIT + parseState->token.value.type) + (JKHash)parseState->token.value.number.unsignedLongLongValue;\n      }\n    }\n\n    if(JK_EXPECT_F(errno != 0)) {\n      numberState = JSONNumberStateError;\n      if(errno == ERANGE) {\n        switch(parseState->token.value.type) {\n          case JKValueTypeDouble:           jk_error(parseState, @\"The value '%s' could not be represented as a 'double' due to %s.\",           numberTempBuf, (parseState->token.value.number.doubleValue == 0.0) ? \"underflow\" : \"overflow\"); break; // see above for == 0.0.\n          case JKValueTypeLongLong:         jk_error(parseState, @\"The value '%s' exceeded the minimum value that could be represented: %lld.\", numberTempBuf, parseState->token.value.number.longLongValue);                                   break;\n          case JKValueTypeUnsignedLongLong: jk_error(parseState, @\"The value '%s' exceeded the maximum value that could be represented: %llu.\", numberTempBuf, parseState->token.value.number.unsignedLongLongValue);                           break;\n          default:                          jk_error(parseState, @\"Internal error: Unknown token value type. %@ line #%ld\",                     [NSString stringWithUTF8String:__FILE__], (long)__LINE__);                                      break;\n        }\n      }\n    }\n    if(JK_EXPECT_F(endOfNumber != &numberTempBuf[parseState->token.tokenPtrRange.length]) && JK_EXPECT_F(numberState != JSONNumberStateError)) { numberState = JSONNumberStateError; jk_error(parseState, @\"The conversion function did not consume all of the number tokens characters.\"); }\n\n    size_t hashIndex = 0UL;\n    for(hashIndex = 0UL; hashIndex < parseState->token.value.ptrRange.length; hashIndex++) { parseState->token.value.hash = calculateHash(parseState->token.value.hash, parseState->token.value.ptrRange.ptr[hashIndex]); }\n  }\n\n  if(JK_EXPECT_F(numberState != JSONNumberStateFinished)) { jk_error(parseState, @\"Invalid number.\"); }\n  return(JK_EXPECT_T((numberState == JSONNumberStateFinished)) ? 0 : 1);\n}\n\nJK_STATIC_INLINE void jk_set_parsed_token(JKParseState *parseState, const unsigned char *ptr, size_t length, JKTokenType type, size_t advanceBy) {\n  parseState->token.tokenPtrRange.ptr     = ptr;\n  parseState->token.tokenPtrRange.length  = length;\n  parseState->token.type                  = type;\n  parseState->atIndex                    += advanceBy;\n}\n\nstatic size_t jk_parse_is_newline(JKParseState *parseState, const unsigned char *atCharacterPtr) {\n  NSCParameterAssert((parseState != NULL) && (atCharacterPtr != NULL) && (atCharacterPtr >= parseState->stringBuffer.bytes.ptr) && (atCharacterPtr < JK_END_STRING_PTR(parseState)));\n  const unsigned char *endOfStringPtr = JK_END_STRING_PTR(parseState);\n\n  if(JK_EXPECT_F(atCharacterPtr >= endOfStringPtr)) { return(0UL); }\n\n  if(JK_EXPECT_F((*(atCharacterPtr + 0)) == '\\n')) { return(1UL); }\n  if(JK_EXPECT_F((*(atCharacterPtr + 0)) == '\\r')) { if((JK_EXPECT_T((atCharacterPtr + 1) < endOfStringPtr)) && ((*(atCharacterPtr + 1)) == '\\n')) { return(2UL); } return(1UL); }\n  if(parseState->parseOptionFlags & JKParseOptionUnicodeNewlines) {\n    if((JK_EXPECT_F((*(atCharacterPtr + 0)) == 0xc2)) && (((atCharacterPtr + 1) < endOfStringPtr) && ((*(atCharacterPtr + 1)) == 0x85))) { return(2UL); }\n    if((JK_EXPECT_F((*(atCharacterPtr + 0)) == 0xe2)) && (((atCharacterPtr + 2) < endOfStringPtr) && ((*(atCharacterPtr + 1)) == 0x80) && (((*(atCharacterPtr + 2)) == 0xa8) || ((*(atCharacterPtr + 2)) == 0xa9)))) { return(3UL); }\n  }\n\n  return(0UL);\n}\n\nJK_STATIC_INLINE int jk_parse_skip_newline(JKParseState *parseState) {\n  size_t newlineAdvanceAtIndex = 0UL;\n  if(JK_EXPECT_F((newlineAdvanceAtIndex = jk_parse_is_newline(parseState, JK_AT_STRING_PTR(parseState))) > 0UL)) { parseState->lineNumber++; parseState->atIndex += (newlineAdvanceAtIndex - 1UL); parseState->lineStartIndex = parseState->atIndex + 1UL; return(1); }\n  return(0);\n}\n\nJK_STATIC_INLINE void jk_parse_skip_whitespace(JKParseState *parseState) {\n#ifndef __clang_analyzer__\n  NSCParameterAssert((parseState != NULL) && (JK_AT_STRING_PTR(parseState) <= JK_END_STRING_PTR(parseState)));\n  const unsigned char *atCharacterPtr   = NULL;\n  const unsigned char *endOfStringPtr   = JK_END_STRING_PTR(parseState);\n\n  for(atCharacterPtr = JK_AT_STRING_PTR(parseState); (JK_EXPECT_T((atCharacterPtr = JK_AT_STRING_PTR(parseState)) < endOfStringPtr)); parseState->atIndex++) {\n    if(((*(atCharacterPtr + 0)) == ' ') || ((*(atCharacterPtr + 0)) == '\\t')) { continue; }\n    if(jk_parse_skip_newline(parseState)) { continue; }\n    if(parseState->parseOptionFlags & JKParseOptionComments) {\n      if((JK_EXPECT_F((*(atCharacterPtr + 0)) == '/')) && (JK_EXPECT_T((atCharacterPtr + 1) < endOfStringPtr))) {\n        if((*(atCharacterPtr + 1)) == '/') {\n          parseState->atIndex++;\n          for(atCharacterPtr = JK_AT_STRING_PTR(parseState); (JK_EXPECT_T((atCharacterPtr = JK_AT_STRING_PTR(parseState)) < endOfStringPtr)); parseState->atIndex++) { if(jk_parse_skip_newline(parseState)) { break; } }\n          continue;\n        }\n        if((*(atCharacterPtr + 1)) == '*') {\n          parseState->atIndex++;\n          for(atCharacterPtr = JK_AT_STRING_PTR(parseState); (JK_EXPECT_T((atCharacterPtr = JK_AT_STRING_PTR(parseState)) < endOfStringPtr)); parseState->atIndex++) {\n            if(jk_parse_skip_newline(parseState)) { continue; }\n            if(((*(atCharacterPtr + 0)) == '*') && (((atCharacterPtr + 1) < endOfStringPtr) && ((*(atCharacterPtr + 1)) == '/'))) { parseState->atIndex++; break; }\n          }\n          continue;\n        }\n      }\n    }\n    break;\n  }\n#endif\n}\n\nstatic int jk_parse_next_token(JKParseState *parseState) {\n  NSCParameterAssert((parseState != NULL) && (JK_AT_STRING_PTR(parseState) <= JK_END_STRING_PTR(parseState)));\n  const unsigned char *atCharacterPtr   = NULL;\n  const unsigned char *endOfStringPtr   = JK_END_STRING_PTR(parseState);\n  unsigned char        currentCharacter = 0U;\n  int                  stopParsing      = 0;\n\n  parseState->prev_atIndex        = parseState->atIndex;\n  parseState->prev_lineNumber     = parseState->lineNumber;\n  parseState->prev_lineStartIndex = parseState->lineStartIndex;\n\n  jk_parse_skip_whitespace(parseState);\n\n  if((JK_AT_STRING_PTR(parseState) == endOfStringPtr)) { stopParsing = 1; }\n\n  if((JK_EXPECT_T(stopParsing == 0)) && (JK_EXPECT_T((atCharacterPtr = JK_AT_STRING_PTR(parseState)) < endOfStringPtr))) {\n    currentCharacter = *atCharacterPtr;\n\n         if(JK_EXPECT_T(currentCharacter == '\"')) { if(JK_EXPECT_T((stopParsing = jk_parse_string(parseState)) == 0)) { jk_set_parsed_token(parseState, parseState->token.tokenPtrRange.ptr, parseState->token.tokenPtrRange.length, JKTokenTypeString, 0UL); } }\n    else if(JK_EXPECT_T(currentCharacter == ':')) { jk_set_parsed_token(parseState, atCharacterPtr, 1UL, JKTokenTypeSeparator,   1UL); }\n    else if(JK_EXPECT_T(currentCharacter == ',')) { jk_set_parsed_token(parseState, atCharacterPtr, 1UL, JKTokenTypeComma,       1UL); }\n    else if((JK_EXPECT_T(currentCharacter >= '0') && JK_EXPECT_T(currentCharacter <= '9')) || JK_EXPECT_T(currentCharacter == '-')) { if(JK_EXPECT_T((stopParsing = jk_parse_number(parseState)) == 0)) { jk_set_parsed_token(parseState, parseState->token.tokenPtrRange.ptr, parseState->token.tokenPtrRange.length, JKTokenTypeNumber, 0UL); } }\n    else if(JK_EXPECT_T(currentCharacter == '{')) { jk_set_parsed_token(parseState, atCharacterPtr, 1UL, JKTokenTypeObjectBegin, 1UL); }\n    else if(JK_EXPECT_T(currentCharacter == '}')) { jk_set_parsed_token(parseState, atCharacterPtr, 1UL, JKTokenTypeObjectEnd,   1UL); }\n    else if(JK_EXPECT_T(currentCharacter == '[')) { jk_set_parsed_token(parseState, atCharacterPtr, 1UL, JKTokenTypeArrayBegin,  1UL); }\n    else if(JK_EXPECT_T(currentCharacter == ']')) { jk_set_parsed_token(parseState, atCharacterPtr, 1UL, JKTokenTypeArrayEnd,    1UL); }\n\n    else if(JK_EXPECT_T(currentCharacter == 't')) { if(!((JK_EXPECT_T((atCharacterPtr + 4UL) < endOfStringPtr)) && (JK_EXPECT_T(atCharacterPtr[1] == 'r')) && (JK_EXPECT_T(atCharacterPtr[2] == 'u')) && (JK_EXPECT_T(atCharacterPtr[3] == 'e'))))                                            { stopParsing = 1; /* XXX Add error message */ } else { jk_set_parsed_token(parseState, atCharacterPtr, 4UL, JKTokenTypeTrue,  4UL); } }\n    else if(JK_EXPECT_T(currentCharacter == 'f')) { if(!((JK_EXPECT_T((atCharacterPtr + 5UL) < endOfStringPtr)) && (JK_EXPECT_T(atCharacterPtr[1] == 'a')) && (JK_EXPECT_T(atCharacterPtr[2] == 'l')) && (JK_EXPECT_T(atCharacterPtr[3] == 's')) && (JK_EXPECT_T(atCharacterPtr[4] == 'e')))) { stopParsing = 1; /* XXX Add error message */ } else { jk_set_parsed_token(parseState, atCharacterPtr, 5UL, JKTokenTypeFalse, 5UL); } }\n    else if(JK_EXPECT_T(currentCharacter == 'n')) { if(!((JK_EXPECT_T((atCharacterPtr + 4UL) < endOfStringPtr)) && (JK_EXPECT_T(atCharacterPtr[1] == 'u')) && (JK_EXPECT_T(atCharacterPtr[2] == 'l')) && (JK_EXPECT_T(atCharacterPtr[3] == 'l'))))                                            { stopParsing = 1; /* XXX Add error message */ } else { jk_set_parsed_token(parseState, atCharacterPtr, 4UL, JKTokenTypeNull,  4UL); } }\n    else { stopParsing = 1; /* XXX Add error message */ }\n  }\n\n  if(JK_EXPECT_F(stopParsing)) { jk_error(parseState, @\"Unexpected token, wanted '{', '}', '[', ']', ',', ':', 'true', 'false', 'null', '\\\"STRING\\\"', 'NUMBER'.\"); }\n  return(stopParsing);\n}\n\nstatic void jk_error_parse_accept_or3(JKParseState *parseState, int state, NSString *or1String, NSString *or2String, NSString *or3String) {\n  NSString *acceptStrings[16];\n  int acceptIdx = 0;\n  if(state & JKParseAcceptValue) { acceptStrings[acceptIdx++] = or1String; }\n  if(state & JKParseAcceptComma) { acceptStrings[acceptIdx++] = or2String; }\n  if(state & JKParseAcceptEnd)   { acceptStrings[acceptIdx++] = or3String; }\n       if(acceptIdx == 1) { jk_error(parseState, @\"Expected %@, not '%*.*s'\",           acceptStrings[0],                                     (int)parseState->token.tokenPtrRange.length, (int)parseState->token.tokenPtrRange.length, parseState->token.tokenPtrRange.ptr); }\n  else if(acceptIdx == 2) { jk_error(parseState, @\"Expected %@ or %@, not '%*.*s'\",     acceptStrings[0], acceptStrings[1],                   (int)parseState->token.tokenPtrRange.length, (int)parseState->token.tokenPtrRange.length, parseState->token.tokenPtrRange.ptr); }\n  else if(acceptIdx == 3) { jk_error(parseState, @\"Expected %@, %@, or %@, not '%*.*s\", acceptStrings[0], acceptStrings[1], acceptStrings[2], (int)parseState->token.tokenPtrRange.length, (int)parseState->token.tokenPtrRange.length, parseState->token.tokenPtrRange.ptr); }\n}\n\nstatic void *jk_parse_array(JKParseState *parseState) {\n  size_t  startingObjectIndex = parseState->objectStack.index;\n  int     arrayState          = JKParseAcceptValueOrEnd, stopParsing = 0;\n  void   *parsedArray         = NULL;\n\n  while(JK_EXPECT_T((JK_EXPECT_T(stopParsing == 0)) && (JK_EXPECT_T(parseState->atIndex < parseState->stringBuffer.bytes.length)))) {\n    if(JK_EXPECT_F(parseState->objectStack.index > (parseState->objectStack.count - 4UL))) { if(jk_objectStack_resize(&parseState->objectStack, parseState->objectStack.count + 128UL)) { jk_error(parseState, @\"Internal error: [array] objectsIndex > %zu, resize failed? %@ line %#ld\", (parseState->objectStack.count - 4UL), [NSString stringWithUTF8String:__FILE__], (long)__LINE__); break; } }\n\n    if(JK_EXPECT_T((stopParsing = jk_parse_next_token(parseState)) == 0)) {\n      void *object = NULL;\n#ifndef NS_BLOCK_ASSERTIONS\n      parseState->objectStack.objects[parseState->objectStack.index] = NULL;\n      parseState->objectStack.keys   [parseState->objectStack.index] = NULL;\n#endif\n      switch(parseState->token.type) {\n        case JKTokenTypeNumber:\n        case JKTokenTypeString:\n        case JKTokenTypeTrue:\n        case JKTokenTypeFalse:\n        case JKTokenTypeNull:\n        case JKTokenTypeArrayBegin:\n        case JKTokenTypeObjectBegin:\n          if(JK_EXPECT_F((arrayState & JKParseAcceptValue)          == 0))    { parseState->errorIsPrev = 1; jk_error(parseState, @\"Unexpected value.\");              stopParsing = 1; break; }\n          if(JK_EXPECT_F((object = jk_object_for_token(parseState)) == NULL)) {                              jk_error(parseState, @\"Internal error: Object == NULL\"); stopParsing = 1; break; } else { parseState->objectStack.objects[parseState->objectStack.index++] = object; arrayState = JKParseAcceptCommaOrEnd; }\n          break;\n        case JKTokenTypeArrayEnd: if(JK_EXPECT_T(arrayState & JKParseAcceptEnd)) { NSCParameterAssert(parseState->objectStack.index >= startingObjectIndex); parsedArray = (void *)_JKArrayCreate((id *)&parseState->objectStack.objects[startingObjectIndex], (parseState->objectStack.index - startingObjectIndex), parseState->mutableCollections); } else { parseState->errorIsPrev = 1; jk_error(parseState, @\"Unexpected ']'.\"); } stopParsing = 1; break;\n        case JKTokenTypeComma:    if(JK_EXPECT_T(arrayState & JKParseAcceptComma)) { arrayState = JKParseAcceptValue; } else { parseState->errorIsPrev = 1; jk_error(parseState, @\"Unexpected ','.\"); stopParsing = 1; } break;\n        default: parseState->errorIsPrev = 1; jk_error_parse_accept_or3(parseState, arrayState, @\"a value\", @\"a comma\", @\"a ']'\"); stopParsing = 1; break;\n      }\n    }\n  }\n\n  if(JK_EXPECT_F(parsedArray == NULL)) { size_t idx = 0UL; for(idx = startingObjectIndex; idx < parseState->objectStack.index; idx++) { if(parseState->objectStack.objects[idx] != NULL) { CFRelease(parseState->objectStack.objects[idx]); parseState->objectStack.objects[idx] = NULL; } } }\n#if !defined(NS_BLOCK_ASSERTIONS)\n  else { size_t idx = 0UL; for(idx = startingObjectIndex; idx < parseState->objectStack.index; idx++) { parseState->objectStack.objects[idx] = NULL; parseState->objectStack.keys[idx] = NULL; } }\n#endif\n\n  parseState->objectStack.index = startingObjectIndex;\n  return(parsedArray);\n}\n\nstatic void *jk_create_dictionary(JKParseState *parseState, size_t startingObjectIndex) {\n  void *parsedDictionary = NULL;\n\n  parseState->objectStack.index--;\n\n  parsedDictionary = _JKDictionaryCreate((id *)&parseState->objectStack.keys[startingObjectIndex], (NSUInteger *)&parseState->objectStack.cfHashes[startingObjectIndex], (id *)&parseState->objectStack.objects[startingObjectIndex], (parseState->objectStack.index - startingObjectIndex), parseState->mutableCollections);\n\n  return(parsedDictionary);\n}\n\nstatic void *jk_parse_dictionary(JKParseState *parseState) {\n  size_t  startingObjectIndex = parseState->objectStack.index;\n  int     dictState           = JKParseAcceptValueOrEnd, stopParsing = 0;\n  void   *parsedDictionary    = NULL;\n\n  while(JK_EXPECT_T((JK_EXPECT_T(stopParsing == 0)) && (JK_EXPECT_T(parseState->atIndex < parseState->stringBuffer.bytes.length)))) {\n    if(JK_EXPECT_F(parseState->objectStack.index > (parseState->objectStack.count - 4UL))) { if(jk_objectStack_resize(&parseState->objectStack, parseState->objectStack.count + 128UL)) { jk_error(parseState, @\"Internal error: [dictionary] objectsIndex > %zu, resize failed? %@ line #%ld\", (parseState->objectStack.count - 4UL), [NSString stringWithUTF8String:__FILE__], (long)__LINE__); break; } }\n\n    size_t objectStackIndex = parseState->objectStack.index++;\n    parseState->objectStack.keys[objectStackIndex]    = NULL;\n    parseState->objectStack.objects[objectStackIndex] = NULL;\n    void *key = NULL, *object = NULL;\n\n    if(JK_EXPECT_T((JK_EXPECT_T(stopParsing == 0)) && (JK_EXPECT_T((stopParsing = jk_parse_next_token(parseState)) == 0)))) {\n      switch(parseState->token.type) {\n        case JKTokenTypeString:\n          if(JK_EXPECT_F((dictState & JKParseAcceptValue)        == 0))    { parseState->errorIsPrev = 1; jk_error(parseState, @\"Unexpected string.\");           stopParsing = 1; break; }\n          if(JK_EXPECT_F((key = jk_object_for_token(parseState)) == NULL)) {                              jk_error(parseState, @\"Internal error: Key == NULL.\"); stopParsing = 1; break; }\n          else {\n            parseState->objectStack.keys[objectStackIndex] = key;\n            if(JK_EXPECT_T(parseState->token.value.cacheItem != NULL)) { if(JK_EXPECT_F(parseState->token.value.cacheItem->cfHash == 0UL)) { parseState->token.value.cacheItem->cfHash = CFHash(key); } parseState->objectStack.cfHashes[objectStackIndex] = parseState->token.value.cacheItem->cfHash; }\n            else { parseState->objectStack.cfHashes[objectStackIndex] = CFHash(key); }\n          }\n          break;\n\n        case JKTokenTypeObjectEnd: if((JK_EXPECT_T(dictState & JKParseAcceptEnd)))   { NSCParameterAssert(parseState->objectStack.index >= startingObjectIndex); parsedDictionary = jk_create_dictionary(parseState, startingObjectIndex); } else { parseState->errorIsPrev = 1; jk_error(parseState, @\"Unexpected '}'.\"); } stopParsing = 1; break;\n        case JKTokenTypeComma:     if((JK_EXPECT_T(dictState & JKParseAcceptComma))) { dictState = JKParseAcceptValue; parseState->objectStack.index--; continue; } else { parseState->errorIsPrev = 1; jk_error(parseState, @\"Unexpected ','.\"); stopParsing = 1; } break;\n\n        default: parseState->errorIsPrev = 1; jk_error_parse_accept_or3(parseState, dictState, @\"a \\\"STRING\\\"\", @\"a comma\", @\"a '}'\"); stopParsing = 1; break;\n      }\n    }\n\n    if(JK_EXPECT_T(stopParsing == 0)) {\n      if(JK_EXPECT_T((stopParsing = jk_parse_next_token(parseState)) == 0)) { if(JK_EXPECT_F(parseState->token.type != JKTokenTypeSeparator)) { parseState->errorIsPrev = 1; jk_error(parseState, @\"Expected ':'.\"); stopParsing = 1; } }\n    }\n\n    if((JK_EXPECT_T(stopParsing == 0)) && (JK_EXPECT_T((stopParsing = jk_parse_next_token(parseState)) == 0))) {\n      switch(parseState->token.type) {\n        case JKTokenTypeNumber:\n        case JKTokenTypeString:\n        case JKTokenTypeTrue:\n        case JKTokenTypeFalse:\n        case JKTokenTypeNull:\n        case JKTokenTypeArrayBegin:\n        case JKTokenTypeObjectBegin:\n          if(JK_EXPECT_F((dictState & JKParseAcceptValue)           == 0))    { parseState->errorIsPrev = 1; jk_error(parseState, @\"Unexpected value.\");               stopParsing = 1; break; }\n          if(JK_EXPECT_F((object = jk_object_for_token(parseState)) == NULL)) {                              jk_error(parseState, @\"Internal error: Object == NULL.\"); stopParsing = 1; break; } else { parseState->objectStack.objects[objectStackIndex] = object; dictState = JKParseAcceptCommaOrEnd; }\n          break;\n        default: parseState->errorIsPrev = 1; jk_error_parse_accept_or3(parseState, dictState, @\"a value\", @\"a comma\", @\"a '}'\"); stopParsing = 1; break;\n      }\n    }\n  }\n\n  if(JK_EXPECT_F(parsedDictionary == NULL)) { size_t idx = 0UL; for(idx = startingObjectIndex; idx < parseState->objectStack.index; idx++) { if(parseState->objectStack.keys[idx] != NULL) { CFRelease(parseState->objectStack.keys[idx]); parseState->objectStack.keys[idx] = NULL; } if(parseState->objectStack.objects[idx] != NULL) { CFRelease(parseState->objectStack.objects[idx]); parseState->objectStack.objects[idx] = NULL; } } }\n#if !defined(NS_BLOCK_ASSERTIONS)\n  else { size_t idx = 0UL; for(idx = startingObjectIndex; idx < parseState->objectStack.index; idx++) { parseState->objectStack.objects[idx] = NULL; parseState->objectStack.keys[idx] = NULL; } }\n#endif\n\n  parseState->objectStack.index = startingObjectIndex;\n  return(parsedDictionary);\n}\n\nstatic id json_parse_it(JKParseState *parseState) {\n  id  parsedObject = NULL;\n  int stopParsing  = 0;\n\n  while((JK_EXPECT_T(stopParsing == 0)) && (JK_EXPECT_T(parseState->atIndex < parseState->stringBuffer.bytes.length))) {\n    if((JK_EXPECT_T(stopParsing == 0)) && (JK_EXPECT_T((stopParsing = jk_parse_next_token(parseState)) == 0))) {\n      switch(parseState->token.type) {\n        case JKTokenTypeArrayBegin:\n        case JKTokenTypeObjectBegin: parsedObject = [(id)jk_object_for_token(parseState) autorelease]; stopParsing = 1; break;\n        default:                     jk_error(parseState, @\"Expected either '[' or '{'.\");             stopParsing = 1; break;\n      }\n    }\n  }\n\n  NSCParameterAssert((parseState->objectStack.index == 0) && (JK_AT_STRING_PTR(parseState) <= JK_END_STRING_PTR(parseState)));\n\n  if((parsedObject == NULL) && (JK_AT_STRING_PTR(parseState) == JK_END_STRING_PTR(parseState))) { jk_error(parseState, @\"Reached the end of the buffer.\"); }\n  if(parsedObject == NULL) { jk_error(parseState, @\"Unable to parse JSON.\"); }\n\n  if((parsedObject != NULL) && (JK_AT_STRING_PTR(parseState) < JK_END_STRING_PTR(parseState))) {\n    jk_parse_skip_whitespace(parseState);\n    if((parsedObject != NULL) && ((parseState->parseOptionFlags & JKParseOptionPermitTextAfterValidJSON) == 0) && (JK_AT_STRING_PTR(parseState) < JK_END_STRING_PTR(parseState))) {\n      jk_error(parseState, @\"A valid JSON object was parsed but there were additional non-white-space characters remaining.\");\n      parsedObject = NULL;\n    }\n  }\n\n  return(parsedObject);\n}\n\n////////////\n#pragma mark -\n#pragma mark Object cache\n\n// This uses a Galois Linear Feedback Shift Register (LFSR) PRNG to pick which item in the cache to age. It has a period of (2^32)-1.\n// NOTE: A LFSR *MUST* be initialized to a non-zero value and must always have a non-zero value.\nJK_STATIC_INLINE void jk_cache_age(JKParseState *parseState) {\n  NSCParameterAssert((parseState != NULL) && (parseState->cache.prng_lfsr != 0U));\n  parseState->cache.prng_lfsr = (parseState->cache.prng_lfsr >> 1) ^ ((0U - (parseState->cache.prng_lfsr & 1U)) & 0x80200003U);\n  parseState->cache.age[parseState->cache.prng_lfsr & (parseState->cache.count - 1UL)] >>= 1;\n}\n\n// The object cache is nothing more than a hash table with open addressing collision resolution that is bounded by JK_CACHE_PROBES attempts.\n//\n// The hash table is a linear C array of JKTokenCacheItem.  The terms \"item\" and \"bucket\" are synonymous with the index in to the cache array, i.e. cache.items[bucket].\n//\n// Items in the cache have an age associated with them.  The age is the number of rightmost 1 bits, i.e. 0000 = 0, 0001 = 1, 0011 = 2, 0111 = 3, 1111 = 4.\n// This allows us to use left and right shifts to add or subtract from an items age.  Add = (age << 1) | 1.  Subtract = age >> 0.  Subtract is synonymous with \"age\" (i.e., age an item).\n// The reason for this is it allows us to perform saturated adds and subtractions and is branchless.\n// The primitive C type MUST be unsigned.  It is currently a \"char\", which allows (at a minimum and in practice) 8 bits.\n//\n// A \"useable bucket\" is a bucket that is not in use (never populated), or has an age == 0.\n//\n// When an item is found in the cache, it's age is incremented.\n// If a useable bucket hasn't been found, the current item (bucket) is aged along with two random items.\n//\n// If a value is not found in the cache, and no useable bucket has been found, that value is not added to the cache.\n\nstatic void *jk_cachedObjects(JKParseState *parseState) {\n  unsigned long  bucket     = parseState->token.value.hash & (parseState->cache.count - 1UL), setBucket = 0UL, useableBucket = 0UL, x = 0UL;\n  void          *parsedAtom = NULL;\n\n  if(JK_EXPECT_F(parseState->token.value.ptrRange.length == 0UL) && JK_EXPECT_T(parseState->token.value.type == JKValueTypeString)) { return(@\"\"); }\n\n  for(x = 0UL; x < JK_CACHE_PROBES; x++) {\n    if(JK_EXPECT_F(parseState->cache.items[bucket].object == NULL)) { setBucket = 1UL; useableBucket = bucket; break; }\n\n    if((JK_EXPECT_T(parseState->cache.items[bucket].hash == parseState->token.value.hash)) && (JK_EXPECT_T(parseState->cache.items[bucket].size == parseState->token.value.ptrRange.length)) && (JK_EXPECT_T(parseState->cache.items[bucket].type == parseState->token.value.type)) && (JK_EXPECT_T(parseState->cache.items[bucket].bytes != NULL)) && (JK_EXPECT_T(memcmp(parseState->cache.items[bucket].bytes, parseState->token.value.ptrRange.ptr, parseState->token.value.ptrRange.length) == 0U))) {\n      parseState->cache.age[bucket]     = (parseState->cache.age[bucket] << 1) | 1U;\n      parseState->token.value.cacheItem = &parseState->cache.items[bucket];\n      NSCParameterAssert(parseState->cache.items[bucket].object != NULL);\n      return((void *)CFRetain(parseState->cache.items[bucket].object));\n    } else {\n      if(JK_EXPECT_F(setBucket == 0UL) && JK_EXPECT_F(parseState->cache.age[bucket] == 0U)) { setBucket = 1UL; useableBucket = bucket; }\n      if(JK_EXPECT_F(setBucket == 0UL))                                                     { parseState->cache.age[bucket] >>= 1; jk_cache_age(parseState); jk_cache_age(parseState); }\n      // This is the open addressing function.  The values length and type are used as a form of \"double hashing\" to distribute values with the same effective value hash across different object cache buckets.\n      // The values type is a prime number that is relatively coprime to the other primes in the set of value types and the number of hash table buckets.\n      bucket = (parseState->token.value.hash + (parseState->token.value.ptrRange.length * (x + 1UL)) + (parseState->token.value.type * (x + 1UL)) + (3UL * (x + 1UL))) & (parseState->cache.count - 1UL);\n    }\n  }\n\n  switch(parseState->token.value.type) {\n    case JKValueTypeString:           parsedAtom = (void *)CFStringCreateWithBytes(NULL, parseState->token.value.ptrRange.ptr, parseState->token.value.ptrRange.length, kCFStringEncodingUTF8, 0); break;\n    case JKValueTypeLongLong:         parsedAtom = (void *)CFNumberCreate(NULL, kCFNumberLongLongType, &parseState->token.value.number.longLongValue);                                             break;\n    case JKValueTypeUnsignedLongLong:\n      if(parseState->token.value.number.unsignedLongLongValue <= LLONG_MAX) { parsedAtom = (void *)CFNumberCreate(NULL, kCFNumberLongLongType, &parseState->token.value.number.unsignedLongLongValue); }\n      else { parsedAtom = (void *)parseState->objCImpCache.NSNumberInitWithUnsignedLongLong(parseState->objCImpCache.NSNumberAlloc(parseState->objCImpCache.NSNumberClass, @selector(alloc)), @selector(initWithUnsignedLongLong:), parseState->token.value.number.unsignedLongLongValue); }\n      break;\n    case JKValueTypeDouble:           parsedAtom = (void *)CFNumberCreate(NULL, kCFNumberDoubleType,   &parseState->token.value.number.doubleValue);                                               break;\n    default: jk_error(parseState, @\"Internal error: Unknown token value type. %@ line #%ld\", [NSString stringWithUTF8String:__FILE__], (long)__LINE__); break;\n  }\n\n  if(JK_EXPECT_T(setBucket) && (JK_EXPECT_T(parsedAtom != NULL))) {\n    bucket = useableBucket;\n    if(JK_EXPECT_T((parseState->cache.items[bucket].object != NULL))) { CFRelease(parseState->cache.items[bucket].object); parseState->cache.items[bucket].object = NULL; }\n\n    if(JK_EXPECT_T((parseState->cache.items[bucket].bytes = (unsigned char *)reallocf(parseState->cache.items[bucket].bytes, parseState->token.value.ptrRange.length)) != NULL)) {\n      memcpy(parseState->cache.items[bucket].bytes, parseState->token.value.ptrRange.ptr, parseState->token.value.ptrRange.length);\n      parseState->cache.items[bucket].object = (void *)CFRetain(parsedAtom);\n      parseState->cache.items[bucket].hash   = parseState->token.value.hash;\n      parseState->cache.items[bucket].cfHash = 0UL;\n      parseState->cache.items[bucket].size   = parseState->token.value.ptrRange.length;\n      parseState->cache.items[bucket].type   = parseState->token.value.type;\n      parseState->token.value.cacheItem      = &parseState->cache.items[bucket];\n      parseState->cache.age[bucket]          = JK_INIT_CACHE_AGE;\n    } else { // The realloc failed, so clear the appropriate fields.\n      parseState->cache.items[bucket].hash   = 0UL;\n      parseState->cache.items[bucket].cfHash = 0UL;\n      parseState->cache.items[bucket].size   = 0UL;\n      parseState->cache.items[bucket].type   = 0UL;\n    }\n  }\n\n  return(parsedAtom);\n}\n\n\nstatic void *jk_object_for_token(JKParseState *parseState) {\n  void *parsedAtom = NULL;\n\n  parseState->token.value.cacheItem = NULL;\n  switch(parseState->token.type) {\n    case JKTokenTypeString:      parsedAtom = jk_cachedObjects(parseState);    break;\n    case JKTokenTypeNumber:      parsedAtom = jk_cachedObjects(parseState);    break;\n    case JKTokenTypeObjectBegin: parsedAtom = jk_parse_dictionary(parseState); break;\n    case JKTokenTypeArrayBegin:  parsedAtom = jk_parse_array(parseState);      break;\n    case JKTokenTypeTrue:        parsedAtom = (void *)kCFBooleanTrue;          break;\n    case JKTokenTypeFalse:       parsedAtom = (void *)kCFBooleanFalse;         break;\n    case JKTokenTypeNull:        parsedAtom = (void *)kCFNull;                 break;\n    default: jk_error(parseState, @\"Internal error: Unknown token type. %@ line #%ld\", [NSString stringWithUTF8String:__FILE__], (long)__LINE__); break;\n  }\n\n  return(parsedAtom);\n}\n\n#pragma mark -\n@implementation JSONDecoder\n\n+ (id)decoder\n{\n  return([self decoderWithParseOptions:JKParseOptionStrict]);\n}\n\n+ (id)decoderWithParseOptions:(JKParseOptionFlags)parseOptionFlags\n{\n  return([[[self alloc] initWithParseOptions:parseOptionFlags] autorelease]);\n}\n\n- (id)init\n{\n  return([self initWithParseOptions:JKParseOptionStrict]);\n}\n\n- (id)initWithParseOptions:(JKParseOptionFlags)parseOptionFlags\n{\n  if((self = [super init]) == NULL) { return(NULL); }\n\n  if(parseOptionFlags & ~JKParseOptionValidFlags) { [self autorelease]; [NSException raise:NSInvalidArgumentException format:@\"Invalid parse options.\"]; }\n\n  if((parseState = (JKParseState *)calloc(1UL, sizeof(JKParseState))) == NULL) { goto errorExit; }\n\n  parseState->parseOptionFlags = parseOptionFlags;\n\n  parseState->token.tokenBuffer.roundSizeUpToMultipleOf = 4096UL;\n  parseState->objectStack.roundSizeUpToMultipleOf       = 2048UL;\n\n  parseState->objCImpCache.NSNumberClass                    = _jk_NSNumberClass;\n  parseState->objCImpCache.NSNumberAlloc                    = _jk_NSNumberAllocImp;\n  parseState->objCImpCache.NSNumberInitWithUnsignedLongLong = _jk_NSNumberInitWithUnsignedLongLongImp;\n\n  parseState->cache.prng_lfsr = 1U;\n  parseState->cache.count     = JK_CACHE_SLOTS;\n  if((parseState->cache.items = (JKTokenCacheItem *)calloc(1UL, sizeof(JKTokenCacheItem) * parseState->cache.count)) == NULL) { goto errorExit; }\n\n  return(self);\n\n errorExit:\n  if(self) { [self autorelease]; self = NULL; }\n  return(NULL);\n}\n\n// This is here primarily to support the NSString and NSData convenience functions so the autoreleased JSONDecoder can release most of its resources before the pool pops.\nstatic void _JSONDecoderCleanup(JSONDecoder *decoder) {\n  if((decoder != NULL) && (decoder->parseState != NULL)) {\n    jk_managedBuffer_release(&decoder->parseState->token.tokenBuffer);\n    jk_objectStack_release(&decoder->parseState->objectStack);\n\n    [decoder clearCache];\n    if(decoder->parseState->cache.items != NULL) { free(decoder->parseState->cache.items); decoder->parseState->cache.items = NULL; }\n\n    free(decoder->parseState); decoder->parseState = NULL;\n  }\n}\n\n- (void)dealloc\n{\n  _JSONDecoderCleanup(self);\n  [super dealloc];\n}\n\n- (void)clearCache\n{\n  if(JK_EXPECT_T(parseState != NULL)) {\n    if(JK_EXPECT_T(parseState->cache.items != NULL)) {\n      size_t idx = 0UL;\n      for(idx = 0UL; idx < parseState->cache.count; idx++) {\n        if(JK_EXPECT_T(parseState->cache.items[idx].object != NULL)) { CFRelease(parseState->cache.items[idx].object); parseState->cache.items[idx].object = NULL; }\n        if(JK_EXPECT_T(parseState->cache.items[idx].bytes  != NULL)) { free(parseState->cache.items[idx].bytes);       parseState->cache.items[idx].bytes  = NULL; }\n        memset(&parseState->cache.items[idx], 0, sizeof(JKTokenCacheItem));\n        parseState->cache.age[idx] = 0U;\n      }\n    }\n  }\n}\n\n// This needs to be completely rewritten.\nstatic id _JKParseUTF8String(JKParseState *parseState, BOOL mutableCollections, const unsigned char *string, size_t length, NSError **error) {\n  NSCParameterAssert((parseState != NULL) && (string != NULL) && (parseState->cache.prng_lfsr != 0U));\n  parseState->stringBuffer.bytes.ptr    = string;\n  parseState->stringBuffer.bytes.length = length;\n  parseState->atIndex                   = 0UL;\n  parseState->lineNumber                = 1UL;\n  parseState->lineStartIndex            = 0UL;\n  parseState->prev_atIndex              = 0UL;\n  parseState->prev_lineNumber           = 1UL;\n  parseState->prev_lineStartIndex       = 0UL;\n  parseState->error                     = NULL;\n  parseState->errorIsPrev               = 0;\n  parseState->mutableCollections        = (mutableCollections == NO) ? NO : YES;\n\n  unsigned char stackTokenBuffer[JK_TOKENBUFFER_SIZE] JK_ALIGNED(64);\n  jk_managedBuffer_setToStackBuffer(&parseState->token.tokenBuffer, stackTokenBuffer, sizeof(stackTokenBuffer));\n\n  void       *stackObjects [JK_STACK_OBJS] JK_ALIGNED(64);\n  void       *stackKeys    [JK_STACK_OBJS] JK_ALIGNED(64);\n  CFHashCode  stackCFHashes[JK_STACK_OBJS] JK_ALIGNED(64);\n  jk_objectStack_setToStackBuffer(&parseState->objectStack, stackObjects, stackKeys, stackCFHashes, JK_STACK_OBJS);\n\n  id parsedJSON = json_parse_it(parseState);\n\n  if((error != NULL) && (parseState->error != NULL)) { *error = parseState->error; }\n\n  jk_managedBuffer_release(&parseState->token.tokenBuffer);\n  jk_objectStack_release(&parseState->objectStack);\n\n  parseState->stringBuffer.bytes.ptr    = NULL;\n  parseState->stringBuffer.bytes.length = 0UL;\n  parseState->atIndex                   = 0UL;\n  parseState->lineNumber                = 1UL;\n  parseState->lineStartIndex            = 0UL;\n  parseState->prev_atIndex              = 0UL;\n  parseState->prev_lineNumber           = 1UL;\n  parseState->prev_lineStartIndex       = 0UL;\n  parseState->error                     = NULL;\n  parseState->errorIsPrev               = 0;\n  parseState->mutableCollections        = NO;\n\n  return(parsedJSON);\n}\n\n////////////\n#pragma mark Deprecated as of v1.4\n////////////\n\n// Deprecated in JSONKit v1.4.  Use objectWithUTF8String:length: instead.\n- (id)parseUTF8String:(const unsigned char *)string length:(size_t)length\n{\n  return([self objectWithUTF8String:string length:length error:NULL]);\n}\n\n// Deprecated in JSONKit v1.4.  Use objectWithUTF8String:length:error: instead.\n- (id)parseUTF8String:(const unsigned char *)string length:(size_t)length error:(NSError **)error\n{\n  return([self objectWithUTF8String:string length:length error:error]);\n}\n\n// Deprecated in JSONKit v1.4.  Use objectWithData: instead.\n- (id)parseJSONData:(NSData *)jsonData\n{\n  return([self objectWithData:jsonData error:NULL]);\n}\n\n// Deprecated in JSONKit v1.4.  Use objectWithData:error: instead.\n- (id)parseJSONData:(NSData *)jsonData error:(NSError **)error\n{\n  return([self objectWithData:jsonData error:error]);\n}\n\n////////////\n#pragma mark Methods that return immutable collection objects\n////////////\n\n- (id)objectWithUTF8String:(const unsigned char *)string length:(NSUInteger)length\n{\n  return([self objectWithUTF8String:string length:length error:NULL]);\n}\n\n- (id)objectWithUTF8String:(const unsigned char *)string length:(NSUInteger)length error:(NSError **)error\n{\n  if(parseState == NULL) { [NSException raise:NSInternalInconsistencyException format:@\"parseState is NULL.\"];          }\n  if(string     == NULL) { [NSException raise:NSInvalidArgumentException       format:@\"The string argument is NULL.\"]; }\n\n  return(_JKParseUTF8String(parseState, NO, string, (size_t)length, error));\n}\n\n- (id)objectWithData:(NSData *)jsonData\n{\n  return([self objectWithData:jsonData error:NULL]);\n}\n\n- (id)objectWithData:(NSData *)jsonData error:(NSError **)error\n{\n  if(jsonData == NULL) { [NSException raise:NSInvalidArgumentException format:@\"The jsonData argument is NULL.\"]; }\n  return([self objectWithUTF8String:(const unsigned char *)[jsonData bytes] length:[jsonData length] error:error]);\n}\n\n////////////\n#pragma mark Methods that return mutable collection objects\n////////////\n\n- (id)mutableObjectWithUTF8String:(const unsigned char *)string length:(NSUInteger)length\n{\n  return([self mutableObjectWithUTF8String:string length:length error:NULL]);\n}\n\n- (id)mutableObjectWithUTF8String:(const unsigned char *)string length:(NSUInteger)length error:(NSError **)error\n{\n  if(parseState == NULL) { [NSException raise:NSInternalInconsistencyException format:@\"parseState is NULL.\"];          }\n  if(string     == NULL) { [NSException raise:NSInvalidArgumentException       format:@\"The string argument is NULL.\"]; }\n\n  return(_JKParseUTF8String(parseState, YES, string, (size_t)length, error));\n}\n\n- (id)mutableObjectWithData:(NSData *)jsonData\n{\n  return([self mutableObjectWithData:jsonData error:NULL]);\n}\n\n- (id)mutableObjectWithData:(NSData *)jsonData error:(NSError **)error\n{\n  if(jsonData == NULL) { [NSException raise:NSInvalidArgumentException format:@\"The jsonData argument is NULL.\"]; }\n  return([self mutableObjectWithUTF8String:(const unsigned char *)[jsonData bytes] length:[jsonData length] error:error]);\n}\n\n@end\n\n/*\n The NSString and NSData convenience methods need a little bit of explanation.\n\n Prior to JSONKit v1.4, the NSString -objectFromJSONStringWithParseOptions:error: method looked like\n\n const unsigned char *utf8String = (const unsigned char *)[self UTF8String];\n if(utf8String == NULL) { return(NULL); }\n size_t               utf8Length = strlen((const char *)utf8String);\n return([[JSONDecoder decoderWithParseOptions:parseOptionFlags] parseUTF8String:utf8String length:utf8Length error:error]);\n\n This changed with v1.4 to a more complicated method.  The reason for this is to keep the amount of memory that is\n allocated, but not yet freed because it is dependent on the autorelease pool to pop before it can be reclaimed.\n\n In the simpler v1.3 code, this included all the bytes used to store the -UTF8String along with the JSONDecoder and all its overhead.\n\n Now we use an autoreleased CFMutableData that is sized to the UTF8 length of the NSString in question and is used to hold the UTF8\n conversion of said string.\n\n Once parsed, the CFMutableData has its length set to 0.  This should, hopefully, allow the CFMutableData to realloc and/or free\n the buffer.\n\n Another change made was a slight modification to JSONDecoder so that most of the cleanup work that was done in -dealloc was moved\n to a private, internal function.  These convenience routines keep the pointer to the autoreleased JSONDecoder and calls\n _JSONDecoderCleanup() to early release the decoders resources since we already know that particular decoder is not going to be used\n again.\n\n If everything goes smoothly, this will most likely result in perhaps a few hundred bytes that are allocated but waiting for the\n autorelease pool to pop.  This is compared to the thousands and easily hundreds of thousands of bytes that would have been in\n autorelease limbo.  It's more complicated for us, but a win for the user.\n\n Autorelease objects are used in case things don't go smoothly.  By having them autoreleased, we effectively guarantee that our\n requirement to -release the object is always met, not matter what goes wrong.  The downside is having a an object or two in\n autorelease limbo, but we've done our best to minimize that impact, so it all balances out.\n */\n\n@implementation NSString (JSONKitDeserializing)\n\nstatic id _NSStringObjectFromJSONString(NSString *jsonString, JKParseOptionFlags parseOptionFlags, NSError **error, BOOL mutableCollection) {\n  id                returnObject = NULL;\n  CFMutableDataRef  mutableData  = NULL;\n  JSONDecoder      *decoder      = NULL;\n\n  CFIndex    stringLength     = CFStringGetLength((CFStringRef)jsonString);\n  NSUInteger stringUTF8Length = [jsonString lengthOfBytesUsingEncoding:NSUTF8StringEncoding];\n\n  if((mutableData = (CFMutableDataRef)[(id)CFDataCreateMutable(NULL, (NSUInteger)stringUTF8Length) autorelease]) != NULL) {\n    UInt8   *utf8String = CFDataGetMutableBytePtr(mutableData);\n    CFIndex  usedBytes  = 0L, convertedCount = 0L;\n\n    convertedCount = CFStringGetBytes((CFStringRef)jsonString, CFRangeMake(0L, stringLength), kCFStringEncodingUTF8, '?', NO, utf8String, (NSUInteger)stringUTF8Length, &usedBytes);\n    if(JK_EXPECT_F(convertedCount != stringLength) || JK_EXPECT_F(usedBytes < 0L)) { if(error != NULL) { *error = [NSError errorWithDomain:@\"JKErrorDomain\" code:-1L userInfo:[NSDictionary dictionaryWithObject:@\"An error occurred converting the contents of a NSString to UTF8.\" forKey:NSLocalizedDescriptionKey]]; } goto exitNow; }\n\n    if(mutableCollection == NO) { returnObject = [(decoder = [JSONDecoder decoderWithParseOptions:parseOptionFlags])        objectWithUTF8String:(const unsigned char *)utf8String length:(size_t)usedBytes error:error]; }\n    else                        { returnObject = [(decoder = [JSONDecoder decoderWithParseOptions:parseOptionFlags]) mutableObjectWithUTF8String:(const unsigned char *)utf8String length:(size_t)usedBytes error:error]; }\n  }\n\nexitNow:\n  if(mutableData != NULL) { CFDataSetLength(mutableData, 0L); }\n  if(decoder     != NULL) { _JSONDecoderCleanup(decoder);     }\n  return(returnObject);\n}\n\n- (id)objectFromJSONString\n{\n  return([self objectFromJSONStringWithParseOptions:JKParseOptionStrict error:NULL]);\n}\n\n- (id)objectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags\n{\n  return([self objectFromJSONStringWithParseOptions:parseOptionFlags error:NULL]);\n}\n\n- (id)objectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error\n{\n  return(_NSStringObjectFromJSONString(self, parseOptionFlags, error, NO));\n}\n\n\n- (id)mutableObjectFromJSONString\n{\n  return([self mutableObjectFromJSONStringWithParseOptions:JKParseOptionStrict error:NULL]);\n}\n\n- (id)mutableObjectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags\n{\n  return([self mutableObjectFromJSONStringWithParseOptions:parseOptionFlags error:NULL]);\n}\n\n- (id)mutableObjectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error\n{\n  return(_NSStringObjectFromJSONString(self, parseOptionFlags, error, YES));\n}\n\n@end\n\n@implementation NSData (JSONKitDeserializing)\n\n- (id)objectFromJSONData\n{\n  return([self objectFromJSONDataWithParseOptions:JKParseOptionStrict error:NULL]);\n}\n\n- (id)objectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags\n{\n  return([self objectFromJSONDataWithParseOptions:parseOptionFlags error:NULL]);\n}\n\n- (id)objectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error\n{\n  JSONDecoder *decoder = NULL;\n  id returnObject = [(decoder = [JSONDecoder decoderWithParseOptions:parseOptionFlags]) objectWithData:self error:error];\n  if(decoder != NULL) { _JSONDecoderCleanup(decoder); }\n  return(returnObject);\n}\n\n- (id)mutableObjectFromJSONData\n{\n  return([self mutableObjectFromJSONDataWithParseOptions:JKParseOptionStrict error:NULL]);\n}\n\n- (id)mutableObjectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags\n{\n  return([self mutableObjectFromJSONDataWithParseOptions:parseOptionFlags error:NULL]);\n}\n\n- (id)mutableObjectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error\n{\n  JSONDecoder *decoder = NULL;\n  id returnObject = [(decoder = [JSONDecoder decoderWithParseOptions:parseOptionFlags]) mutableObjectWithData:self error:error];\n  if(decoder != NULL) { _JSONDecoderCleanup(decoder); }\n  return(returnObject);\n}\n\n\n@end\n\n////////////\n#pragma mark -\n#pragma mark Encoding / deserializing functions\n\nstatic void jk_encode_error(JKEncodeState *encodeState, NSString *format, ...) {\n  NSCParameterAssert((encodeState != NULL) && (format != NULL));\n\n  va_list varArgsList;\n  va_start(varArgsList, format);\n  NSString *formatString = [[[NSString alloc] initWithFormat:format arguments:varArgsList] autorelease];\n  va_end(varArgsList);\n\n  if(encodeState->error == NULL) {\n    encodeState->error = [NSError errorWithDomain:@\"JKErrorDomain\" code:-1L userInfo:\n                                   [NSDictionary dictionaryWithObjectsAndKeys:\n                                                                              formatString, NSLocalizedDescriptionKey,\n                                                                              NULL]];\n  }\n}\n\nJK_STATIC_INLINE void jk_encode_updateCache(JKEncodeState *encodeState, JKEncodeCache *cacheSlot, size_t startingAtIndex, id object) {\n  NSCParameterAssert(encodeState != NULL);\n  if(JK_EXPECT_T(cacheSlot != NULL)) {\n    NSCParameterAssert((object != NULL) && (startingAtIndex <= encodeState->atIndex));\n    cacheSlot->object = object;\n    cacheSlot->offset = startingAtIndex;\n    cacheSlot->length = (size_t)(encodeState->atIndex - startingAtIndex);\n  }\n}\n\nstatic int jk_encode_printf(JKEncodeState *encodeState, JKEncodeCache *cacheSlot, size_t startingAtIndex, id object, const char *format, ...) {\n  va_list varArgsList, varArgsListCopy;\n  va_start(varArgsList, format);\n  va_copy(varArgsListCopy, varArgsList);\n\n  NSCParameterAssert((encodeState != NULL) && (encodeState->atIndex < encodeState->stringBuffer.bytes.length) && (startingAtIndex <= encodeState->atIndex) && (format != NULL));\n\n  ssize_t  formattedStringLength = 0L;\n  int      returnValue           = 0;\n\n  if(JK_EXPECT_T((formattedStringLength = vsnprintf((char *)&encodeState->stringBuffer.bytes.ptr[encodeState->atIndex], (encodeState->stringBuffer.bytes.length - encodeState->atIndex), format, varArgsList)) >= (ssize_t)(encodeState->stringBuffer.bytes.length - encodeState->atIndex))) {\n    NSCParameterAssert(((encodeState->atIndex + (formattedStringLength * 2UL) + 256UL) > encodeState->stringBuffer.bytes.length));\n    if(JK_EXPECT_F(((encodeState->atIndex + (formattedStringLength * 2UL) + 256UL) > encodeState->stringBuffer.bytes.length)) && JK_EXPECT_F((jk_managedBuffer_resize(&encodeState->stringBuffer, encodeState->atIndex + (formattedStringLength * 2UL)+ 4096UL) == NULL))) { jk_encode_error(encodeState, @\"Unable to resize temporary buffer.\"); returnValue = 1; goto exitNow; }\n    if(JK_EXPECT_F((formattedStringLength = vsnprintf((char *)&encodeState->stringBuffer.bytes.ptr[encodeState->atIndex], (encodeState->stringBuffer.bytes.length - encodeState->atIndex), format, varArgsListCopy)) >= (ssize_t)(encodeState->stringBuffer.bytes.length - encodeState->atIndex))) { jk_encode_error(encodeState, @\"vsnprintf failed unexpectedly.\"); returnValue = 1; goto exitNow; }\n  }\n\nexitNow:\n  va_end(varArgsList);\n  va_end(varArgsListCopy);\n  if(JK_EXPECT_T(returnValue == 0)) { encodeState->atIndex += formattedStringLength; jk_encode_updateCache(encodeState, cacheSlot, startingAtIndex, object); }\n  return(returnValue);\n}\n\nstatic int jk_encode_write(JKEncodeState *encodeState, JKEncodeCache *cacheSlot, size_t startingAtIndex, id object, const char *format) {\n  NSCParameterAssert((encodeState != NULL) && (encodeState->atIndex < encodeState->stringBuffer.bytes.length) && (startingAtIndex <= encodeState->atIndex) && (format != NULL));\n  if(JK_EXPECT_F(((encodeState->atIndex + strlen(format) + 256UL) > encodeState->stringBuffer.bytes.length)) && JK_EXPECT_F((jk_managedBuffer_resize(&encodeState->stringBuffer, encodeState->atIndex + strlen(format) + 1024UL) == NULL))) { jk_encode_error(encodeState, @\"Unable to resize temporary buffer.\"); return(1); }\n\n  size_t formatIdx = 0UL;\n  for(formatIdx = 0UL; format[formatIdx] != 0; formatIdx++) { NSCParameterAssert(encodeState->atIndex < encodeState->stringBuffer.bytes.length); encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = format[formatIdx]; }\n  jk_encode_updateCache(encodeState, cacheSlot, startingAtIndex, object);\n  return(0);\n}\n\nstatic int jk_encode_writePrettyPrintWhiteSpace(JKEncodeState *encodeState) {\n  NSCParameterAssert((encodeState != NULL) && ((encodeState->serializeOptionFlags & JKSerializeOptionPretty) != 0UL));\n  if(JK_EXPECT_F((encodeState->atIndex + ((encodeState->depth + 1UL) * 2UL) + 16UL) > encodeState->stringBuffer.bytes.length) && JK_EXPECT_T(jk_managedBuffer_resize(&encodeState->stringBuffer, encodeState->atIndex + ((encodeState->depth + 1UL) * 2UL) + 4096UL) == NULL)) { jk_encode_error(encodeState, @\"Unable to resize temporary buffer.\"); return(1); }\n  encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\n';\n  size_t depthWhiteSpace = 0UL;\n  for(depthWhiteSpace = 0UL; depthWhiteSpace < (encodeState->depth * 2UL); depthWhiteSpace++) { NSCParameterAssert(encodeState->atIndex < encodeState->stringBuffer.bytes.length); encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = ' '; }\n  return(0);\n}\n\nstatic int jk_encode_write1slow(JKEncodeState *encodeState, ssize_t depthChange, const char *format) {\n  NSCParameterAssert((encodeState != NULL) && (encodeState->atIndex < encodeState->stringBuffer.bytes.length) && (format != NULL) && ((depthChange >= -1L) && (depthChange <= 1L)) && ((encodeState->depth == 0UL) ? (depthChange >= 0L) : 1) && ((encodeState->serializeOptionFlags & JKSerializeOptionPretty) != 0UL));\n  if(JK_EXPECT_F((encodeState->atIndex + ((encodeState->depth + 1UL) * 2UL) + 16UL) > encodeState->stringBuffer.bytes.length) && JK_EXPECT_F(jk_managedBuffer_resize(&encodeState->stringBuffer, encodeState->atIndex + ((encodeState->depth + 1UL) * 2UL) + 4096UL) == NULL)) { jk_encode_error(encodeState, @\"Unable to resize temporary buffer.\"); return(1); }\n  encodeState->depth += depthChange;\n  if(JK_EXPECT_T(format[0] == ':')) { encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = format[0]; encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = ' '; }\n  else {\n    if(JK_EXPECT_F(depthChange == -1L)) { if(JK_EXPECT_F(jk_encode_writePrettyPrintWhiteSpace(encodeState))) { return(1); } }\n    encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = format[0];\n    if(JK_EXPECT_T(depthChange != -1L)) { if(JK_EXPECT_F(jk_encode_writePrettyPrintWhiteSpace(encodeState))) { return(1); } }\n  }\n  NSCParameterAssert(encodeState->atIndex < encodeState->stringBuffer.bytes.length);\n  return(0);\n}\n\nstatic int jk_encode_write1fast(JKEncodeState *encodeState, ssize_t depthChange JK_UNUSED_ARG, const char *format) {\n  NSCParameterAssert((encodeState != NULL) && (encodeState->atIndex < encodeState->stringBuffer.bytes.length) && ((encodeState->serializeOptionFlags & JKSerializeOptionPretty) == 0UL));\n  if(JK_EXPECT_T((encodeState->atIndex + 4UL) < encodeState->stringBuffer.bytes.length)) { encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = format[0]; }\n  else { return(jk_encode_write(encodeState, NULL, 0UL, NULL, format)); }\n  return(0);\n}\n\nstatic int jk_encode_writen(JKEncodeState *encodeState, JKEncodeCache *cacheSlot, size_t startingAtIndex, id object, const char *format, size_t length) {\n  NSCParameterAssert((encodeState != NULL) && (encodeState->atIndex < encodeState->stringBuffer.bytes.length) && (startingAtIndex <= encodeState->atIndex));\n  if(JK_EXPECT_F((encodeState->stringBuffer.bytes.length - encodeState->atIndex) < (length + 4UL))) { if(jk_managedBuffer_resize(&encodeState->stringBuffer, encodeState->atIndex + 4096UL + length) == NULL) { jk_encode_error(encodeState, @\"Unable to resize temporary buffer.\"); return(1); } }\n  memcpy(encodeState->stringBuffer.bytes.ptr + encodeState->atIndex, format, length);\n  encodeState->atIndex += length;\n  jk_encode_updateCache(encodeState, cacheSlot, startingAtIndex, object);\n  return(0);\n}\n\nJK_STATIC_INLINE JKHash jk_encode_object_hash(void *objectPtr) {\n  return( ( (((JKHash)objectPtr) >> 21) ^ (((JKHash)objectPtr) >> 9)   ) + (((JKHash)objectPtr) >> 4) );\n}\n\nstatic int jk_encode_add_atom_to_buffer(JKEncodeState *encodeState, void *objectPtr) {\n  NSCParameterAssert((encodeState != NULL) && (encodeState->atIndex < encodeState->stringBuffer.bytes.length) && (objectPtr != NULL));\n\n  id     object          = (id)objectPtr, encodeCacheObject = object;\n  int    isClass         = JKClassUnknown;\n  size_t startingAtIndex = encodeState->atIndex;\n\n  JKHash         objectHash = jk_encode_object_hash(objectPtr);\n  JKEncodeCache *cacheSlot  = &encodeState->cache[objectHash % JK_ENCODE_CACHE_SLOTS];\n\n  if(JK_EXPECT_T(cacheSlot->object == object)) {\n    NSCParameterAssert((cacheSlot->object != NULL) &&\n                       (cacheSlot->offset < encodeState->atIndex)                   && ((cacheSlot->offset + cacheSlot->length) < encodeState->atIndex)                                    &&\n                       (cacheSlot->offset < encodeState->stringBuffer.bytes.length) && ((cacheSlot->offset + cacheSlot->length) < encodeState->stringBuffer.bytes.length)                  &&\n                       ((encodeState->stringBuffer.bytes.ptr + encodeState->atIndex)                     < (encodeState->stringBuffer.bytes.ptr + encodeState->stringBuffer.bytes.length)) &&\n                       ((encodeState->stringBuffer.bytes.ptr + cacheSlot->offset)                        < (encodeState->stringBuffer.bytes.ptr + encodeState->stringBuffer.bytes.length)) &&\n                       ((encodeState->stringBuffer.bytes.ptr + cacheSlot->offset + cacheSlot->length)    < (encodeState->stringBuffer.bytes.ptr + encodeState->stringBuffer.bytes.length)));\n    if(JK_EXPECT_F(((encodeState->atIndex + cacheSlot->length + 256UL) > encodeState->stringBuffer.bytes.length)) && JK_EXPECT_F((jk_managedBuffer_resize(&encodeState->stringBuffer, encodeState->atIndex + cacheSlot->length + 1024UL) == NULL))) { jk_encode_error(encodeState, @\"Unable to resize temporary buffer.\"); return(1); }\n    NSCParameterAssert(((encodeState->atIndex + cacheSlot->length) < encodeState->stringBuffer.bytes.length) &&\n                       ((encodeState->stringBuffer.bytes.ptr + encodeState->atIndex)                     < (encodeState->stringBuffer.bytes.ptr + encodeState->stringBuffer.bytes.length)) &&\n                       ((encodeState->stringBuffer.bytes.ptr + encodeState->atIndex + cacheSlot->length) < (encodeState->stringBuffer.bytes.ptr + encodeState->stringBuffer.bytes.length)) &&\n                       ((encodeState->stringBuffer.bytes.ptr + cacheSlot->offset)                        < (encodeState->stringBuffer.bytes.ptr + encodeState->stringBuffer.bytes.length)) &&\n                       ((encodeState->stringBuffer.bytes.ptr + cacheSlot->offset + cacheSlot->length)    < (encodeState->stringBuffer.bytes.ptr + encodeState->stringBuffer.bytes.length)) &&\n                       ((encodeState->stringBuffer.bytes.ptr + cacheSlot->offset + cacheSlot->length)    < (encodeState->stringBuffer.bytes.ptr + encodeState->atIndex)));\n    memcpy(encodeState->stringBuffer.bytes.ptr + encodeState->atIndex, encodeState->stringBuffer.bytes.ptr + cacheSlot->offset, cacheSlot->length);\n    encodeState->atIndex += cacheSlot->length;\n    return(0);\n  }\n\n  // When we encounter a class that we do not handle, and we have either a delegate or block that the user supplied to format unsupported classes,\n  // we \"re-run\" the object check.  However, we re-run the object check exactly ONCE.  If the user supplies an object that isn't one of the\n  // supported classes, we fail the second time (i.e., double fault error).\n  BOOL rerunningAfterClassFormatter = NO;\n rerunAfterClassFormatter:;\n\n  // XXX XXX XXX XXX\n  //\n  //     We need to work around a bug in 10.7, which breaks ABI compatibility with Objective-C going back not just to 10.0, but OpenStep and even NextStep.\n  //\n  //     It has long been documented that \"the very first thing that a pointer to an Objective-C object \"points to\" is a pointer to that objects class\".\n  //\n  //     This is euphemistically called \"tagged pointers\".  There are a number of highly technical problems with this, most involving long passages from\n  //     the C standard(s).  In short, one can make a strong case, couched from the perspective of the C standard(s), that that 10.7 \"tagged pointers\" are\n  //     fundamentally Wrong and Broken, and should have never been implemented.  Assuming those points are glossed over, because the change is very clearly\n  //     breaking ABI compatibility, this should have resulted in a minimum of a \"minimum version required\" bump in various shared libraries to prevent\n  //     causes code that used to work just fine to suddenly break without warning.\n  //\n  //     In fact, the C standard says that the hack below is \"undefined behavior\"- there is no requirement that the 10.7 tagged pointer hack of setting the\n  //     \"lower, unused bits\" must be preserved when casting the result to an integer type, but this \"works\" because for most architectures\n  //     `sizeof(long) == sizeof(void *)` and the compiler uses the same representation for both.  (note: this is informal, not meant to be\n  //     normative or pedantically correct).\n  //\n  //     In other words, while this \"works\" for now, technically the compiler is not obligated to do \"what we want\", and a later version of the compiler\n  //     is not required in any way to produce the same results or behavior that earlier versions of the compiler did for the statement below.\n  //\n  //     Fan-fucking-tastic.\n  //\n  //     Why not just use `object_getClass()`?  Because `object->isa` reduces to (typically) a *single* instruction.  Calling `object_getClass()` requires\n  //     that the compiler potentially spill registers, establish a function call frame / environment, and finally execute a \"jump subroutine\" instruction.\n  //     Then, the called subroutine must spend half a dozen instructions in its prolog, however many instructions doing whatever it does, then half a dozen\n  //     instructions in its prolog.  One instruction compared to dozens, maybe a hundred instructions.\n  //\n  //     Yes, that's one to two orders of magnitude difference.  Which is compelling in its own right.  When going for performance, you're often happy with\n  //     gains in the two to three percent range.\n  //\n  // XXX XXX XXX XXX\n\n  BOOL workAroundMacOSXABIBreakingBug = NO;\n  if(JK_EXPECT_F(((NSUInteger)object) & 0x1)) { workAroundMacOSXABIBreakingBug = YES; goto slowClassLookup; }\n\n       if(JK_EXPECT_T(object_getClass(object) == encodeState->fastClassLookup.stringClass))     { isClass = JKClassString;     }\n  else if(JK_EXPECT_T(object_getClass(object) == encodeState->fastClassLookup.numberClass))     { isClass = JKClassNumber;     }\n  else if(JK_EXPECT_T(object_getClass(object) == encodeState->fastClassLookup.dictionaryClass)) { isClass = JKClassDictionary; }\n  else if(JK_EXPECT_T(object_getClass(object) == encodeState->fastClassLookup.arrayClass))      { isClass = JKClassArray;      }\n  else if(JK_EXPECT_T(object_getClass(object) == encodeState->fastClassLookup.nullClass))       { isClass = JKClassNull;       }\n  else {\n  slowClassLookup:\n         if(JK_EXPECT_T([object isKindOfClass:[NSString     class]])) { if(workAroundMacOSXABIBreakingBug == NO) { encodeState->fastClassLookup.stringClass     = object_getClass(object); } isClass = JKClassString;     }\n    else if(JK_EXPECT_T([object isKindOfClass:[NSNumber     class]])) { if(workAroundMacOSXABIBreakingBug == NO) { encodeState->fastClassLookup.numberClass     = object_getClass(object); } isClass = JKClassNumber;     }\n    else if(JK_EXPECT_T([object isKindOfClass:[NSDictionary class]])) { if(workAroundMacOSXABIBreakingBug == NO) { encodeState->fastClassLookup.dictionaryClass = object_getClass(object); } isClass = JKClassDictionary; }\n    else if(JK_EXPECT_T([object isKindOfClass:[NSArray      class]])) { if(workAroundMacOSXABIBreakingBug == NO) { encodeState->fastClassLookup.arrayClass      = object_getClass(object); } isClass = JKClassArray;      }\n    else if(JK_EXPECT_T([object isKindOfClass:[NSNull       class]])) { if(workAroundMacOSXABIBreakingBug == NO) { encodeState->fastClassLookup.nullClass       = object_getClass(object); } isClass = JKClassNull;       }\n    else {\n      if((rerunningAfterClassFormatter == NO) && (\n#ifdef __BLOCKS__\n           ((encodeState->classFormatterBlock) && ((object = encodeState->classFormatterBlock(object))                                                                         != NULL)) ||\n#endif\n           ((encodeState->classFormatterIMP)   && ((object = encodeState->classFormatterIMP(encodeState->classFormatterDelegate, encodeState->classFormatterSelector, object)) != NULL))    )) { rerunningAfterClassFormatter = YES; goto rerunAfterClassFormatter; }\n\n      if(rerunningAfterClassFormatter == NO) { jk_encode_error(encodeState, @\"Unable to serialize object class %@.\", NSStringFromClass([encodeCacheObject class])); return(1); }\n      else { jk_encode_error(encodeState, @\"Unable to serialize object class %@ that was returned by the unsupported class formatter.  Original object class was %@.\", (object == NULL) ? @\"NULL\" : NSStringFromClass([object class]), NSStringFromClass([encodeCacheObject class])); return(1); }\n    }\n  }\n\n  // This is here for the benefit of the optimizer.  It allows the optimizer to do loop invariant code motion for the JKClassArray\n  // and JKClassDictionary cases when printing simple, single characters via jk_encode_write(), which is actually a macro:\n  // #define jk_encode_write1(es, dc, f) (_jk_encode_prettyPrint ? jk_encode_write1slow(es, dc, f) : jk_encode_write1fast(es, dc, f))\n  int _jk_encode_prettyPrint = JK_EXPECT_T((encodeState->serializeOptionFlags & JKSerializeOptionPretty) == 0) ? 0 : 1;\n\n  switch(isClass) {\n    case JKClassString:\n      {\n        {\n          const unsigned char *cStringPtr = (const unsigned char *)CFStringGetCStringPtr((CFStringRef)object, kCFStringEncodingMacRoman);\n          if(cStringPtr != NULL) {\n            const unsigned char *utf8String = cStringPtr;\n            size_t               utf8Idx    = 0UL;\n\n            CFIndex stringLength = CFStringGetLength((CFStringRef)object);\n            if(JK_EXPECT_F(((encodeState->atIndex + (stringLength * 2UL) + 256UL) > encodeState->stringBuffer.bytes.length)) && JK_EXPECT_F((jk_managedBuffer_resize(&encodeState->stringBuffer, encodeState->atIndex + (stringLength * 2UL) + 1024UL) == NULL))) { jk_encode_error(encodeState, @\"Unable to resize temporary buffer.\"); return(1); }\n\n            if(JK_EXPECT_T((encodeState->encodeOption & JKEncodeOptionStringObjTrimQuotes) == 0UL)) { encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\"'; }\n            for(utf8Idx = 0UL; utf8String[utf8Idx] != 0U; utf8Idx++) {\n              NSCParameterAssert(((&encodeState->stringBuffer.bytes.ptr[encodeState->atIndex]) - encodeState->stringBuffer.bytes.ptr) < (ssize_t)encodeState->stringBuffer.bytes.length);\n              NSCParameterAssert(encodeState->atIndex < encodeState->stringBuffer.bytes.length);\n              if(JK_EXPECT_F(utf8String[utf8Idx] >= 0x80U)) { encodeState->atIndex = startingAtIndex; goto slowUTF8Path; }\n              if(JK_EXPECT_F(utf8String[utf8Idx] <  0x20U)) {\n                switch(utf8String[utf8Idx]) {\n                  case '\\b': encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = 'b'; break;\n                  case '\\f': encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = 'f'; break;\n                  case '\\n': encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = 'n'; break;\n                  case '\\r': encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = 'r'; break;\n                  case '\\t': encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = 't'; break;\n                  default: if(JK_EXPECT_F(jk_encode_printf(encodeState, NULL, 0UL, NULL, \"\\\\u%4.4x\", utf8String[utf8Idx]))) { return(1); } break;\n                }\n              } else {\n                if(JK_EXPECT_F(utf8String[utf8Idx] == '\\\"') || JK_EXPECT_F(utf8String[utf8Idx] == '\\\\') || (JK_EXPECT_F(encodeState->serializeOptionFlags & JKSerializeOptionEscapeForwardSlashes) && JK_EXPECT_F(utf8String[utf8Idx] == '/'))) { encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; }\n                encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = utf8String[utf8Idx];\n              }\n            }\n            NSCParameterAssert((encodeState->atIndex + 1UL) < encodeState->stringBuffer.bytes.length);\n            if(JK_EXPECT_T((encodeState->encodeOption & JKEncodeOptionStringObjTrimQuotes) == 0UL)) { encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\"'; }\n            jk_encode_updateCache(encodeState, cacheSlot, startingAtIndex, encodeCacheObject);\n            return(0);\n          }\n        }\n\n      slowUTF8Path:\n        {\n          CFIndex stringLength        = CFStringGetLength((CFStringRef)object);\n          CFIndex maxStringUTF8Length = CFStringGetMaximumSizeForEncoding(stringLength, kCFStringEncodingUTF8) + 32L;\n\n          if(JK_EXPECT_F((size_t)maxStringUTF8Length > encodeState->utf8ConversionBuffer.bytes.length) && JK_EXPECT_F(jk_managedBuffer_resize(&encodeState->utf8ConversionBuffer, maxStringUTF8Length + 1024UL) == NULL)) { jk_encode_error(encodeState, @\"Unable to resize temporary buffer.\"); return(1); }\n\n          CFIndex usedBytes = 0L, convertedCount = 0L;\n          convertedCount = CFStringGetBytes((CFStringRef)object, CFRangeMake(0L, stringLength), kCFStringEncodingUTF8, '?', NO, encodeState->utf8ConversionBuffer.bytes.ptr, encodeState->utf8ConversionBuffer.bytes.length - 16L, &usedBytes);\n          if(JK_EXPECT_F(convertedCount != stringLength) || JK_EXPECT_F(usedBytes < 0L)) { jk_encode_error(encodeState, @\"An error occurred converting the contents of a NSString to UTF8.\"); return(1); }\n\n          if(JK_EXPECT_F((encodeState->atIndex + (maxStringUTF8Length * 2UL) + 256UL) > encodeState->stringBuffer.bytes.length) && JK_EXPECT_F(jk_managedBuffer_resize(&encodeState->stringBuffer, encodeState->atIndex + (maxStringUTF8Length * 2UL) + 1024UL) == NULL)) { jk_encode_error(encodeState, @\"Unable to resize temporary buffer.\"); return(1); }\n\n          const unsigned char *utf8String = encodeState->utf8ConversionBuffer.bytes.ptr;\n\n          size_t utf8Idx = 0UL;\n          if(JK_EXPECT_T((encodeState->encodeOption & JKEncodeOptionStringObjTrimQuotes) == 0UL)) { encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\"'; }\n          for(utf8Idx = 0UL; utf8Idx < (size_t)usedBytes; utf8Idx++) {\n            NSCParameterAssert(((&encodeState->stringBuffer.bytes.ptr[encodeState->atIndex]) - encodeState->stringBuffer.bytes.ptr) < (ssize_t)encodeState->stringBuffer.bytes.length);\n            NSCParameterAssert(encodeState->atIndex < encodeState->stringBuffer.bytes.length);\n            NSCParameterAssert((CFIndex)utf8Idx < usedBytes);\n            if(JK_EXPECT_F(utf8String[utf8Idx] < 0x20U)) {\n              switch(utf8String[utf8Idx]) {\n                case '\\b': encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = 'b'; break;\n                case '\\f': encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = 'f'; break;\n                case '\\n': encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = 'n'; break;\n                case '\\r': encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = 'r'; break;\n                case '\\t': encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = 't'; break;\n                default: if(JK_EXPECT_F(jk_encode_printf(encodeState, NULL, 0UL, NULL, \"\\\\u%4.4x\", utf8String[utf8Idx]))) { return(1); } break;\n              }\n            } else {\n              if(JK_EXPECT_F(utf8String[utf8Idx] >= 0x80U) && (encodeState->serializeOptionFlags & JKSerializeOptionEscapeUnicode)) {\n                const unsigned char *nextValidCharacter = NULL;\n                UTF32                u32ch              = 0U;\n                ConversionResult     result;\n\n                if(JK_EXPECT_F((result = ConvertSingleCodePointInUTF8(&utf8String[utf8Idx], &utf8String[usedBytes], (UTF8 const **)&nextValidCharacter, &u32ch)) != conversionOK)) { jk_encode_error(encodeState, @\"Error converting UTF8.\"); return(1); }\n                else {\n                  utf8Idx = (nextValidCharacter - utf8String) - 1UL;\n                  if(JK_EXPECT_T(u32ch <= 0xffffU)) { if(JK_EXPECT_F(jk_encode_printf(encodeState, NULL, 0UL, NULL, \"\\\\u%4.4x\", u32ch)))                                                           { return(1); } }\n                  else                              { if(JK_EXPECT_F(jk_encode_printf(encodeState, NULL, 0UL, NULL, \"\\\\u%4.4x\\\\u%4.4x\", (0xd7c0U + (u32ch >> 10)), (0xdc00U + (u32ch & 0x3ffU))))) { return(1); } }\n                }\n              } else {\n                if(JK_EXPECT_F(utf8String[utf8Idx] == '\\\"') || JK_EXPECT_F(utf8String[utf8Idx] == '\\\\') || (JK_EXPECT_F(encodeState->serializeOptionFlags & JKSerializeOptionEscapeForwardSlashes) && JK_EXPECT_F(utf8String[utf8Idx] == '/'))) { encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\\'; }\n                encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = utf8String[utf8Idx];\n              }\n            }\n          }\n          NSCParameterAssert((encodeState->atIndex + 1UL) < encodeState->stringBuffer.bytes.length);\n          if(JK_EXPECT_T((encodeState->encodeOption & JKEncodeOptionStringObjTrimQuotes) == 0UL)) { encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\\"'; }\n          jk_encode_updateCache(encodeState, cacheSlot, startingAtIndex, encodeCacheObject);\n          return(0);\n        }\n      }\n      break;\n\n    case JKClassNumber:\n      {\n             if(object == (id)kCFBooleanTrue)  { return(jk_encode_writen(encodeState, cacheSlot, startingAtIndex, encodeCacheObject, \"true\",  4UL)); }\n        else if(object == (id)kCFBooleanFalse) { return(jk_encode_writen(encodeState, cacheSlot, startingAtIndex, encodeCacheObject, \"false\", 5UL)); }\n\n        const char         *objCType = [object objCType];\n        char                anum[256], *aptr = &anum[255];\n        int                 isNegative = 0;\n        unsigned long long  ullv;\n        long long           llv;\n\n        if(JK_EXPECT_F(objCType == NULL) || JK_EXPECT_F(objCType[0] == 0) || JK_EXPECT_F(objCType[1] != 0)) { jk_encode_error(encodeState, @\"NSNumber conversion error, unknown type.  Type: '%s'\", (objCType == NULL) ? \"<NULL>\" : objCType); return(1); }\n\n        switch(objCType[0]) {\n          case 'c': case 'i': case 's': case 'l': case 'q':\n            if(JK_EXPECT_T(CFNumberGetValue((CFNumberRef)object, kCFNumberLongLongType, &llv)))  {\n              if(llv < 0LL)  { ullv = -llv; isNegative = 1; } else { ullv = llv; isNegative = 0; }\n              goto convertNumber;\n            } else { jk_encode_error(encodeState, @\"Unable to get scalar value from number object.\"); return(1); }\n            break;\n          case 'C': case 'I': case 'S': case 'L': case 'Q': case 'B':\n            if(JK_EXPECT_T(CFNumberGetValue((CFNumberRef)object, kCFNumberLongLongType, &ullv))) {\n            convertNumber:\n              if(JK_EXPECT_F(ullv < 10ULL)) { *--aptr = ullv + '0'; } else { while(JK_EXPECT_T(ullv > 0ULL)) { *--aptr = (ullv % 10ULL) + '0'; ullv /= 10ULL; NSCParameterAssert(aptr > anum); } }\n              if(isNegative) { *--aptr = '-'; }\n              NSCParameterAssert(aptr > anum);\n              return(jk_encode_writen(encodeState, cacheSlot, startingAtIndex, encodeCacheObject, aptr, &anum[255] - aptr));\n            } else { jk_encode_error(encodeState, @\"Unable to get scalar value from number object.\"); return(1); }\n            break;\n          case 'f': case 'd':\n            {\n              double dv;\n              if(JK_EXPECT_T(CFNumberGetValue((CFNumberRef)object, kCFNumberDoubleType, &dv))) {\n                if(JK_EXPECT_F(!isfinite(dv))) { jk_encode_error(encodeState, @\"Floating point values must be finite.  JSON does not support NaN or Infinity.\"); return(1); }\n                return(jk_encode_printf(encodeState, cacheSlot, startingAtIndex, encodeCacheObject, \"%.17g\", dv));\n              } else { jk_encode_error(encodeState, @\"Unable to get floating point value from number object.\"); return(1); }\n            }\n            break;\n          default: jk_encode_error(encodeState, @\"NSNumber conversion error, unknown type.  Type: '%c' / 0x%2.2x\", objCType[0], objCType[0]); return(1); break;\n        }\n      }\n      break;\n\n    case JKClassArray:\n      {\n        int     printComma = 0;\n        CFIndex arrayCount = CFArrayGetCount((CFArrayRef)object), idx = 0L;\n        if(JK_EXPECT_F(jk_encode_write1(encodeState, 1L, \"[\"))) { return(1); }\n        if(JK_EXPECT_F(arrayCount > 1020L)) {\n          for(id arrayObject in object)          { if(JK_EXPECT_T(printComma)) { if(JK_EXPECT_F(jk_encode_write1(encodeState, 0L, \",\"))) { return(1); } } printComma = 1; if(JK_EXPECT_F(jk_encode_add_atom_to_buffer(encodeState, arrayObject)))  { return(1); } }\n        } else {\n          void *objects[1024];\n          CFArrayGetValues((CFArrayRef)object, CFRangeMake(0L, arrayCount), (const void **)objects);\n          for(idx = 0L; idx < arrayCount; idx++) { if(JK_EXPECT_T(printComma)) { if(JK_EXPECT_F(jk_encode_write1(encodeState, 0L, \",\"))) { return(1); } } printComma = 1; if(JK_EXPECT_F(jk_encode_add_atom_to_buffer(encodeState, objects[idx]))) { return(1); } }\n        }\n        return(jk_encode_write1(encodeState, -1L, \"]\"));\n      }\n      break;\n\n    case JKClassDictionary:\n      {\n        int     printComma      = 0;\n        CFIndex dictionaryCount = CFDictionaryGetCount((CFDictionaryRef)object), idx = 0L;\n        id      enumerateObject = JK_EXPECT_F(_jk_encode_prettyPrint) ? [[object allKeys] sortedArrayUsingSelector:@selector(compare:)] : object;\n\n        if(JK_EXPECT_F(jk_encode_write1(encodeState, 1L, \"{\"))) { return(1); }\n        if(JK_EXPECT_F(_jk_encode_prettyPrint) || JK_EXPECT_F(dictionaryCount > 1020L)) {\n          for(id keyObject in enumerateObject) {\n            if(JK_EXPECT_T(printComma)) { if(JK_EXPECT_F(jk_encode_write1(encodeState, 0L, \",\"))) { return(1); } }\n            printComma = 1;\n            if(JK_EXPECT_F((object_getClass(keyObject)      != encodeState->fastClassLookup.stringClass)) && JK_EXPECT_F(([keyObject   isKindOfClass:[NSString class]] == NO))) { jk_encode_error(encodeState, @\"Key must be a string object.\"); return(1); }\n            if(JK_EXPECT_F(jk_encode_add_atom_to_buffer(encodeState, keyObject)))                                                        { return(1); }\n            if(JK_EXPECT_F(jk_encode_write1(encodeState, 0L, \":\")))                                                                      { return(1); }\n            if(JK_EXPECT_F(jk_encode_add_atom_to_buffer(encodeState, (void *)CFDictionaryGetValue((CFDictionaryRef)object, keyObject)))) { return(1); }\n          }\n        } else {\n          void *keys[1024], *objects[1024];\n          CFDictionaryGetKeysAndValues((CFDictionaryRef)object, (const void **)keys, (const void **)objects);\n          for(idx = 0L; idx < dictionaryCount; idx++) {\n            if(JK_EXPECT_T(printComma)) { if(JK_EXPECT_F(jk_encode_write1(encodeState, 0L, \",\"))) { return(1); } }\n            printComma = 1;\n            if(JK_EXPECT_F(object_getClass((id)keys[idx]) != encodeState->fastClassLookup.stringClass) && JK_EXPECT_F([(id)keys[idx] isKindOfClass:[NSString class]] == NO)) { jk_encode_error(encodeState, @\"Key must be a string object.\"); return(1); }\n            if(JK_EXPECT_F(jk_encode_add_atom_to_buffer(encodeState, keys[idx])))    { return(1); }\n            if(JK_EXPECT_F(jk_encode_write1(encodeState, 0L, \":\")))                  { return(1); }\n            if(JK_EXPECT_F(jk_encode_add_atom_to_buffer(encodeState, objects[idx]))) { return(1); }\n          }\n        }\n        return(jk_encode_write1(encodeState, -1L, \"}\"));\n      }\n      break;\n\n    case JKClassNull: return(jk_encode_writen(encodeState, cacheSlot, startingAtIndex, encodeCacheObject, \"null\", 4UL)); break;\n\n    default: jk_encode_error(encodeState, @\"Unable to serialize object class %@.\", NSStringFromClass([object class])); return(1); break;\n  }\n\n  return(0);\n}\n\n\n@implementation JKSerializer\n\n+ (id)serializeObject:(id)object options:(JKSerializeOptionFlags)optionFlags encodeOption:(JKEncodeOptionType)encodeOption block:(JKSERIALIZER_BLOCKS_PROTO)block delegate:(id)delegate selector:(SEL)selector error:(NSError **)error\n{\n  return([[[[self alloc] init] autorelease] serializeObject:object options:optionFlags encodeOption:encodeOption block:block delegate:delegate selector:selector error:error]);\n}\n\n- (id)serializeObject:(id)object options:(JKSerializeOptionFlags)optionFlags encodeOption:(JKEncodeOptionType)encodeOption block:(JKSERIALIZER_BLOCKS_PROTO)block delegate:(id)delegate selector:(SEL)selector error:(NSError **)error\n{\n#ifndef __BLOCKS__\n#pragma unused(block)\n#endif\n  NSParameterAssert((object != NULL) && (encodeState == NULL) && ((delegate != NULL) ? (block == NULL) : 1) && ((block != NULL) ? (delegate == NULL) : 1) &&\n                    (((encodeOption & JKEncodeOptionCollectionObj) != 0UL) ? (((encodeOption & JKEncodeOptionStringObj)     == 0UL) && ((encodeOption & JKEncodeOptionStringObjTrimQuotes) == 0UL)) : 1) &&\n                    (((encodeOption & JKEncodeOptionStringObj)     != 0UL) ?  ((encodeOption & JKEncodeOptionCollectionObj) == 0UL)                                                                 : 1));\n\n  id returnObject = NULL;\n\n  if(encodeState != NULL) { [self releaseState]; }\n  if((encodeState = (struct JKEncodeState *)calloc(1UL, sizeof(JKEncodeState))) == NULL) { [NSException raise:NSMallocException format:@\"Unable to allocate state structure.\"]; return(NULL); }\n\n  if((error != NULL) && (*error != NULL)) { *error = NULL; }\n\n  if(delegate != NULL) {\n    if(selector                               == NULL) { [NSException raise:NSInvalidArgumentException format:@\"The delegate argument is not NULL, but the selector argument is NULL.\"]; }\n    if([delegate respondsToSelector:selector] == NO)   { [NSException raise:NSInvalidArgumentException format:@\"The serializeUnsupportedClassesUsingDelegate: delegate does not respond to the selector argument.\"]; }\n    encodeState->classFormatterDelegate = delegate;\n    encodeState->classFormatterSelector = selector;\n    encodeState->classFormatterIMP      = (JKClassFormatterIMP)[delegate methodForSelector:selector];\n    NSCParameterAssert(encodeState->classFormatterIMP != NULL);\n  }\n\n#ifdef __BLOCKS__\n  encodeState->classFormatterBlock                          = block;\n#endif\n  encodeState->serializeOptionFlags                         = optionFlags;\n  encodeState->encodeOption                                 = encodeOption;\n  encodeState->stringBuffer.roundSizeUpToMultipleOf         = (1024UL * 32UL);\n  encodeState->utf8ConversionBuffer.roundSizeUpToMultipleOf = 4096UL;\n\n  unsigned char stackJSONBuffer[JK_JSONBUFFER_SIZE] JK_ALIGNED(64);\n  jk_managedBuffer_setToStackBuffer(&encodeState->stringBuffer,         stackJSONBuffer, sizeof(stackJSONBuffer));\n\n  unsigned char stackUTF8Buffer[JK_UTF8BUFFER_SIZE] JK_ALIGNED(64);\n  jk_managedBuffer_setToStackBuffer(&encodeState->utf8ConversionBuffer, stackUTF8Buffer, sizeof(stackUTF8Buffer));\n\n  if(((encodeOption & JKEncodeOptionCollectionObj) != 0UL) && (([object isKindOfClass:[NSArray  class]] == NO) && ([object isKindOfClass:[NSDictionary class]] == NO))) { jk_encode_error(encodeState, @\"Unable to serialize object class %@, expected a NSArray or NSDictionary.\", NSStringFromClass([object class])); goto errorExit; }\n  if(((encodeOption & JKEncodeOptionStringObj)     != 0UL) &&  ([object isKindOfClass:[NSString class]] == NO))                                                         { jk_encode_error(encodeState, @\"Unable to serialize object class %@, expected a NSString.\", NSStringFromClass([object class])); goto errorExit; }\n\n  if(jk_encode_add_atom_to_buffer(encodeState, object) == 0) {\n    BOOL stackBuffer = ((encodeState->stringBuffer.flags & JKManagedBufferMustFree) == 0UL) ? YES : NO;\n\n    if((encodeState->atIndex < 2UL))\n    if((stackBuffer == NO) && ((encodeState->stringBuffer.bytes.ptr = (unsigned char *)reallocf(encodeState->stringBuffer.bytes.ptr, encodeState->atIndex + 16UL)) == NULL)) { jk_encode_error(encodeState, @\"Unable to realloc buffer\"); goto errorExit; }\n\n    switch((encodeOption & JKEncodeOptionAsTypeMask)) {\n      case JKEncodeOptionAsData:\n        if(stackBuffer == YES) { if((returnObject = [(id)CFDataCreate(                 NULL,                encodeState->stringBuffer.bytes.ptr, (CFIndex)encodeState->atIndex)                                  autorelease]) == NULL) { jk_encode_error(encodeState, @\"Unable to create NSData object\"); } }\n        else                   { if((returnObject = [(id)CFDataCreateWithBytesNoCopy(  NULL,                encodeState->stringBuffer.bytes.ptr, (CFIndex)encodeState->atIndex, NULL)                            autorelease]) == NULL) { jk_encode_error(encodeState, @\"Unable to create NSData object\"); } }\n        break;\n\n      case JKEncodeOptionAsString:\n        if(stackBuffer == YES) { if((returnObject = [(id)CFStringCreateWithBytes(      NULL, (const UInt8 *)encodeState->stringBuffer.bytes.ptr, (CFIndex)encodeState->atIndex, kCFStringEncodingUTF8, NO)       autorelease]) == NULL) { jk_encode_error(encodeState, @\"Unable to create NSString object\"); } }\n        else                   { if((returnObject = [(id)CFStringCreateWithBytesNoCopy(NULL, (const UInt8 *)encodeState->stringBuffer.bytes.ptr, (CFIndex)encodeState->atIndex, kCFStringEncodingUTF8, NO, NULL) autorelease]) == NULL) { jk_encode_error(encodeState, @\"Unable to create NSString object\"); } }\n        break;\n\n      default: jk_encode_error(encodeState, @\"Unknown encode as type.\"); break;\n    }\n\n    if((returnObject != NULL) && (stackBuffer == NO)) { encodeState->stringBuffer.flags &= ~JKManagedBufferMustFree; encodeState->stringBuffer.bytes.ptr = NULL; encodeState->stringBuffer.bytes.length = 0UL; }\n  }\n\nerrorExit:\n  if((encodeState != NULL) && (error != NULL) && (encodeState->error != NULL)) { *error = encodeState->error; encodeState->error = NULL; }\n  [self releaseState];\n\n  return(returnObject);\n}\n\n- (void)releaseState\n{\n  if(encodeState != NULL) {\n    jk_managedBuffer_release(&encodeState->stringBuffer);\n    jk_managedBuffer_release(&encodeState->utf8ConversionBuffer);\n    free(encodeState); encodeState = NULL;\n  }\n}\n\n- (void)dealloc\n{\n  [self releaseState];\n  [super dealloc];\n}\n\n@end\n\n@implementation NSString (JSONKitSerializing)\n\n////////////\n#pragma mark Methods for serializing a single NSString.\n////////////\n\n// Useful for those who need to serialize just a NSString.  Otherwise you would have to do something like [NSArray arrayWithObject:stringToBeJSONSerialized], serializing the array, and then chopping of the extra ^\\[.*\\]$ square brackets.\n\n// NSData returning methods...\n\n- (NSData *)JSONData\n{\n  return([self JSONDataWithOptions:JKSerializeOptionNone includeQuotes:YES error:NULL]);\n}\n\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions includeQuotes:(BOOL)includeQuotes error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsData | ((includeQuotes == NO) ? JKEncodeOptionStringObjTrimQuotes : 0UL) | JKEncodeOptionStringObj) block:NULL delegate:NULL selector:NULL error:error]);\n}\n\n// NSString returning methods...\n\n- (NSString *)JSONString\n{\n  return([self JSONStringWithOptions:JKSerializeOptionNone includeQuotes:YES error:NULL]);\n}\n\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions includeQuotes:(BOOL)includeQuotes error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsString | ((includeQuotes == NO) ? JKEncodeOptionStringObjTrimQuotes : 0UL) | JKEncodeOptionStringObj) block:NULL delegate:NULL selector:NULL error:error]);\n}\n\n@end\n\n@implementation NSArray (JSONKitSerializing)\n\n// NSData returning methods...\n\n- (NSData *)JSONData\n{\n  return([JKSerializer serializeObject:self options:JKSerializeOptionNone encodeOption:(JKEncodeOptionAsData | JKEncodeOptionCollectionObj) block:NULL delegate:NULL selector:NULL error:NULL]);\n}\n\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsData | JKEncodeOptionCollectionObj) block:NULL delegate:NULL selector:NULL error:error]);\n}\n\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsData | JKEncodeOptionCollectionObj) block:NULL delegate:delegate selector:selector error:error]);\n}\n\n// NSString returning methods...\n\n- (NSString *)JSONString\n{\n  return([JKSerializer serializeObject:self options:JKSerializeOptionNone encodeOption:(JKEncodeOptionAsString | JKEncodeOptionCollectionObj) block:NULL delegate:NULL selector:NULL error:NULL]);\n}\n\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsString | JKEncodeOptionCollectionObj) block:NULL delegate:NULL selector:NULL error:error]);\n}\n\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsString | JKEncodeOptionCollectionObj) block:NULL delegate:delegate selector:selector error:error]);\n}\n\n@end\n\n@implementation NSDictionary (JSONKitSerializing)\n\n// NSData returning methods...\n\n- (NSData *)JSONData\n{\n  return([JKSerializer serializeObject:self options:JKSerializeOptionNone encodeOption:(JKEncodeOptionAsData | JKEncodeOptionCollectionObj) block:NULL delegate:NULL selector:NULL error:NULL]);\n}\n\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsData | JKEncodeOptionCollectionObj) block:NULL delegate:NULL selector:NULL error:error]);\n}\n\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsData | JKEncodeOptionCollectionObj) block:NULL delegate:delegate selector:selector error:error]);\n}\n\n// NSString returning methods...\n\n- (NSString *)JSONString\n{\n  return([JKSerializer serializeObject:self options:JKSerializeOptionNone encodeOption:(JKEncodeOptionAsString | JKEncodeOptionCollectionObj) block:NULL delegate:NULL selector:NULL error:NULL]);\n}\n\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsString | JKEncodeOptionCollectionObj) block:NULL delegate:NULL selector:NULL error:error]);\n}\n\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsString | JKEncodeOptionCollectionObj) block:NULL delegate:delegate selector:selector error:error]);\n}\n\n@end\n\n\n#ifdef __BLOCKS__\n\n@implementation NSArray (JSONKitSerializingBlockAdditions)\n\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingBlock:(id(^)(id object))block error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsData | JKEncodeOptionCollectionObj) block:block delegate:NULL selector:NULL error:error]);\n}\n\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingBlock:(id(^)(id object))block error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsString | JKEncodeOptionCollectionObj) block:block delegate:NULL selector:NULL error:error]);\n}\n\n@end\n\n@implementation NSDictionary (JSONKitSerializingBlockAdditions)\n\n- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingBlock:(id(^)(id object))block error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsData | JKEncodeOptionCollectionObj) block:block delegate:NULL selector:NULL error:error]);\n}\n\n- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingBlock:(id(^)(id object))block error:(NSError **)error\n{\n  return([JKSerializer serializeObject:self options:serializeOptions encodeOption:(JKEncodeOptionAsString | JKEncodeOptionCollectionObj) block:block delegate:NULL selector:NULL error:error]);\n}\n\n@end\n\n#endif // __BLOCKS__\n\n"
  },
  {
    "path": "Slate/JSOperation.h",
    "content": "//\n//  JSOperation.h\n//  Slate\n//\n//  Created by Jigish Patel on 1/22/13.\n//  Copyright 2013 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n#import <WebKit/WebKit.h>\n#import \"Operation.h\"\n\n@interface JSOperation : Operation {\n  WebScriptObject *function;\n}\n\n@property (strong) WebScriptObject *function;\n\n- (id)initWithFunction:(WebScriptObject *)_function;\n+ (id)jsOperationWithFunction:(WebScriptObject *)function;\n\n@end\n"
  },
  {
    "path": "Slate/JSOperation.m",
    "content": "//\n//  JSOperation.m\n//  Slate\n//\n//  Created by Jigish Patel on 1/22/13.\n//  Copyright 2013 Jigish Patel. All rights reserved.\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\n#import \"JSOperation.h\"\n#import \"JSController.h\"\n#import \"AccessibilityWrapper.h\"\n#import \"ScreenWrapper.h\"\n#import \"SlateLogger.h\"\n#import \"JSWindowWrapper.h\"\n#import \"JSInfoWrapper.h\"\n\n@implementation JSOperation\n\n@synthesize function;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [self setOpName:@\"js\"];\n  }\n  return self;\n}\n\n- (id)initWithFunction:(WebScriptObject *)_function {\n  self = [super init];\n  if (self) {\n    [self setOpName:@\"js\"];\n    [self setFunction:_function];\n  }\n  return self;\n}\n\n- (BOOL)doOperationWithAccessibilityWrapper:(AccessibilityWrapper *)aw screenWrapper:(ScreenWrapper *)sw {\n  BOOL success = YES;\n  [self evalOptionsWithAccessibilityWrapper:aw screenWrapper:sw];\n  [[JSInfoWrapper getInstance] setSw:sw];\n  [[JSInfoWrapper getInstance] setAw:aw];\n  JSWindowWrapper *window = nil;\n  if (aw != nil && [aw inited]) window = [[JSWindowWrapper alloc] initWithAccessibilityWrapper:aw screenWrapper:sw];\n  [[JSController getInstance] runFunction:[self function] withArg:window];\n  return success;\n}\n\n- (BOOL)doOperation {\n  SlateLogger(@\"----------------- Begin JS Operation -----------------\");\n  AccessibilityWrapper *aw = [[AccessibilityWrapper alloc] init];\n  ScreenWrapper *sw = [[ScreenWrapper alloc] init];\n  BOOL success = NO;\n  if (![aw inited]) aw = nil;\n  success = [self doOperationWithAccessibilityWrapper:aw screenWrapper:sw];\n  SlateLogger(@\"-----------------  End JS Operation  -----------------\");\n  return success;\n}\n\n- (BOOL)testOperation {\n  return function != nil && [@\"function\" isEqualToString:[[JSController getInstance] jsTypeof:function]];\n}\n\n+ (JSOperation *)jsOperationWithFunction:(WebScriptObject*)function {\n  return [[JSOperation alloc] initWithFunction:function];\n}\n\n@end\n"
  },
  {
    "path": "Slate/JSOperationWrapper.h",
    "content": "//\n//  JSOperationWrapper.h\n//  Slate\n//\n//  Created by Jigish Patel on 1/25/13.\n//  Copyright 2013 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n#import <WebKit/WebKit.h>\n\n@class AccessibilityWrapper;\n@class ScreenWrapper;\n@class Operation;\n\n@interface JSOperationWrapper : NSObject {\n  Operation *op;\n}\n\n@property (strong) Operation *op;\n\n- (BOOL)run;\n- (JSOperationWrapper *)dup:(WebScriptObject *)opts;\n- (BOOL)doOperation;\n- (BOOL)doOperationWithAccessibilityWrapper:(AccessibilityWrapper *)aw screenWrapper:(ScreenWrapper *)sw;\n\n+ (JSOperationWrapper *)operation:(NSString*)name options:(WebScriptObject *)opts;\n+ (JSOperationWrapper *)operationFromString:(NSString *)opString;\n\n@end\n"
  },
  {
    "path": "Slate/JSOperationWrapper.m",
    "content": "//\n//  JSOperationWrapper.m\n//  Slate\n//\n//  Created by Jigish Patel on 1/25/13.\n//  Copyright 2013 Jigish Patel. All rights reserved.\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\n#import \"JSOperationWrapper.h\"\n#import \"Operation.h\"\n#import \"JSController.h\"\n#import \"SlateLogger.h\"\n#import \"SlateConfig.h\"\n\n@implementation JSOperationWrapper\n\nstatic NSDictionary *jsowJsMethods;\n\n@synthesize op;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [JSOperationWrapper setJsMethods];\n  }\n  return self;\n}\n\n- (id)initWithOperation:(Operation *)_op {\n  self = [self init];\n  if (self) {\n    @try {\n      [self setOp:_op];\n      if ([self op] == nil) { return nil; }\n    } @catch (NSException *ex) {\n      SlateLogger(@\"   ERROR %@\",[ex name]);\n      NSAlert *alert = [SlateConfig warningAlertWithKeyEquivalents: [NSArray arrayWithObjects:@\"Quit\", @\"Skip\", nil]];\n      [alert setMessageText:[ex name]];\n      [alert setInformativeText:[ex reason]];\n      if ([alert runModal] == NSAlertFirstButtonReturn) {\n        SlateLogger(@\"User selected exit\");\n        [NSApp terminate:nil];\n      }\n      return nil;\n    }\n  }\n  return self;\n}\n\n- (id)initWithName:(NSString*)name options:(WebScriptObject *)opts {\n  self = [self init];\n  if (self) {\n    @try {\n      [self setOp:[Operation operationWithName:name options:[[JSController getInstance] unmarshall:opts]]];\n      if ([self op] == nil) { return nil; }\n    } @catch (NSException *ex) {\n      SlateLogger(@\"   ERROR %@\",[ex name]);\n      NSAlert *alert = [SlateConfig warningAlertWithKeyEquivalents: [NSArray arrayWithObjects:@\"Quit\", @\"Skip\", nil]];\n      [alert setMessageText:[ex name]];\n      [alert setInformativeText:[ex reason]];\n      if ([alert runModal] == NSAlertFirstButtonReturn) {\n        SlateLogger(@\"User selected exit\");\n        [NSApp terminate:nil];\n      }\n      return nil;\n    }\n  }\n  return self;\n}\n\n- (id)initWithString:(NSString *)str {\n  self = [self init];\n  if (self) {\n    @try {\n      [self setOp:[Operation operationFromString:str]];\n      if ([self op] == nil) { return nil; }\n    } @catch (NSException *ex) {\n      SlateLogger(@\"   ERROR %@\",[ex name]);\n      NSAlert *alert = [SlateConfig warningAlertWithKeyEquivalents: [NSArray arrayWithObjects:@\"Quit\", @\"Skip\", nil]];\n      [alert setMessageText:[ex name]];\n      [alert setInformativeText:[ex reason]];\n      if ([alert runModal] == NSAlertFirstButtonReturn) {\n        SlateLogger(@\"User selected exit\");\n        [NSApp terminate:nil];\n      }\n      return nil;\n    }\n  }\n  return self;\n}\n\n- (BOOL)run {\n  return [[self op] doOperation];\n}\n\n- (BOOL)doOperation {\n  return [[self op] doOperation];\n}\n\n- (BOOL)doOperationWithAccessibilityWrapper:(AccessibilityWrapper *)aw screenWrapper:(ScreenWrapper *)sw {\n  return [[self op] doOperationWithAccessibilityWrapper:aw screenWrapper:sw];\n}\n\n- (JSOperationWrapper *)dup:(WebScriptObject *)opts {\n  NSString *type = [[JSController getInstance] jsTypeof:opts];\n  if (![@\"object\" isEqualToString:type]) {\n    SlateLogger(@\"   ERROR operation.dup parameter must be a hash\");\n    NSAlert *alert = [SlateConfig warningAlertWithKeyEquivalents: [NSArray arrayWithObjects:@\"Quit\", @\"Skip\", nil]];\n    [alert setMessageText:@\"operation.dup parameter must be a hash\"];\n    [alert setInformativeText:[NSString stringWithFormat:@\"was: %@\", type]];\n    if ([alert runModal] == NSAlertFirstButtonReturn) {\n      SlateLogger(@\"User selected exit\");\n      [NSApp terminate:nil];\n    }\n    return nil;\n  }\n  NSDictionary *optDict = [[JSController getInstance] unmarshall:opts];\n  return [[JSOperationWrapper alloc] initWithOperation:[[self op] dup:optDict]];\n}\n\n+ (JSOperationWrapper *)operation:(NSString*)name options:(WebScriptObject *)opts {\n  return [[JSOperationWrapper alloc] initWithName:name options:opts];\n}\n\n+ (JSOperationWrapper *)operationFromString:(NSString *)opString {\n  return [[JSOperationWrapper alloc] initWithString:opString];\n}\n\n+ (void)setJsMethods {\n  if (jsowJsMethods == nil) {\n    jsowJsMethods = @{\n      NSStringFromSelector(@selector(run)): @\"run\",\n      NSStringFromSelector(@selector(dup:)): @\"dup\",\n    };\n  }\n}\n\n+ (BOOL)isSelectorExcludedFromWebScript:(SEL)sel {\n  return [jsowJsMethods objectForKey:NSStringFromSelector(sel)] == NULL;\n}\n\n+ (NSString *)webScriptNameForSelector:(SEL)sel {\n  return [jsowJsMethods objectForKey:NSStringFromSelector(sel)];\n}\n\n@end\n"
  },
  {
    "path": "Slate/JSScreenWrapper.h",
    "content": "//\n//  JSScreenWrapper.h\n//  Slate\n//\n//  Created by Jigish Patel on 1/21/13.\n//  Copyright 2013 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n\n@class AccessibilityWrapper;\n@class ScreenWrapper;\n\n@interface JSScreenWrapper : NSObject {\n  ScreenWrapper *sw;\n  NSInteger screenId;\n}\n\n@property (strong) ScreenWrapper *sw;\n@property NSInteger screenId;\n\n- (id)initWithScreenId:(NSInteger)_id screenWrapper:(ScreenWrapper *)_sw;\n- (NSString *)toString;\n\n@end\n"
  },
  {
    "path": "Slate/JSScreenWrapper.m",
    "content": "//\n//  JSScreenWrapper.m\n//  Slate\n//\n//  Created by Jigish Patel on 1/21/13.\n//  Copyright 2013 Jigish Patel. All rights reserved.\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\n#import \"JSScreenWrapper.h\"\n#import \"ScreenWrapper.h\"\n#import \"JSController.h\"\n\n@implementation JSScreenWrapper\n\nstatic NSDictionary *jsswJsMethods = nil;\n\n@synthesize screenId;\n@synthesize sw;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [self setScreenId:0];\n    [self setSw:[[ScreenWrapper alloc] init]];\n    [JSScreenWrapper setJsMethods];\n  }\n  return self;\n}\n\n- (id)initWithScreenId:(NSInteger)_id screenWrapper:(ScreenWrapper *)_sw {\n  self = [super init];\n  if (self) {\n    [self setScreenId:_id];\n    [self setSw:_sw];\n    [JSScreenWrapper setJsMethods];\n  }\n  return self;\n}\n\n- (id)rect {\n  NSRect rect = [sw getScreenRectForRef:[self screenId]];\n  return [[JSController getInstance] marshall:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInteger:rect.size.width],\n                                                                                         @\"width\",\n                                                                                         [NSNumber numberWithInteger:rect.size.height],\n                                                                                         @\"height\",\n                                                                                         [NSNumber numberWithInteger:rect.origin.x],\n                                                                                         @\"x\",\n                                                                                         [NSNumber numberWithInteger:rect.origin.y],\n                                                                                         @\"y\", nil]];\n}\n\n- (id)vrect { return [self visibleRect]; }\n\n- (id)visibleRect {\n  NSRect rect = [sw getScreenVisibleRectForRef:[self screenId]];\n  return [[JSController getInstance] marshall:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInteger:rect.size.width],\n                                                                                         @\"width\",\n                                                                                         [NSNumber numberWithInteger:rect.size.height],\n                                                                                         @\"height\",\n                                                                                         [NSNumber numberWithInteger:rect.origin.x],\n                                                                                         @\"x\",\n                                                                                         [NSNumber numberWithInteger:rect.origin.y],\n                                                                                         @\"y\", nil]];\n}\n\n- (NSString *)toString {\n  return [NSString stringWithFormat:@\"%ld\", [self screenId]];\n}\n\n- (BOOL)main { return [self isMain]; }\n\n- (BOOL)isMain {\n  return [sw isMainScreenRef:[self screenId]];\n}\n\n+ (void)setJsMethods {\n  if (jsswJsMethods == nil) {\n    jsswJsMethods = @{\n      NSStringFromSelector(@selector(screenId)): @\"id\",\n      NSStringFromSelector(@selector(rect)): @\"rect\",\n      NSStringFromSelector(@selector(visibleRect)): @\"visibleRect\",\n      NSStringFromSelector(@selector(vrect)): @\"vrect\",\n      NSStringFromSelector(@selector(isMain)): @\"isMain\",\n      NSStringFromSelector(@selector(main)): @\"main\",\n    };\n  }\n}\n\n+ (BOOL)isSelectorExcludedFromWebScript:(SEL)sel {\n  return [jsswJsMethods objectForKey:NSStringFromSelector(sel)] == NULL;\n}\n\n+ (NSString *)webScriptNameForSelector:(SEL)sel {\n  return [jsswJsMethods objectForKey:NSStringFromSelector(sel)];\n}\n\n@end\n"
  },
  {
    "path": "Slate/JSWindowWrapper.h",
    "content": "//\n//  JSWindowWrapper.h\n//  Slate\n//\n//  Created by Jigish Patel on 1/21/13.\n//  Copyright 2013 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n\n@class AccessibilityWrapper;\n@class ScreenWrapper;\n\n@interface JSWindowWrapper : NSObject {\n  ScreenWrapper *sw;\n  AccessibilityWrapper *aw;\n}\n\n@property (strong) ScreenWrapper *sw;\n@property (strong) AccessibilityWrapper *aw;\n\n- (id)initWithAccessibilityWrapper:(AccessibilityWrapper *)_aw screenWrapper:(ScreenWrapper *)_sw;\n\n@end\n"
  },
  {
    "path": "Slate/JSWindowWrapper.m",
    "content": "//\n//  JSWindowWrapper.m\n//  Slate\n//\n//  Created by Jigish Patel on 1/21/13.\n//  Copyright 2013 Jigish Patel. All rights reserved.\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\n#import \"JSWindowWrapper.h\"\n#import \"AccessibilityWrapper.h\"\n#import \"ScreenWrapper.h\"\n#import \"JSController.h\"\n#import \"ExpressionPoint.h\"\n#import \"JSScreenWrapper.h\"\n#import \"JSWrapperUtils.h\"\n#import \"JSApplicationWrapper.h\"\n#import \"JSOperationWrapper.h\"\n\n@implementation JSWindowWrapper\n\nstatic NSDictionary *jswwJsMethods;\n\n@synthesize aw;\n@synthesize sw;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [self setAw:[[AccessibilityWrapper alloc] init]];\n    [self setSw:[[ScreenWrapper alloc] init]];\n    [JSWindowWrapper setJsMethods];\n  }\n  return self;\n}\n\n- (id)initWithAccessibilityWrapper:(AccessibilityWrapper *)_aw screenWrapper:(ScreenWrapper *)_sw {\n  self = [super init];\n  if (self) {\n    [self setAw:_aw];\n    [self setSw:_sw];\n    [JSWindowWrapper setJsMethods];\n  }\n  return self;\n}\n\n- (NSString *)title {\n  return [aw getTitle];\n}\n\n- (id)rect {\n  NSPoint tl = [aw getCurrentTopLeft];\n  NSSize s = [aw getCurrentSize];\n  return [[JSController getInstance] marshall:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInteger:tl.x],\n                                                                                         @\"x\",\n                                                                                         [NSNumber numberWithInteger:tl.y],\n                                                                                         @\"y\",\n                                                                                         [NSNumber numberWithInteger:s.width],\n                                                                                         @\"width\",\n                                                                                         [NSNumber numberWithInteger:s.height],\n                                                                                         @\"height\", nil]];\n}\n\n- (id)tl { return [self topLeft]; }\n\n- (id)topLeft {\n  NSPoint tl = [aw getCurrentTopLeft];\n  return [[JSController getInstance] marshall:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInteger:tl.x],\n                                                                                         @\"x\",\n                                                                                         [NSNumber numberWithInteger:tl.y],\n                                                                                         @\"y\", nil]];\n}\n\n- (id)size {\n  NSSize s = [aw getCurrentSize];\n  return [[JSController getInstance] marshall:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInteger:s.width],\n                                                                                         @\"width\",\n                                                                                         [NSNumber numberWithInteger:s.height],\n                                                                                         @\"height\", nil]];\n}\n\n- (pid_t)pid {\n  return [aw processIdentifier];\n}\n\n- (BOOL)focus {\n  return [aw focus];\n}\n\n- (BOOL)hidden { return [self isMinimizedOrHidden]; }\n\n- (BOOL)isMinimizedOrHidden {\n  return [aw isMinimizedOrHidden];\n}\n\n- (BOOL)movable { return [self isMovable]; }\n\n- (BOOL)isMovable {\n  return [aw isMovable];\n}\n\n- (BOOL)resizable { return [self isResizable]; }\n\n- (BOOL)isResizable {\n  return [aw isResizable];\n}\n\n- (BOOL)main { return [self isMain]; }\n\n- (BOOL)isMain {\n  return [AccessibilityWrapper isMainWindow:[aw window]];\n}\n\n- (BOOL)move:(id)point {\n  id pointDict = [[JSController getInstance] unmarshall:point];\n  NSValue *p = [JSWrapperUtils pointFromDict:pointDict aw:aw sw:sw];\n  if (p == nil) { return NO; }\n  return [aw moveWindow:[p pointValue]];\n}\n\n- (BOOL)resize:(id)size {\n  id sizeDict = [[JSController getInstance] unmarshall:size];\n  NSValue *s = [JSWrapperUtils sizeFromDict:sizeDict aw:aw sw:sw];\n  if (s == nil) { return NO; }\n  return [aw resizeWindow:[s sizeValue]];\n}\n\n- (JSScreenWrapper *)screen {\n  NSPoint tl = [aw getCurrentTopLeft];\n  NSSize size = [aw getCurrentSize];\n  NSRect wRect = NSMakeRect(tl.x, tl.y, size.width, size.height);\n  return [[JSScreenWrapper alloc] initWithScreenId:[sw getScreenRefIdForRect:wRect] screenWrapper:sw];\n}\n\n- (JSApplicationWrapper *)app {\n  return [[JSApplicationWrapper alloc] initWithAccessibilityWrapper:aw screenWrapper:sw];\n}\n\n- (BOOL)doop:(id)op options:(id)opts { return [self doOperation:op options:opts]; }\n\n- (BOOL)doOperation:(id)op options:(id)opts {\n  if ([op isKindOfClass:[JSOperationWrapper class]]) {\n    return [op doOperationWithAccessibilityWrapper:aw screenWrapper:sw];\n  } else if ([op isKindOfClass:[NSString class]]) {\n    id options = [[JSController getInstance] unmarshall:opts];\n    if ([options isKindOfClass:[NSDictionary class]]) {\n      return [Operation doOperation:op options:options aw:[self aw] sw:[self sw]];\n    }\n  }\n  return NO;\n}\n\n+ (void)setJsMethods {\n  if (jswwJsMethods == nil) {\n    jswwJsMethods = @{\n      NSStringFromSelector(@selector(title)): @\"title\",\n      NSStringFromSelector(@selector(topLeft)): @\"topLeft\",\n      NSStringFromSelector(@selector(tl)): @\"tl\",\n      NSStringFromSelector(@selector(size)): @\"size\",\n      NSStringFromSelector(@selector(rect)): @\"rect\",\n      NSStringFromSelector(@selector(pid)): @\"pid\",\n      NSStringFromSelector(@selector(focus)): @\"focus\",\n      NSStringFromSelector(@selector(isMinimizedOrHidden)): @\"isMinimizedOrHidden\",\n      NSStringFromSelector(@selector(hidden)): @\"hidden\",\n      NSStringFromSelector(@selector(isMovable)): @\"isMovable\",\n      NSStringFromSelector(@selector(movable)): @\"movable\",\n      NSStringFromSelector(@selector(isResizable)): @\"isResizable\",\n      NSStringFromSelector(@selector(resizable)): @\"resizable\",\n      NSStringFromSelector(@selector(isMain)): @\"isMain\",\n      NSStringFromSelector(@selector(main)): @\"main\",\n      NSStringFromSelector(@selector(move:)): @\"move\",\n      NSStringFromSelector(@selector(resize:)): @\"resize\",\n      NSStringFromSelector(@selector(screen)): @\"screen\",\n      NSStringFromSelector(@selector(doOperation:options:)): @\"doOperation\",\n      NSStringFromSelector(@selector(doop:options:)): @\"doop\",\n      NSStringFromSelector(@selector(app)): @\"app\",\n    };\n  }\n}\n\n+ (BOOL)isSelectorExcludedFromWebScript:(SEL)sel {\n  return [jswwJsMethods objectForKey:NSStringFromSelector(sel)] == NULL;\n}\n\n+ (NSString *)webScriptNameForSelector:(SEL)sel {\n  return [jswwJsMethods objectForKey:NSStringFromSelector(sel)];\n}\n\n@end\n"
  },
  {
    "path": "Slate/JSWrapperUtils.h",
    "content": "//\n//  JSWrapperUtils.h\n//  Slate\n//\n//  Created by Jigish Patel on 1/22/13.\n//  Copyright 2013 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n\n@class AccessibilityWrapper;\n@class ScreenWrapper;\n\n@interface JSWrapperUtils : NSObject\n\n+ (NSDictionary *)screenAndWindowValues:(NSString *)screen aw:(AccessibilityWrapper *)aw sw:(ScreenWrapper *)sw;\n+ (NSValue *)pointFromDict:(id)dict aw:(AccessibilityWrapper *)aw sw:(ScreenWrapper *)sw;\n+ (NSValue *)sizeFromDict:(id)dict aw:(AccessibilityWrapper *)aw sw:(ScreenWrapper *)sw;\n+ (NSValue *)rectFromDict:(id)dict aw:(AccessibilityWrapper *)aw sw:(ScreenWrapper *)sw;\n\n@end\n"
  },
  {
    "path": "Slate/JSWrapperUtils.m",
    "content": "//\n//  JSWrapperUtils.m\n//  Slate\n//\n//  Created by Jigish Patel on 1/22/13.\n//  Copyright 2013 Jigish Patel. All rights reserved.\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\n#import \"JSWrapperUtils.h\"\n#import \"ExpressionPoint.h\"\n#import \"AccessibilityWrapper.h\"\n#import \"ScreenWrapper.h\"\n\n@implementation JSWrapperUtils\n\n+ (NSDictionary *)screenAndWindowValues:(NSString *)screen aw:(AccessibilityWrapper *)aw sw:(ScreenWrapper *)sw {\n  NSInteger screenId = 0;\n  NSPoint wTL = [aw getCurrentTopLeft];\n  NSSize wSize = [aw getCurrentSize];\n  NSRect wRect = NSMakeRect(wTL.x, wTL.y, wSize.width, wSize.height);\n  if (screen != nil) {\n    screenId = [sw getScreenId:screen windowRect:wRect];\n  } else {\n    screenId = [sw getScreenIdForRect:wRect];\n  }\n  return [sw getScreenAndWindowValues:screenId window:wRect newSize:wRect.size];\n}\n\n+ (NSValue *)pointFromDict:(id)dict aw:(AccessibilityWrapper *)aw sw:(ScreenWrapper *)sw {\n  if (![dict isKindOfClass:[NSDictionary class]]) { return nil; }\n  if ([dict objectForKey:@\"x\"] == nil) { return nil; }\n  if ([dict objectForKey:@\"y\"] == nil) { return nil; }\n\n  NSDictionary *values = nil;\n  float x = 0;\n  if ([[dict objectForKey:@\"x\"] isKindOfClass:[NSString class]]) {\n    values = [JSWrapperUtils screenAndWindowValues:[dict objectForKey:@\"screen\"] aw:aw sw:sw];\n    x = [ExpressionPoint expToFloat:[dict objectForKey:@\"x\"] withDict:values];\n  } else if ([[dict objectForKey:@\"x\"] isKindOfClass:[NSNumber class]] ||\n             [[dict objectForKey:@\"x\"] isKindOfClass:[NSValue class]]) {\n    x = [[dict objectForKey:@\"x\"] floatValue];\n  } else {\n    return nil;\n  }\n  float y = 0;\n  if ([[dict objectForKey:@\"y\"] isKindOfClass:[NSString class]]) {\n    if (values == nil) {\n      values = [JSWrapperUtils screenAndWindowValues:[dict objectForKey:@\"screen\"] aw:aw sw:sw];\n    }\n    y = [ExpressionPoint expToFloat:[dict objectForKey:@\"y\"] withDict:values];\n  } else if ([[dict objectForKey:@\"y\"] isKindOfClass:[NSNumber class]] ||\n             [[dict objectForKey:@\"y\"] isKindOfClass:[NSValue class]]) {\n    y = [[dict objectForKey:@\"y\"] floatValue];\n  } else {\n    return nil;\n  }\n  return [NSValue valueWithPoint:NSMakePoint(x, y)];\n}\n\n+ (NSValue *)sizeFromDict:(id)dict aw:(AccessibilityWrapper *)aw sw:(ScreenWrapper *)sw {\n  if (![dict isKindOfClass:[NSDictionary class]]) { return nil; }\n  if ([dict objectForKey:@\"width\"] == nil) { return nil; }\n  if ([dict objectForKey:@\"height\"] == nil) { return nil; }\n\n  NSDictionary *values = nil;\n  float width = 0;\n  if ([[dict objectForKey:@\"width\"] isKindOfClass:[NSString class]]) {\n    values = [JSWrapperUtils screenAndWindowValues:[dict objectForKey:@\"screen\"] aw:aw sw:sw];\n    width = [ExpressionPoint expToFloat:[dict objectForKey:@\"width\"] withDict:values];\n  } else if ([[dict objectForKey:@\"width\"] isKindOfClass:[NSNumber class]] ||\n             [[dict objectForKey:@\"width\"] isKindOfClass:[NSValue class]]) {\n    width = [[dict objectForKey:@\"width\"] floatValue];\n  } else {\n    return nil;\n  }\n  float height = 0;\n  if ([[dict objectForKey:@\"height\"] isKindOfClass:[NSString class]]) {\n    if (values == nil) {\n      values = [JSWrapperUtils screenAndWindowValues:[dict objectForKey:@\"screen\"] aw:aw sw:sw];\n    }\n    height = [ExpressionPoint expToFloat:[dict objectForKey:@\"height\"] withDict:values];\n  } else if ([[dict objectForKey:@\"height\"] isKindOfClass:[NSNumber class]] ||\n             [[dict objectForKey:@\"height\"] isKindOfClass:[NSValue class]]) {\n    height = [[dict objectForKey:@\"height\"] floatValue];\n  } else {\n    return nil;\n  }\n\n  return [NSValue valueWithSize:NSMakeSize(width, height)];\n}\n\n+ (NSValue *)rectFromDict:(id)dict aw:(AccessibilityWrapper *)aw sw:(ScreenWrapper *)sw {\n  NSValue *pVal = [JSWrapperUtils pointFromDict:dict aw:aw sw:sw];\n  if (pVal == nil) { return nil; }\n  NSPoint p = [pVal pointValue];\n  NSValue *sVal = [JSWrapperUtils sizeFromDict:dict aw:aw sw:sw];\n  if (sVal == nil) { return nil; }\n  NSSize s = [sVal sizeValue];\n  return [NSValue valueWithRect:NSMakeRect(p.x, p.y, s.width, s.height)];\n}\n\n@end\n"
  },
  {
    "path": "Slate/Layout.h",
    "content": "//\n//  Layout.h\n//  Slate\n//\n//  Created by Jigish Patel on 6/13/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n\n\n@interface Layout : NSObject {\n@private\n  NSString *name;\n  NSMutableDictionary *appStates;\n  NSMutableDictionary *appOptions;\n  NSMutableArray *appOrder;\n  NSMutableArray *before;\n  NSMutableArray *after;\n}\n\n@property (copy) NSString *name;\n@property NSMutableDictionary *appStates;\n@property NSMutableDictionary *appOptions;\n@property NSMutableArray *appOrder;\n@property NSMutableArray *before;\n@property NSMutableArray *after;\n\n- (id)initWithString:(NSString *)layout;\n- (id)initWithName:(NSString *)name dict:(NSDictionary *)dict;\n- (void)addWithString:(NSString *)layout;\n\n@end\n"
  },
  {
    "path": "Slate/Layout.m",
    "content": "//\n//  Layout.m\n//  Slate\n//\n//  Created by Jigish Patel on 6/13/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"ApplicationOptions.h\"\n#import \"Constants.h\"\n#import \"Layout.h\"\n#import \"Operation.h\"\n#import \"StringTokenizer.h\"\n#import \"SlateLogger.h\"\n\n@implementation Layout\n\n@synthesize name;\n@synthesize appStates;\n@synthesize appOptions;\n@synthesize appOrder;\n@synthesize before, after;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    appStates = [NSMutableDictionary dictionary];\n    appOptions = [NSMutableDictionary dictionary];\n    appOrder = [NSMutableArray array];\n    before = [NSMutableArray array];\n    after = [NSMutableArray array];\n  }\n  return self;\n}\n\n- (id)initWithString:(NSString *)layout {\n  self = [self init];\n  if (self) {\n    [self addWithString:layout];\n  }\n  return self;\n}\n\n- (id)initWithName:(NSString *)_name dict:(NSDictionary *)dict {\n  self = [self init];\n  if (self) {\n    if (_name == nil) { return nil; }\n    [self setName:_name];\n    for (NSString *appName in [dict allKeys]) {\n      id appDict = [dict objectForKey:appName];\n      if (appDict == nil || ![appDict isKindOfClass:[NSDictionary class]]) continue;\n      id _ops = [appDict objectForKey:OPT_OPERATIONS];\n      if (_ops == nil) continue;\n      NSMutableArray *ops = nil;\n      if ([_ops isKindOfClass:[NSArray class]]) ops = [_ops mutableCopy];\n      else ops = [NSMutableArray arrayWithObject:_ops];\n      if (ops == nil || ![ops isKindOfClass:[NSArray class]]) continue;\n      if ([OPT_BEFORE isEqualToString:appName]) {\n        [self setBefore:ops];\n      } else if ([OPT_AFTER isEqualToString:appName]) {\n        [self setAfter:ops];\n      } else {\n        [[self appOrder] addObject:appName];\n        [[self appStates] setObject:ops forKey:appName];\n        ApplicationOptions *appOpts = [[ApplicationOptions alloc] init];\n        if ([appDict objectForKey:OPT_IGNORE_FAIL] != nil && [[appDict objectForKey:OPT_IGNORE_FAIL] boolValue]) {\n          [appOpts setIgnoreFail:YES];\n        }\n        if ([appDict objectForKey:OPT_REPEAT] != nil && [[appDict objectForKey:OPT_REPEAT] boolValue]) {\n          [appOpts setRepeat:YES];\n        }\n        if ([appDict objectForKey:OPT_REPEAT_LAST] != nil && [[appDict objectForKey:OPT_REPEAT_LAST] boolValue]) {\n          [appOpts setRepeatLast:YES];\n        }\n        if ([appDict objectForKey:OPT_MAIN_FIRST] != nil && [[appDict objectForKey:OPT_MAIN_FIRST] boolValue]) {\n          [appOpts setMainFirst:YES];\n        }\n        if ([appDict objectForKey:OPT_MAIN_LAST] != nil && [[appDict objectForKey:OPT_MAIN_LAST] boolValue]) {\n          [appOpts setMainLast:YES];\n        }\n        if ([appDict objectForKey:OPT_SORT_TITLE] != nil && [[appDict objectForKey:OPT_SORT_TITLE] boolValue]) {\n          [appOpts setSortTitle:YES];\n        }\n        if ([appDict objectForKey:OPT_TITLE_ORDER] != nil && [[appDict objectForKey:OPT_TITLE_ORDER] isKindOfClass:[NSArray class]]) {\n          [appOpts setTitleOrder:[appDict objectForKey:OPT_TITLE_ORDER]];\n        }\n        if ([appDict objectForKey:OPT_TITLE_ORDER_REGEX] != nil && [[appDict objectForKey:OPT_TITLE_ORDER_REGEX] isKindOfClass:[NSArray class]]) {\n          [appOpts setTitleOrderRegex:[appDict objectForKey:OPT_TITLE_ORDER_REGEX]];\n        }\n        [appOptions setObject:appOpts forKey:appName];\n      }\n    }\n  }\n  return self;\n}\n\n- (void)addWithString:(NSString *)layout {\n  // layout <name> <app name> <op+params> (| <op+params>)*\n  NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n  [StringTokenizer tokenize:layout into:tokens maxTokens:4 quoteChars:[NSCharacterSet characterSetWithCharactersInString:QUOTES]];\n  if ([tokens count] <=3) {\n    @throw([NSException exceptionWithName:@\"Unrecognized Layout\" reason:layout userInfo:nil]);\n  }\n\n  [self setName:[tokens objectAtIndex:1]];\n\n  NSArray *appNameAndOptions = [[tokens objectAtIndex:2] componentsSeparatedByString:COLON];\n  NSString *appName = [appNameAndOptions objectAtIndex:0];\n  if ([APP_NAME_BEFORE isEqualToString:appName]) {\n    NSString *opsString = [tokens objectAtIndex:3];\n    Operation *op = [Operation operationFromString:opsString];\n    if (op != nil) {\n      [before addObject:op];\n    } else {\n      SlateLogger(@\"ERROR: Invalid Operation in before: '%@'\", opsString);\n      @throw([NSException exceptionWithName:@\"Invalid Operation in before\" reason:[NSString stringWithFormat:@\"Invalid operation '%@' in chain.\", opsString] userInfo:nil]);\n    }\n  } else if([APP_NAME_AFTER isEqualToString:appName]) {\n    NSString *opsString = [tokens objectAtIndex:3];\n    Operation *op = [Operation operationFromString:opsString];\n    if (op != nil) {\n      [after addObject:op];\n    } else {\n      SlateLogger(@\"ERROR: Invalid Operation in after: '%@'\", opsString);\n      @throw([NSException exceptionWithName:@\"Invalid Operation in after\" reason:[NSString stringWithFormat:@\"Invalid operation '%@' in chain.\", opsString] userInfo:nil]);\n    }\n  } else {\n    if ([appOptions objectForKey:appName] != nil) [appOrder removeObject:appName];\n    [appOrder addObject:appName];\n\n    if ([appNameAndOptions count] > 1) {\n      NSString *options = [appNameAndOptions objectAtIndex:1];\n      ApplicationOptions *appOpts = [[ApplicationOptions alloc] init];\n      NSArray *optArr = [options componentsSeparatedByString:COMMA];\n      for (NSInteger i = 0; i < [optArr count]; i++) {\n        NSString *option = [optArr objectAtIndex:i];\n        if ([option isEqualToString:IGNORE_FAIL]) {\n          [appOpts setIgnoreFail:YES];\n        } else if ([option isEqualToString:REPEAT]) {\n          [appOpts setRepeat:YES];\n        } else if ([option isEqualToString:REPEAT_LAST]) {\n          [appOpts setRepeatLast:YES];\n        } else if ([option isEqualToString:MAIN_FIRST]) {\n          [appOpts setMainFirst:YES];\n        } else if ([option isEqualToString:MAIN_LAST]) {\n          [appOpts setMainLast:YES];\n        } else if ([option isEqualToString:SORT_TITLE]) {\n          [appOpts setSortTitle:YES];\n        } else if ([option rangeOfString:TITLE_ORDER].length > 0) {\n          [appOpts setTitleOrder:[[[option componentsSeparatedByString:EQUALS] objectAtIndex:1] componentsSeparatedByString:SEMICOLON]];\n        } else if ([option rangeOfString:TITLE_ORDER_REGEX].length > 0) {\n          [appOpts setTitleOrderRegex:[[[option componentsSeparatedByString:EQUALS] objectAtIndex:1] componentsSeparatedByString:SEMICOLON]];\n        }\n      }\n      [appOptions setObject:appOpts forKey:appName];\n    } else {\n      [appOptions setObject:[[ApplicationOptions alloc] init] forKey:appName];\n    }\n    NSString *opsString = [tokens objectAtIndex:3];\n    NSArray *ops = [opsString componentsSeparatedByString:PIPE_PADDED];\n    NSMutableArray *opArray = [[NSMutableArray alloc] initWithCapacity:10];\n    for (NSInteger i = 0; i < [ops count]; i++) {\n      Operation *op = [Operation operationFromString:[ops objectAtIndex:i]];\n      if (op != nil) {\n        [opArray addObject:op];\n      } else {\n        SlateLogger(@\"ERROR: Invalid Operation in Chain: '%@'\", [ops objectAtIndex:i]);\n        @throw([NSException exceptionWithName:@\"Invalid Operation in Chain\" reason:[NSString stringWithFormat:@\"Invalid operation '%@' in chain.\", [ops objectAtIndex:i]] userInfo:nil]);\n      }\n    }\n\n    [[self appStates] setObject:opArray forKey:appName];\n  }\n}\n\n@end\n"
  },
  {
    "path": "Slate/LayoutOperation.h",
    "content": "//\n//  LayoutOperation.h\n//  Slate\n//\n//  Created by Jigish Patel on 6/14/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n#import \"Operation.h\"\n\n\n@interface LayoutOperation : Operation {\n@private\n  NSString *name;\n}\n\n@property (copy) NSString *name;\n\n- (id)initWithName:(NSString *)theName;\n- (BOOL)testOperation:(Operation *)op;\n\n+ (BOOL)activateLayout:(NSString *)name;\n+ (BOOL)activateLayout:(NSString *)name screenWrapper:(ScreenWrapper *)sw;\n+ (id)layoutOperation;\n+ (id)layoutOperationFromString:(NSString *)layoutOperation;\n\n@end\n"
  },
  {
    "path": "Slate/LayoutOperation.m",
    "content": "//\n//  LayoutOperation.m\n//  Slate\n//\n//  Created by Jigish Patel on 6/14/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"ApplicationOptions.h\"\n#import \"Constants.h\"\n#import \"Layout.h\"\n#import \"LayoutOperation.h\"\n#import \"SlateConfig.h\"\n#import \"StringTokenizer.h\"\n#import \"SlateLogger.h\"\n#import \"RunningApplications.h\"\n\n@implementation LayoutOperation\n\n@synthesize name;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [self setName:nil];\n  }\n  return self;\n}\n\n- (id)initWithName:(NSString *)theName {\n  self = [self init];\n  if (self) {\n    [self setName:theName];\n  }\n  return self;\n}\n\n- (BOOL)doOperation {\n  SlateLogger(@\"----------------- Begin Layout Operation -----------------\");\n  ScreenWrapper *sw = [[ScreenWrapper alloc] init];\n  // We don't use the passed in AccessibilityWrapper so it is nil. No need to waste time creating one here\n  BOOL success = [self doOperationWithAccessibilityWrapper:nil screenWrapper:sw];\n  SlateLogger(@\"-----------------  End Layout Operation  -----------------\");\n  return success;\n}\n\n// Note that the AccessibilityWrapper is never used because layouts use multiple applications\n- (BOOL)doOperationWithAccessibilityWrapper:(AccessibilityWrapper *)iamnil screenWrapper:(ScreenWrapper *)sw {\n  [self evalOptionsWithAccessibilityWrapper:iamnil screenWrapper:sw];\n  return [LayoutOperation activateLayout:[self name] screenWrapper:sw];\n}\n\n- (BOOL)testOperation:(Operation *)op {\n  BOOL success = [op testOperation];\n  return success;\n}\n\n- (BOOL)testOperation {\n  BOOL success = YES;\n  Layout *layout = [[[SlateConfig getInstance] layouts] objectForKey:[self name]];\n  if (layout == nil) {\n    @throw([NSException exceptionWithName:@\"Unrecognized Layout\" reason:[self name] userInfo:nil]);\n  }\n  NSArray *apps = [[layout appStates] allKeys];\n  for (NSInteger i = 0; i < [apps count]; i++) {\n    NSArray *ops = [[layout appStates] objectForKey:[apps objectAtIndex:i]];\n    for (NSInteger op = 0; op < [ops count]; op++) {\n      success = [self testOperation:[ops objectAtIndex:op]] && success;\n    }\n  }\n  return success;\n}\n\n- (NSArray *)requiredOptions {\n  return [NSArray arrayWithObjects:OPT_NAME, nil];\n}\n\n- (void)parseOption:(NSString *)_name value:(id)value {\n  if (value == nil) { return; }\n  if ([_name isEqualToString:OPT_NAME]) {\n    if (![value isKindOfClass:[NSString class]]) {\n      @throw([NSException exceptionWithName:[NSString stringWithFormat:@\"Invalid %@\", _name] reason:[NSString stringWithFormat:@\"Invalid %@ '%@'\", _name, value] userInfo:nil]);\n      return;\n    }\n    [self setName:value];\n  }\n}\n\n+ (BOOL)activateLayout:(NSString *)name screenWrapper:(ScreenWrapper *)sw {\n  Layout *layout = [[[SlateConfig getInstance] layouts] objectForKey:name];\n  if (layout == nil) {\n    @throw([NSException exceptionWithName:@\"Unrecognized Layout\" reason:name userInfo:nil]);\n  }\n\n  BOOL success = YES;\n\n  id appsArray = nil;\n  if ([[SlateConfig getInstance] getBoolConfig:LAYOUT_FOCUS_ON_ACTIVATE]) {\n    appsArray = [NSMutableArray array];\n    for (NSString *appName in [layout appOrder]) {\n      NSRunningApplication *appToAdd = [[[RunningApplications getInstance] appNameToApp] objectForKey:appName];\n      if (appToAdd != nil) [appsArray addObject:appToAdd];\n    }\n  } else {\n    appsArray = [RunningApplications getInstance];\n  }\n\n  // do before\n  for (Operation *op in [layout before]) {\n    [op doOperation];\n  }\n\n  for (NSRunningApplication *app in appsArray) {\n    NSString *appName = [app localizedName];\n    pid_t appPID = [app processIdentifier];\n    SlateLogger(@\"I see application '%@' with pid '%d'\", appName, appPID);\n\n    NSArray *operations = [[layout appStates] objectForKey:appName];\n    if (operations == nil) {\n      continue;\n    }\n\n    // Yes, I am aware that the following blocks are inefficient. Deal with it.\n    AXUIElementRef appRef = AXUIElementCreateApplication(appPID);\n    CFArrayRef windowsArrRef = [AccessibilityWrapper windowsInApp:appRef];\n    if (!windowsArrRef || CFArrayGetCount(windowsArrRef) == 0) continue;\n    CFMutableArrayRef windowsArr = CFArrayCreateMutableCopy(kCFAllocatorDefault, 0, windowsArrRef);\n    CFMutableArrayRef windows = CFArrayCreateMutable(kCFAllocatorDefault, CFArrayGetCount(windowsArr), &kCFTypeArrayCallBacks);\n    CFMutableArrayRef windowsAppend = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);\n    // First Pass for main window if needed\n    if ([(ApplicationOptions *)[[layout appOptions] objectForKey:appName] mainFirst]) {\n      SlateLogger(@\"Main First\");\n      for (NSInteger i = 0; i < CFArrayGetCount(windowsArr); i++) {\n        if([AccessibilityWrapper isMainWindow:CFArrayGetValueAtIndex(windowsArr, i)]) {\n          SlateLogger(@\" Found Main\");\n          CFArrayAppendValue(windows, CFArrayGetValueAtIndex(windowsArr, i));\n          CFArrayRemoveValueAtIndex(windowsArr, i);\n          break;\n        }\n      }\n    } else if ([(ApplicationOptions *)[[layout appOptions] objectForKey:appName] mainLast]) {\n      SlateLogger(@\"Main Last\");\n      CFRelease(windowsAppend);\n      windowsAppend = CFArrayCreateMutable(kCFAllocatorDefault, 1, &kCFTypeArrayCallBacks);\n      for (NSInteger i = 0; i < CFArrayGetCount(windowsArr); i++) {\n        if([AccessibilityWrapper isMainWindow:CFArrayGetValueAtIndex(windowsArr, i)]) {\n          SlateLogger(@\" Found Main\");\n          CFArrayAppendValue(windowsAppend, CFArrayGetValueAtIndex(windowsArr, i));\n          CFArrayRemoveValueAtIndex(windowsArr, i);\n          break;\n        }\n      }\n    }\n    // Second Pass for title order if needed\n    if ([(ApplicationOptions *)[[layout appOptions] objectForKey:appName] titleOrder] != nil) {\n      NSMutableArray *titleOrder = [NSMutableArray arrayWithArray:[(ApplicationOptions *)[[layout appOptions] objectForKey:appName] titleOrder]];\n      SlateLogger(@\"Title Order: %@\", titleOrder);\n      for (NSInteger j = 0; j < [titleOrder count]; j++) {\n        for (NSInteger i = 0; i < CFArrayGetCount(windowsArr); i++) {\n          SlateLogger(@\" Checking Title: %@\", [AccessibilityWrapper getTitle:CFArrayGetValueAtIndex(windowsArr, i)]);\n          if([[AccessibilityWrapper getTitle:CFArrayGetValueAtIndex(windowsArr, i)] isEqualToString:[titleOrder objectAtIndex:j]]) {\n            SlateLogger(@\" Found Title: %@\", [titleOrder objectAtIndex:j]);\n            CFArrayAppendValue(windows, CFArrayGetValueAtIndex(windowsArr, i));\n            CFArrayRemoveValueAtIndex(windowsArr, i);\n            break;\n          }\n        }\n      }\n    }\n    // Third Pass for title order regex if needed\n    if ([(ApplicationOptions *)[[layout appOptions] objectForKey:appName] titleOrderRegex] != nil) {\n      NSMutableArray *titleOrder = [NSMutableArray arrayWithArray:[(ApplicationOptions *)[[layout appOptions] objectForKey:appName] titleOrderRegex]];\n      SlateLogger(@\"Title Order Regex: %@\", titleOrder);\n      for (NSInteger j = 0; j < [titleOrder count]; j++) {\n        for (NSInteger i = 0; i < CFArrayGetCount(windowsArr); i++) {\n          SlateLogger(@\" Checking Title: %@\", [AccessibilityWrapper getTitle:CFArrayGetValueAtIndex(windowsArr, i)]);\n          NSError *error = nil;\n          NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:[titleOrder objectAtIndex:j] options:0 error:&error];\n          if (error != NULL && error != nil) {\n            continue;\n          }\n          NSString *currWinTitle = [AccessibilityWrapper getTitle:CFArrayGetValueAtIndex(windowsArr, i)];\n          NSUInteger numMatches = [regex numberOfMatchesInString:currWinTitle options:0 range:NSMakeRange(0, [currWinTitle length])];\n          if(numMatches > 0) {\n            SlateLogger(@\" Found Title: %@\", currWinTitle);\n            CFArrayAppendValue(windows, CFArrayGetValueAtIndex(windowsArr, i));\n            CFArrayRemoveValueAtIndex(windowsArr, i);\n            break;\n          }\n        }\n      }\n    }\n    // Fourth Pass for sort\n    if ([(ApplicationOptions *)[[layout appOptions] objectForKey:appName] sortTitle]) {\n      SlateLogger(@\"Sort By Title\");\n      while (CFArrayGetCount(windowsArr) > 0) {\n        NSString *title = nil;\n        NSInteger index = 0;\n        for (NSInteger i = 0; i < CFArrayGetCount(windowsArr); i++) {\n          NSString *currTitle = [AccessibilityWrapper getTitle:CFArrayGetValueAtIndex(windowsArr, i)];\n          if (title == nil) {\n            title = currTitle;\n            index = i;\n            continue;\n          }\n          if ([title compare:currTitle] == NSOrderedDescending) {\n            title = currTitle;\n            index = i;\n          }\n        }\n        CFArrayAppendValue(windows, CFArrayGetValueAtIndex(windowsArr, index));\n        CFArrayRemoveValueAtIndex(windowsArr, index);\n      }\n    } else {\n      SlateLogger(@\"No Sort\");\n      CFArrayAppendArray(windows, windowsArr, CFRangeMake(0, CFArrayGetCount(windowsArr)));\n    }\n    CFArrayAppendArray(windows, windowsAppend, CFRangeMake(0, CFArrayGetCount(windowsAppend)));\n\n    NSInteger failedWindows = 0;\n    BOOL appSuccess = YES;\n    if ([(ApplicationOptions *)[[layout appOptions] objectForKey:appName] repeat]) {\n      for (NSInteger i = 0; i < CFArrayGetCount(windows); i++) {\n        AccessibilityWrapper *aw = [[AccessibilityWrapper alloc] initWithApp:appRef window:CFArrayGetValueAtIndex(windows, i)];\n        appSuccess = [[operations objectAtIndex:((i-failedWindows) % [operations count])] doOperationWithAccessibilityWrapper:aw screenWrapper:sw] && appSuccess;\n        if ([[SlateConfig getInstance] getBoolConfig:LAYOUT_FOCUS_ON_ACTIVATE]) { [aw focus]; }\n        if (![(ApplicationOptions *)[[layout appOptions] objectForKey:appName] ignoreFail] && !appSuccess)\n          failedWindows++;\n      }\n    } else if ([(ApplicationOptions *)[[layout appOptions] objectForKey:appName] repeatLast]) {\n      for (NSInteger i = 0; i < CFArrayGetCount(windows); i++) {\n        AccessibilityWrapper *aw = [[AccessibilityWrapper alloc] initWithApp:appRef window:CFArrayGetValueAtIndex(windows, i)];\n        NSInteger opIndex = ((i-failedWindows) % [operations count]);\n        if (i-failedWindows >= [operations count]) {\n          opIndex = [operations count] - 1;\n        }\n        appSuccess = [[operations objectAtIndex:opIndex] doOperationWithAccessibilityWrapper:aw screenWrapper:sw] && appSuccess;\n        if ([[SlateConfig getInstance] getBoolConfig:LAYOUT_FOCUS_ON_ACTIVATE]) { [aw focus]; }\n        if (![(ApplicationOptions *)[[layout appOptions] objectForKey:appName] ignoreFail] && !appSuccess)\n          failedWindows++;\n      }\n    } else {\n      for (NSInteger i = 0; i < CFArrayGetCount(windows) && i-failedWindows < [operations count]; i++) {\n        AccessibilityWrapper *aw = [[AccessibilityWrapper alloc] initWithApp:appRef window:CFArrayGetValueAtIndex(windows, i)];\n        appSuccess = [[operations objectAtIndex:(i-failedWindows)] doOperationWithAccessibilityWrapper:aw screenWrapper:sw] && appSuccess;\n        if ([[SlateConfig getInstance] getBoolConfig:LAYOUT_FOCUS_ON_ACTIVATE]) { [aw focus]; }\n        if (![(ApplicationOptions *)[[layout appOptions] objectForKey:appName] ignoreFail] && !appSuccess)\n          failedWindows++;\n      }\n    }\n    success = appSuccess && success;\n    CFRelease(windows);\n    CFRelease(windowsArr);\n    CFRelease(windowsAppend);\n  }\n\n  // do after\n  for (Operation *op in [layout after]) {\n    [op doOperation];\n  }\n  return success;\n}\n\n+ (BOOL)activateLayout:(NSString *)name {\n  ScreenWrapper *sw = [[ScreenWrapper alloc] init];\n  return [LayoutOperation activateLayout:name screenWrapper:sw];\n}\n\n+ (id)layoutOperation {\n  return [[LayoutOperation alloc] init];\n}\n\n+ (id)layoutOperationFromString:(NSString *)layoutOperation {\n  // layout <name>\n  NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n  [StringTokenizer tokenize:layoutOperation into:tokens maxTokens:2];\n\n  if ([tokens count] < 2) {\n    SlateLogger(@\"ERROR: Invalid Parameters '%@'\", layoutOperation);\n    @throw([NSException exceptionWithName:@\"Invalid Parameters\" reason:[NSString stringWithFormat:@\"Invalid Parameters in '%@'. Layout operations require the following format: 'layout <name>'\", layoutOperation] userInfo:nil]);\n  }\n\n  Operation *op = [[LayoutOperation alloc] initWithName:[tokens objectAtIndex:1]];\n  return op;\n}\n\n@end\n"
  },
  {
    "path": "Slate/MathUtils.h",
    "content": "//\n//  MathUtils.h\n//  Slate\n//\n//  Created by Jigish Patel on 6/22/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n\n\n@interface MathUtils : NSObject {}\n\n+ (BOOL)isRect:(NSRect)rect1 biggerThan:(NSRect)rect2;\n+ (NSRect)flipYCoordinateOfRect:(NSRect)original withReference:(NSRect)reference;\n+ (NSRect)scaleRect:(NSRect)rect factor:(double)factor;\n+ (NSRect)weightedIntersectionOf:(NSRect)rect1 and:(NSRect)rect2 weight:(double)weight;\n\n@end\n"
  },
  {
    "path": "Slate/MathUtils.m",
    "content": "//\n//  MathUtils.m\n//  Slate\n//\n//  Created by Jigish Patel on 6/22/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"MathUtils.h\"\n\n\n@implementation MathUtils\n\n+ (BOOL)isRect:(NSRect)rect1 biggerThan:(NSRect)rect2 {\n  return rect1.size.width*rect1.size.height > rect2.size.width*rect2.size.height;\n}\n\n// I understand that the following method is stupidly written. Apple apparently enjoys keeping\n// multiple types of coordinate spaces. NSScreen.origin returns bottom-left while we need\n// top-left for window moving. Go figure.\n+ (NSRect)flipYCoordinateOfRect:(NSRect)original withReference:(NSRect)reference {\n  return NSMakeRect(original.origin.x,\n                    reference.size.height - (reference.origin.y + original.origin.y + original.size.height),\n                    original.size.width,\n                    original.size.height);\n}\n\n+ (NSRect)scaleRect:(NSRect)rect factor:(double)factor {\n  return NSMakeRect(rect.origin.x, rect.origin.y, rect.size.width*factor, rect.size.height*factor);\n}\n\n+ (NSRect)weightedIntersectionOf:(NSRect)rect1 and:(NSRect)rect2 weight:(double)weight {\n  NSRect intersection = NSIntersectionRect(rect1, rect2);\n  if (NSEqualRects(intersection, NSZeroRect)) return NSZeroRect;\n  return [MathUtils scaleRect:intersection factor:weight];\n}\n\n@end\n"
  },
  {
    "path": "Slate/MoveOperation.h",
    "content": "//\n//  MoveOperation.h\n//  Slate\n//\n//  Created by Jigish Patel on 5/18/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n#import \"Operation.h\"\n#import \"ExpressionPoint.h\"\n\n\n@interface MoveOperation : Operation {\n@private\n  ExpressionPoint *topLeft;\n  ExpressionPoint *dimensions;\n  NSString *monitor;\n  NSInteger screenId;\n}\n\n@property ExpressionPoint *topLeft;\n@property ExpressionPoint *dimensions;\n@property NSString *monitor;\n@property NSInteger screenId;\n\n- (id)initWithTopLeft:(NSString *)tl dimensions:(NSString *)dim monitor:(NSString *)mon;\n- (id)initWithTopLeftEP:(ExpressionPoint *)tl dimensionsEP:(ExpressionPoint *)dim screenId:(NSInteger)myScreenId;\n- (NSPoint)getTopLeftWithCurrentWindowRect:(NSRect)cWindowRect newSize:(NSSize)nSize screenWrapper:(ScreenWrapper *)sw;\n- (NSSize)getDimensionsWithCurrentWindowRect:(NSRect)cWindowRect screenWrapper:(ScreenWrapper *)sw;\n\n+ (id)moveOperation;\n+ (id)moveOperationFromString:(NSString *)moveOperation;\n\n@end\n"
  },
  {
    "path": "Slate/MoveOperation.m",
    "content": "//\n//  MoveOperation.m\n//  Slate\n//\n//  Created by Jigish Patel on 5/18/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"AccessibilityWrapper.h\"\n#import \"Constants.h\"\n#import \"MoveOperation.h\"\n#import \"ScreenWrapper.h\"\n#import \"SlateConfig.h\"\n#import \"StringTokenizer.h\"\n#import \"SlateLogger.h\"\n\n@implementation MoveOperation\n\n@synthesize topLeft;\n@synthesize dimensions;\n@synthesize monitor;\n@synthesize screenId;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [self setTopLeft:[[ExpressionPoint alloc] initWithX:@\"\" y:@\"\"]];\n    [self setDimensions:[[ExpressionPoint alloc] initWithX:@\"\" y:@\"\"]];\n    [self setMonitor:REF_CURRENT_SCREEN];\n    [self setScreenId:-1];\n  }\n  return self;\n}\n\n- (id)initWithTopLeft:(NSString *)tl dimensions:(NSString *)dim monitor:(NSString *)mon {\n  self = [self init];\n  if (self) {\n    NSArray *tlTokens = [tl componentsSeparatedByString:SEMICOLON];\n    if ([tlTokens count] == 2) {\n      [self setTopLeft:[[ExpressionPoint alloc] initWithX:[tlTokens objectAtIndex:0] y:[tlTokens objectAtIndex:1]]];\n    } else {\n      tlTokens = [tl componentsSeparatedByString:COMMA];\n      if ([tlTokens count] == 2) {\n        [self setTopLeft:[[ExpressionPoint alloc] initWithX:[tlTokens objectAtIndex:0] y:[tlTokens objectAtIndex:1]]];\n      } else {\n        return nil;\n      }\n    }\n    NSArray *dimTokens = [dim componentsSeparatedByString:SEMICOLON];\n    if ([dimTokens count] == 2) {\n      [self setDimensions:[[ExpressionPoint alloc] initWithX:[dimTokens objectAtIndex:0] y:[dimTokens objectAtIndex:1]]];\n    } else {\n      dimTokens = [dim componentsSeparatedByString:COMMA];\n      if ([dimTokens count] == 2) {\n        [self setDimensions:[[ExpressionPoint alloc] initWithX:[dimTokens objectAtIndex:0] y:[dimTokens objectAtIndex:1]] ];\n      } else {\n        return nil;\n      }\n    }\n    [self setMonitor:mon];\n    [self setScreenId:-1];\n  }\n\n  return self;\n}\n\n- (id)initWithTopLeftEP:(ExpressionPoint *)tl dimensionsEP:(ExpressionPoint *)dim screenId:(NSInteger)myScreenId {\n  self = [self init];\n  if (self) {\n    [self setTopLeft:tl];\n    [self setDimensions:dim];\n    [self setScreenId:myScreenId];\n    [self setMonitor:nil];\n  }\n\n  return self;\n}\n\n- (BOOL)doOperationWithAccessibilityWrapper:(AccessibilityWrapper *)aw screenWrapper:(ScreenWrapper *)sw {\n  BOOL success = NO;\n  [self evalOptionsWithAccessibilityWrapper:aw screenWrapper:sw];\n  NSPoint cTopLeft = [aw getCurrentTopLeft];\n  NSSize cSize = [aw getCurrentSize];\n  NSRect cWindowRect = NSMakeRect(cTopLeft.x, cTopLeft.y, cSize.width, cSize.height);\n  NSSize nSize = [self getDimensionsWithCurrentWindowRect:cWindowRect screenWrapper:sw];\n  success = [aw resizeWindow:nSize];\n  NSSize realNewSize = [aw getCurrentSize];\n  NSPoint nTopLeft = [self getTopLeftWithCurrentWindowRect:cWindowRect newSize:realNewSize screenWrapper:sw];\n  success = [aw moveWindow:nTopLeft] && success;\n  success = [aw resizeWindow:nSize] && success;\n  return success;\n}\n\n- (BOOL)doOperation {\n  SlateLogger(@\"----------------- Begin Move Operation -----------------\");\n  AccessibilityWrapper *aw = [[AccessibilityWrapper alloc] init];\n  ScreenWrapper *sw = [[ScreenWrapper alloc] init];\n  BOOL success = NO;\n  if ([aw inited]) success = [self doOperationWithAccessibilityWrapper:aw screenWrapper:sw];\n  SlateLogger(@\"-----------------  End Move Operation  -----------------\");\n  return success;\n}\n\n- (BOOL)testOperation {\n  ScreenWrapper *sw = [[ScreenWrapper alloc] init];\n  NSPoint cTopLeft = NSMakePoint(0, 0);\n  NSSize cSize = NSMakeSize(1000, 1000);\n  NSRect cWindowRect = NSMakeRect(cTopLeft.x, cTopLeft.y, cSize.width, cSize.height);\n  NSSize nSize = [self getDimensionsWithCurrentWindowRect:cWindowRect screenWrapper:sw];\n  [self getTopLeftWithCurrentWindowRect:cWindowRect newSize:nSize screenWrapper:sw];\n  return YES;\n}\n\n- (NSPoint)getTopLeftWithCurrentWindowRect:(NSRect)cWindowRect newSize:(NSSize)nSize screenWrapper:(ScreenWrapper *)sw {\n  // If monitor does not exist send back the same origin\n  if (monitor != nil) {\n    [self setScreenId:[sw getScreenId:monitor windowRect:cWindowRect]];\n  }\n  if (![sw screenExists:[self screenId]]) return cWindowRect.origin;\n  NSDictionary *values = [sw getScreenAndWindowValues:screenId window:cWindowRect newSize:nSize];\n  return [topLeft getPointWithDict:values];\n}\n\n- (NSSize)getDimensionsWithCurrentWindowRect:(NSRect)cWindowRect screenWrapper:(ScreenWrapper *)sw {\n  // If monitor does not exist send back the same size\n  if (monitor != nil) {\n    [self setScreenId:[sw getScreenId:monitor windowRect:cWindowRect]];\n  }\n  if (![sw screenExists:[self screenId]]) return cWindowRect.size;\n  NSDictionary *values = [sw getScreenAndWindowValues:screenId window:cWindowRect newSize:cWindowRect.size];\n  return [dimensions getSizeWithDict:values];\n}\n\n- (NSArray *)requiredOptions {\n  return [NSArray arrayWithObjects:OPT_X, OPT_Y, OPT_WIDTH, OPT_HEIGHT, nil];\n}\n\n- (void)parseOption:(NSString *)name value:(id)val {\n  // all options should be strings\n  if (val == nil) { return; }\n  NSString *value = nil;\n  if ([val isKindOfClass:[NSString class]]) {\n    value = val;\n  } else if ([val isKindOfClass:[NSNumber class]]) {\n    value = [val stringValue];\n  } else {\n    @throw([NSException exceptionWithName:[NSString stringWithFormat:@\"Invalid %@\", name] reason:[NSString stringWithFormat:@\"Invalid %@ '%@'\", name, val] userInfo:nil]);\n    return;\n  }\n  [[self options] setValue:value forKey:name];\n  if ([name isEqualToString:OPT_X]) {\n    [[self topLeft] setX:value];\n  } else if ([name isEqualToString:OPT_Y]) {\n    [[self topLeft] setY:value];\n  } else if ([name isEqualToString:OPT_SCREEN]) {\n    [self setMonitor:value];\n  } else if ([name isEqualToString:OPT_WIDTH]) {\n    [[self dimensions] setX:value];\n  } else if ([name isEqualToString:OPT_HEIGHT]) {\n    [[self dimensions] setY:value];\n  }\n}\n\n+ (id)moveOperation {\n  return [[MoveOperation alloc] init];\n}\n\n+ (id)moveOperationFromString:(NSString *)moveOperation {\n  // move <topLeft> <dimensions> <optional:monitor>\n  NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n  [StringTokenizer tokenize:moveOperation into:tokens];\n\n  if ([tokens count] < 3) {\n    SlateLogger(@\"ERROR: Invalid Parameters '%@'\", moveOperation);\n    @throw([NSException exceptionWithName:@\"Invalid Parameters\" reason:[NSString stringWithFormat:@\"Invalid Parameters in '%@'. Move operations require the following format: 'move topLeftX;topLeftY width;height [optional:screemNumber]'\", moveOperation] userInfo:nil]);\n  }\n\n  Operation *op = nil;\n  op = [[MoveOperation alloc] initWithTopLeft:[tokens objectAtIndex:1] dimensions:[tokens objectAtIndex:2] monitor:([tokens count] >=4 ? [tokens objectAtIndex:3] : REF_CURRENT_SCREEN)];\n  return op;\n}\n\n@end\n"
  },
  {
    "path": "Slate/NSFileManager+ApplicationSupport.h",
    "content": "//\n//  NSFileManager+ApplicationSupport.h\n//  Slate\n//\n//  Created by Jigish Patel on 4/23/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n\n@interface NSFileManager (ApplicationSupport)\n\n- (NSURL *)applicationSupportDirectory;\n- (NSURL *)findOrCreateDirectory:(NSSearchPathDirectory)searchPathDirectory inDomain:(NSSearchPathDomainMask)domainMask append:(NSString *)appendComponent error:(NSError **)errorOut;\n\n@end\n"
  },
  {
    "path": "Slate/NSFileManager+ApplicationSupport.m",
    "content": "//\n//  NSFileManager+ApplicationSupport.m\n//  Slate\n//\n//  Created by Jigish Patel on 4/23/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"NSFileManager+ApplicationSupport.h\"\n\n@implementation NSFileManager (ApplicationSupport)\n\n- (NSURL *)applicationSupportDirectory {\n  return [self findOrCreateDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask append:[[NSBundle mainBundle] bundleIdentifier] error:nil];\n}\n\n- (NSURL *)findOrCreateDirectory:(NSSearchPathDirectory)searchPathDirectory inDomain:(NSSearchPathDomainMask)domainMask append:(NSString *)appendComponent error:(NSError **)errorOut {\n  NSArray *urls = [self URLsForDirectory:searchPathDirectory inDomains:domainMask];\n  if ([urls count] == 0) return nil;\n  NSURL *url = [urls objectAtIndex:0];\n\n  if (appendComponent) {\n    url = [url URLByAppendingPathComponent:appendComponent];\n  }\n  NSError *error;\n  SInt32 major, minor, bugfix;\n  Gestalt(gestaltSystemVersionMajor, &major);\n  Gestalt(gestaltSystemVersionMinor, &minor);\n  Gestalt(gestaltSystemVersionBugFix, &bugfix);\n  BOOL success = NO;\n  // need to use AtPath if < 10.7 because AtURL is 10.7 only\n  if (major >= 10 && minor >= 7) {\n    success = [self createDirectoryAtURL:url withIntermediateDirectories:YES attributes:nil error:&error];\n  } else {\n    success = [self createDirectoryAtPath:[url path] withIntermediateDirectories:YES attributes:nil error:&error];\n  }\n  if (!success) {\n    if (errorOut) *errorOut = error;\n    return nil;\n  }\n  if (errorOut) *errorOut = nil;\n  return url;\n}\n\n@end\n"
  },
  {
    "path": "Slate/NSString+Indicies.h",
    "content": "//\n//  NSString+Indicies.h\n//  Slate\n//\n//  Created by Jigish Patel on 10/1/12.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n\n@interface NSString (Indicies)\n\n- (NSInteger)indexOfString:(NSString *)str;\n- (NSInteger)indexOfChar:(const unichar)c;\n\n@end\n"
  },
  {
    "path": "Slate/NSString+Indicies.m",
    "content": "//\n//  NSString+Indicies.m\n//  Slate\n//\n//  Created by Jigish Patel on 10/1/12.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"NSString+Indicies.h\"\n\n@implementation NSString (Indicies)\n\n- (NSInteger)indexOfString:(NSString *)str {\n  NSRange range = [self rangeOfString:str];\n  if ( range.length > 0 ) {\n    return range.location;\n  } else {\n    return -1;\n  }\n}\n\n- (NSInteger)indexOfChar:(const unichar) c {\n  NSRange range = [self rangeOfString:[NSString stringWithCharacters:&c length:1]];\n  if ( range.length > 0 ) {\n    return range.location;\n  } else {\n    return -1;\n  }\n}\n\n@end\n"
  },
  {
    "path": "Slate/NSString+Levenshtein.h",
    "content": "//\n//  NSString+Levenshtein.h\n//  Slate\n//\n//  Created by Jigish Patel on 3/1/12.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n\n@interface NSString (Levenshtein)\n\n- (float) levenshteinDistance: (NSString *) stringB;\n- (float) sequentialDistance: (NSString *) stringB;\n\n- (int) smallestOf: (int) a andOf: (int) b andOf: (int) c;\n\n@end\n"
  },
  {
    "path": "Slate/NSString+Levenshtein.m",
    "content": "//\n//  NSString+Levenshtein.m\n//  Slate\n//\n//  Created by Jigish Patel on 3/1/12.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"NSString+Levenshtein.h\"\n\n@implementation NSString (Levenshtein)\n\n- (float) levenshteinDistance:(NSString *)stringB {\n  // normalize strings\n  NSString * stringA = [NSString stringWithString: self];\n  [stringA stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];\n  [stringB stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];\n  stringA = [stringA lowercaseString];\n  stringB = [stringB lowercaseString];\n\n  // Step 1\n  int k, i, j, cost, * d, distance;\n  NSUInteger n = [stringA length];\n  NSUInteger m = [stringB length];\n  if( n++ != 0 && m++ != 0 ) {\n    d = malloc( sizeof(int) * m * n );\n    // Step 2\n    for( k = 0; k < n; k++)\n      d[k] = k;\n    for( k = 0; k < m; k++)\n      d[ k * n ] = k;\n    // Step 3 and 4\n    for( i = 1; i < n; i++ )\n      for( j = 1; j < m; j++ ) {\n        // Step 5\n        if( [stringA characterAtIndex: i-1] ==\n           [stringB characterAtIndex: j-1] )\n          cost = 0;\n        else\n          cost = 1;\n        // Step 6\n        d[ j * n + i ] = [self smallestOf: d [ (j - 1) * n + i ] + 1\n                                    andOf: d[ j * n + i - 1 ] +  1\n                                    andOf: d[ (j - 1) * n + i -1 ] + cost ];\n      }\n    distance = d[ n * m - 1 ];\n    free( d );\n    return distance;\n  }\n  return 0.0;\n}\n\n- (float) sequentialDistance:(NSString *)stringB {\n  NSString * stringA = [NSString stringWithString: self];\n  [stringA stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];\n  [stringB stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];\n  stringA = [stringA lowercaseString];\n  stringB = [stringB lowercaseString];\n  float distance = 0.0;\n  for (NSInteger i = 0; i < MIN([stringA length], [stringB length]); i++) {\n    if ([stringA characterAtIndex:i] == [stringB characterAtIndex:i]) distance++;\n    else break;\n  }\n  return distance;\n}\n\n\n// return the minimum of a, b and c\n- (int) smallestOf:(int)a andOf:(int)b andOf:(int)c {\n  int min = a;\n  if ( b < min )\n    min = b;\n  if( c < min )\n    min = c;\n  return min;\n}\n\n@end\n"
  },
  {
    "path": "Slate/NudgeOperation.h",
    "content": "//\n//  NudgeOperation.h\n//  Slate\n//\n//  Created by Jigish Patel on 1/20/13.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"MoveOperation.h\"\n\n@interface NudgeOperation : MoveOperation\n\n+ (id)nudgeOperation;\n+ (id)nudgeOperationFromString:(NSString *)nudgeOperation;\n\n@end\n"
  },
  {
    "path": "Slate/NudgeOperation.m",
    "content": "//\n//  NudgeOperation.m\n//  Slate\n//\n//  Created by Jigish Patel on 1/20/13.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"NudgeOperation.h\"\n#import \"Constants.h\"\n#import \"StringTokenizer.h\"\n#import \"SlateLogger.h\"\n#import \"SlateConfig.h\"\n\n@implementation NudgeOperation\n\n- (NSArray *)requiredOptions {\n  return [NSArray arrayWithObjects:OPT_X, OPT_Y, nil];\n}\n\n- (void)beforeInitOptions {\n  [self setDimensions:[[ExpressionPoint alloc] initWithX:@\"windowSizeX\" y:@\"windowSizeY\"]];\n  [self setMonitor:REF_CURRENT_SCREEN];\n}\n\n- (void)parseOption:(NSString *)name value:(NSString *)value {\n  // all options should be strings\n  if (value == nil) { return; }\n  if (![value isKindOfClass:[NSString class]]) {\n    @throw([NSException exceptionWithName:[NSString stringWithFormat:@\"Invalid %@\", name] reason:[NSString stringWithFormat:@\"Invalid %@ '%@'\", name, value] userInfo:nil]);\n    return;\n  }\n  NSString *nudgePercentOf = [[SlateConfig getInstance] getConfig:NUDGE_PERCENT_OF];\n  if ([name isEqualToString:OPT_X]) {\n    NSString *tlX = WINDOW_TOP_LEFT_X;\n    if ([value hasSuffix:PERCENT]) {\n      // % Nudge\n      tlX = [tlX stringByAppendingString:[value stringByReplacingOccurrencesOfString:PERCENT withString:[NSString stringWithFormat:@\"*%@X/100\",nudgePercentOf]]];\n    } else {\n      // Hard Nudge\n      tlX = [tlX stringByAppendingString:value];\n    }\n    [[self topLeft] setX:tlX];\n  } else if ([name isEqualToString:OPT_Y]) {\n    NSString *tlY = WINDOW_TOP_LEFT_Y;\n    if ([value hasSuffix:PERCENT]) {\n      // % Nudge\n      tlY = [tlY stringByAppendingString:[value stringByReplacingOccurrencesOfString:PERCENT withString:[NSString stringWithFormat:@\"*%@Y/100\",nudgePercentOf]]];\n    } else {\n      // Hard Nudge\n      tlY = [tlY stringByAppendingString:value];\n    }\n    [[self topLeft] setY:tlY];\n  }\n}\n\n+ (id)nudgeOperation {\n  return [[NudgeOperation alloc] init];\n}\n\n+ (id)nudgeOperationFromString:(NSString *)nudgeOperation {\n  // nudge x y\n  NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n  [StringTokenizer tokenize:nudgeOperation into:tokens];\n\n  if ([tokens count] < 2) {\n    SlateLogger(@\"ERROR: Invalid Parameters '%@'\", nudgeOperation);\n    @throw([NSException exceptionWithName:@\"Invalid Parameters\" reason:[NSString stringWithFormat:@\"Invalid Parameters in '%@'. Nudge operations require the following format: 'nudge x y'\", nudgeOperation] userInfo:nil]);\n  }\n\n  NSString *tlX = WINDOW_TOP_LEFT_X;\n  NSString *x = [tokens objectAtIndex:1];\n  NSString *nudgePercentOf = [[SlateConfig getInstance] getConfig:NUDGE_PERCENT_OF];\n  if ([x hasSuffix:PERCENT]) {\n    // % Nudge\n    tlX = [tlX stringByAppendingString:[x stringByReplacingOccurrencesOfString:PERCENT withString:[NSString stringWithFormat:@\"*%@X/100\",nudgePercentOf]]];\n  } else {\n    // Hard Nudge\n    tlX = [tlX stringByAppendingString:x];\n  }\n\n  NSString *tlY = WINDOW_TOP_LEFT_Y;\n  NSString *y = [tokens objectAtIndex:2];\n  if ([y hasSuffix:PERCENT]) {\n    // % Nudge\n    tlY = [tlY stringByAppendingString:[y stringByReplacingOccurrencesOfString:PERCENT withString:[NSString stringWithFormat:@\"*%@Y/100\",nudgePercentOf]]];\n  } else {\n    // Hard Nudge\n    tlY = [tlY stringByAppendingString:y];\n  }\n  Operation *op = [[MoveOperation alloc] initWithTopLeft:[[tlX stringByAppendingString:SEMICOLON] stringByAppendingString:tlY] dimensions:@\"windowSizeX;windowSizeY\" monitor:REF_CURRENT_SCREEN];\n  return op;\n}\n\n@end\n"
  },
  {
    "path": "Slate/Operation.h",
    "content": "//\n//  Operation.h\n//  Slate\n//\n//  Created by Jigish Patel on 5/18/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n#import \"AccessibilityWrapper.h\"\n#import \"ScreenWrapper.h\"\n\n\n@interface Operation : NSObject {\n  NSString *opName;\n  NSMutableDictionary *options;\n  NSMutableDictionary *dynamicOptions;\n}\n\n@property NSString *opName;\n@property NSMutableDictionary *options;\n@property NSMutableDictionary *dynamicOptions;\n\n- (BOOL)doOperation;\n- (BOOL)doOperationWithAccessibilityWrapper:(AccessibilityWrapper *)aw screenWrapper:(ScreenWrapper *)sw;\n- (BOOL)testOperation;\n- (BOOL)testOperationWithAccessibilityWrapper:(AccessibilityWrapper *)aw screenWrapper:(ScreenWrapper *)sw;\n- (BOOL)shouldTakeUndoSnapshot;\n- (NSArray *)requiredOptions;\n- (NSString *)checkRequiredOptions:(NSDictionary *)_options;\n- (void)beforeInitOptions;\n- (void)initOptions:(NSDictionary *)_options;\n- (void)parseOption:(NSString *)name value:(id)value;\n- (void)evalOptionsWithAccessibilityWrapper:(AccessibilityWrapper *)aw screenWrapper:(ScreenWrapper *)sw;\n- (void)afterEvalOptions;\n- (id)dup:(NSDictionary *)_options;\n\n+ (id)operationFromString:(NSString *)opString;\n+ (id)operationWithName:(NSString *)op options:(NSDictionary *)options;\n+ (BOOL)isRepeatOnHoldOp:(NSString *)op;\n+ (BOOL)doOperation:(NSString *)op options:(NSDictionary *)options aw:(AccessibilityWrapper *)aw sw:(ScreenWrapper *)sw;\n\n@end\n"
  },
  {
    "path": "Slate/Operation.m",
    "content": "//\n//  Operation.m\n//  Slate\n//\n//  Created by Jigish Patel on 5/18/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"Operation.h\"\n#import \"MoveOperation.h\"\n#import \"ResizeOperation.h\"\n#import \"ChainOperation.h\"\n#import \"LayoutOperation.h\"\n#import \"FocusOperation.h\"\n#import \"SnapshotOperation.h\"\n#import \"ActivateSnapshotOperation.h\"\n#import \"DeleteSnapshotOperation.h\"\n#import \"HintOperation.h\"\n#import \"StringTokenizer.h\"\n#import \"Constants.h\"\n#import \"SlateLogger.h\"\n#import \"SwitchOperation.h\"\n#import \"GridOperation.h\"\n#import \"SequenceOperation.h\"\n#import \"VisibilityOperation.h\"\n#import \"RelaunchOperation.h\"\n#import \"ShellOperation.h\"\n#import \"UndoOperation.h\"\n#import \"SlateConfig.h\"\n#import <WebKit/WebKit.h>\n#import \"JSController.h\"\n#import \"CornerOperation.h\"\n#import \"ThrowOperation.h\"\n#import \"NudgeOperation.h\"\n#import \"PushOperation.h\"\n#import \"JSInfoWrapper.h\"\n\n@implementation Operation\n\n@synthesize opName;\n@synthesize options;\n@synthesize dynamicOptions;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [self setOpName:nil];\n    [self setOptions:[NSMutableDictionary dictionary]];\n    [self setDynamicOptions:[NSMutableDictionary dictionary]];\n  }\n\n  return self;\n}\n\n\n- (BOOL)doOperation {\n  return YES;\n}\n\n- (BOOL)doOperationWithAccessibilityWrapper:(AccessibilityWrapper *)aw screenWrapper:(ScreenWrapper *)sw {\n  return YES;\n}\n\n- (BOOL)testOperation {\n  return YES;\n}\n\n- (BOOL)shouldTakeUndoSnapshot {\n  return [[[SlateConfig getInstance] getConfig:UNDO_OPS] rangeOfString:[self opName]].location != NSNotFound;\n}\n\n- (NSArray *)requiredOptions {\n  return [NSArray array];\n}\n\n- (NSString *)checkRequiredOptions:(NSDictionary *)_options {\n  for (NSString *key in [self requiredOptions]) {\n    id opt = [_options objectForKey:key];\n    if (opt == nil) {\n      return key;\n    }\n  }\n  return nil;\n}\n\n- (void)initOptions:(NSDictionary *)_options {\n  NSString *missing = [self checkRequiredOptions:_options];\n  if (missing != nil) {\n    SlateLogger(@\"ERROR: Missing Option in %@\", [self opName]);\n    @throw([NSException exceptionWithName:@\"Missing Option\" reason:[NSString stringWithFormat:@\"Missing option '%@' in '%@'\", missing, [self opName]] userInfo:nil]);\n    return;\n  }\n  [self beforeInitOptions];\n  for (NSString *key in [_options allKeys]) {\n    id opt = [_options objectForKey:key];\n    if (opt == nil) { continue; }\n    if ([opt isKindOfClass:[NSString class]] || [opt isKindOfClass:[NSValue class]] || [opt isKindOfClass:[NSNumber class]] ||\n        [opt isKindOfClass:[NSDictionary class]] || [opt isKindOfClass:[NSArray class]]) {\n      [self.options setObject:opt forKey:key];\n      [self parseOption:key value:[[self options] objectForKey:key]];\n    } else if ([opt isKindOfClass:[WebScriptObject class]]) {\n      // assume this is a function (otherwise it would have been converted)\n      NSString *jsKey = [[JSController getInstance] addCallableFunction:opt];\n      [self.dynamicOptions setObject:jsKey forKey:key];\n    } else {\n      [self.options setObject:[NSString stringWithFormat:@\"%@\", opt] forKey:key];\n      [self parseOption:key value:[[self options] objectForKey:key]];\n    }\n  }\n  if ([[self dynamicOptions] count] == 0) { [self afterEvalOptions]; };\n}\n\n- (void)beforeInitOptions {\n  // OVERRIDE - runs before any options are set\n}\n\n- (void)parseOption:(NSString *)name value:(id)value {\n  // OVERRIDE - runs while setting options (both normal and dynamic)\n}\n\n- (void)afterEvalOptions {\n  // OVERRIDE - runs after all options are set\n}\n\n- (BOOL)testOperationWithAccessibilityWrapper:(AccessibilityWrapper *)aw screenWrapper:(ScreenWrapper *)sw {\n  [self evalOptionsWithAccessibilityWrapper:aw screenWrapper:sw];\n  return [self testOperation];\n}\n\n- (void)evalOptionsWithAccessibilityWrapper:(AccessibilityWrapper *)aw screenWrapper:(ScreenWrapper *)sw {\n  if ([[self dynamicOptions] count] == 0) { return; }\n  if (aw == nil) {\n    [[JSInfoWrapper getInstance] setAw:[[AccessibilityWrapper alloc] init]];\n  } else {\n    [[JSInfoWrapper getInstance] setAw:aw];\n  }\n  if (sw == nil) {\n    [[JSInfoWrapper getInstance] setSw:[[ScreenWrapper alloc] init]];\n  } else {\n    [[JSInfoWrapper getInstance] setSw:sw];\n  }\n  for (NSString *key in [[self dynamicOptions] allKeys]) {\n    id result = [[JSController getInstance] runCallableFunction:[[self dynamicOptions] objectForKey:key]];\n    if (result == nil) { continue; }\n    [self.options setObject:result forKey:key];\n    [self parseOption:key value:[[self options] objectForKey:key]];\n  }\n  [self afterEvalOptions];\n}\n\n- (id)dup:(NSDictionary *)_options {\n  NSMutableDictionary *newOptions = [NSMutableDictionary dictionaryWithDictionary:[self options]];\n  [newOptions addEntriesFromDictionary:[self dynamicOptions]];\n  [newOptions addEntriesFromDictionary:_options];\n  return [Operation operationWithName:[self opName] options:newOptions];\n}\n\n+ (BOOL)doOperation:(NSString *)op options:(NSDictionary *)options aw:(AccessibilityWrapper *)aw sw:(ScreenWrapper *)sw {\n  Operation *operation = [Operation operationWithName:op options:options];\n  BOOL success = NO;\n  if (operation != nil) {\n    [operation doOperationWithAccessibilityWrapper:aw screenWrapper:sw];\n    operation = nil; // force release of operation object\n  }\n  return success;\n}\n\n+ (id)operationFromString:(NSString *)opString {\n  NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n  [StringTokenizer tokenize:opString into:tokens maxTokens:2];\n  NSString *op = [tokens objectAtIndex:0];\n  Operation *operation = nil;\n  if ([op isEqualToString:MOVE]) {\n    operation = [MoveOperation moveOperationFromString:opString];\n  } else if ([op isEqualToString:RESIZE]) {\n    operation = [ResizeOperation resizeOperationFromString:opString];\n  } else if ([op isEqualToString:PUSH]) {\n    operation = [PushOperation pushOperationFromString:opString];\n  } else if ([op isEqualToString:NUDGE]) {\n    operation = [NudgeOperation nudgeOperationFromString:opString];\n  } else if ([op isEqualToString:THROW]) {\n    operation = [ThrowOperation throwOperationFromString:opString];\n  } else if ([op isEqualToString:CORNER]) {\n    operation = [CornerOperation cornerOperationFromString:opString];\n  } else if ([op isEqualToString:CHAIN]) {\n    operation = [ChainOperation chainOperationFromString:opString];\n  } else if ([op isEqualToString:LAYOUT]) {\n    operation = [LayoutOperation layoutOperationFromString:opString];\n  } else if ([op isEqualToString:FOCUS]) {\n    operation = [FocusOperation focusOperationFromString:opString];\n  } else if ([op isEqualToString:SNAPSHOT]) {\n    operation = [SnapshotOperation snapshotOperationFromString:opString];\n  } else if ([op isEqualToString:ACTIVATE_SNAPSHOT]) {\n    operation = [ActivateSnapshotOperation activateSnapshotOperationFromString:opString];\n  } else if ([op isEqualToString:DELETE_SNAPSHOT]) {\n    operation = [DeleteSnapshotOperation deleteSnapshotOperationFromString:opString];\n  } else if ([op isEqualToString:HINT]) {\n    operation = [HintOperation hintOperationFromString:opString];\n  } else if ([op isEqualToString:SWITCH]) {\n    operation = [SwitchOperation switchOperationFromString:opString];\n  } else if ([op isEqualToString:GRID]) {\n    operation = [GridOperation gridOperationFromString:opString];\n  } else if ([op isEqualToString:SEQUENCE]) {\n    operation = [SequenceOperation sequenceOperationFromString:opString];\n  } else if ([op isEqualToString:TOGGLE] || [op isEqualToString:SHOW] || [op isEqualToString:HIDE]) {\n    operation = [VisibilityOperation visibilityOperationFromString:opString];\n  } else if ([op isEqualToString:RELAUNCH]) {\n    operation = [RelaunchOperation relaunchOperationFromString:opString];\n  } else if ([op isEqualToString:SHELL]) {\n    operation = [ShellOperation shellOperationFromString:opString];\n  } else if ([op isEqualToString:UNDO]) {\n    operation = [UndoOperation undoOperationFromString:opString];\n  } else {\n    SlateLogger(@\"ERROR: Unrecognized operation '%@'\", opString);\n    @throw([NSException exceptionWithName:@\"Unrecognized Operation\" reason:[NSString stringWithFormat:@\"Unrecognized operation '%@' in '%@'\", op, opString] userInfo:nil]);\n  }\n  if (operation != nil) { [operation setOpName:op]; }\n  return operation;\n}\n\n+ (id)operationWithName:(NSString *)op options:(NSDictionary *)options {\n  Operation *operation = nil;\n  if ([op isEqualToString:MOVE]) {\n    operation = [MoveOperation moveOperation];\n  } else if ([op isEqualToString:RESIZE]) {\n    operation = [ResizeOperation resizeOperation];\n  } else if ([op isEqualToString:PUSH]) {\n    operation = [PushOperation pushOperation];\n  } else if ([op isEqualToString:NUDGE]) {\n    operation = [NudgeOperation nudgeOperation];\n  } else if ([op isEqualToString:THROW]) {\n    operation = [ThrowOperation throwOperation];\n  } else if ([op isEqualToString:CORNER]) {\n    operation = [CornerOperation cornerOperation];\n  } else if ([op isEqualToString:CHAIN]) {\n    operation = [ChainOperation chainOperation];\n  } else if ([op isEqualToString:LAYOUT]) {\n    operation = [LayoutOperation layoutOperation];\n  } else if ([op isEqualToString:FOCUS]) {\n    operation = [FocusOperation focusOperation];\n  } else if ([op isEqualToString:SNAPSHOT]) {\n    operation = [SnapshotOperation snapshotOperation];\n  } else if ([op isEqualToString:ACTIVATE_SNAPSHOT]) {\n    operation = [ActivateSnapshotOperation activateSnapshotOperation];\n  } else if ([op isEqualToString:DELETE_SNAPSHOT]) {\n    operation = [DeleteSnapshotOperation deleteSnapshotOperation];\n  } else if ([op isEqualToString:HINT]) {\n    operation = [HintOperation hintOperation];\n  } else if ([op isEqualToString:SWITCH]) {\n    operation = [SwitchOperation switchOperation];\n  } else if ([op isEqualToString:GRID]) {\n    operation = [GridOperation gridOperation];\n  } else if ([op isEqualToString:SEQUENCE]) {\n    operation = [SequenceOperation sequenceOperation];\n  } else if ([op isEqualToString:TOGGLE] || [op isEqualToString:SHOW] || [op isEqualToString:HIDE]) {\n    operation = [VisibilityOperation visibilityOperation];\n  } else if ([op isEqualToString:RELAUNCH]) {\n    operation = [RelaunchOperation relaunchOperation];\n  } else if ([op isEqualToString:SHELL]) {\n    operation = [ShellOperation shellOperation];\n  } else if ([op isEqualToString:UNDO]) {\n    operation = [UndoOperation undoOperation];\n  } else {\n    SlateLogger(@\"ERROR: Unrecognized operation '%@'\", op);\n    @throw([NSException exceptionWithName:@\"Unrecognized Operation\" reason:[NSString stringWithFormat:@\"Unrecognized operation '%@'\", op] userInfo:nil]);\n  }\n  if (operation != nil) {\n    [operation setOpName:op];\n    [operation initOptions:options];\n  }\n  return operation;\n}\n\n+ (BOOL)isRepeatOnHoldOp:(NSString *)op {\n  NSArray *repeatOps = [[[SlateConfig getInstance] getConfig:REPEAT_ON_HOLD_OPS] componentsSeparatedByString:COMMA];\n  for (NSInteger i = 0; i < [repeatOps count]; i++) {\n    if ([op isEqualToString:[repeatOps objectAtIndex:i]]) {\n      return YES;\n    }\n  }\n  return NO;\n}\n\n@end\n"
  },
  {
    "path": "Slate/PushOperation.h",
    "content": "//\n//  PushOperation.h\n//  Slate\n//\n//  Created by Jigish Patel on 1/20/13.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"MoveOperation.h\"\n\n@interface PushOperation : MoveOperation\n\n+ (id)pushOperation;\n+ (id)pushOperationFromString:(NSString *)pushOperation;\n\n@end\n"
  },
  {
    "path": "Slate/PushOperation.m",
    "content": "//\n//  PushOperation.m\n//  Slate\n//\n//  Created by Jigish Patel on 1/20/13.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"PushOperation.h\"\n#import \"StringTokenizer.h\"\n#import \"SlateLogger.h\"\n#import \"Constants.h\"\n\n@implementation PushOperation\n\n- (NSArray *)requiredOptions {\n  return [NSArray arrayWithObjects:OPT_DIRECTION, nil];\n}\n\n- (void)afterEvalOptions {\n  NSString *direction = [[self options] objectForKey:OPT_DIRECTION];\n  NSString *style = [[self options] objectForKey:OPT_STYLE];\n  if (style == nil) { style = NONE; }\n  NSString *screen = [[self options] objectForKey:OPT_SCREEN];\n  if (screen == nil) { screen = REF_CURRENT_SCREEN; }\n  [self setMonitor:screen];\n  [self setDimensions:[[ExpressionPoint alloc] initWithX:@\"windowSizeX\" y:@\"windowSizeY\"]];\n  if ([direction isEqualToString:TOP] || [direction isEqualToString:UP]) {\n    if ([style isEqualToString:CENTER]) {\n      [self setTopLeft:[[ExpressionPoint alloc] initWithX:@\"screenOriginX+(screenSizeX-windowSizeX)/2\" y:@\"screenOriginY\"]];\n    } else if ([style isEqualToString:BAR]) {\n      [self setTopLeft:[[ExpressionPoint alloc] initWithX:@\"screenOriginX\" y:@\"screenOriginY\"]];\n      [self setDimensions:[[ExpressionPoint alloc] initWithX:@\"screenSizeX\" y:@\"windowSizeY\"]];\n    } else if ([style hasPrefix:BAR_RESIZE_WITH_VALUE]) {\n      NSString *resizeExpression = [[style componentsSeparatedByString:COLON] objectAtIndex:1];\n      [self setTopLeft:[[ExpressionPoint alloc] initWithX:@\"screenOriginX\" y:@\"screenOriginY\"]];\n      [self setDimensions:[[ExpressionPoint alloc] initWithX:@\"screenSizeX\" y:resizeExpression]];\n    } else if ([style isEqualToString:NONE]) {\n      [self setTopLeft:[[ExpressionPoint alloc] initWithX:@\"windowTopLeftX\" y:@\"screenOriginY\"]];\n    } else {\n      SlateLogger(@\"ERROR: Unrecognized style '%@'\", style);\n      @throw([NSException exceptionWithName:@\"Unrecognized Style\" reason:[NSString stringWithFormat:@\"Unrecognized style '%@'\", style] userInfo:nil]);\n    }\n  } else if ([direction isEqualToString:BOTTOM] || [direction isEqualToString:DOWN]) {\n    if ([style isEqualToString:CENTER]) {\n      [self setTopLeft:[[ExpressionPoint alloc] initWithX:@\"screenOriginX+(screenSizeX-windowSizeX)/2\" y:@\"screenOriginY+screenSizeY-windowSizeY\"]];\n    } else if ([style isEqualToString:BAR]) {\n      [self setTopLeft:[[ExpressionPoint alloc] initWithX:@\"screenOriginX\" y:@\"screenOriginY+screenSizeY-windowSizeY\"]];\n      [self setDimensions:[[ExpressionPoint alloc] initWithX:@\"screenSizeX\" y:@\"windowSizeY\"]];\n    } else if ([style hasPrefix:BAR_RESIZE_WITH_VALUE]) {\n      NSString *resizeExpression = [[style componentsSeparatedByString:COLON] objectAtIndex:1];\n      [self setTopLeft:[[ExpressionPoint alloc] initWithX:@\"screenOriginX\" y:[NSString stringWithFormat:@\"screenOriginY+screenSizeY-(%@)\", resizeExpression]]];\n      [self setDimensions:[[ExpressionPoint alloc] initWithX:@\"screenSizeX\" y:resizeExpression]];\n    } else if ([style isEqualToString:NONE]) {\n      [self setTopLeft:[[ExpressionPoint alloc] initWithX:@\"windowTopLeftX\" y:@\"screenOriginY+screenSizeY-windowSizeY\"]];\n    } else {\n      SlateLogger(@\"ERROR: Unrecognized style '%@'\", style);\n      @throw([NSException exceptionWithName:@\"Unrecognized Style\" reason:[NSString stringWithFormat:@\"Unrecognized style '%@'\", style] userInfo:nil]);\n    }\n  } else if ([direction isEqualToString:LEFT]) {\n    if ([style isEqualToString:CENTER]) {\n      [self setTopLeft:[[ExpressionPoint alloc] initWithX:@\"screenOriginX\" y:@\"screenOriginY+(screenSizeY-windowSizeY)/2\"]];\n    } else if ([style isEqualToString:BAR]) {\n      [self setTopLeft:[[ExpressionPoint alloc] initWithX:@\"screenOriginX\" y:@\"screenOriginY\"]];\n      [self setDimensions:[[ExpressionPoint alloc] initWithX:@\"windowSizeX\" y:@\"screenSizeY\"]];\n    } else if ([style hasPrefix:BAR_RESIZE_WITH_VALUE]) {\n      NSString *resizeExpression = [[style componentsSeparatedByString:COLON] objectAtIndex:1];\n      [self setTopLeft:[[ExpressionPoint alloc] initWithX:@\"screenOriginX\" y:@\"screenOriginY\"]];\n      [self setDimensions:[[ExpressionPoint alloc] initWithX:resizeExpression y:@\"screenSizeY\"]];\n    } else if ([style isEqualToString:NONE]) {\n      [self setTopLeft:[[ExpressionPoint alloc] initWithX:@\"screenOriginX\" y:@\"windowTopLeftY\"]];\n    } else {\n      SlateLogger(@\"ERROR: Unrecognized style '%@'\", style);\n      @throw([NSException exceptionWithName:@\"Unrecognized Style\" reason:[NSString stringWithFormat:@\"Unrecognized style '%@'\", style] userInfo:nil]);\n    }\n  } else if ([direction isEqualToString:RIGHT]) {\n    if ([style isEqualToString:CENTER]) {\n      [self setTopLeft:[[ExpressionPoint alloc] initWithX:@\"screenOriginX+screenSizeX-windowSizeX\" y:@\"screenOriginY+(screenSizeY-windowSizeY)/2\"]];\n    } else if ([style isEqualToString:BAR]) {\n      [self setTopLeft:[[ExpressionPoint alloc] initWithX:@\"screenOriginX+screenSizeX-windowSizeX\" y:@\"screenOriginY\"]];\n      [self setDimensions:[[ExpressionPoint alloc] initWithX:@\"windowSizeX\" y:@\"screenSizeY\"]];\n    } else if ([style hasPrefix:BAR_RESIZE_WITH_VALUE]) {\n      NSString *resizeExpression = [[style componentsSeparatedByString:COLON] objectAtIndex:1];\n      [self setTopLeft:[[ExpressionPoint alloc] initWithX:[NSString stringWithFormat:@\"screenOriginX+screenSizeX-(%@)\", resizeExpression] y:@\"screenOriginY\"]];\n      [self setDimensions:[[ExpressionPoint alloc] initWithX:resizeExpression y:@\"screenSizeY\"]];\n    } else if ([style isEqualToString:NONE]) {\n      [self setTopLeft:[[ExpressionPoint alloc] initWithX:@\"screenOriginX+screenSizeX-windowSizeX\" y:@\"windowTopLeftY\"]];\n    } else {\n      SlateLogger(@\"ERROR: Unrecognized style '%@'\", style);\n      @throw([NSException exceptionWithName:@\"Unrecognized Style\" reason:[NSString stringWithFormat:@\"Unrecognized style '%@'\", style] userInfo:nil]);\n    }\n  } else {\n    SlateLogger(@\"ERROR: Unrecognized direction '%@'\", direction);\n    @throw([NSException exceptionWithName:@\"Unrecognized Direction\" reason:[NSString stringWithFormat:@\"Unrecognized direction '%@'\", direction] userInfo:nil]);\n  }\n}\n\n+ (id)pushOperation {\n  return [[PushOperation alloc] init];\n}\n\n+ (id)pushOperationFromString:(NSString *)pushOperation {\n  // push <top|bottom|up|down|left|right> <optional:none|center|bar|bar-resize:expression> <optional:monitor (must specify previous option to specify monitor)>\n  NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n  [StringTokenizer tokenize:pushOperation into:tokens];\n\n  if ([tokens count] < 2) {\n    SlateLogger(@\"ERROR: Invalid Parameters '%@'\", pushOperation);\n    @throw([NSException exceptionWithName:@\"Invalid Parameters\" reason:[NSString stringWithFormat:@\"Invalid Parameters in '%@'. Push operations require the following format: 'push direction [optional:style]'\", pushOperation] userInfo:nil]);\n  }\n\n  NSString *direction = [tokens objectAtIndex:1];\n  NSString *dimensions = @\"windowSizeX;windowSizeY\";\n  NSString *topLeft = nil;\n  NSString *style = NONE;\n  if ([tokens count] >= 3) {\n    style = [tokens objectAtIndex:2];\n  }\n  if ([direction isEqualToString:TOP] || [direction isEqualToString:UP]) {\n    if ([style isEqualToString:CENTER]) {\n      topLeft = @\"screenOriginX+(screenSizeX-windowSizeX)/2;screenOriginY\";\n    } else if ([style isEqualToString:BAR]) {\n      topLeft = @\"screenOriginX;screenOriginY\";\n      dimensions = @\"screenSizeX;windowSizeY\";\n    } else if ([style hasPrefix:BAR_RESIZE_WITH_VALUE]) {\n      NSString *resizeExpression = [[style componentsSeparatedByString:COLON] objectAtIndex:1];\n      topLeft = @\"screenOriginX;screenOriginY\";\n      dimensions = [@\"screenSizeX;\" stringByAppendingString:resizeExpression];\n    } else if ([style isEqualToString:NONE]) {\n      topLeft = @\"windowTopLeftX;screenOriginY\";\n    } else {\n      SlateLogger(@\"ERROR: Unrecognized style '%@'\", style);\n      @throw([NSException exceptionWithName:@\"Unrecognized Style\" reason:[NSString stringWithFormat:@\"Unrecognized style '%@' in '%@'\", style, pushOperation] userInfo:nil]);\n    }\n  } else if ([direction isEqualToString:BOTTOM] || [direction isEqualToString:DOWN]) {\n    if ([style isEqualToString:CENTER]) {\n      topLeft = @\"screenOriginX+(screenSizeX-windowSizeX)/2;screenOriginY+screenSizeY-windowSizeY\";\n    } else if ([style isEqualToString:BAR]) {\n      topLeft = @\"screenOriginX;screenOriginY+screenSizeY-windowSizeY\";\n      dimensions = @\"screenSizeX;windowSizeY\";\n    } else if ([style hasPrefix:BAR_RESIZE_WITH_VALUE]) {\n      NSString *resizeExpression = [[style componentsSeparatedByString:COLON] objectAtIndex:1];\n      topLeft = [@\"screenOriginX;screenOriginY+screenSizeY-\" stringByAppendingString:resizeExpression];\n      dimensions = [@\"screenSizeX;\" stringByAppendingString:resizeExpression];\n    } else if ([style isEqualToString:NONE]) {\n      topLeft = @\"windowTopLeftX;screenOriginY+screenSizeY-windowSizeY\";\n    } else {\n      SlateLogger(@\"ERROR: Unrecognized style '%@'\", style);\n      @throw([NSException exceptionWithName:@\"Unrecognized Style\" reason:[NSString stringWithFormat:@\"Unrecognized style '%@' in '%@'\", style, pushOperation] userInfo:nil]);\n    }\n  } else if ([direction isEqualToString:LEFT]) {\n    if ([style isEqualToString:CENTER]) {\n      topLeft = @\"screenOriginX;screenOriginY+(screenSizeY-windowSizeY)/2\";\n    } else if ([style isEqualToString:BAR]) {\n      topLeft = @\"screenOriginX;screenOriginY\";\n      dimensions = @\"windowSizeX;screenSizeY\";\n    } else if ([style hasPrefix:BAR_RESIZE_WITH_VALUE]) {\n      NSString *resizeExpression = [[style componentsSeparatedByString:COLON] objectAtIndex:1];\n      topLeft = @\"screenOriginX;screenOriginY\";\n      dimensions = [resizeExpression stringByAppendingString:@\",screenSizeY\"];\n    } else if ([style isEqualToString:NONE]) {\n      topLeft = @\"screenOriginX;windowTopLeftY\";\n    } else {\n      SlateLogger(@\"ERROR: Unrecognized style '%@'\", style);\n      @throw([NSException exceptionWithName:@\"Unrecognized Style\" reason:[NSString stringWithFormat:@\"Unrecognized style '%@' in '%@'\", style, pushOperation] userInfo:nil]);\n    }\n  } else if ([direction isEqualToString:RIGHT]) {\n    if ([style isEqualToString:CENTER]) {\n      topLeft = @\"screenOriginX+screenSizeX-windowSizeX;screenOriginY+(screenSizeY-windowSizeY)/2\";\n    } else if ([style isEqualToString:BAR]) {\n      topLeft = @\"screenOriginX+screenSizeX-windowSizeX;screenOriginY\";\n      dimensions = @\"windowSizeX;screenSizeY\";\n    } else if ([style hasPrefix:BAR_RESIZE_WITH_VALUE]) {\n      NSString *resizeExpression = [[style componentsSeparatedByString:COLON] objectAtIndex:1];\n      topLeft = [[@\"screenOriginX+screenSizeX-\" stringByAppendingString:resizeExpression] stringByAppendingString:@\";screenOriginY\"];\n      dimensions = [resizeExpression stringByAppendingString:@\";screenSizeY\"];\n    } else if ([style isEqualToString:NONE]) {\n      topLeft = @\"screenOriginX+screenSizeX-windowSizeX;windowTopLeftY\";\n    } else {\n      SlateLogger(@\"ERROR: Unrecognized style '%@'\", style);\n      @throw([NSException exceptionWithName:@\"Unrecognized Style\" reason:[NSString stringWithFormat:@\"Unrecognized style '%@' in '%@'\", style, pushOperation] userInfo:nil]);\n    }\n  } else {\n    SlateLogger(@\"ERROR: Unrecognized direction '%@'\", direction);\n    @throw([NSException exceptionWithName:@\"Unrecognized Direction\" reason:[NSString stringWithFormat:@\"Unrecognized direction '%@' in '%@'\", direction, pushOperation] userInfo:nil]);\n  }\n  Operation *op = [[MoveOperation alloc] initWithTopLeft:topLeft dimensions:dimensions monitor:([tokens count] >=4 ? [tokens objectAtIndex:3] : REF_CURRENT_SCREEN)];\n  return op;\n}\n\n@end\n"
  },
  {
    "path": "Slate/RelaunchOperation.h",
    "content": "//\n//  RelaunchOperation.h\n//  Slate\n//\n//  Created by Jigish Patel on 10/11/12.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"Operation.h\"\n\n@interface RelaunchOperation : Operation\n\n+ (id)relaunchOperation;\n+ (id)relaunchOperationFromString:(NSString *)unused;\n\n@end\n"
  },
  {
    "path": "Slate/RelaunchOperation.m",
    "content": "//\n//  RelaunchOperation.m\n//  Slate\n//\n//  Created by Jigish Patel on 10/11/12.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"RelaunchOperation.h\"\n#import \"SlateLogger.h\"\n#import \"SlateAppDelegate.h\"\n\n@implementation RelaunchOperation\n\n- (id)init {\n  self = [super init];\n  return self;\n}\n\n- (BOOL)doOperation {\n  SlateLogger(@\"----------------- Begin Relaunch Operation -----------------\");\n  // We don't use the passed in AccessibilityWrapper or ScreenWrapper so they are nil. No need to waste time creating them here.\n  BOOL success = [self doOperationWithAccessibilityWrapper:nil screenWrapper:nil];\n  SlateLogger(@\"-----------------  End Relaunch Operation  -----------------\");\n  return success;\n}\n\n- (BOOL)doOperationWithAccessibilityWrapper:(AccessibilityWrapper *)iamnil screenWrapper:(ScreenWrapper *)iamalsonil {\n  [(SlateAppDelegate *)[NSApp delegate] relaunch];\n  return YES;\n}\n\n- (BOOL)testOperation {\n  return YES;\n}\n\n+ (id)relaunchOperation {\n  return [[RelaunchOperation alloc] init];\n}\n\n+ (id)relaunchOperationFromString:(NSString *)unused {\n  return [RelaunchOperation relaunchOperation];\n}\n\n@end\n"
  },
  {
    "path": "Slate/ResizeOperation.h",
    "content": "//\n//  ResizeOperation.h\n//  Slate\n//\n//  Created by Jigish Patel on 5/26/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n#import \"Operation.h\"\n\n\n@interface ResizeOperation : Operation {\n@private\n  NSInteger anchor;\n  NSString *xResize;\n  NSString *yResize;\n}\n\n@property (assign) NSInteger anchor;\n@property (copy) NSString *xResize;\n@property (copy) NSString *yResize;\n\n- (id)initWithAnchor:(NSString *)a xResize:(NSString *)x yResize:(NSString *)y;\n- (NSPoint)getTopLeftWithCurrentWindow:(NSRect)cWindowRect newSize:(NSSize)nSize;\n- (NSSize)getDimensionsWithCurrentWindow:(NSRect)cWindowRect screenWrapper:(ScreenWrapper *)sw;\n- (NSInteger)resizeStringToInt:(NSString *)resize withValue:(NSInteger) val;\n\n+ (id)resizeOperation;\n+ (id)resizeOperationFromString:(NSString *)resizeOperation;\n\n@end\n"
  },
  {
    "path": "Slate/ResizeOperation.m",
    "content": "//\n//  ResizeOperation.m\n//  Slate\n//\n//  Created by Jigish Patel on 5/26/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"AccessibilityWrapper.h\"\n#import \"Constants.h\"\n#import \"ResizeOperation.h\"\n#import \"ScreenWrapper.h\"\n#import \"SlateConfig.h\"\n#import \"StringTokenizer.h\"\n#import \"SlateLogger.h\"\n\n@implementation ResizeOperation\n\n@synthesize anchor;\n@synthesize xResize;\n@synthesize yResize;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [self setAnchor:ANCHOR_TOP_LEFT];\n    [self setXResize:@\"+0\"];\n    [self setYResize:@\"+0\"];\n  }\n  return self;\n}\n\n- (id)initWithAnchor:(NSString *)a xResize:(NSString *)x yResize:(NSString *)y {\n  self = [self init];\n  if (self) {\n    if ([a isEqualToString:TOP_LEFT]) {\n      [self setAnchor:ANCHOR_TOP_LEFT];\n    } else if ([a isEqualToString:TOP_RIGHT]) {\n      [self setAnchor:ANCHOR_TOP_RIGHT];\n    } else if ([a isEqualToString:BOTTOM_LEFT]) {\n      [self setAnchor:ANCHOR_BOTTOM_LEFT];\n    } else if ([a isEqualToString:BOTTOM_RIGHT]) {\n      [self setAnchor:ANCHOR_BOTTOM_RIGHT];\n    } else {\n      SlateLogger(@\"ERROR: Unrecognized anchor '%@'\", a);\n      return nil;\n    }\n    [self setXResize:x];\n    [self setYResize:y];\n  }\n  return self;\n}\n\n- (BOOL)doOperationWithAccessibilityWrapper:(AccessibilityWrapper *)aw screenWrapper:(ScreenWrapper *)sw {\n  BOOL success = NO;\n  [self evalOptionsWithAccessibilityWrapper:aw screenWrapper:sw];\n  NSPoint cTopLeft = [aw getCurrentTopLeft];\n  NSSize cSize = [aw getCurrentSize];\n  NSRect cWindowRect = NSMakeRect(cTopLeft.x, cTopLeft.y, cSize.width, cSize.height);\n  NSSize nSize = [self getDimensionsWithCurrentWindow:cWindowRect screenWrapper:sw];\n  if (!NSEqualSizes(cSize, nSize)) {\n    success = [aw resizeWindow:nSize];\n    NSSize realNewSize = [aw getCurrentSize];\n    NSPoint nTopLeft = [self getTopLeftWithCurrentWindow:cWindowRect newSize:realNewSize];\n    success = [aw moveWindow:nTopLeft] && success;\n  }\n  return success;\n}\n\n- (BOOL)doOperation {\n  SlateLogger(@\"----------------- Begin Resize Operation -----------------\");\n  AccessibilityWrapper *aw = [[AccessibilityWrapper alloc] init];\n  ScreenWrapper *sw = [[ScreenWrapper alloc] init];\n  BOOL success = NO;\n  if ([aw inited]) success = [self doOperationWithAccessibilityWrapper:aw screenWrapper:sw];\n  SlateLogger(@\"-----------------  End Resize Operation  -----------------\");\n  return success;\n}\n\n- (BOOL)testOperation {\n  ScreenWrapper *sw = [[ScreenWrapper alloc] init];\n  NSRect cWindowRect = NSMakeRect(0, 0, 1000, 1000);\n  NSSize nSize = [self getDimensionsWithCurrentWindow:cWindowRect screenWrapper:sw];\n  [self getTopLeftWithCurrentWindow:cWindowRect newSize:nSize];\n  return YES;\n}\n\n- (NSPoint)getTopLeftWithCurrentWindow:(NSRect)cWindowRect newSize:(NSSize)nSize {\n  NSPoint cTopLeft = cWindowRect.origin;\n  NSSize cSize = cWindowRect.size;\n  if (anchor == ANCHOR_TOP_LEFT) {\n    return cTopLeft;\n  } else if (anchor == ANCHOR_TOP_RIGHT) {\n    NSInteger x = cTopLeft.x + cSize.width - nSize.width;\n    NSInteger y = cTopLeft.y;\n    return NSMakePoint(x,y);\n  } else if (anchor == ANCHOR_BOTTOM_LEFT) {\n    NSInteger x = cTopLeft.x;\n    NSInteger y = cTopLeft.y + cSize.height - nSize.height;\n    return NSMakePoint(x,y);\n  } else if (anchor == ANCHOR_BOTTOM_RIGHT) {\n    NSInteger x = cTopLeft.x + cSize.width - nSize.width;\n    NSInteger y = cTopLeft.y + cSize.height - nSize.height;\n    return NSMakePoint(x,y);\n  }\n  return NSMakePoint(0,0);\n}\n\n// Assumes well-formed resize +100 or -10%\n- (NSInteger)resizeStringToInt:(NSString *)resize withValue:(NSInteger) val {\n  NSInteger sign = [resize hasPrefix:MINUS] ? -1 : 1;\n  NSString *magnitude = [resize stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:EMPTY];\n\n  if ([magnitude hasSuffix:PERCENT]) {\n    magnitude = [magnitude stringByReplacingOccurrencesOfString:PERCENT withString:EMPTY];\n    return (sign * val * [magnitude integerValue] / 100);\n  } else {\n    return (sign * [magnitude integerValue]);\n  }\n}\n\n- (NSSize)getDimensionsWithCurrentWindow:(NSRect)cWindowRect screenWrapper:(ScreenWrapper *)sw {\n  NSSize cSize = cWindowRect.size;\n  NSInteger sizeX = cSize.width;\n  NSInteger sizeY = cSize.height;\n  NSString *resizePercentOf = [[SlateConfig getInstance] getConfig:RESIZE_PERCENT_OF];\n  if ([resizePercentOf isEqualToString:SCREEN_SIZE]) {\n    NSInteger screenId = [sw getScreenId:REF_CURRENT_SCREEN windowRect:cWindowRect];\n    if (![sw screenExists:screenId]) {\n      return cSize;\n    }\n    NSSize screenSize = [sw convertScreenVisibleRectToWindowCoords:screenId].size;\n    sizeX = screenSize.width;\n    sizeY = screenSize.height;\n  }\n  NSInteger dimX = cSize.width + [self resizeStringToInt:xResize withValue:sizeX];\n  NSInteger dimY = cSize.height + [self resizeStringToInt:yResize withValue:sizeY];\n  return NSMakeSize(dimX,dimY);\n}\n\n- (void)parseOption:(NSString *)name value:(NSString *)value {\n  // all options should be strings\n  if (value == nil) { return; }\n  if (![value isKindOfClass:[NSString class]]) {\n    @throw([NSException exceptionWithName:[NSString stringWithFormat:@\"Invalid %@\", name] reason:[NSString stringWithFormat:@\"Invalid %@ '%@'\", name, value] userInfo:nil]);\n  }\n  if ([name isEqualToString:OPT_WIDTH]) {\n    [self setXResize:value];\n  } else if ([name isEqualToString:OPT_HEIGHT]) {\n    [self setYResize:value];\n  } else if ([name isEqualToString:OPT_ANCHOR]) {\n    if ([value isEqualToString:TOP_LEFT]) {\n      [self setAnchor:ANCHOR_TOP_LEFT];\n    } else if ([value isEqualToString:TOP_RIGHT]) {\n      [self setAnchor:ANCHOR_TOP_RIGHT];\n    } else if ([value isEqualToString:BOTTOM_LEFT]) {\n      [self setAnchor:ANCHOR_BOTTOM_LEFT];\n    } else if ([value isEqualToString:BOTTOM_RIGHT]) {\n      [self setAnchor:ANCHOR_BOTTOM_RIGHT];\n    } else {\n      SlateLogger(@\"ERROR: Unrecognized anchor '%@'\", value);\n      @throw([NSException exceptionWithName:@\"Unrecognized Anchor\" reason:[NSString stringWithFormat:@\"ERROR: Unrecognized anchor '%@'\", value] userInfo:nil]);\n    }\n  }\n}\n\n+ (id)resizeOperation {\n  return [[ResizeOperation alloc] init];\n}\n\n+ (id)resizeOperationFromString:(NSString *)resizeOperation {\n  // resize <x> <y> <optional:anchor>\n  NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n  [StringTokenizer tokenize:resizeOperation into:tokens];\n\n  if ([tokens count] < 3) {\n    SlateLogger(@\"ERROR: Invalid Parameters '%@'\", resizeOperation);\n    @throw([NSException exceptionWithName:@\"Invalid Parameters\" reason:[NSString stringWithFormat:@\"Invalid Parameters in '%@'. Resize operations require the following format: 'resize resizeX resizeY [optional:anchor]'\", resizeOperation] userInfo:nil]);\n  }\n\n  NSString *anchor = TOP_LEFT;\n  if ([tokens count] >= 4) {\n    anchor = [tokens objectAtIndex:3];\n  }\n  Operation *op = [[ResizeOperation alloc] initWithAnchor:anchor xResize:[tokens objectAtIndex:1] yResize:[tokens objectAtIndex:2]];\n  return op;\n}\n\n@end\n"
  },
  {
    "path": "Slate/RunningApplications.h",
    "content": "//\n//  RunningApplications.h\n//  Slate\n//\n//  Created by Jigish Patel on 3/22/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n\n@interface RunningApplications : NSObject <NSFastEnumeration> {\n  NSMutableArray *apps;\n  NSMutableDictionary *appNameToApp;\n  NSMutableArray *windows;\n  NSMutableDictionary *appToWindows;\n  NSMutableDictionary *titleToWindow;\n  NSInteger nextWindowNumber;\n  NSMutableArray *unusedWindowNumbers;\n  NSMutableDictionary *pidToObserver;\n}\n\n@property NSMutableArray *apps;\n@property NSMutableDictionary *appNameToApp;\n@property NSMutableArray *windows;\n@property NSMutableDictionary *appToWindows;\n@property NSMutableDictionary *titleToWindow;\n@property (assign) NSInteger nextWindowNumber;\n@property NSMutableArray *unusedWindowNumbers;\n@property NSMutableDictionary *pidToObserver;\n\n+ (RunningApplications *)getInstance;\n+ (BOOL)isAppSelectable:(NSRunningApplication *)app;\n+ (NSRunningApplication *)focusedApp;\n\n- (void)pruneWindows;\n- (NSArray *)windowIdsForTitle:(NSString *)title;\n\n@end\n"
  },
  {
    "path": "Slate/RunningApplications.m",
    "content": "//\n//  RunningApplications.m\n//  Slate\n//\n//  Created by Jigish Patel on 3/22/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"RunningApplications.h\"\n#import \"SlateLogger.h\"\n#import \"AccessibilityWrapper.h\"\n#import \"Constants.h\"\n#import \"JSController.h\"\n#import \"JSWindowWrapper.h\"\n#import \"JSApplicationWrapper.h\"\n#import \"SlateConfig.h\"\n\n@implementation RunningApplications\n\n@synthesize apps, appNameToApp, windows, appToWindows, titleToWindow, unusedWindowNumbers, nextWindowNumber, pidToObserver;\n\nstatic RunningApplications *_instance = nil;\n\n+ (RunningApplications *)getInstance {\n  @synchronized([RunningApplications class]) {\n    if (!_instance)\n      _instance = [[[RunningApplications class] alloc] init];\n    return _instance;\n  }\n}\n\n+ (BOOL)isAppSelectable:(NSRunningApplication *)app {\n  return [app activationPolicy] == NSApplicationActivationPolicyRegular;\n}\n\nstatic NSDictionary *eventNameDict = nil;\n\nstatic NSString *prettyifyEventName(NSString *event) {\n  if (eventNameDict == nil) {\n    eventNameDict = [NSDictionary dictionaryWithObjectsAndKeys:@\"windowClosed\", [NSString stringWithFormat:@\"%@\", kAXUIElementDestroyedNotification],\n                                                               @\"windowMoved\", [NSString stringWithFormat:@\"%@\", kAXMovedNotification],\n                                                               @\"windowResized\", [NSString stringWithFormat:@\"%@\", kAXResizedNotification],\n                                                               @\"windowOpened\", [NSString stringWithFormat:@\"%@\", kAXWindowCreatedNotification],\n                                                               @\"windowFocused\", [NSString stringWithFormat:@\"%@\", kAXFocusedWindowChangedNotification],\n                                                               @\"windowTitleChanged\", [NSString stringWithFormat:@\"%@\", kAXTitleChangedNotification],\n                                                               @\"appClosed\", NSWorkspaceDidTerminateApplicationNotification,\n                                                               @\"appOpened\", NSWorkspaceDidLaunchApplicationNotification,\n                                                               @\"appHidden\", NSWorkspaceDidHideApplicationNotification,\n                                                               @\"appUnhidden\", NSWorkspaceDidUnhideApplicationNotification,\n                                                               @\"appActivated\", NSWorkspaceDidActivateApplicationNotification,\n                                                               @\"appDeactivated\", NSWorkspaceDidDeactivateApplicationNotification, nil];\n  }\n  return [eventNameDict objectForKey:event];\n}\n\nstatic void runWindowJSCallbacks(AXUIElementRef element, CFStringRef notification) {\n  // Run any js callbacks\n  AccessibilityWrapper *openedWindow = [[AccessibilityWrapper alloc] initWithApp:[AccessibilityWrapper applicationForElement:element] window:element];\n  NSString *eventName = prettyifyEventName([NSString stringWithFormat:@\"%@\", notification]);\n  [[JSController getInstance] runCallbacks:eventName\n                                   payload:[[JSWindowWrapper alloc] initWithAccessibilityWrapper:openedWindow screenWrapper:[[ScreenWrapper alloc] init]]];\n}\n\nstatic void windowChanged(AXObserverRef observer, AXUIElementRef element, CFStringRef notification, void *refcon) {\n  RunningApplications *ref = (__bridge RunningApplications *)refcon;\n  SlateLogger(@\">> WINDOW CHANGED, %@ <<\", notification);\n  if (CFStringCompare(notification, kAXUIElementDestroyedNotification, 0) == kCFCompareEqualTo) {\n    SlateLogger(@\">> WINDOW DESTROYED <<\");\n    AXObserverRemoveNotification(observer, element, kAXUIElementDestroyedNotification);\n    AXObserverRemoveNotification(observer, element, kAXMovedNotification);\n    AXObserverRemoveNotification(observer, element, kAXResizedNotification);\n    [ref pruneWindows];\n  }\n  NSString *eventName = prettyifyEventName([NSString stringWithFormat:@\"%@\", notification]);\n  [[JSController getInstance] runCallbacks:eventName\n                                   payload:[[JSApplicationWrapper alloc] initWithRunningApplication:[NSRunningApplication runningApplicationWithProcessIdentifier:[AccessibilityWrapper processIdentifierOfUIElement:element]] screenWrapper:[[ScreenWrapper alloc] init]]];\n}\n\nstatic void registerForWindowDeath(AXUIElementRef element, RunningApplications *ref) {\n  // register for death event\n  AXError err;\n  AXObserverRef observer;\n  err = AXObserverCreate([AccessibilityWrapper processIdentifierOfUIElement:element], windowChanged, &observer);\n  err = AXObserverAddNotification(observer, element, kAXUIElementDestroyedNotification, (__bridge void *)ref);\n  if (err != kAXErrorSuccess) {\n    AXObserverRemoveNotification(observer, element, kAXUIElementDestroyedNotification);\n    return;\n  }\n  if ([[SlateConfig getInstance] getBoolConfig:JS_RECEIVE_MOVE_EVENT]) {\n    err = AXObserverAddNotification(observer, element, kAXMovedNotification, (__bridge void *)ref);\n    if (err != kAXErrorSuccess) {\n      AXObserverRemoveNotification(observer, element, kAXMovedNotification);\n      return;\n    }\n  }\n  if ([[SlateConfig getInstance] getBoolConfig:JS_RECEIVE_RESIZE_EVENT]) {\n    err = AXObserverAddNotification(observer, element, kAXResizedNotification, (__bridge void *)ref);\n    if (err != kAXErrorSuccess) {\n      AXObserverRemoveNotification(observer, element, kAXResizedNotification);\n      return;\n    }\n  }\n  CFRunLoopAddSource ([[NSRunLoop currentRunLoop] getCFRunLoop], AXObserverGetRunLoopSource(observer), kCFRunLoopDefaultMode);\n}\n\n// WINDOW INFO:\n//   0 = title\n//   1 = NSRunningApplication\n//   2 = window number\nstatic void windowCreated(pid_t currPID, AXUIElementRef element, RunningApplications *ref) {\n  SlateLogger(@\">> WINDOW CREATED <<\");\n  [ref pruneWindows];\n  NSString *title = [AccessibilityWrapper getTitle:element];\n  if (title == nil || [EMPTY isEqualToString:title]) return; // skip empty title windows because they are invisible\n  NSMutableArray *windowInfo = [NSMutableArray array];\n  [windowInfo addObject:title];\n  [windowInfo addObject:[NSRunningApplication runningApplicationWithProcessIdentifier:currPID]];\n  if ([[ref unusedWindowNumbers] count] > 0) {\n    [windowInfo addObject:[[ref unusedWindowNumbers] objectAtIndex:0]];\n    [[ref unusedWindowNumbers] removeObjectAtIndex:0];\n  } else {\n    [windowInfo addObject:[NSNumber numberWithInteger:[ref nextWindowNumber]]];\n    [ref setNextWindowNumber:[ref nextWindowNumber]+1];\n  }\n  [[ref windows] insertObject:windowInfo atIndex:0];\n  if ([[ref titleToWindow] objectForKey:title]) {\n    [[[ref titleToWindow] objectForKey:title] addObject:windowInfo];\n  } else {\n    [[ref titleToWindow] setObject:[NSMutableArray arrayWithObject:windowInfo] forKey:title];\n  }\n  [[[ref appToWindows] objectForKey:[NSNumber numberWithInteger:currPID]] addObject:windowInfo];\n  registerForWindowDeath(element, ref);\n}\n\n+ (NSRunningApplication *)focusedApp {\n  NSWorkspace *sharedWorkspace = [NSWorkspace sharedWorkspace];\n  if ([sharedWorkspace respondsToSelector:@selector(frontmostApplication)]) {\n    return [sharedWorkspace frontmostApplication];\n  } else {\n    AccessibilityWrapper *aw = [[AccessibilityWrapper alloc] init];\n    return [NSRunningApplication runningApplicationWithProcessIdentifier:[aw processIdentifier]];\n  }\n}\n\nstatic void windowCallback(AXObserverRef observer, AXUIElementRef element, CFStringRef notification, void *refcon) {\n  SlateLogger(@\">>> %@ for %@\", notification, [AccessibilityWrapper getRole:element]);\n  if (![AccessibilityWrapper isWindow:element]) return;\n  RunningApplications *ref = (__bridge RunningApplications *)refcon;\n  pid_t currPID = [AccessibilityWrapper processIdentifierOfUIElement:element];\n\n  // Title Changed, update windows\n  if (CFStringCompare(notification, kAXTitleChangedNotification, 0) == kCFCompareEqualTo) {\n    SlateLogger(@\">>> TITLE CHANGED TO %@\", [AccessibilityWrapper getTitle:element]);\n    NSNumber *appPID = [NSNumber numberWithInteger:[AccessibilityWrapper processIdentifierOfUIElement:element]];\n    NSMutableArray *oldWindowsInApp = [[[ref appToWindows] objectForKey:appPID] mutableCopy];\n    CFArrayRef windowsArr = [AccessibilityWrapper windowsInApp:AXUIElementCreateApplication([appPID intValue])];\n    // Remove all windows if app has no windows\n    if (!windowsArr || CFArrayGetCount(windowsArr) == 0) return;\n    if (oldWindowsInApp == nil || [oldWindowsInApp count] == 0) {\n      windowCreated(currPID, element, ref);\n      runWindowJSCallbacks(element, notification);\n      return;\n    }\n    // set up title counts\n    NSMutableDictionary *tmpTitleToCount = [NSMutableDictionary dictionary];\n    for (NSMutableArray *windowInfo in oldWindowsInApp) {\n      NSString *title = [windowInfo objectAtIndex:0];\n      if ([tmpTitleToCount objectForKey:title]) {\n        [tmpTitleToCount setObject:[NSNumber numberWithInteger:([[tmpTitleToCount objectForKey:title] integerValue]+1)] forKey:title];\n      } else {\n        [tmpTitleToCount setObject:[NSNumber numberWithInteger:1] forKey:title];\n      }\n    }\n    // figure out which title is new\n    NSString *newTitle = nil;\n    for (NSInteger i = 0; i < CFArrayGetCount(windowsArr); i++) {\n      AXUIElementRef window = CFArrayGetValueAtIndex(windowsArr, i);\n      NSString *currTitle = [AccessibilityWrapper getTitle:window];\n      NSNumber *currCount = [tmpTitleToCount objectForKey:currTitle];\n      if (currCount == nil || [currCount integerValue] == 0) {\n        newTitle = currTitle;\n      } else {\n        [tmpTitleToCount setObject:[NSNumber numberWithInteger:([currCount integerValue]-1)] forKey:currTitle];\n      }\n    }\n    // figure out which title is old\n    NSString *oldTitle = nil;\n    for (NSString *currTitle in [tmpTitleToCount allKeys]) {\n      NSNumber *currCount = [tmpTitleToCount objectForKey:currTitle];\n      if (currCount != nil && [currCount integerValue] > 0) {\n        oldTitle = currTitle;\n        break;\n      }\n    }\n    // out with the old and in with the new\n    if (oldTitle != nil && newTitle != nil) {\n      for (NSMutableArray *windowInfo in oldWindowsInApp) {\n        if ([[windowInfo objectAtIndex:0] isEqualToString:oldTitle]) {\n          [windowInfo removeObjectAtIndex:0];\n          [windowInfo insertObject:[AccessibilityWrapper getTitle:element] atIndex:0];\n          NSMutableArray *windowsForTitle = [[ref titleToWindow] objectForKey:oldTitle];\n          if (!windowsForTitle || [windowsForTitle count] == 0) continue;\n          if ([windowsForTitle count] == 1) {\n            [[ref titleToWindow] removeObjectForKey:oldTitle];\n          } else {\n            [windowsForTitle removeObject:windowInfo];\n          }\n          windowsForTitle = [[ref titleToWindow] objectForKey:[windowInfo objectAtIndex:0]];\n          if (!windowsForTitle) {\n            [[ref titleToWindow] setObject:[NSMutableArray arrayWithObject:windowInfo] forKey:[windowInfo objectAtIndex:0]];\n          } else {\n            [windowsForTitle insertObject:windowInfo atIndex:0];\n            [[ref titleToWindow] setObject:windowsForTitle forKey:[windowInfo objectAtIndex:0]];\n          }\n          [ref pruneWindows];\n          runWindowJSCallbacks(element, notification);\n          return;\n        }\n      }\n    }\n    [ref pruneWindows];\n    runWindowJSCallbacks(element, notification);\n    return;\n  }\n\n  // Focus Changed, update windows\n  if (CFStringCompare(notification, kAXFocusedWindowChangedNotification, 0) == kCFCompareEqualTo) {\n    [ref pruneWindows];\n    runWindowJSCallbacks(element, notification);\n    return;\n  }\n\n  // Window created, add to windows\n  windowCreated(currPID, element, ref);\n  runWindowJSCallbacks(element, notification);\n  SlateLogger(@\">>> END %@ for %@\", notification, [AccessibilityWrapper getRole:element]);\n}\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    unusedWindowNumbers = [NSMutableArray array];\n    nextWindowNumber = 0;\n    apps = [NSMutableArray array];\n    appNameToApp = [NSMutableDictionary dictionary];\n    windows = [NSMutableArray array];\n    appToWindows = [NSMutableDictionary dictionary];\n    pidToObserver = [NSMutableDictionary dictionary];\n    titleToWindow = [NSMutableDictionary dictionary];\n    SlateLogger(@\"------------------ Checking Running Applications ------------------\");\n    NSArray *appsArr = [[NSWorkspace sharedWorkspace] runningApplications];\n    NSRunningApplication *currentApp = [NSRunningApplication currentApplication];\n    for (NSRunningApplication *app in appsArr) {\n      if ([RunningApplications isAppSelectable:app]) {\n        SlateLogger(@\"  Selectable: %@\", [app localizedName]);\n        [apps addObject:app];\n        [appNameToApp setObject:app forKey:[app localizedName]];\n        SlateLogger(@\"    I see application '%@'\", [app localizedName]);\n        // check for windows\n        NSNumber *appPID = [NSNumber numberWithInteger:[app processIdentifier]];\n        [appToWindows setObject:[NSMutableArray array] forKey:appPID];\n        AXUIElementRef appRef = AXUIElementCreateApplication([app processIdentifier]);\n        CFArrayRef windowsArr = [AccessibilityWrapper windowsInApp:appRef];\n        if (windowsArr && CFArrayGetCount(windowsArr) > 0) {\n          SlateLogger(@\"      Has Windows: %@\", [app localizedName]);\n          for (NSInteger i = 0; i < CFArrayGetCount(windowsArr); i++) {\n            NSMutableArray *windowInfo = [NSMutableArray array];\n            AXUIElementRef window = CFArrayGetValueAtIndex(windowsArr, i);\n            NSString *title = [AccessibilityWrapper getTitle:window];\n            if (title == nil || [EMPTY isEqualToString:title]) continue; // skip empty title windows because they are invisible\n            SlateLogger(@\"        Title: %@\", title);\n            [windowInfo addObject:title];\n            [windowInfo addObject:app];\n            [windowInfo addObject:[NSNumber numberWithInteger:nextWindowNumber]];\n            if ([self isCurrentApplication:app] && [AccessibilityWrapper isMainWindow:window]) {\n              [windows insertObject:windowInfo atIndex:0];\n              [[appToWindows objectForKey:appPID] insertObject:windowInfo atIndex:0];\n            } else if ([AccessibilityWrapper isMainWindow:window]) {\n              [windows addObject:windowInfo];\n              [[appToWindows objectForKey:appPID] insertObject:windowInfo atIndex:0];\n            } else {\n              [windows addObject:windowInfo];\n              [[appToWindows objectForKey:appPID] addObject:windowInfo];\n            }\n            NSMutableArray *windowsForTitle = [titleToWindow objectForKey:title];\n            if (!windowsForTitle) {\n              [titleToWindow setObject:[NSMutableArray arrayWithObject:windowInfo] forKey:title];\n            } else {\n              [windowsForTitle addObject:windowInfo];\n              [titleToWindow setObject:windowsForTitle forKey:title];\n            }\n            registerForWindowDeath(window, self);\n            nextWindowNumber++;\n          }\n        }\n        if ([self isCurrentApplication:app]) {\n          currentApp = app;\n        }\n        AXError err;\n        AXUIElementRef sendingApp = AXUIElementCreateApplication([app processIdentifier]);\n        AXObserverRef observer;\n        err = AXObserverCreate([app processIdentifier], windowCallback, &observer);\n        err = AXObserverAddNotification(observer, sendingApp, kAXWindowCreatedNotification, (__bridge void *)self);\n        err = AXObserverAddNotification(observer, sendingApp, kAXFocusedWindowChangedNotification, (__bridge void *)self);\n        err = AXObserverAddNotification(observer, sendingApp, kAXTitleChangedNotification, (__bridge void *)self);\n        if (err != kAXErrorSuccess) {\n          AXObserverRemoveNotification(observer, sendingApp, kAXWindowCreatedNotification);\n          AXObserverRemoveNotification(observer, sendingApp, kAXFocusedWindowChangedNotification);\n          AXObserverRemoveNotification(observer, sendingApp, kAXTitleChangedNotification);\n        } else {\n          CFRunLoopAddSource ([[NSRunLoop currentRunLoop] getCFRunLoop], AXObserverGetRunLoopSource(observer), kCFRunLoopDefaultMode);\n          [pidToObserver setObject:[NSValue valueWithPointer:observer] forKey:[NSNumber numberWithInteger:[app processIdentifier]]];\n        }\n      }\n    }\n    SlateLogger(@\"CURRENT APP = '%@'\", [currentApp localizedName]);\n    [self bringAppToFront:currentApp];\n    SlateLogger(@\"------------------ Done Checking Running Applications ------------------\");\n    [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(applicationKilled:) name:NSWorkspaceDidTerminateApplicationNotification object:nil];\n    [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(applicationLaunched:) name:NSWorkspaceDidLaunchApplicationNotification object:nil];\n    [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(applicationDeactivated:) name:NSWorkspaceDidHideApplicationNotification object:nil];\n    [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(applicationActivated:) name:NSWorkspaceDidUnhideApplicationNotification object:nil];\n    [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(applicationDeactivated:) name:NSWorkspaceDidDeactivateApplicationNotification object:nil];\n    [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(applicationActivated:) name:NSWorkspaceDidActivateApplicationNotification object:nil];\n  }\n  return self;\n}\n\n- (NSRunningApplication *)currentApplication {\n  // ownsMenuBar is 10.7+ only\n  if ([[NSRunningApplication currentApplication] respondsToSelector:@selector(ownsMenuBar)]) {\n    NSArray *appsArr = [[NSWorkspace sharedWorkspace] runningApplications];\n    for (NSRunningApplication *app in appsArr) {\n      if ([RunningApplications isAppSelectable:app]) {\n        if ([app ownsMenuBar]) return app;\n      }\n    }\n  }\n  return [NSRunningApplication currentApplication];\n}\n\n- (BOOL)isCurrentApplication:(NSRunningApplication *)app {\n  // ownsMenuBar is 10.7+ only\n  if ([[NSRunningApplication currentApplication] respondsToSelector:@selector(ownsMenuBar)]) {\n    return [app ownsMenuBar];\n  }\n  return app == [NSRunningApplication currentApplication];\n}\n\n- (void)pruneWindows {\n  NSArray *windowsCopy = [windows copy];\n  for (NSArray *windowInfo in windowsCopy) {\n    if (![apps containsObject:[windowInfo objectAtIndex:1]]) {\n      [self removeWindow:windowInfo];\n      SlateLogger(@\"  PRUNE Because app died\");\n    }\n  }\n  for (NSRunningApplication *app in apps) {\n    NSNumber *appPID = [NSNumber numberWithInteger:[app processIdentifier]];\n    NSMutableArray *oldWindowsInApp = [[appToWindows objectForKey:appPID] mutableCopy];\n    CFArrayRef windowsArr = [AccessibilityWrapper windowsInRunningApp:app];\n    // Remove all windows if app has no windows\n    if (!windowsArr || CFArrayGetCount(windowsArr) == 0) {\n      NSArray *windowsToRemove = [[appToWindows objectForKey:appPID] copy];\n      for (NSArray *windowInfo in windowsToRemove) {\n        [self removeWindow:windowInfo];\n        SlateLogger(@\"  PRUNE Because app has no windows\");\n      }\n      continue;\n    }\n    // Remove windows that are no longer open. No need to add windows that we havn't seen because technically our callback should catch it.\n    for (NSArray *windowInfo in oldWindowsInApp) {\n      BOOL found = NO;\n      for (NSInteger i = 0; i < CFArrayGetCount(windowsArr); i++) {\n        AXUIElementRef window = CFArrayGetValueAtIndex(windowsArr, i);\n        if ([[windowInfo objectAtIndex:0] isEqualToString:[AccessibilityWrapper getTitle:window]]) {\n          found = YES;\n        }\n      }\n      if (!found)  {\n        [self removeWindow:windowInfo];\n        SlateLogger(@\"  PRUNE Because title mismatch\");\n      }\n    }\n  }\n}\n\n- (void)removeWindow:(NSArray *)windowInfo {\n  [unusedWindowNumbers addObject:[windowInfo objectAtIndex:2]];\n  [windows removeObject:windowInfo];\n  NSNumber *appPID = [NSNumber numberWithInteger:[[windowInfo objectAtIndex:1] processIdentifier]];\n  if ([appToWindows objectForKey:appPID] != nil) {\n    [[appToWindows objectForKey:appPID] removeObject:windowInfo];\n  }\n  NSMutableArray *windowsForTitle = [titleToWindow objectForKey:[windowInfo objectAtIndex:0]];\n  if (!windowsForTitle || [windowsForTitle count] <= 1) {\n    [titleToWindow removeObjectForKey:[windowInfo objectAtIndex:0]];\n  } else {\n    [windowsForTitle removeObject:windowInfo];\n    [titleToWindow setObject:windowsForTitle forKey:[windowInfo objectAtIndex:0]];\n  }\n}\n\n/*- (void)notificationRecieved:(id)notification {\n  SlateLogger(@\"NOTE RECIEVED: %@\", [notification name]);\n}*/\n\n- (void)applicationActivated:(id)notification {\n  SlateLogger(@\"Activated: %@\", [notification name]);\n  NSRunningApplication *activatedApp = [[notification userInfo] objectForKey:NSWorkspaceApplicationKey];\n  if ([[activatedApp localizedName] isEqualToString:@\"Slate\"]) return;\n  [self bringAppToFront:activatedApp];\n  [self pruneWindows];\n  NSString *eventName = prettyifyEventName([notification name]);\n  [[JSController getInstance] runCallbacks:eventName\n                                   payload:[[JSApplicationWrapper alloc] initWithRunningApplication:activatedApp screenWrapper:[[ScreenWrapper alloc] init]]];\n}\n\n- (void)applicationDeactivated:(id)notification {\n  SlateLogger(@\"Deactivated: %@\", [notification name]);\n  NSRunningApplication *deactivatedApp = [[notification userInfo] objectForKey:NSWorkspaceApplicationKey];\n  NSString *eventName = prettyifyEventName([notification name]);\n  [[JSController getInstance] runCallbacks:eventName\n                                   payload:[[JSApplicationWrapper alloc] initWithRunningApplication:deactivatedApp screenWrapper:[[ScreenWrapper alloc] init]]];\n}\n\n- (void)applicationLaunched:(id)notification {\n  SlateLogger(@\"Launched: %@\", [notification name]);\n  NSRunningApplication *launchedApp = [[notification userInfo] objectForKey:NSWorkspaceApplicationKey];\n  if ([[launchedApp localizedName] isEqualToString:@\"Slate\"]) return;\n  NSNumber *appPID = [NSNumber numberWithInteger:[launchedApp processIdentifier]];\n  [appToWindows setObject:[NSMutableArray array] forKey:appPID];\n  AXError err;\n  AXUIElementRef sendingApp = AXUIElementCreateApplication([launchedApp processIdentifier]);\n  AXObserverRef observer;\n  err = AXObserverCreate([launchedApp processIdentifier], windowCallback, &observer);\n  if (err != kAXErrorSuccess) return;\n  err = AXObserverAddNotification(observer, sendingApp, kAXWindowCreatedNotification, (__bridge void *)self);\n  err = AXObserverAddNotification(observer, sendingApp, kAXFocusedWindowChangedNotification, (__bridge void *)self);\n  err = AXObserverAddNotification(observer, sendingApp, kAXTitleChangedNotification, (__bridge void *)self);\n  if (err != kAXErrorSuccess) {\n    AXObserverRemoveNotification(observer, AXUIElementCreateApplication([launchedApp processIdentifier]), kAXWindowCreatedNotification);\n    AXObserverRemoveNotification(observer, AXUIElementCreateApplication([launchedApp processIdentifier]), kAXFocusedWindowChangedNotification);\n    AXObserverRemoveNotification(observer, AXUIElementCreateApplication([launchedApp processIdentifier]), kAXTitleChangedNotification);\n    return;\n  }\n  CFRunLoopAddSource ([[NSRunLoop currentRunLoop] getCFRunLoop], AXObserverGetRunLoopSource(observer), kCFRunLoopDefaultMode);\n  [pidToObserver setObject:[NSValue valueWithPointer:observer] forKey:[NSNumber numberWithInteger:[launchedApp processIdentifier]]];\n  // add already created windows\n  CFArrayRef windowsArr = [AccessibilityWrapper windowsInApp:AXUIElementCreateApplication([launchedApp processIdentifier])];\n  if (windowsArr != NULL) {\n    for (NSInteger i = 0; i < CFArrayGetCount(windowsArr); i++) {\n      AXUIElementRef element = CFArrayGetValueAtIndex(windowsArr, i);\n      NSString *title = [AccessibilityWrapper getTitle:element];\n      if (title == nil || [EMPTY isEqualToString:title]) continue; // skip empty title windows because they are invisible\n      NSMutableArray *windowInfo = [NSMutableArray array];\n      [windowInfo addObject:title];\n      [windowInfo addObject:[NSRunningApplication runningApplicationWithProcessIdentifier:[launchedApp processIdentifier]]];\n      if ([[self unusedWindowNumbers] count] > 0) {\n        [windowInfo addObject:[[self unusedWindowNumbers] objectAtIndex:0]];\n        [[self unusedWindowNumbers] removeObjectAtIndex:0];\n      } else {\n        [windowInfo addObject:[NSNumber numberWithInteger:[self nextWindowNumber]]];\n        [self setNextWindowNumber:[self nextWindowNumber]+1];\n      }\n      [[self windows] insertObject:windowInfo atIndex:0];\n      NSMutableArray *windowsForTitle = [[self titleToWindow] objectForKey:title];\n      if (!windowsForTitle) {\n        [[self titleToWindow] setObject:[NSMutableArray arrayWithObject:windowInfo] forKey:title];\n      } else {\n        [windowsForTitle addObject:windowInfo];\n        [[self titleToWindow] setObject:windowsForTitle forKey:title];\n      }\n      [[[self appToWindows] objectForKey:[NSNumber numberWithInteger:[launchedApp processIdentifier]]] addObject:windowInfo];\n    }\n  }\n  [self bringAppToFront:launchedApp];\n  [self pruneWindows];\n  NSString *eventName = prettyifyEventName([notification name]);\n  [[JSController getInstance] runCallbacks:eventName\n                                   payload:[[JSApplicationWrapper alloc] initWithRunningApplication:launchedApp screenWrapper:[[ScreenWrapper alloc] init]]];\n}\n\n- (void)applicationKilled:(id)notification {\n  SlateLogger(@\"Killed: %@\", [notification name]);\n  NSRunningApplication *app = [[notification userInfo] objectForKey:NSWorkspaceApplicationKey];\n  [apps removeObject:app];\n  [appNameToApp removeObjectForKey:[app localizedName]];\n  NSNumber *appPID = [NSNumber numberWithInteger:[app processIdentifier]];\n  [appToWindows removeObjectForKey:appPID];\n  AXObserverRemoveNotification([[pidToObserver objectForKey:[NSNumber numberWithInteger:[app processIdentifier]]] pointerValue], AXUIElementCreateApplication([app processIdentifier]), kAXWindowCreatedNotification);\n  AXObserverRemoveNotification([[pidToObserver objectForKey:[NSNumber numberWithInteger:[app processIdentifier]]] pointerValue], AXUIElementCreateApplication([app processIdentifier]), kAXFocusedWindowChangedNotification);\n  AXObserverRemoveNotification([[pidToObserver objectForKey:[NSNumber numberWithInteger:[app processIdentifier]]] pointerValue], AXUIElementCreateApplication([app processIdentifier]), kAXTitleChangedNotification);\n  [pidToObserver removeObjectForKey:[NSNumber numberWithInteger:[app processIdentifier]]];\n  [self pruneWindows];\n  [self bringAppToFront:[self currentApplication]];\n  NSString *eventName = prettyifyEventName([notification name]);\n  [[JSController getInstance] runCallbacks:eventName\n                                   payload:[[JSApplicationWrapper alloc] initWithRunningApplication:app screenWrapper:[[ScreenWrapper alloc] init]]];\n}\n\n- (void)bringAppToFront:(NSRunningApplication *)app {\n  if (![RunningApplications isAppSelectable:app]) return;\n  [apps removeObject:app];\n  [apps insertObject:app atIndex:0];\n#ifdef DEBUG\n  SlateLogger(@\"  New App Order:\");\n  for (NSRunningApplication *app in apps) {\n    SlateLogger(@\"    %@\", [app localizedName]);\n  }\n#endif\n}\n\n- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(__unsafe_unretained id *)stackbuf count:(NSUInteger)len {\n  return [apps countByEnumeratingWithState:state objects:stackbuf count:len];\n}\n\n- (NSArray *)windowIdsForTitle:(NSString *)title {\n  NSArray *windowsForTitle = [titleToWindow objectForKey:title];\n  if (windowsForTitle == nil || [windowsForTitle count] == 0) return nil;\n  NSMutableArray *windowIdsForTitle = [NSMutableArray array];\n  for(NSArray *windowInfo in windowsForTitle) {\n    [windowIdsForTitle addObject:[windowInfo objectAtIndex:2]];\n  }\n  return windowIdsForTitle;\n}\n\n@end\n"
  },
  {
    "path": "Slate/ScreenState.h",
    "content": "//\n//  ScreenState.h\n//  Slate\n//\n//  Created by Jigish Patel on 6/19/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n\n\n@interface ScreenState : NSObject {\n@private\n  id layout;\n  NSInteger type;\n  NSInteger count;\n  NSMutableArray *resolutions;\n}\n\n@property  id layout;\n@property (assign) NSInteger type;\n@property (assign) NSInteger count;\n@property  NSMutableArray *resolutions;\n\n- (id)initWithString:(NSString *)state;\n- (id)initWithConfig:(id)screenConfig layout:(id)_layout;\n\n@end\n"
  },
  {
    "path": "Slate/ScreenState.m",
    "content": "//\n//  ScreenState.m\n//  Slate\n//\n//  Created by Jigish Patel on 6/19/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"Constants.h\"\n#import \"ScreenState.h\"\n#import \"StringTokenizer.h\"\n\n\n@implementation ScreenState\n\n@synthesize layout;\n@synthesize type;\n@synthesize count;\n@synthesize resolutions;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [self setLayout:nil];\n    [self setType:TYPE_UNKNOWN];\n    [self setCount:TYPE_UNKNOWN];\n    [self setResolutions:nil];\n  }\n  return self;\n}\n\n- (id)initWithString:(NSString *)state {\n  // defaultLayout <name> <screen-setup>\n  self = [self init];\n  if (self) {\n    NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n    [StringTokenizer tokenize:state into:tokens];\n    if ([tokens count] < 3) {\n      return nil;\n    }\n    [self setLayout:[tokens objectAtIndex:1]];\n    // Parse screen-setup\n    //   count:NUMBER\n    //   resolutions:WIDTHxHEIGHT;...\n    NSArray *screenSetup = [[tokens objectAtIndex:2] componentsSeparatedByString:COLON];\n    if ([screenSetup count] < 2) {\n      return nil;\n    }\n    if ([[screenSetup objectAtIndex:0] isEqualToString:COUNT]) {\n      [self setCount:[[screenSetup objectAtIndex:1] integerValue]];\n      [self setType:TYPE_COUNT];\n    } else if ([[screenSetup objectAtIndex:0] isEqualToString:RESOLUTIONS]) {\n      [self setResolutions:[NSMutableArray arrayWithArray:[[screenSetup objectAtIndex:1] componentsSeparatedByCharactersInSet:\n                                                           [NSCharacterSet characterSetWithCharactersInString:[SEMICOLON stringByAppendingString:COMMA]]]]];\n      [resolutions sortUsingSelector:@selector(compare:)];\n      [self setType:TYPE_RESOLUTIONS];\n    } else {\n      return nil;\n    }\n  }\n  return self;\n}\n\n- (id)initWithConfig:(id)screenConfig layout:(id)_layout {\n  self = [self init];\n  if (self) {\n    [self setLayout:_layout];\n    if ([screenConfig isKindOfClass:[NSValue class]] || [screenConfig isKindOfClass:[NSNumber class]]) {\n      [self setCount:[screenConfig integerValue]];\n      [self setType:TYPE_COUNT];\n    } else if ([screenConfig isKindOfClass:[NSArray class]]) {\n      [self setResolutions:[screenConfig mutableCopy]];\n      [resolutions sortUsingSelector:@selector(compare:)];\n      [self setType:TYPE_RESOLUTIONS];\n    } else {\n      return nil;\n    }\n  }\n  return self;\n}\n\n\n@end\n"
  },
  {
    "path": "Slate/ScreenWrapper.h",
    "content": "//\n//  ScreenWrapper.h\n//  Slate\n//\n//  Created by Jigish Patel on 6/17/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n\n\n@interface ScreenWrapper : NSObject {\n  NSArray *screens;\n}\n\n@property  NSArray *screens;\n\n+ (void)updateLeftToRightToDefault;\n+ (void)updateLeftToRightToDefault:(NSArray *)theScreens;\n+ (void)updateScreenResolutions;\n+ (void)updateScreenResolutions:(NSArray *)theScreens;\n+ (void)updateStatics;\n+ (BOOL)hasScreenConfigChanged;\n- (id)initWithScreens:(NSArray *)theScreens; // Used for testing\n- (NSInteger)getScreenCount;\n- (NSRect)getScreenVisibleRect:(NSInteger)screenId;\n- (NSRect)getScreenVisibleRectForRef:(NSInteger)screenRefId;\n- (NSRect)getScreenRect:(NSInteger)screenId;\n- (NSRect)getScreenRectForRef:(NSInteger)screenRefId;\n- (NSInteger)convertDefaultOrderToLeftToRightOrder:(NSInteger)screenId;\n- (NSInteger)convertDefaultOrderToLeftToRightOrderIfNeeded:(NSInteger)screenId;\n- (void)getScreenResolutionStrings:(NSMutableArray *)strings;\n- (NSInteger)getScreenRefId:(NSString *)screenRef windowRect:(NSRect)window;\n- (NSInteger)getScreenId:(NSString *)screenRef windowRect:(NSRect)window;\n- (NSInteger)getScreenRefIdForRect:(NSRect)rect;\n- (NSInteger)getScreenIdForRect:(NSRect)rect;\n- (NSInteger)getScreenRefIdForPoint:(NSPoint)point;\n- (NSInteger)getScreenIdForPoint:(NSPoint)point;\n- (BOOL)isMainScreen:(NSInteger)screenID;\n- (BOOL)isMainScreenRef:(NSInteger)screenID;\n- (BOOL)isRectOffScreen:(NSRect)rect;\n- (BOOL)screenExists:(NSInteger)screenId;\n- (NSDictionary *)getScreenAndWindowValues:(NSInteger)screenId window:(NSRect)cWindowRect newSize:(NSSize)nSize;\n- (NSRect)convertScreenRectToWindowCoords:(NSInteger)screenId;\n+ (NSRect)convertScreenRectToWindowCoords:(NSScreen *)screen withReference:(NSScreen *)refScreen;\n- (NSRect)convertScreenVisibleRectToWindowCoords:(NSInteger)screenId;\n- (NSPoint)convertTopLeftToScreenRelative:(NSPoint)topLeft screen:(NSInteger)screenId;\n\n@end\n"
  },
  {
    "path": "Slate/ScreenWrapper.m",
    "content": "//\n//  ScreenWrapper.m\n//  Slate\n//\n//  Created by Jigish Patel on 6/17/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"Constants.h\"\n#import \"MathUtils.h\"\n#import \"ScreenWrapper.h\"\n#import \"SlateConfig.h\"\n#import \"SlateLogger.h\"\n\nstatic NSMutableArray *leftToRightToDefault = nil;\nstatic NSString *resolutions = nil;\n\n@implementation ScreenWrapper\n\n@synthesize screens;\n\n+ (void)initialize {\n  if (!leftToRightToDefault) {\n    leftToRightToDefault = [[NSMutableArray alloc] init];\n    [ScreenWrapper updateStatics];\n  }\n}\n\n+ (void)updateLeftToRightToDefault {\n  [ScreenWrapper updateLeftToRightToDefault:[NSScreen screens]];\n}\n\n+ (void)updateLeftToRightToDefault:(NSArray *)theScreens {\n  leftToRightToDefault = [[NSMutableArray alloc] initWithCapacity:[theScreens count]];\n  NSArray *sortedByXThenY = [theScreens sortedArrayUsingComparator: ^(id screen1, id screen2) {\n    NSRect screen1Rect = [ScreenWrapper convertScreenRectToWindowCoords:screen1 withReference:[theScreens objectAtIndex:ID_MAIN_SCREEN]];\n    NSRect screen2Rect = [ScreenWrapper convertScreenRectToWindowCoords:screen2 withReference:[theScreens objectAtIndex:ID_MAIN_SCREEN]];\n    if (screen1Rect.origin.x > screen2Rect.origin.x) {\n      return (NSComparisonResult)NSOrderedDescending;\n    }\n    if (screen1Rect.origin.x < screen2Rect.origin.x) {\n      return (NSComparisonResult)NSOrderedAscending;\n    }\n    if (screen1Rect.origin.y < screen2Rect.origin.y) {\n      return (NSComparisonResult)NSOrderedDescending;\n    }\n    if (screen1Rect.origin.y > screen2Rect.origin.y) {\n      return (NSComparisonResult)NSOrderedAscending;\n    }\n    return (NSComparisonResult)NSOrderedSame;\n  }];\n  for (NSInteger i = 0; i < [sortedByXThenY count]; i++) {\n    NSNumber *defaultId = nil;\n    for (NSInteger j = 0; j < [theScreens count]; j++) {\n      if ([sortedByXThenY objectAtIndex:i] == [theScreens objectAtIndex:j]) {\n        defaultId = [NSNumber numberWithInteger:j];\n        break;\n      }\n    }\n    [leftToRightToDefault addObject:defaultId];\n  }\n}\n\n+ (void)updateScreenResolutions {\n  [ScreenWrapper updateScreenResolutions:[NSScreen screens]];\n}\n\n+ (void)updateScreenResolutions:(NSArray *)theScreens {\n  resolutions = @\"\";\n  for (NSScreen *screen in theScreens) {\n    NSRect screenRect =[screen frame];\n    resolutions = [resolutions stringByAppendingFormat:@\"%i%@%i,\",(int)screenRect.size.width,X,(int)screenRect.size.height];\n  }\n}\n\n+ (void)updateStatics {\n  SlateLogger(@\"-- updateStatics\");\n  [ScreenWrapper updateLeftToRightToDefault];\n  [ScreenWrapper updateScreenResolutions];\n}\n\n+ (BOOL)hasScreenConfigChanged {\n  NSString *oldResolutions = [NSString stringWithString:resolutions];\n  NSArray *oldLeftToRight = [NSArray arrayWithArray:leftToRightToDefault];\n  [ScreenWrapper updateStatics];\n  if (![oldResolutions isEqualToString:resolutions]) return YES;\n  if ([oldLeftToRight count] != [leftToRightToDefault count]) return YES;\n  for (NSInteger i = 0; i < [oldLeftToRight count]; i++) {\n    if ([[oldLeftToRight objectAtIndex:i] integerValue] != [[leftToRightToDefault objectAtIndex:i] integerValue]) return YES;\n  }\n  return NO;\n}\n\n- (id)init {\n  return [self initWithScreens:[NSScreen screens]];\n}\n\n- (id)initWithScreens:(NSArray *)theScreens {\n  self = [super init];\n  if (self) {\n    [self setScreens:theScreens];\n    [ScreenWrapper updateLeftToRightToDefault:theScreens];\n  }\n  return self;\n}\n\n- (NSInteger)getScreenCount {\n  return [screens count];\n}\n\n- (void)getScreenResolutionStrings:(NSMutableArray *)strings {\n  for (NSInteger i = 0; i < [screens count]; i++) {\n    NSRect screenRect = [self convertScreenRectToWindowCoords:i];\n    NSString *resolution = [NSString stringWithFormat:@\"%i%@%i\",(int)screenRect.size.width,X,(int)screenRect.size.height];\n    SlateLogger(@\"Adding resolution: %@\",resolution);\n    [strings addObject:resolution];\n  }\n}\n\n- (NSRect)getScreenVisibleRect:(NSInteger)screenId {\n  return [self convertScreenVisibleRectToWindowCoords:screenId];\n}\n\n- (NSRect)getScreenVisibleRectForRef:(NSInteger)screenRefId {\n  NSInteger screenId = [[SlateConfig getInstance] getBoolConfig:ORDER_SCREENS_LEFT_TO_RIGHT] ? [[leftToRightToDefault objectAtIndex:screenRefId] integerValue] : screenRefId;\n  return [self getScreenVisibleRect:screenId];\n}\n\n- (NSRect)getScreenRect:(NSInteger)screenId {\n  return [self convertScreenRectToWindowCoords:screenId];\n}\n\n- (NSRect)getScreenRectForRef:(NSInteger)screenRefId {\n  NSInteger screenId = [[SlateConfig getInstance] getBoolConfig:ORDER_SCREENS_LEFT_TO_RIGHT] ? [[leftToRightToDefault objectAtIndex:screenRefId] integerValue] : screenRefId;\n  return [self getScreenRect:screenId];\n}\n\n- (NSInteger)convertDefaultOrderToLeftToRightOrder:(NSInteger)screenId {\n  return [leftToRightToDefault indexOfObject:[NSNumber numberWithInteger:screenId]];\n}\n\n- (NSInteger)convertDefaultOrderToLeftToRightOrderIfNeeded:(NSInteger)screenId {\n  return [[SlateConfig getInstance] getBoolConfig:ORDER_SCREENS_LEFT_TO_RIGHT] ? [self convertDefaultOrderToLeftToRightOrder:screenId] : screenId;\n}\n\n- (NSInteger)getScreenRefId:(NSString *)screenRef windowRect:(NSRect)window {\n  // returns the external (not default ordering) screen ID\n  if ([[SlateConfig getInstance] getBoolConfig:ORDER_SCREENS_LEFT_TO_RIGHT]) {\n    return [self convertDefaultOrderToLeftToRightOrder:[self getScreenId:screenRef windowRect:window]];\n  } else {\n    return [self getScreenId:screenRef windowRect:window];\n  }\n}\n\n- (NSInteger)getScreenId:(NSString *)screenRef windowRect:(NSRect)window {\n  NSInteger screenId = ID_IGNORE_SCREEN;\n  NSInteger currentScreenId = [self getScreenIdForRect:window];\n  NSRect screenRect = [self convertScreenRectToWindowCoords:currentScreenId];\n  if ([screenRef rangeOfString:RIGHT].length > 0) { // Orientation Based\n    NSRect testRect = NSMakeRect(screenRect.origin.x+screenRect.size.width, screenRect.origin.y, 1, screenRect.size.height);\n    screenId = [self getScreenIdForRect:testRect];\n  } else if ([screenRef rangeOfString:LEFT].length > 0) {\n    NSRect testRect = NSMakeRect(screenRect.origin.x-1, screenRect.origin.y, 1, screenRect.size.height);\n    screenId = [self getScreenIdForRect:testRect];\n  } else if ([screenRef rangeOfString:ABOVE].length > 0 || [screenRef rangeOfString:UP].length > 0) {\n    NSRect testRect = NSMakeRect(screenRect.origin.x, screenRect.origin.y - 1, screenRect.size.width, 1);\n    screenId = [self getScreenIdForRect:testRect];\n  } else if ([screenRef rangeOfString:BELOW].length > 0 || [screenRef rangeOfString:UP].length > 0) {\n    NSRect testRect = NSMakeRect(screenRect.origin.x, screenRect.origin.y + screenRect.size.height, screenRect.size.width, 1);\n    screenId = [self getScreenIdForRect:testRect];\n  } else if ([screenRef rangeOfString:NEXT].length > 0) {\n    if (currentScreenId == [screens count] - 1)\n      screenId = ID_MAIN_SCREEN;\n    else\n      screenId = currentScreenId+1;\n  } else if ([screenRef rangeOfString:PREVIOUS].length > 0 || [screenRef rangeOfString:PREV].length > 0) {\n    if (currentScreenId == ID_MAIN_SCREEN)\n      screenId = [screens count] - 1;\n    else\n      screenId = currentScreenId-1;\n  } else if ([screenRef rangeOfString:X].length > 0) { // Resolution Based\n    NSArray *tokens = [screenRef componentsSeparatedByString:X];\n    if ([tokens count] < 2) return ID_IGNORE_SCREEN;\n    NSInteger width = [[tokens objectAtIndex:0] integerValue];\n    NSInteger height = [[tokens objectAtIndex:1] integerValue];\n    for (NSUInteger i = 0; i < [screens count]; i++) {\n      NSSize size = [self convertScreenRectToWindowCoords:i].size;\n      if (size.width == width && size.height == height) return i;\n    }\n    screenId = [[SlateConfig getInstance] getBoolConfig:DEFAULT_TO_CURRENT_SCREEN] ? ID_CURRENT_SCREEN : ID_IGNORE_SCREEN;\n  } else if ([screenRef rangeOfString:ORDERED].length > 0) { // Explicitly Ordered\n    NSArray *tokens = [screenRef componentsSeparatedByString:COLON];\n    if ([tokens count] < 2) return ID_IGNORE_SCREEN;\n    NSInteger leftToRightId = [[tokens objectAtIndex:1] integerValue];\n    screenId = (leftToRightId < ID_MAIN_SCREEN || leftToRightId > [screens count]) ? leftToRightId : [[leftToRightToDefault objectAtIndex:leftToRightId] integerValue];\n  } else {\n    NSInteger screenRefInt = [screenRef integerValue];\n    if (screenRefInt < ID_MAIN_SCREEN || screenRefInt >= [screens count]) {\n      screenId = screenRefInt;\n    } else {\n      screenId = [[SlateConfig getInstance] getBoolConfig:ORDER_SCREENS_LEFT_TO_RIGHT] ? [[leftToRightToDefault objectAtIndex:screenRefInt] integerValue] : screenRefInt;\n    }\n  }\n  SlateLogger(@\"getScreenId for ref=[%@] current=[%ld] screen=[%ld]\", screenRef, (long)currentScreenId, (long)screenId);\n  if (screenId == ID_CURRENT_SCREEN) {\n    return currentScreenId;\n  } else if (screenId < ID_MAIN_SCREEN) {\n    return ID_IGNORE_SCREEN;\n  } else if (ID_MAIN_SCREEN <= screenId && screenId < [screens count]) {\n    return screenId;\n  } else if ([[SlateConfig getInstance] getBoolConfig:DEFAULT_TO_CURRENT_SCREEN]) {\n    return currentScreenId;\n  } else {\n    return ID_IGNORE_SCREEN;\n  }\n}\n\n- (NSInteger)getScreenRefIdForRect:(NSRect)rect {\n  return [self convertDefaultOrderToLeftToRightOrder:[self getScreenIdForRect:rect]];\n}\n\n- (NSInteger)getScreenIdForRect:(NSRect)rect {\n  NSRect largestIntersection = NSZeroRect;\n  NSInteger screenIndex = ID_IGNORE_SCREEN;\n  for (NSInteger i = 0; i < [screens count]; i++) {\n    NSRect currentIntersection = NSIntersectionRect([self convertScreenRectToWindowCoords:i], rect);\n    if ([MathUtils isRect:currentIntersection biggerThan:largestIntersection]) {\n      largestIntersection = currentIntersection;\n      screenIndex = i;\n    }\n  }\n  return screenIndex;\n}\n\n- (NSInteger)getScreenRefIdForPoint:(NSPoint)point {\n  return [self convertDefaultOrderToLeftToRightOrder:[self getScreenIdForPoint:point]];\n}\n\n- (NSInteger)getScreenIdForPoint:(NSPoint)point {\n  for (NSInteger i = 0; i < [screens count]; i++) {\n    NSRect screen = [self convertScreenRectToWindowCoords:i];\n    if (screen.origin.x <= point.x && screen.origin.x+screen.size.width >= point.x &&\n        screen.origin.y <= point.y && screen.origin.y+screen.size.height >= point.y)\n      return i;\n  }\n  return -1;\n}\n\n- (BOOL)isMainScreen:(NSInteger)screenID {\n  return screenID == ID_MAIN_SCREEN;\n}\n\n- (BOOL)isMainScreenRef:(NSInteger)screenRefId {\n  NSInteger screenId = [[SlateConfig getInstance] getBoolConfig:ORDER_SCREENS_LEFT_TO_RIGHT] ? [[leftToRightToDefault objectAtIndex:screenRefId] integerValue] : screenRefId;\n  return [self isMainScreen:screenId];\n}\n\n- (BOOL)isRectOffScreen:(NSRect)rect {\n  // Check all corners to see if they are on a screen\n  // Top-left\n  if ([self getScreenIdForPoint:NSMakePoint(rect.origin.x, rect.origin.y)] < 0) return YES;\n  // Top-right\n  if ([self getScreenIdForPoint:NSMakePoint(rect.origin.x+rect.size.width, rect.origin.y)] < 0) return YES;\n  // Bottom-left\n  if ([self getScreenIdForPoint:NSMakePoint(rect.origin.x, rect.origin.y+rect.size.height)] < 0) return YES;\n  // Bottom-right\n  if ([self getScreenIdForPoint:NSMakePoint(rect.origin.x+rect.size.width, rect.origin.y+rect.size.height)] < 0) return YES;\n  return NO;\n}\n\n- (BOOL)screenExists:(NSInteger)screenId {\n  NSInteger count = ((NSInteger)[[NSScreen screens] count]);\n  return (ID_MAIN_SCREEN <= screenId && screenId < count) ? YES : NO;\n}\n\n- (NSDictionary *)getScreenAndWindowValues:(NSInteger)screenId window:(NSRect)cWindowRect newSize:(NSSize)nSize {\n  NSInteger originX = 0;\n  NSInteger originY = 0;\n  NSInteger sizeX = 0;\n  NSInteger sizeY = 0;\n  if ([self screenExists:screenId]) {\n    NSRect screenRect = [self convertScreenVisibleRectToWindowCoords:screenId];\n    sizeX = screenRect.size.width;\n    sizeY = screenRect.size.height;\n    originX = screenRect.origin.x;\n    originY = screenRect.origin.y;\n  } else {\n    return [NSDictionary dictionary];\n  }\n  NSSize cSize = cWindowRect.size;\n  NSPoint cTopLeft = cWindowRect.origin;\n  SlateLogger(@\"screenOrigin:(%ld,%ld), screenSize:(%ld,%ld), windowSize:(%f,%f), windowTopLeft:(%f,%f)\",(long)originX,\n        (long)originY,\n        (long)sizeX,\n        (long)sizeY,\n        cSize.width,\n        cSize.height,\n        cTopLeft.x,\n        cTopLeft.y);\n  return [NSDictionary dictionaryWithObjectsAndKeys:\n          [NSNumber numberWithInteger:originX], SCREEN_ORIGIN_X,\n          [NSNumber numberWithInteger:originY], SCREEN_ORIGIN_Y,\n          [NSNumber numberWithInteger:sizeX], SCREEN_SIZE_X,\n          [NSNumber numberWithInteger:sizeY], SCREEN_SIZE_Y,\n          [NSNumber numberWithInteger:(NSInteger)cSize.width], WINDOW_SIZE_X,\n          [NSNumber numberWithInteger:(NSInteger)cSize.height], WINDOW_SIZE_Y,\n          [NSNumber numberWithInteger:(NSInteger)nSize.width], NEW_WINDOW_SIZE_X,\n          [NSNumber numberWithInteger:(NSInteger)nSize.height], NEW_WINDOW_SIZE_Y,\n          [NSNumber numberWithInteger:(NSInteger)cTopLeft.x], WINDOW_TOP_LEFT_X,\n          [NSNumber numberWithInteger:(NSInteger)cTopLeft.y], WINDOW_TOP_LEFT_Y, nil];\n}\n\n// The following three methods are the only methods that should contain the frame/visibleFrame calls. All other methods should fetch the frame\n// and/or visibleFrame using these methods. This is due to the comment above flipYCoordinateOfRect.\n- (NSRect)convertScreenRectToWindowCoords:(NSInteger)screenId {\n  if (screenId == ID_MAIN_SCREEN) {\n    return [[screens objectAtIndex:screenId] frame];\n  } else if ([self screenExists:screenId]) {\n    return [MathUtils flipYCoordinateOfRect:[[screens objectAtIndex:screenId] frame] withReference:[[screens objectAtIndex:ID_MAIN_SCREEN] frame]];\n  }\n  return NSZeroRect;\n}\n\n+ (NSRect)convertScreenRectToWindowCoords:(NSScreen *)screen withReference:(NSScreen *)refScreen {\n  if (screen) {\n    return [MathUtils flipYCoordinateOfRect:[screen frame] withReference:[refScreen frame]];\n  }\n  return NSZeroRect;\n}\n\n- (NSRect)convertScreenVisibleRectToWindowCoords:(NSInteger)screenId {\n  if (screenId == ID_MAIN_SCREEN) {\n    return [MathUtils flipYCoordinateOfRect:[[screens objectAtIndex:ID_MAIN_SCREEN] visibleFrame] withReference:[[screens objectAtIndex:ID_MAIN_SCREEN] frame]];\n  } else if ([self screenExists:screenId]) {\n    return [MathUtils flipYCoordinateOfRect:[[screens objectAtIndex:screenId] visibleFrame] withReference:[[screens objectAtIndex:ID_MAIN_SCREEN] frame]];\n  }\n  return NSZeroRect;\n}\n\n- (NSPoint)convertTopLeftToScreenRelative:(NSPoint)topLeft screen:(NSInteger)screenId {\n  NSRect screenRect = [self convertScreenVisibleRectToWindowCoords:screenId];\n  return NSMakePoint(topLeft.x-screenRect.origin.x, topLeft.y-screenRect.origin.y);\n}\n\n@end\n"
  },
  {
    "path": "Slate/SequenceOperation.h",
    "content": "//\n//  SequenceOperation.h\n//  Slate\n//\n//  Created by Jigish Patel on 10/5/12.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"Operation.h\"\n\n@interface SequenceOperation : Operation {\n  NSArray *operations; // Array of arrays\n}\n\n@property NSArray *operations;\n\n- (id)initWithArray:(NSArray *)opArray;\n\n+ (id)sequenceOperation;\n+ (id)sequenceOperationFromString:(NSString *)sequenceOperation;\n\n@end\n"
  },
  {
    "path": "Slate/SequenceOperation.m",
    "content": "//\n//  SequenceOperation.m\n//  Slate\n//\n//  Created by Jigish Patel on 10/5/12.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"SequenceOperation.h\"\n#import \"SlateLogger.h\"\n#import \"StringTokenizer.h\"\n#import \"Constants.h\"\n#import \"JSController.h\"\n#import <WebKit/WebKit.h>\n#import \"JSOperation.h\"\n\n@implementation SequenceOperation\n\n@synthesize operations;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [self setOperations:[NSArray array]];\n  }\n  return self;\n}\n\n- (id)initWithArray:(NSArray *)opArray {\n  self = [self init];\n  if (self) {\n    [self setOperations:opArray];\n  }\n  return self;\n}\n\n- (BOOL)doOperation {\n  SlateLogger(@\"----------------- Begin Sequence Operation -----------------\");\n  ScreenWrapper *sw = [[ScreenWrapper alloc] init];\n  BOOL success = [self doOperationWithAccessibilityWrapper:nil screenWrapper:sw];\n  SlateLogger(@\"-----------------  End Sequence Operation  -----------------\");\n  return success;\n}\n\n- (BOOL) doOperationWithAccessibilityWrapper:(AccessibilityWrapper *)iamnil screenWrapper:(ScreenWrapper *)sw {\n  for (NSInteger i = 0; i < [[self operations] count]; i++) {\n    AccessibilityWrapper *aw = [[AccessibilityWrapper alloc] init];\n    if (![aw inited]) return NO;\n    for (NSInteger j = 0; j < [[[self operations] objectAtIndex:i] count]; j++) {\n      [[[[self operations] objectAtIndex:i] objectAtIndex:j] doOperationWithAccessibilityWrapper:aw screenWrapper:sw];\n    }\n  }\n  return YES;\n}\n\n- (BOOL)testOperation {\n  BOOL success = YES;\n  for (NSInteger i = 0; i < [operations count]; i++) {\n    for (NSInteger op = 0; op < [[operations objectAtIndex:i] count]; op++) {\n      [[[operations objectAtIndex:i] objectAtIndex:op] testOperation];\n    }\n  }\n  return success;\n}\n\n- (NSArray *)requiredOptions {\n  return [NSArray arrayWithObject:OPT_OPERATIONS];\n}\n\n- (void)parseOption:(NSString *)_name value:(id)value {\n  if (value == nil) { return; }\n  if ([_name isEqualToString:OPT_OPERATIONS]) {\n    if (![value isKindOfClass:[NSArray class]]) {\n      @throw([NSException exceptionWithName:[NSString stringWithFormat:@\"Invalid %@\", _name] reason:[NSString stringWithFormat:@\"Invalid %@ '%@'\", _name, value] userInfo:nil]);\n      return;\n    }\n    NSMutableArray *ops = [NSMutableArray array];\n    for (id key in value) {\n      if (![key isKindOfClass:[Operation class]] && ![key isKindOfClass:[NSArray class]] && ![key isKindOfClass:[WebScriptObject class]]) {\n        @throw([NSException exceptionWithName:[NSString stringWithFormat:@\"Invalid %@\", _name] reason:[NSString stringWithFormat:@\"Invalid %@ '%@'\", _name, value] userInfo:nil]);\n        continue;\n      }\n      NSMutableArray *innerOps = [NSMutableArray array];\n      if ([key isKindOfClass:[WebScriptObject class]]) {\n        Operation *op = [JSOperation jsOperationWithFunction:key];\n        if (op == nil) {\n          @throw([NSException exceptionWithName:[NSString stringWithFormat:@\"Invalid %@\", _name] reason:[NSString stringWithFormat:@\"Invalid %@ '%@'\", _name, value] userInfo:nil]);\n          continue;\n        }\n        [innerOps addObject:op];\n      } else if ([key isKindOfClass:[Operation class]]) {\n        [innerOps addObject:key];\n      } else if ([key isKindOfClass:[NSArray class]]) {\n        for (id innerKey in key) {\n          Operation *op = nil;\n          if ([innerKey isKindOfClass:[WebScriptObject class]]) {\n            op = [JSOperation jsOperationWithFunction:innerKey];\n          } else if ([innerKey isKindOfClass:[Operation class]]) {\n            op = innerKey;\n          }\n          if (op == nil) {\n            @throw([NSException exceptionWithName:[NSString stringWithFormat:@\"Invalid %@\", _name] reason:[NSString stringWithFormat:@\"Invalid %@ '%@'\", _name, value] userInfo:nil]);\n            continue;\n          }\n          [innerOps addObject:op];\n        }\n      }\n      [ops addObject:innerOps];\n    }\n    [self setOperations:ops];\n  }\n}\n\n+ (id)sequenceOperation {\n  return [[SequenceOperation alloc] init];\n}\n\n+ (id)sequenceOperationFromString:(NSString *)sequenceOperation {\n  // sequence op[ (\\||>) op]+\n  NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n  [StringTokenizer tokenize:sequenceOperation into:tokens maxTokens:2];\n\n  if ([tokens count] < 2) {\n    SlateLogger(@\"ERROR: Invalid Parameters '%@'\", sequenceOperation);\n    @throw([NSException exceptionWithName:@\"Invalid Parameters\" reason:[NSString stringWithFormat:@\"Invalid Parameters in '%@'. Sequence operations require the following format: 'chain op [(\\\\||>) op]+'\", sequenceOperation] userInfo:nil]);\n  }\n\n  NSString *opsString = [tokens objectAtIndex:1];\n  NSArray *ops = [opsString componentsSeparatedByString:PIPE_PADDED];\n  NSMutableArray *opArray = [[NSMutableArray alloc] initWithCapacity:10];\n  for (NSInteger i = 0; i < [ops count]; i++) {\n    NSArray *sameWindowOps = [[ops objectAtIndex:i] componentsSeparatedByString:GREATER_THAN_PADDED];\n    NSMutableArray *sameWindowOpArray = [[NSMutableArray alloc] initWithCapacity:10];\n    for (NSInteger j = 0; j < [sameWindowOps count]; j++) {\n      Operation *op = [Operation operationFromString:[sameWindowOps objectAtIndex:j]];\n      if (op != nil) {\n        [sameWindowOpArray addObject:op];\n      } else {\n        SlateLogger(@\"ERROR: Invalid Operation in Sequence: '%@'\", [sameWindowOps objectAtIndex:j]);\n        @throw([NSException exceptionWithName:@\"Invalid Operation in Sequence\" reason:[NSString stringWithFormat:@\"Invalid operation '%@' in sequence.\", [sameWindowOps objectAtIndex:j]] userInfo:nil]);\n      }\n    }\n    [opArray addObject:sameWindowOpArray];\n  }\n\n  Operation *op = [[SequenceOperation alloc] initWithArray:opArray];\n  return op;\n}\n\n\n\n@end\n"
  },
  {
    "path": "Slate/ShellOperation.h",
    "content": "//\n//  ShellOperation.h\n//  Slate\n//\n//  Created by Jigish Patel on 10/17/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"Operation.h\"\n\n@interface ShellOperation : Operation {\n  NSString *command;\n  NSArray *args;\n  NSString *currentPath;\n  BOOL waitForExit;\n}\n\n@property NSString *command;\n@property NSArray *args;\n@property NSString *currentPath;\n@property BOOL waitForExit;\n\n- (id)initWithCommand:(NSString *)theCommand args:(NSArray *)theArgs waitForExit:(BOOL)theWaitForExit currentPath:(NSString *)theCurrentPath;\n\n+ (id)shellOperation;\n+ (id)shellOperationFromString:(NSString *)shellOperation;\n\n@end\n"
  },
  {
    "path": "Slate/ShellOperation.m",
    "content": "//\n//  ShellOperation.m\n//  Slate\n//\n//  Created by Jigish Patel on 10/17/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"ShellOperation.h\"\n#import \"Constants.h\"\n#import \"SlateLogger.h\"\n#import \"StringTokenizer.h\"\n#import \"ShellUtils.h\"\n\n@implementation ShellOperation\n\n@synthesize command, args, waitForExit, currentPath;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [self setCommand:@\"\"];\n    [self setArgs:[NSArray array]];\n    [self setWaitForExit:NO];\n    [self setCurrentPath:nil];\n  }\n  return self;\n}\n\n- (id)initWithCommand:(NSString *)theCommand args:(NSArray *)theArgs waitForExit:(BOOL)theWaitForExit currentPath:(NSString *)theCurrentPath {\n  self = [super init];\n  if (self) {\n    [self setCommand:theCommand];\n    [self setArgs:theArgs];\n    [self setWaitForExit:theWaitForExit];\n    [self setCurrentPath:theCurrentPath];\n  }\n  return self;\n}\n\n- (BOOL)doOperation {\n  SlateLogger(@\"----------------- Begin Shell Operation -----------------\");\n  // We don't use the passed in AccessibilityWrapper or ScreenWrapper so they are nil. No need to waste time creating them here.\n  BOOL success = [self doOperationWithAccessibilityWrapper:nil screenWrapper:nil];\n  SlateLogger(@\"-----------------  End Shell Operation  -----------------\");\n  return success;\n}\n\n- (BOOL)doOperationWithAccessibilityWrapper:(AccessibilityWrapper *)iamnil screenWrapper:(ScreenWrapper *)iamalsonil {\n  [self evalOptionsWithAccessibilityWrapper:iamnil screenWrapper:iamalsonil];\n  NSTask *task = [ShellUtils run:[self command] args:[self args] wait:[self waitForExit] path:[self currentPath]];\n  return task != nil;\n}\n\n- (BOOL)testOperation {\n  return [ShellUtils commandExists:[self command]];\n}\n\n- (NSArray *)requiredOptions {\n  return [NSArray arrayWithObjects:OPT_COMMAND, nil];\n}\n\n- (void)parseOption:(NSString *)name value:(NSString *)value {\n  // all options should be strings\n  if (value == nil) { return; }\n  if ([name isEqualToString:OPT_COMMAND]) {\n    if (![value isKindOfClass:[NSString class]]) {\n      @throw([NSException exceptionWithName:[NSString stringWithFormat:@\"Invalid %@\", name] reason:[NSString stringWithFormat:@\"Invalid %@ '%@'\", name, value] userInfo:nil]);\n    }\n    NSMutableArray *commandAndArgsTokens = [NSMutableArray array];\n    [StringTokenizer tokenize:value into:commandAndArgsTokens];\n    if ([commandAndArgsTokens count] < 1) {\n      SlateLogger(@\"ERROR: Invalid Shell Parameter '%@'\", value);\n      @throw([NSException exceptionWithName:@\"Invalid Shell Parameter\" reason:[NSString stringWithFormat:@\"Invalid Shell Parameter '%@'.\", value] userInfo:nil]);\n    }\n    NSString *cmd = [commandAndArgsTokens objectAtIndex:0];\n    NSMutableArray *ars = [NSMutableArray array];\n    for (NSInteger i = 1; i < [commandAndArgsTokens count]; i++) {\n      [ars addObject:[commandAndArgsTokens objectAtIndex:i]];\n    }\n    [self setCommand:cmd];\n    [self setArgs:ars];\n  } else if ([name isEqualToString:OPT_WAIT]) {\n    if (![value isKindOfClass:[NSString class]] && ![value isKindOfClass:[NSValue class]] && ![value isKindOfClass:[NSNumber class]]) {\n      @throw([NSException exceptionWithName:[NSString stringWithFormat:@\"Invalid %@\", name] reason:[NSString stringWithFormat:@\"Invalid %@ '%@'\", name, value] userInfo:nil]);\n    }\n    [self setWaitForExit:[value boolValue]];\n  } else if ([name isEqualToString:OPT_PATH]) {\n    if (![value isKindOfClass:[NSString class]]) {\n      @throw([NSException exceptionWithName:[NSString stringWithFormat:@\"Invalid %@\", name] reason:[NSString stringWithFormat:@\"Invalid %@ '%@'\", name, value] userInfo:nil]);\n    }\n    [self setCurrentPath:[value stringByExpandingTildeInPath]];\n  }\n}\n\n+ (id)shellOperation {\n  return [[ShellOperation alloc] init];\n}\n\n+ (id)shellOperationFromString:(NSString *)shellOperation {\n  // shell [wait] 'command'\n  NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n  [StringTokenizer tokenize:shellOperation into:tokens quoteChars:[NSCharacterSet characterSetWithCharactersInString:QUOTES]];\n\n  if ([tokens count] < 2) {\n    SlateLogger(@\"ERROR: Invalid Parameters '%@'\", shellOperation);\n    @throw([NSException exceptionWithName:@\"Invalid Parameters\" reason:[NSString stringWithFormat:@\"Invalid Parameters in '%@'. Shell operations require the following format: shell [wait] 'command'\", shellOperation] userInfo:nil]);\n  }\n\n  BOOL waitForExit = NO;\n  NSString *currentPath = nil;\n  for (NSInteger i = 1; i < [tokens count] - 1; i++) {\n    if ([[tokens objectAtIndex:i] isEqualToString:WAIT]) {\n      waitForExit = YES;\n    } else if ([[tokens objectAtIndex:i] hasPrefix:PATH]) {\n      currentPath = [[tokens objectAtIndex:i] stringByReplacingOccurrencesOfString:PATH withString:EMPTY];\n      if ([currentPath hasPrefix:TILDA]) {\n        currentPath = [currentPath stringByExpandingTildeInPath];\n      }\n    }\n  }\n  NSString *commandAndArgs = [tokens lastObject];\n  NSMutableArray *commandAndArgsTokens = [NSMutableArray array];\n  [StringTokenizer tokenize:commandAndArgs into:commandAndArgsTokens];\n  if ([commandAndArgsTokens count] < 1) {\n    SlateLogger(@\"ERROR: Invalid Parameters '%@'\", shellOperation);\n    @throw([NSException exceptionWithName:@\"Invalid Parameters\" reason:[NSString stringWithFormat:@\"Invalid Parameters in '%@'. Shell operations require the following format: shell [wait] 'command'\", shellOperation] userInfo:nil]);\n  }\n  NSString *command = [commandAndArgsTokens objectAtIndex:0];\n  NSMutableArray *args = [NSMutableArray array];\n  for (NSInteger i = 1; i < [commandAndArgsTokens count]; i++) {\n    [args addObject:[commandAndArgsTokens objectAtIndex:i]];\n  }\n\n  Operation *op = [[ShellOperation alloc] initWithCommand:command args:args waitForExit:waitForExit currentPath:currentPath];\n  return op;\n\n}\n\n@end\n"
  },
  {
    "path": "Slate/ShellUtils.h",
    "content": "//\n//  ShellUtils.h\n//  Slate\n//\n//  Created by Jigish Patel on 10/17/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n\n@interface ShellUtils : NSObject\n\n+ (BOOL)commandExists:(NSString *)command;\n+ (NSTask *)run:(NSString *)command args:(NSArray *)args wait:(BOOL)wait path:(NSString *)path;\n+ (NSString *)run:(NSString *)commandAndArgs wait:(BOOL)wait path:(NSString *)path;\n\n@end\n"
  },
  {
    "path": "Slate/ShellUtils.m",
    "content": "//\n//  ShellUtils.m\n//  Slate\n//\n//  Created by Jigish Patel on 10/17/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"ShellUtils.h\"\n#import \"Constants.h\"\n#import \"SlateLogger.h\"\n#import \"StringTokenizer.h\"\n\n@implementation ShellUtils\n\n+ (BOOL)commandExists:(NSString *)command {\n  if (command == nil || [EMPTY isEqualToString:command]) return NO;\n  @try {\n    NSTask *task;\n    task = [[NSTask alloc] init];\n    [task setLaunchPath:@\"/usr/bin/command\"];\n\n    NSArray *arguments;\n    arguments = [NSArray arrayWithObjects:@\"-v\", command, nil];\n    [task setArguments:arguments];\n\n    NSPipe *pipe;\n    pipe = [NSPipe pipe];\n    [task setStandardOutput:pipe];\n    [task setStandardInput:[NSPipe pipe]];\n\n    NSFileHandle *file;\n    file = [pipe fileHandleForReading];\n\n    [task launch];\n\n    NSData *data;\n    data = [file readDataToEndOfFile];\n\n    NSString *string;\n    string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];\n    if ([string isEqualToString:EMPTY]) {\n      return NO;\n    }\n    return YES;\n  } @catch (id ex) {\n    return NO;\n  }\n}\n\n+ (NSTask *)run:(NSString *)command args:(NSArray *)args wait:(BOOL)wait path:(NSString *)path {\n  NSTask *task;\n  task = [[NSTask alloc] init];\n  [task setLaunchPath:command];\n  [task setArguments:args];\n  if (path != nil) [task setCurrentDirectoryPath:path];\n\n  NSPipe *pipe;\n  pipe = [NSPipe pipe];\n  [task setStandardOutput:pipe];\n  [task setStandardError:pipe];\n  [task setStandardInput:[NSPipe pipe]];\n\n  NSFileHandle *file;\n  file = [pipe fileHandleForReading];\n\n  [task launch];\n  if (wait){\n    [task waitUntilExit];\n    SlateLogger(@\"SHELL RESULT:\");\n    SlateLogger([[NSString alloc] initWithData:[file readDataToEndOfFile] encoding:NSUTF8StringEncoding]);\n  }\n  return task;\n}\n\n+ (NSString *)run:(NSString *)commandAndArgs wait:(BOOL)wait path:(NSString *)path {\n  NSMutableArray *commandAndArgsTokens = [NSMutableArray array];\n  [StringTokenizer tokenize:commandAndArgs into:commandAndArgsTokens quoteChars:[NSCharacterSet characterSetWithCharactersInString:@\"'\\\"\"]];\n  if ([commandAndArgsTokens count] < 1) {\n    SlateLogger(@\"ERROR: Invalid Shell Parameter '%@'\", commandAndArgs);\n    @throw([NSException exceptionWithName:@\"Invalid Shell Parameter\" reason:[NSString stringWithFormat:@\"Invalid Shell Parameter '%@'.\", commandAndArgs] userInfo:nil]);\n  }\n  NSString *command = [commandAndArgsTokens objectAtIndex:0];\n  NSMutableArray *args = [NSMutableArray array];\n  for (NSInteger i = 1; i < [commandAndArgsTokens count]; i++) {\n    [args addObject:[commandAndArgsTokens objectAtIndex:i]];\n  }\n  NSTask *task;\n  task = [[NSTask alloc] init];\n  [task setLaunchPath:[command stringByExpandingTildeInPath]];\n  [task setArguments:args];\n  if (path != nil) [task setCurrentDirectoryPath:[path stringByExpandingTildeInPath]];\n\n  NSPipe *pipe;\n  pipe = [NSPipe pipe];\n  [task setStandardOutput:pipe];\n  [task setStandardError:pipe];\n  [task setStandardInput:[NSPipe pipe]];\n\n  NSFileHandle *file;\n  file = [pipe fileHandleForReading];\n\n  [task launch];\n  if (!wait) return nil;\n  [task waitUntilExit];\n  NSData *data = [file readDataToEndOfFile];\n  NSString *res = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];\n  SlateLogger(@\"SHELL RESULT:\");\n  SlateLogger(res);\n  return res;\n}\n\n@end\n"
  },
  {
    "path": "Slate/Slate-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIconFile</key>\n\t<string>icon.icns</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.slate.${PRODUCT_NAME:rfc1034identifier}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0.25</string>\n\t<key>LSApplicationCategoryType</key>\n\t<string>public.app-category.utilities</string>\n\t<key>LSBackgroundOnly</key>\n\t<false/>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>${MACOSX_DEPLOYMENT_TARGET}</string>\n\t<key>LSUIElement</key>\n\t<true/>\n\t<key>NSMainNibFile</key>\n\t<string>MainMenu</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n\t<key>SUFeedURL</key>\n\t<string>https://www.ninjamonkeysoftware.com/slate/appcast.xml</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Slate/Slate-Prefix.pch",
    "content": "//\n// Prefix header for all source files of the 'Slate' target in the 'Slate' project\n//\n\n#ifdef __OBJC__\n    #import <Cocoa/Cocoa.h>\n#endif\n"
  },
  {
    "path": "Slate/SlateAppDelegate.h",
    "content": "//\n//  SlateAppDelegate.h\n//  Slate\n//\n//  Created by Jigish Patel on 5/18/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <Carbon/Carbon.h>\n#import <Cocoa/Cocoa.h>\n\n@class SwitchOperation;\n@class SnapshotOperation;\n@class ActivateSnapshotOperation;\n@class DeleteSnapshotOperation;\n@class HintOperation;\n@class Binding;\n@class GridOperation;\n\n@interface SlateAppDelegate : NSObject <NSApplicationDelegate> {\n@private\n  IBOutlet NSMenu *statusMenu;\n  NSMenuItem *activateSnapshotItem;\n  NSMenuItem *launchOnLoginItem;\n  IBOutlet NSWindow *windowInfo;\n  IBOutlet NSWindow *configHelper;\n  IBOutlet NSTextView *configHelperTextView;\n  NSStatusItem *statusItem;\n  NSWindowController *windowInfoController;\n  NSWindowController *configHelperController;\n  HintOperation *currentHintOperation;\n  GridOperation *currentGridOperation;\n  Binding *currentSwitchBinding;\n  SnapshotOperation *menuSnapshotOperation;\n  SnapshotOperation *undoSnapshotOperation;\n  ActivateSnapshotOperation *menuActivateSnapshotOperation;\n  DeleteSnapshotOperation *undoDeleteSnapshotOperation;\n  NSInteger cmdTabBinding;\n  NSInteger cmdShiftTabBinding;\n  NSMutableDictionary *modalHotKeyRefs;\n  NSMutableDictionary *modalIdToKey;\n  NSString *currentModalKey;\n  NSMutableArray *currentModalHotKeyRefs;\n  BOOL hasUndoOperation;\n}\n\n@property HintOperation *currentHintOperation;\n@property GridOperation *currentGridOperation;\n@property Binding *currentSwitchBinding;\n@property SnapshotOperation *menuSnapshotOperation;\n@property SnapshotOperation *undoSnapshotOperation;\n@property ActivateSnapshotOperation *menuActivateSnapshotOperation;\n@property DeleteSnapshotOperation *undoDeleteSnapshotOperation;\n@property (assign) NSInteger cmdTabBinding;\n@property (assign) NSInteger cmdShiftTabBinding;\n@property NSMutableDictionary *modalHotKeyRefs;\n@property NSMutableDictionary *modalIdToKey;\n@property NSString *currentModalKey;\n@property NSMutableArray *currentModalHotKeyRefs;\n@property (assign) BOOL hasUndoOperation;\n\n\n- (IBAction)updateLaunchState;\n- (IBAction)relaunch;\n- (IBAction)currentWindowInfo;\n- (IBAction)configurationHelper;\n- (IBAction)aboutWindow;\n- (void)loadConfig;\n- (void)registerHotKeys;\n- (void)createSnapshotOperations;\n- (IBAction)takeSnapshot;\n- (IBAction)activateSnapshot;\n- (OSStatus)timerActivateBinding:(NSTimer *)timer;\n- (void)resetModalKey;\n- (OSStatus)activateBinding:(EventHotKeyID)hkCom isRepeat:(BOOL)isRepeat;\n- (BOOL)isInLoginItems;\n- (void)addToLoginItems;\n- (void)deleteFromLoginItems;\n- (void)setLaunchOnLoginItemStatus;\n\nOSStatus OnHotKeyEvent(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData);\nOSStatus OnHotKeyReleasedEvent(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData);\nOSStatus OnModifiersChangedEvent(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData);\n\n@end\n"
  },
  {
    "path": "Slate/SlateAppDelegate.m",
    "content": "//\n//  SlateAppDelegate.m\n//  Slate\n//\n//  Created by Jigish Patel on 5/18/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"Constants.h\"\n#import \"SlateAppDelegate.h\"\n#import \"SlateConfig.h\"\n#import \"JSController.h\"\n#import \"Binding.h\"\n#import \"HintOperation.h\"\n#import \"SlateLogger.h\"\n#import \"SnapshotList.h\"\n#import \"SnapshotOperation.h\"\n#import \"ActivateSnapshotOperation.h\"\n#import \"DeleteSnapshotOperation.h\"\n#import \"SwitchOperation.h\"\n#import \"RunningApplications.h\"\n#import \"GridOperation.h\"\n#import <Sparkle/SUUpdater.h>\n\n@implementation SlateAppDelegate\n\n@synthesize currentHintOperation, currentGridOperation, currentSwitchBinding, menuSnapshotOperation;\n@synthesize menuActivateSnapshotOperation, cmdTabBinding, cmdShiftTabBinding, modalHotKeyRefs, modalIdToKey;\n@synthesize currentModalKey, currentModalHotKeyRefs, undoSnapshotOperation, undoDeleteSnapshotOperation, hasUndoOperation;\n\nstatic NSObject *timerLock = nil;\nstatic NSObject *keyUpLock = nil;\nstatic NSTimer *currentTimer = nil;\nstatic EventHotKeyID currentHotKey;\nstatic SlateAppDelegate *selfRef = nil;\nstatic EventHandlerRef modifiersEvent;\n\n- (IBAction)updateLaunchState {\n  if ([launchOnLoginItem state] == NSOnState) {\n    // currently on\n    [self deleteFromLoginItems];\n    [self setLaunchOnLoginItemStatus];\n  } else {\n    // currently off\n    [self addToLoginItems];\n    [self setLaunchOnLoginItemStatus];\n  }\n}\n\n- (IBAction)relaunch {\n  NSString *launcherSource = [[NSBundle bundleForClass:[SUUpdater class]]  pathForResource:@\"relaunch\" ofType:@\"\"];\n  NSString *launcherTarget = [NSTemporaryDirectory() stringByAppendingPathComponent:[launcherSource lastPathComponent]];\n  NSString *appPath = [[NSBundle mainBundle] bundlePath];\n  NSString *processID = [NSString stringWithFormat:@\"%d\", [[NSProcessInfo processInfo] processIdentifier]];\n\n  [[NSFileManager defaultManager] removeItemAtPath:launcherTarget error:NULL];\n  [[NSFileManager defaultManager] copyItemAtPath:launcherSource toPath:launcherTarget error:NULL];\n\n  [NSTask launchedTaskWithLaunchPath:launcherTarget arguments:[NSArray arrayWithObjects:appPath, processID, nil]];\n  [NSApp terminate:self];\n}\n\n- (IBAction)currentWindowInfo {\n  [windowInfoController showWindow:windowInfo];\n  [windowInfo makeKeyAndOrderFront:NSApp];\n  [windowInfo setLevel:(NSScreenSaverWindowLevel - 1)];\n}\n\n- (IBAction)configurationHelper {\n  NSString *configFile = [@\"~/.slate\" stringByExpandingTildeInPath];\n  [configHelperTextView setFont:[NSFont fontWithName:@\"Menlo\" size:11]];\n  [configHelperTextView setString:[NSString stringWithContentsOfFile:[configFile stringByExpandingTildeInPath] encoding:NSUTF8StringEncoding error:nil]];\n  [configHelperController showWindow:configHelper];\n  [configHelper makeKeyAndOrderFront:NSApp];\n  [configHelper setLevel:(NSScreenSaverWindowLevel - 1)];\n}\n\n- (void)loadConfig {\n  [self setHasUndoOperation:NO];\n  [[SlateConfig getInstance] load];\n}\n\n- (void)registerHotKeys {\n  SlateLogger(@\"Registering HotKeys...\");\n  EventTypeSpec eventType;\n  EventTypeSpec eventReleasedType;\n  eventType.eventClass = kEventClassKeyboard;\n  eventType.eventKind = kEventHotKeyPressed;\n  eventReleasedType.eventClass = kEventClassKeyboard;\n  eventReleasedType.eventKind = kEventHotKeyReleased;\n\n  InstallEventHandler(GetEventMonitorTarget(), &OnHotKeyEvent, 1, &eventType, (__bridge void *)self, NULL);\n  InstallEventHandler(GetEventMonitorTarget(), &OnHotKeyReleasedEvent, 1, &eventReleasedType, (__bridge void *)self, NULL);\n\n  NSMutableArray *bindings = [[SlateConfig getInstance] bindings];\n\n  for (NSInteger i = 0; i < [bindings count]; i++) {\n    Binding *binding = [bindings objectAtIndex:i];\n    SlateLogger(@\"REGISTERING KEY: %u, MODIFIERS: %u\", [binding keyCode], [binding modifiers]);\n    if ([binding keyCode] == 48 && [binding modifiers] == cmdKey) {\n      cmdTabBinding = i;\n      SlateLogger(@\"Found CMD+Tab binding!\");\n    } else if ([binding keyCode] == 48 && [binding modifiers] == (cmdKey + shiftKey)) {\n      cmdShiftTabBinding = i;\n      SlateLogger(@\"Found CMD+Shift+Tab binding!\");\n    }\n    EventHotKeyID myHotKeyID;\n    EventHotKeyRef myHotKeyRef;\n    myHotKeyID.signature = *[[NSString stringWithFormat:@\"hotkey%li\",i] cStringUsingEncoding:NSASCIIStringEncoding];\n    myHotKeyID.id = (UInt32)i;\n    RegisterEventHotKey([binding keyCode], [binding modifiers], myHotKeyID, GetEventMonitorTarget(), 0, &myHotKeyRef);\n    [binding setHotKeyRef:myHotKeyRef];\n  }\n\n  NSArray *modalKeys = [[[SlateConfig getInstance] modalBindings] allKeys];\n  NSInteger i = MODAL_BEGIN_ID;\n  for (NSString *modalHashKey in modalKeys) {\n    SlateLogger(@\"REGISTERING MODAL KEY: %@\", modalHashKey);\n    NSArray *modalKeyArr = [Binding modalHashKeyToKeyAndModifiers:modalHashKey];\n    if (modalKeyArr == nil) continue;\n    EventHotKeyID myHotKeyID;\n    EventHotKeyRef myHotKeyRef;\n    myHotKeyID.signature = *[[NSString stringWithFormat:@\"hotkey%li\",i] cStringUsingEncoding:NSASCIIStringEncoding];\n    myHotKeyID.id = (UInt32)i;\n    RegisterEventHotKey([[modalKeyArr objectAtIndex:0] unsignedIntValue], [[modalKeyArr objectAtIndex:1] unsignedIntValue], myHotKeyID, GetEventMonitorTarget(), 0, &myHotKeyRef);\n    [[self modalHotKeyRefs] setObject:[NSValue valueWithPointer:myHotKeyRef] forKey:modalHashKey];\n    [[self modalIdToKey] setObject:modalHashKey forKey:[NSNumber numberWithInteger:i]];\n    i++;\n  }\n  SlateLogger(@\"HotKeys registered.\");\n}\n\n- (void)createSnapshotOperations {\n  SnapshotOperation *undoSnapOp = [SnapshotOperation operationFromString:[NSString stringWithFormat:@\"snapshot %@ save-to-disk;stack\", UNDO_SNAPSHOT]];\n  [undoSnapOp setStackSize:[[SlateConfig getInstance] getIntegerConfig:UNDO_MAX_STACK_SIZE]];\n  [self setUndoSnapshotOperation:undoSnapOp];\n  [self setUndoDeleteSnapshotOperation:[DeleteSnapshotOperation operationFromString:[NSString stringWithFormat:@\"delete-snapshot %@ all\", UNDO_SNAPSHOT]]];\n  [self setMenuSnapshotOperation:[SnapshotOperation operationFromString:[NSString stringWithFormat:@\"snapshot %@ save-to-disk\", MENU_SNAPSHOT]]];\n  [self setMenuActivateSnapshotOperation:[ActivateSnapshotOperation operationFromString:[NSString stringWithFormat:@\"activate-snapshot %@\", MENU_SNAPSHOT]]];\n  [[self undoDeleteSnapshotOperation] doOperation];\n}\n\n- (IBAction)takeSnapshot {\n  [menuSnapshotOperation doOperation];\n}\n\n- (IBAction)activateSnapshot {\n  [menuActivateSnapshotOperation doOperation];\n}\n\n- (IBAction)aboutWindow {\n  [NSApp orderFrontStandardAboutPanel:self];\n  NSArray *windows = [NSApp windows];\n  for (NSWindow *window in windows) {\n    [window setLevel:(NSScreenSaverWindowLevel - 1)];\n  }\n}\n\n- (OSStatus)timerActivateBinding:(NSTimer *)timer {\n  return [self activateBinding:currentHotKey isRepeat:YES];\n}\n\n- (void)resetModalKey {\n  // clear out bindings\n  for (NSValue *hotKeyRef in [self currentModalHotKeyRefs]) {\n    UnregisterEventHotKey([hotKeyRef pointerValue]);\n  }\n  // reset status image\n  [statusItem setImage:[NSImage imageNamed:@\"status\"]];\n  currentModalKey = nil;\n}\n\n- (OSStatus)activateBinding:(EventHotKeyID)hkCom isRepeat:(BOOL)isRepeat {\n  SlateLogger(@\"ACTIVATING BINDING: %u\", hkCom.id);\n  // check if there is a currently open binding\n  HintOperation *hintop = [self currentHintOperation];\n  GridOperation *gridop = [self currentGridOperation];\n  Binding *switchop = [self currentSwitchBinding];\n  if (hintop != nil) {\n    [hintop activateHintKey:hkCom.id];\n    return noErr;\n  }\n  if (gridop != nil) {\n    [gridop activateGridKey:hkCom.id];\n    return noErr;\n  }\n  if (switchop != nil) {\n    [(SwitchOperation *)[switchop op] activateSwitchKey:hkCom isRepeat:isRepeat];\n    @synchronized(timerLock) {\n      if (currentTimer != nil) {\n        [currentTimer invalidate];\n        currentTimer = nil;\n      }\n      // Setup timer to repeat operation\n      currentHotKey = hkCom;\n      currentTimer = [NSTimer scheduledTimerWithTimeInterval:[[SlateConfig getInstance] getDoubleConfig:(isRepeat ? SWITCH_SECONDS_BETWEEN_REPEAT : SWITCH_SECONDS_BEFORE_REPEAT)]\n                                                      target:selfRef\n                                                    selector:@selector(timerActivateBinding:)\n                                                    userInfo:nil\n                                                     repeats:NO];\n    }\n    return noErr;\n  }\n\n  // check modal stuffs\n  NSNumber *hkId = [NSNumber numberWithInteger:hkCom.id];\n  NSString *modalKey = [[self modalIdToKey] objectForKey:hkId];\n  if (modalKey != nil) {\n    if (currentModalKey != nil && [modalKey isEqualToString:currentModalKey]) {\n      [self resetModalKey];\n      return noErr;\n    } else if (currentModalKey == nil) {\n      SlateLogger(@\"FOUND MODAL KEY BINDING, REGISTERING!\");\n      // register all these bindings\n      [[self currentModalHotKeyRefs] removeAllObjects];\n      NSArray *modalOperations = [[[SlateConfig getInstance] modalBindings] objectForKey:modalKey];\n      NSInteger i = CURRENT_MODAL_BEGIN_ID;\n      for (Binding *binding in modalOperations) {\n        EventHotKeyID myHotKeyID;\n        EventHotKeyRef myHotKeyRef;\n        myHotKeyID.signature = *[[NSString stringWithFormat:@\"hotkey%li\",i] cStringUsingEncoding:NSASCIIStringEncoding];\n        myHotKeyID.id = (UInt32)i;\n        RegisterEventHotKey([binding keyCode], 0, myHotKeyID, GetEventMonitorTarget(), 0, &myHotKeyRef);\n        [binding setHotKeyRef:myHotKeyRef];\n        [[self currentModalHotKeyRefs] addObject:[NSValue valueWithPointer:myHotKeyRef]];\n        i++;\n      }\n      if (![EMPTY isEqualToString:[[SlateConfig getInstance] getConfig:MODAL_ESCAPE_KEY]]) {\n        EventHotKeyID myHotKeyID;\n        EventHotKeyRef myHotKeyRef;\n        myHotKeyID.signature = *[[NSString stringWithFormat:@\"hotkey%li\",MODAL_ESCAPE_ID] cStringUsingEncoding:NSASCIIStringEncoding];\n        myHotKeyID.id = (UInt32)MODAL_ESCAPE_ID;\n        NSArray *keyarr = [Binding getKeystrokeFromString:[[SlateConfig getInstance] getConfig:MODAL_ESCAPE_KEY]];\n        RegisterEventHotKey([[keyarr objectAtIndex:0] unsignedIntValue], [[keyarr objectAtIndex:1] unsignedIntValue], myHotKeyID, GetEventMonitorTarget(), 0, &myHotKeyRef);\n        [[self currentModalHotKeyRefs] addObject:[NSValue valueWithPointer:myHotKeyRef]];\n      }\n      [self setCurrentModalKey:modalKey];\n      // change status image\n      [statusItem setImage:[NSImage imageNamed:@\"statusActive\"]];\n      return noErr;\n    }\n  }\n\n  if (hkCom.id >= [[[SlateConfig getInstance] bindings] count]) {\n    if (currentModalKey != nil) {\n      if (hkCom.id == MODAL_ESCAPE_ID) {\n        [self resetModalKey];\n      } else {\n        NSInteger potentialId = hkCom.id - CURRENT_MODAL_BEGIN_ID;\n        if (potentialId >= 0 && potentialId < [[[[SlateConfig getInstance] modalBindings] objectForKey:currentModalKey] count]) {\n          Binding *binding = [[[[SlateConfig getInstance] modalBindings] objectForKey:currentModalKey] objectAtIndex:potentialId];\n          [binding doOperation];\n          if (![binding toggle]) {\n            // clear out bindings\n            [self resetModalKey];\n          }\n        }\n      }\n    }\n    return noErr;\n  }\n\n  Binding *binding = [[[SlateConfig getInstance] bindings] objectAtIndex:hkCom.id];\n  if (binding) {\n    SlateLogger(@\"Running Operation %@\", [[[SlateConfig getInstance] bindings] objectAtIndex:hkCom.id]);\n    if ([[binding op] isKindOfClass:[SwitchOperation class]]) {\n      // makes sure that if switch is called immediately after opening slate we don't run into issues\n      NSArray *currentApps = [[RunningApplications getInstance] apps];\n      if ([currentApps count] > 0) {\n        [AccessibilityWrapper focusApp:[currentApps objectAtIndex:0]];\n      }\n      [self setCurrentSwitchBinding:binding];\n      EventTypeSpec modifiersChangedType;\n      modifiersChangedType.eventClass = kEventClassKeyboard;\n      modifiersChangedType.eventKind = kEventRawKeyModifiersChanged;\n      InstallEventHandler(GetEventMonitorTarget(), &OnModifiersChangedEvent, 1, &modifiersChangedType, (__bridge void *)self, &modifiersEvent);\n    }\n    [binding doOperation];\n    if (!(cmdTabBinding > 0 && [[[SlateConfig getInstance] bindings] objectAtIndex:cmdTabBinding] == binding) &&\n        !(cmdShiftTabBinding > 0 && [[[SlateConfig getInstance] bindings] objectAtIndex:cmdShiftTabBinding] == binding) &&\n        ([binding repeat] || [[binding op] isKindOfClass:[SwitchOperation class]])) {\n      @synchronized(timerLock) {\n        if (currentTimer != nil) {\n          [currentTimer invalidate];\n          currentTimer = nil;\n        }\n        // Setup timer to repeat operation\n        currentHotKey = hkCom;\n        if (![[binding op] isKindOfClass:[SwitchOperation class]] || !keyUpSeen) {\n          currentTimer = [NSTimer scheduledTimerWithTimeInterval:[[SlateConfig getInstance] getDoubleConfig:([[binding op] isKindOfClass:[SwitchOperation class]] ?\n                                                                                                             (isRepeat ? SWITCH_SECONDS_BETWEEN_REPEAT : SWITCH_SECONDS_BEFORE_REPEAT) :\n                                                                                                             (isRepeat ? SECONDS_BETWEEN_REPEAT : SECONDS_BEFORE_REPEAT))]\n                                                          target:selfRef\n                                                        selector:@selector(timerActivateBinding:)\n                                                        userInfo:nil\n                                                         repeats:NO];\n        }\n      }\n    }\n  }\n  return noErr;\n}\n\n// Quartz Event Tap for reserved key bindings (CMD+Tab or CMD+Shift+Tab)\nstatic const NSTimeInterval KEY_UP_BUFFER = -0.020;\nstatic BOOL keyUpSeen = YES;\nstatic NSDate *keyUpTime = nil;\nCGEventRef EatAppSwitcherCallback(CGEventTapProxy proxy, CGEventType type,  CGEventRef event, void *refcon) {\n  @synchronized(keyUpLock) {\n    CGEventFlags flags = CGEventGetFlags(event);\n    int64_t keyCode = CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode);\n    SlateLogger(@\"KEY DOWN - FLAGS: %llu, KEYCODE: %lld\", (uint64_t)flags, keyCode);\n    // 48 is tab key code\n    if (keyCode == 48 &&\n        ((flags & kCGEventFlagMaskCommand) == kCGEventFlagMaskCommand) &&\n        ((flags & kCGEventFlagMaskAlternate) != kCGEventFlagMaskAlternate) &&\n        ((flags & kCGEventFlagMaskControl) != kCGEventFlagMaskControl) &&\n        ((flags & kCGEventFlagMaskAlphaShift) != kCGEventFlagMaskAlphaShift) &&\n        ((flags & kCGEventFlagMaskHelp) != kCGEventFlagMaskHelp) &&\n        ((flags & kCGEventFlagMaskNumericPad) != kCGEventFlagMaskNumericPad) &&\n        ((flags & kCGEventFlagMaskSecondaryFn) != kCGEventFlagMaskSecondaryFn)) {\n      SlateLogger(@\"  IS CMD+TAB\");\n      if (keyUpSeen) {\n        SlateLogger(@\"    KEY UP SEEN: %f\", [keyUpTime timeIntervalSinceNow]);\n        if (keyUpTime && [keyUpTime timeIntervalSinceNow] > KEY_UP_BUFFER) {\n          return NULL;\n        }\n        @synchronized(timerLock) {\n          if (currentTimer != nil) {\n            [currentTimer invalidate];\n            currentTimer = nil;\n          }\n        }\n        keyUpSeen = NO;\n        keyUpTime = nil;\n        SlateAppDelegate *del = (__bridge SlateAppDelegate *)refcon;\n        EventHotKeyID myHotKeyID;\n        NSInteger hotkeyID = ((flags & kCGEventFlagMaskShift) == kCGEventFlagMaskShift) ? [del cmdShiftTabBinding] : [del cmdTabBinding];\n        if (hotkeyID < 0) return NULL;\n        myHotKeyID.signature = *[[NSString stringWithFormat:@\"hotkey%li\",hotkeyID] cStringUsingEncoding:NSASCIIStringEncoding];\n        myHotKeyID.id = (UInt32)hotkeyID;\n        [del activateBinding:myHotKeyID isRepeat:NO];\n      } else {\n        SlateLogger(@\"    KEY UP NOT SEEN\");\n        @synchronized(timerLock) {\n          if (currentTimer != nil) {\n            [currentTimer invalidate];\n            currentTimer = nil;\n          }\n        }\n        SlateAppDelegate *del = (__bridge SlateAppDelegate *)refcon;\n        EventHotKeyID myHotKeyID;\n        NSInteger hotkeyID = ((flags & kCGEventFlagMaskShift) == kCGEventFlagMaskShift) ? [del cmdShiftTabBinding] : [del cmdTabBinding];\n        if (hotkeyID < 0) return NULL;\n        myHotKeyID.signature = *[[NSString stringWithFormat:@\"hotkey%li\",hotkeyID] cStringUsingEncoding:NSASCIIStringEncoding];\n        myHotKeyID.id = (UInt32)hotkeyID;\n        [del activateBinding:myHotKeyID isRepeat:YES];\n      }\n      return NULL;\n    }\n    return event;\n  }\n}\n\nCGEventRef EatAppSwitcherResetCallback(CGEventTapProxy proxy, CGEventType type,  CGEventRef event, void *refcon) {\n  @synchronized(keyUpLock) {\n    SlateLogger(@\"KEY UP\");\n    @synchronized(timerLock) {\n      if (currentTimer != nil) {\n        [currentTimer invalidate];\n        currentTimer = nil;\n      }\n    }\n    keyUpSeen = YES;\n    keyUpTime = [NSDate date];\n    return event;\n  }\n}\n\nOSStatus OnHotKeyEvent(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData) {\n  @synchronized(timerLock) {\n    if (currentTimer != nil) {\n      [currentTimer invalidate];\n      currentTimer = nil;\n    }\n  }\n  if (![(__bridge id)userData isKindOfClass:[SlateAppDelegate class]]) return noErr;\n  EventHotKeyID hkCom;\n  GetEventParameter(theEvent, kEventParamDirectObject, typeEventHotKeyID, NULL, sizeof(hkCom), NULL, &hkCom);\n  return [(__bridge SlateAppDelegate *)userData activateBinding:hkCom isRepeat:NO];\n}\n\nOSStatus OnHotKeyReleasedEvent(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData) {\n  @synchronized(timerLock) {\n    if (currentTimer != nil) {\n      [currentTimer invalidate];\n      currentTimer = nil;\n    }\n  }\n  return noErr;\n}\n\nOSStatus OnModifiersChangedEvent(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData) {\n  SlateLogger(@\"Modifiers changed\");\n  @synchronized(timerLock) {\n    if (currentTimer != nil) {\n      [currentTimer invalidate];\n      currentTimer = nil;\n    }\n  }\n  Binding *currSwitch = [(__bridge SlateAppDelegate *)userData currentSwitchBinding];\n  UInt32 modifiers;\n  GetEventParameter(theEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(modifiers), NULL, &modifiers);\n  if (currSwitch != nil) {\n    if ([(SwitchOperation *)[currSwitch op] modifiersChanged:[currSwitch modifiers] new:modifiers]) {\n      [(__bridge SlateAppDelegate *)userData setCurrentSwitchBinding:nil];\n      RemoveEventHandler(modifiersEvent);\n      keyUpSeen = YES;\n    }\n  }\n  return noErr;\n}\n\n- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {\n  if (cmdTabBinding > 0 || cmdShiftTabBinding > 0) {\n    CFMachPortRef keyDownEventTap;\n    CFRunLoopSourceRef keyDownRunLoopSource;\n    keyDownEventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, 0, CGEventMaskBit(kCGEventKeyDown), EatAppSwitcherCallback, (__bridge void *)self);\n    keyDownRunLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, keyDownEventTap, 0);\n    CFRunLoopAddSource(CFRunLoopGetCurrent(), keyDownRunLoopSource, kCFRunLoopCommonModes);\n    CGEventTapEnable(keyDownEventTap, true);\n\n    CFMachPortRef keyUpEventTap;\n    CFRunLoopSourceRef keyUpRunLoopSource;\n    keyUpEventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, 0, CGEventMaskBit(kCGEventKeyUp), EatAppSwitcherResetCallback, (__bridge void *)self);\n    keyUpRunLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, keyUpEventTap, 0);\n    CFRunLoopAddSource(CFRunLoopGetCurrent(), keyUpRunLoopSource, kCFRunLoopCommonModes);\n    CGEventTapEnable(keyUpEventTap, true);\n  }\n}\n\n- (void)setLaunchOnLoginItemStatus {\n  if ([self isInLoginItems]) [launchOnLoginItem setState:NSOnState];\n  else [launchOnLoginItem setState:NSOffState];\n}\n\n- (void)awakeFromNib {\n  cmdTabBinding = -1;\n  cmdShiftTabBinding = -1;\n  currentHintOperation = nil;\n  currentGridOperation = nil;\n\n  [self setModalHotKeyRefs:[NSMutableDictionary dictionary]];\n  [self setModalIdToKey:[NSMutableDictionary dictionary]];\n  [self setCurrentModalHotKeyRefs:[NSMutableArray array]];\n\n  windowInfoController = [[NSWindowController alloc] initWithWindow:windowInfo];\n  configHelperController = [[NSWindowController alloc] initWithWindow:configHelper];\n\n  NSMenuItem *aboutItem = [statusMenu insertItemWithTitle:@\"About Slate\" action:@selector(aboutWindow) keyEquivalent:@\"\" atIndex:0];\n  [aboutItem setTarget:self];\n\n  NSMenuItem *takeSnapshotItem = [statusMenu insertItemWithTitle:@\"Take Snapshot\" action:@selector(takeSnapshot) keyEquivalent:@\"\" atIndex:3];\n  [takeSnapshotItem setTarget:self];\n\n  activateSnapshotItem = [statusMenu insertItemWithTitle:@\"Activate Snapshot\" action:@selector(activateSnapshot) keyEquivalent:@\"\" atIndex:4];\n  [activateSnapshotItem setTarget:self];\n\n  NSMenuItem *loadConfigItem = [statusMenu insertItemWithTitle:@\"Relaunch and Load Config\" action:@selector(relaunch) keyEquivalent:@\"\" atIndex:1];\n  [loadConfigItem setTarget:self];\n\n  launchOnLoginItem = [statusMenu insertItemWithTitle:@\"Launch Slate on Login\" action:@selector(updateLaunchState) keyEquivalent:@\"\" atIndex:2];\n  [self setLaunchOnLoginItemStatus];\n  [launchOnLoginItem setTarget:self];\n\n  NSMenuItem *windowInfoItem = [statusMenu insertItemWithTitle:@\"Current Window Info\" action:@selector(currentWindowInfo) keyEquivalent:@\"\" atIndex:4];\n  [windowInfoItem setTarget:self];\n\n  //NSMenuItem *configInfoItem = [statusMenu insertItemWithTitle:@\"Configuration Helper\" action:@selector(configurationHelper) keyEquivalent:@\"\" atIndex:2];\n  //[configInfoItem setTarget:self];\n\n  statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength: NSVariableStatusItemLength];\n  [statusItem setMenu:statusMenu];\n  NSImage *statusImage = [NSImage imageNamed:@\"status\"];\n  [statusImage setTemplate:YES];\n  [statusItem setImage:statusImage];\n  [statusItem setHighlightMode:YES];\n\n  // Ensure no timer exists\n  @synchronized(timerLock) {\n    currentTimer = nil;\n    timerLock = [[NSObject alloc] init];\n  }\n\n  @synchronized(keyUpLock) {\n    keyUpLock = [[NSObject alloc] init];\n  }\n\n  // Check if Accessibility API is enabled\n  if (!AXAPIEnabled()) {\n    NSAlert *alert = [SlateConfig warningAlertWithKeyEquivalents: [NSArray arrayWithObjects:@\"Enable\", @\"Quit\", nil]];\n    [alert setMessageText:[NSString stringWithFormat:@\"Slate cannot run without \\\"Access for assistive devices\\\". Would you like to enable it?\"]];\n    [alert setInformativeText:[NSString stringWithFormat:@\"You may be prompted for your administrator password.\"]];\n    [alert setAlertStyle:NSCriticalAlertStyle];\n    NSInteger alertIndex = [alert runModal];\n    if (alertIndex == NSAlertFirstButtonReturn) {\n      SlateLogger(@\"User wants to enable Access for assistive devices\");\n      NSDictionary* errorDictionary;\n      NSAppleScript* applescript = [[NSAppleScript alloc] initWithSource:@\"tell application \\\"System Events\\\" to set UI elements enabled to true\"];\n      [applescript executeAndReturnError:&errorDictionary];\n    }\n    else if (alertIndex == NSAlertSecondButtonReturn) {\n      SlateLogger(@\"User selected quit\");\n      [NSApp terminate:nil];\n    }\n  }\n\n  // Read Config\n  [self loadConfig];\n\n  // Register Hot Keys\n  [self registerHotKeys];\n\n  [self createSnapshotOperations];\n\n  // Setup App list\n  NSArray *rapps = [[RunningApplications getInstance] apps];\n  if ([rapps count] > 0) [AccessibilityWrapper focusMainWindow:[rapps objectAtIndex:0]];\n\n  selfRef = self;\n}\n\n- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {\n  if (menuItem == activateSnapshotItem) {\n    SnapshotList *menuSnapshots = [[[SlateConfig getInstance] snapshots] objectForKey:@\"menuSnapshot\"];\n    if (menuSnapshots == nil || [[menuSnapshots snapshots] count] <= 0) {\n      return NO;\n    }\n  }\n  return YES;\n}\n\n- (BOOL)isInLoginItems {\n  NSString * appPath = [[NSBundle mainBundle] bundlePath];\n\n  // This will retrieve the path for the application\n  // For example, /Applications/test.app\n  CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:appPath];\n\n  // Create a reference to the shared file list.\n  LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);\n\n  if (loginItems) {\n    UInt32 seedValue;\n    // Retrieve the list of Login Items and cast them to\n    // a NSArray so that it will be easier to iterate.\n    NSArray  *loginItemsArray = (__bridge NSArray *)LSSharedFileListCopySnapshot(loginItems, &seedValue);\n    for(NSInteger i = 0; i < [loginItemsArray count]; i++){\n      LSSharedFileListItemRef itemRef = (__bridge LSSharedFileListItemRef)[loginItemsArray objectAtIndex:i];\n      //Resolve the item with URL\n      if (LSSharedFileListItemResolve(itemRef, 0, (CFURLRef*) &url, NULL) == noErr) {\n        NSString * urlPath = [(__bridge NSURL*)url path];\n        if ([urlPath compare:appPath] == NSOrderedSame) {\n          return YES;\n        }\n      }\n    }\n  }\n  return NO;\n}\n\n- (void)addToLoginItems {\n  NSString * appPath = [[NSBundle mainBundle] bundlePath];\n\n  // This will retrieve the path for the application\n  // For example, /Applications/test.app\n  CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:appPath];\n\n  // Create a reference to the shared file list.\n  // We are adding it to the current user only.\n  // If we want to add it all users, use\n  // kLSSharedFileListGlobalLoginItems instead of\n  // kLSSharedFileListSessionLoginItems\n  LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);\n  if (loginItems) {\n    //Insert an item to the list.\n    LSSharedFileListItemRef item = LSSharedFileListInsertItemURL(loginItems,\n                                                                 kLSSharedFileListItemLast, NULL, NULL,\n                                                                 url, NULL, NULL);\n    if (item){\n      CFRelease(item);\n    }\n  }\n\n  CFRelease(loginItems);\n}\n\n- (void)deleteFromLoginItems {\n  NSString * appPath = [[NSBundle mainBundle] bundlePath];\n\n  // This will retrieve the path for the application\n  // For example, /Applications/test.app\n  CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:appPath];\n\n  // Create a reference to the shared file list.\n  LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);\n\n  if (loginItems) {\n    UInt32 seedValue;\n    // Retrieve the list of Login Items and cast them to\n    // a NSArray so that it will be easier to iterate.\n    NSArray  *loginItemsArray = (__bridge NSArray *)LSSharedFileListCopySnapshot(loginItems, &seedValue);\n    for(NSInteger i = 0; i < [loginItemsArray count]; i++){\n      LSSharedFileListItemRef itemRef = (__bridge LSSharedFileListItemRef)[loginItemsArray objectAtIndex:i];\n      //Resolve the item with URL\n      if (LSSharedFileListItemResolve(itemRef, 0, (CFURLRef*) &url, NULL) == noErr) {\n        NSString * urlPath = [(__bridge NSURL*)url path];\n        if ([urlPath compare:appPath] == NSOrderedSame) {\n          LSSharedFileListItemRemove(loginItems,itemRef);\n        }\n      }\n    }\n  }\n}\n\n@end\n"
  },
  {
    "path": "Slate/SlateConfig.h",
    "content": "//\n//  SlateConfig.h\n//  Slate\n//\n//  Created by Jigish Patel on 5/18/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n#import \"Snapshot.h\"\n\n@class Binding;\n\n@interface SlateConfig : NSObject {\n@private\n  NSMutableDictionary *configs;\n  NSMutableDictionary *configDefaults;\n  NSMutableArray *bindings;\n  NSMutableDictionary *modalBindings;\n  NSMutableDictionary *layouts;\n  NSMutableArray *defaultLayouts;\n  NSMutableDictionary *aliases;\n  NSMutableDictionary *snapshots;\n}\n\n@property NSMutableDictionary *configs;\n@property NSMutableDictionary *configDefaults;\n@property NSMutableDictionary *appConfigs; // two layer map\n@property NSMutableArray *bindings;\n@property NSMutableDictionary *modalBindings;\n@property NSMutableDictionary *layouts;\n@property NSMutableArray *defaultLayouts;\n@property NSMutableDictionary *aliases;\n@property NSMutableDictionary *snapshots;\n\n+ (SlateConfig *)getInstance;\n+ (NSAlert *)warningAlertWithKeyEquivalents:(NSArray *)titles;\n- (BOOL)load;\n- (BOOL)loadConfigFileWithPath:(NSString *)file;\n- (BOOL)addLayout:(NSString *)name dict:(NSDictionary *)dict;\n- (void)addDefault:(id)screenConfig layout:(NSString *)layout;\n- (void)addBinding:(Binding *)bind;\n- (BOOL)append:(NSString *)configString;\n- (BOOL)loadSnapshots;\n- (BOOL)getBoolConfig:(NSString *)key;\n- (void)setConfig:(NSString *)key to:(NSString *)value;\n- (NSInteger)getIntegerConfig:(NSString *)key;\n- (double)getDoubleConfig:(NSString *)key;\n- (float)getFloatConfig:(NSString *)key;\n- (NSString *)getConfig:(NSString *)key;\n- (NSString *)getConfigDefault:(NSString *)key;\n- (NSString *)getConfig:(NSString *)key app:(NSString *)app;\n- (NSArray *)getArrayConfig:(NSString *)key;\n- (void)addAlias:(NSString *)line;\n- (NSString *)replaceAliases:(NSString *)line;\n- (void)onScreenChange:(id)notification;\n- (void)setupDefaultConfigs;\n- (void)addSnapshot:(Snapshot *)snapshot name:(NSString *)name saveToDisk:(BOOL)saveToDisk isStack:(BOOL)isStack stackSize:(NSUInteger)stackSize;\n- (void)deleteSnapshot:(NSString *)name pop:(BOOL)pop;\n- (Snapshot *)popSnapshot:(NSString *)name remove:(BOOL)remove;\n- (void)activateLayoutOrSnapshot:(NSString *)name;\n- (NSString *)stripComments:(NSString *)line;\n//- (void)processNotification:(id)notification;\n\n+ (NSURL *)snapshotsFile;\n\n@end\n\nvoid onDisplayReconfiguration (CGDirectDisplayID display, CGDisplayChangeSummaryFlags flags, void *userInfo);\n"
  },
  {
    "path": "Slate/SlateConfig.m",
    "content": "//\n//  SlateConfig.m\n//  Slate\n//\n//  Created by Jigish Patel on 5/18/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"Binding.h\"\n#import \"Constants.h\"\n#import \"Layout.h\"\n#import \"LayoutOperation.h\"\n#import \"ScreenState.h\"\n#import \"ScreenWrapper.h\"\n#import \"SlateConfig.h\"\n#import \"StringTokenizer.h\"\n#import \"Snapshot.h\"\n#import \"SnapshotList.h\"\n#import \"JSONKit.h\"\n#import \"SlateLogger.h\"\n#import \"NSFileManager+ApplicationSupport.h\"\n#import \"NSString+Indicies.h\"\n#import \"ActivateSnapshotOperation.h\"\n#import \"JSController.h\"\n#import \"Operation.h\"\n#import \"JSScreenWrapper.h\"\n\n@implementation SlateConfig\n\n@synthesize configs;\n@synthesize configDefaults;\n@synthesize bindings;\n@synthesize modalBindings;\n@synthesize layouts;\n@synthesize defaultLayouts;\n@synthesize aliases;\n@synthesize snapshots;\n@synthesize appConfigs;\n\nstatic SlateConfig *_instance = nil;\n\n+ (SlateConfig *)getInstance {\n  @synchronized([SlateConfig class]) {\n    if (!_instance) {\n      [ScreenWrapper updateStatics];\n      _instance = [[[SlateConfig class] alloc] init];\n    }\n    return _instance;\n  }\n}\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [self setupDefaultConfigs];\n    [self setBindings:[NSMutableArray arrayWithCapacity:10]];\n    [self setModalBindings:[NSMutableDictionary dictionary]];\n    [self setLayouts:[NSMutableDictionary dictionary]];\n    [self setDefaultLayouts:[NSMutableArray array]];\n    [self setAliases:[NSMutableDictionary dictionary]];\n    [self setSnapshots:[NSMutableDictionary dictionary]];\n    \n    // Listen for screen change notifications with Quartz\n    CGDisplayRegisterReconfigurationCallback(onDisplayReconfiguration, (__bridge void *)(self));\n    //[nc addObserver:self selector:@selector(processNotification:) name:nil object:nil];\n  }\n  return self;\n}\n\n- (BOOL)getBoolConfig:(NSString *)key {\n  return [[self getConfig:key] boolValue];\n}\n\n- (NSInteger)getIntegerConfig:(NSString *)key {\n  return [[self getConfig:key] integerValue];\n}\n\n- (double)getDoubleConfig:(NSString *)key {\n  return [[self getConfig:key] doubleValue];\n}\n\n- (float)getFloatConfig:(NSString *)key {\n  return [[self getConfig:key] floatValue];\n}\n\n- (NSArray *)getArrayConfig:(NSString *)key {\n  return [[self getConfig:key] componentsSeparatedByString:SEMICOLON];\n}\n\n- (NSString *)getConfig:(NSString *)key {\n  NSString *c = [configs objectForKey:key];\n  if ([c hasPrefix:@\"_javascript_::\"]) {\n    NSString *fkey = [c stringByReplacingOccurrencesOfString:@\"_javascript_::\" withString:@\"\"];\n    id ret = [[JSController getInstance] runCallableFunction:fkey];\n    return [NSString stringWithFormat:@\"%@\", ret];\n  }\n  return c;\n}\n\n- (void)setConfig:(NSString *)key to:(NSString *)value {\n  [configs setObject:value forKey:key];\n}\n\n- (NSString *)getConfigDefault:(NSString *)key {\n  return [configDefaults objectForKey:key];\n}\n\n- (NSString *)getConfig:(NSString *)key app:(NSString *)app {\n  NSMutableDictionary *configsForApp = [appConfigs objectForKey:app];\n  if (configsForApp == nil) return [self getConfigDefault:key];\n  NSString *config = [configsForApp objectForKey:key];\n  if (config == nil) return [self getConfigDefault:key];\n  return config;\n}\n\n+ (NSAlert *)warningAlertWithKeyEquivalents:(NSArray *)titles {\n  NSAlert *alert = [[NSAlert alloc] init];\n  [alert setAlertStyle:NSWarningAlertStyle];\n  for (NSString *title in titles) {\n    [[alert addButtonWithTitle:title] setKeyEquivalent:[[title substringToIndex: 1] lowercaseString]];\n  }\n  return alert;\n}\n\n- (BOOL)load {\n  SlateLogger(@\"Loading config...\");\n\n  // Reset configs and bindings in case we are calling from menu\n  [self setupDefaultConfigs];\n  [self setBindings:[[NSMutableArray alloc] initWithCapacity:10]];\n  [self setLayouts:[[NSMutableDictionary alloc] init]];\n  [self setDefaultLayouts:[[NSMutableArray alloc] init]];\n  [self setAliases:[[NSMutableDictionary alloc] init]];\n\n  BOOL loadedDefault = [self loadConfigFileWithPath:@\"~/.slate\"];\n  BOOL loadedJS = [self loadConfigFileWithPath:@\"~/.slate.js\"];\n\n  if (!loadedDefault && !loadedJS) {\n    SlateLogger(@\"  ERROR Could not load ~/.slate or ~/.slate.js\");\n    NSAlert *alert = [SlateConfig warningAlertWithKeyEquivalents: [NSArray arrayWithObjects:@\"Continue\", @\"Quit\", nil]];\n    [alert setMessageText:@\"Could not load ~/.slate or ~/.slate.js\"];\n    [alert setInformativeText:@\"The default configuration will be used. You can find the default .slate file at https://github.com/jigish/slate/blob/master/Slate/default.slate\"];\n    if ([alert runModal] == NSAlertSecondButtonReturn) {\n      SlateLogger(@\"User selected exit\");\n      [NSApp terminate:nil];\n    }\n    return [self loadConfigFileWithPath:[[NSBundle mainBundle] pathForResource:@\"default\" ofType:@\"slate\"]];\n  }\n\n  if (![self loadSnapshots]) {\n    SlateLogger(@\"  ERROR Could not load %@\", SNAPSHOTS_FILE);\n    NSAlert *alert = [SlateConfig warningAlertWithKeyEquivalents: [NSArray arrayWithObjects:@\"Quit\", @\"Skip\", nil]];\n    [alert setMessageText:[NSString stringWithFormat:@\"ERROR Could not load %@\", SNAPSHOTS_FILE]];\n    [alert setInformativeText:[NSString stringWithFormat:@\"I dunno. Figure it out. Maybe try deleting %@\", SNAPSHOTS_FILE]];\n    if ([alert runModal] == NSAlertFirstButtonReturn) {\n      SlateLogger(@\"User selected exit\");\n      [NSApp terminate:nil];\n    }\n    return NO;\n  }\n\n  if ([[SlateConfig getInstance] getBoolConfig:CHECK_DEFAULTS_ON_LOAD]) {\n    SlateLogger(@\"Config loaded. Checking defaults...\");\n    [self checkDefaults];\n    SlateLogger(@\"Defaults loaded.\");\n  } else {\n    SlateLogger(@\"Config loaded.\");\n  }\n\n  return YES;\n}\n\n- (BOOL)loadConfigFileWithPath:(NSString *)file {\n  if (file == nil) return NO;\n  NSString *configFile = file;\n  if ([file rangeOfString:SLASH].location != 0 && [file rangeOfString:TILDA].location != 0)\n    configFile = [NSString stringWithFormat:@\"~/%@\", file];\n  if ([configFile hasSuffix:EXT_JS]) {\n    return [[JSController getInstance] loadConfigFileWithPath:configFile];\n  }\n  NSError *err;\n  NSString *fileString = [NSString stringWithContentsOfFile:[configFile stringByExpandingTildeInPath] encoding:NSUTF8StringEncoding error:&err];\n  if (err == nil && fileString != nil && fileString != NULL) { return [self append:fileString]; }\n  return NO;\n}\n\n- (NSString *)stripComments:(NSString *)line {\n  if (line == nil) { return nil; }\n  NSString *theLine = [line stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:WHITESPACE]];\n  if ([theLine length] == 0 || [theLine characterAtIndex:0] == COMMENT_CHARACTER) {\n    return nil;\n  }\n  NSInteger idx = [theLine indexOfChar:COMMENT_CHARACTER];\n  if (idx < 0) { return theLine; }\n  return [[theLine substringToIndex:idx] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:WHITESPACE]];\n}\n\n- (BOOL)addLayout:(NSString *)name dict:(NSDictionary *)dict {\n  Layout *l = [[Layout alloc] initWithName:(NSString *)name dict:dict];\n  if (l == nil) { return NO; }\n  [[self layouts] setObject:l forKey:name];\n  return YES;\n}\n\n- (void)addBinding:(Binding *)bind {\n  if ([bind modalKey] != nil) {\n    NSMutableArray *theBindings = [modalBindings objectForKey:[bind modalHashKey]];\n    if (theBindings == nil) theBindings = [NSMutableArray array];\n    [theBindings addObject:bind];\n    [modalBindings setObject:theBindings forKey:[bind modalHashKey]];\n  } else {\n    [bindings addObject:bind];\n  }\n}\n\n- (BOOL)append:(NSString *)configString {\n  if (configString == nil)\n    return NO;\n  NSArray *lines = [configString componentsSeparatedByString:@\"\\n\"];\n\n  NSEnumerator *e = [lines objectEnumerator];\n  NSString *line = [e nextObject];\n  while (line) {\n    line = [self stripComments:line];\n    if (line == nil || [line length] == 0) { line = [e nextObject]; continue; }\n    @try {\n      line = [self replaceAliases:line];\n    } @catch (NSException *ex) {\n      SlateLogger(@\"   ERROR %@\",[ex name]);\n      NSAlert *alert = [SlateConfig warningAlertWithKeyEquivalents: [NSArray arrayWithObjects:@\"Quit\", @\"Skip\", nil]];\n      [alert setMessageText:[ex name]];\n      [alert setInformativeText:[ex reason]];\n      if ([alert runModal] == NSAlertFirstButtonReturn) {\n        SlateLogger(@\"User selected exit\");\n        [NSApp terminate:nil];\n      }\n    }\n    NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n    [StringTokenizer tokenize:line into:tokens];\n    if ([tokens count] >= 3 && [[tokens objectAtIndex:0] isEqualToString:CONFIG]) {\n      // config <key>[:<app>] <value>\n      SlateLogger(@\"  LoadingC: %@\",line);\n      NSArray *splitKey = [[tokens objectAtIndex:1] componentsSeparatedByString:@\":\"];\n      NSString *key = [splitKey count] > 1 ? [splitKey objectAtIndex:0] : [tokens objectAtIndex:1];\n      if ([configs objectForKey:key] == nil) {\n        SlateLogger(@\"   ERROR Unrecognized config '%@'\",[tokens objectAtIndex:1]);\n        NSAlert *alert = [SlateConfig warningAlertWithKeyEquivalents: [NSArray arrayWithObjects:@\"Quit\", @\"Skip\", nil]];\n        [alert setMessageText:[NSString stringWithFormat:@\"Unrecognized Config '%@'\",[tokens objectAtIndex:1]]];\n        [alert setInformativeText:line];\n        if ([alert runModal] == NSAlertFirstButtonReturn) {\n          SlateLogger(@\"User selected exit\");\n          [NSApp terminate:nil];\n        }\n      } else {\n        if ([splitKey count] > 1 && [[splitKey objectAtIndex:1] length] > 2) {\n          NSString *appName = [[splitKey objectAtIndex:1] substringWithRange:NSMakeRange(1, [[splitKey objectAtIndex:1] length] - 2)];\n          SlateLogger(@\"    Found App Config for App: '%@' Key: %@\", appName, key);\n          NSMutableDictionary *configsForApp = [appConfigs objectForKey:appName];\n          if (configsForApp == nil) { configsForApp = [NSMutableDictionary dictionary]; }\n          [configsForApp setObject:[tokens objectAtIndex:2] forKey:key];\n          [appConfigs setObject:configsForApp forKey:appName];\n        } else {\n          [configs setObject:[tokens objectAtIndex:2] forKey:[tokens objectAtIndex:1]];\n        }\n      }\n    } else if ([tokens count] >= 3 && [[tokens objectAtIndex:0] isEqualToString:BIND]) {\n      // bind <key:modifiers|modal-key> <op> <parameters>\n      @try {\n        SlateLogger(@\"  LoadingB: %@\",line);\n        Binding *bind = [[Binding alloc] initWithString:line];\n        [self addBinding:bind];\n      } @catch (NSException *ex) {\n        SlateLogger(@\"   ERROR %@\",[ex name]);\n        NSAlert *alert = [SlateConfig warningAlertWithKeyEquivalents: [NSArray arrayWithObjects:@\"Quit\", @\"Skip\", nil]];\n        [alert setMessageText:[ex name]];\n        [alert setInformativeText:[ex reason]];\n        if ([alert runModal] == NSAlertFirstButtonReturn) {\n          SlateLogger(@\"User selected exit\");\n          [NSApp terminate:nil];\n        }\n      }\n    } else if ([tokens count] >= 4 && [[tokens objectAtIndex:0] isEqualToString:LAYOUT]) {\n      // layout <name> <app name> <op+params> (| <op+params>)*\n      @try {\n        if ([layouts objectForKey:[tokens objectAtIndex:1]] == nil) {\n          Layout *layout = [[Layout alloc] initWithString:line];\n          SlateLogger(@\"  LoadingL: %@\",line);\n          [layouts setObject:layout forKey:[layout name]];\n        } else {\n          Layout *layout = [layouts objectForKey:[tokens objectAtIndex:1]];\n          [layout addWithString:line];\n          SlateLogger(@\"  LoadingL: %@\",line);\n        }\n      } @catch (NSException *ex) {\n        SlateLogger(@\"   ERROR %@\",[ex name]);\n        NSAlert *alert = [SlateConfig warningAlertWithKeyEquivalents: [NSArray arrayWithObjects:@\"Quit\", @\"Skip\", nil]];\n        [alert setMessageText:[ex name]];\n        [alert setInformativeText:[ex reason]];\n        if ([alert runModal] == NSAlertFirstButtonReturn) {\n          SlateLogger(@\"User selected exit\");\n          [NSApp terminate:nil];\n        }\n      }\n    } else if ([tokens count] >= 3 && [[tokens objectAtIndex:0] isEqualToString:DEFAULT]) {\n      // default <name> <screen-setup>\n      @try {\n        ScreenState *state = [[ScreenState alloc] initWithString:line];\n        if (state == nil) {\n          SlateLogger(@\"   ERROR Loading default layout\");\n          NSAlert *alert = [SlateConfig warningAlertWithKeyEquivalents: [NSArray arrayWithObjects:@\"Quit\", @\"Skip\", nil]];\n          [alert setMessageText:@\"Error loading default layout\"];\n          [alert setInformativeText:line];\n          if ([alert runModal] == NSAlertFirstButtonReturn) {\n            SlateLogger(@\"User selected exit\");\n            [NSApp terminate:nil];\n          }\n        } else {\n          [defaultLayouts addObject:state];\n          SlateLogger(@\"  LoadingDL: %@\",line);\n        }\n      } @catch (NSException *ex) {\n        SlateLogger(@\"   ERROR %@\",[ex name]);\n        NSAlert *alert = [SlateConfig warningAlertWithKeyEquivalents: [NSArray arrayWithObjects:@\"Quit\", @\"Skip\", nil]];\n        [alert setMessageText:[ex name]];\n        [alert setInformativeText:[ex reason]];\n        if ([alert runModal] == NSAlertFirstButtonReturn) {\n          SlateLogger(@\"User selected exit\");\n          [NSApp terminate:nil];\n        }\n      }\n    } else if ([tokens count] >= 3 && [[tokens objectAtIndex:0] isEqualToString:ALIAS]) {\n      // alias <name> <value>\n      @try {\n        [self addAlias:line];\n        SlateLogger(@\"  LoadingA: %@\",line);\n      } @catch (NSException *ex) {\n        SlateLogger(@\"   ERROR %@\",[ex name]);\n        NSAlert *alert = [SlateConfig warningAlertWithKeyEquivalents: [NSArray arrayWithObjects:@\"Quit\", @\"Skip\", nil]];\n        [alert setMessageText:[ex name]];\n        [alert setInformativeText:[ex reason]];\n        if ([alert runModal] == NSAlertFirstButtonReturn) {\n          SlateLogger(@\"User selected exit\");\n          [NSApp terminate:nil];\n        }\n      }\n    } else if ([tokens count] >= 2 && [[tokens objectAtIndex:0] isEqualToString:SOURCE]) {\n      // source filename optional:if_exists\n      SlateLogger(@\"  LoadingS: %@\",line);\n      if (![self loadConfigFileWithPath:[tokens objectAtIndex:1]]) {\n        if ([tokens count] >= 3 && [[tokens objectAtIndex:2] isEqualToString:IF_EXISTS]) {\n          SlateLogger(@\"   Could not find file '%@' but that's ok. User specified if_exists.\",[tokens objectAtIndex:1]);\n        } else {\n          SlateLogger(@\"   ERROR Sourcing file '%@'\",[tokens objectAtIndex:1]);\n          NSAlert *alert = [SlateConfig warningAlertWithKeyEquivalents: [NSArray arrayWithObjects:@\"Quit\", @\"Skip\", nil]];\n          [alert setMessageText:[NSString stringWithFormat:@\"ERROR Sourcing file '%@'\",[tokens objectAtIndex:1]]];\n          [alert setInformativeText:@\"I dunno. Figure it out.\"];\n          if ([alert runModal] == NSAlertFirstButtonReturn) {\n            SlateLogger(@\"User selected exit\");\n            [NSApp terminate:nil];\n          }\n        }\n      }\n    }\n    line = [e nextObject];\n  }\n  return YES;\n}\n\n- (void)addDefault:(id)screenConfig layout:(id)layout {\n  ScreenState *state = [[ScreenState alloc] initWithConfig:screenConfig layout:layout];\n  if (state == nil) return;\n  [defaultLayouts addObject:state];\n}\n\n- (void)snapshotsFromDictionary:(NSDictionary *)snapshotsDict {\n  NSArray *keys = [snapshotsDict allKeys];\n  for (NSString *name in keys) {\n    SnapshotList *list = [SnapshotList snapshotListFromDictionary:[snapshotsDict objectForKey:name]];\n    [snapshots setObject:list forKey:[list name]];\n  }\n}\n\n- (BOOL)loadSnapshots {\n  NSString *fileString = [NSString stringWithContentsOfURL:[SlateConfig snapshotsFile] encoding:NSUTF8StringEncoding error:nil];\n  if (fileString == nil || [fileString isEqualToString:EMPTY])\n    return YES;\n  id iShouldBeADictionary = [fileString objectFromJSONString];\n  if (![iShouldBeADictionary isKindOfClass:[NSDictionary class]]) return NO;\n  NSDictionary *snapshotsDict = iShouldBeADictionary;\n  [self snapshotsFromDictionary:snapshotsDict];\n  return YES;\n}\n\n- (void)addAlias:(NSString *)line {\n  NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n  [StringTokenizer tokenize:line into:tokens maxTokens:3];\n  [aliases setObject:[tokens objectAtIndex:2] forKey:[NSString stringWithFormat:@\"${%@}\",[tokens objectAtIndex:1]]];\n}\n\n- (NSString *)replaceAliases:(NSString *)line {\n  NSArray *aliasNames = [aliases allKeys];\n  for (NSInteger i = 0; i < [aliasNames count]; i++) {\n    line = [line stringByReplacingOccurrencesOfString:[aliasNames objectAtIndex:i] withString:[aliases objectForKey:[aliasNames objectAtIndex:i]]];\n  }\n  if ([line rangeOfString:@\"${\"].length > 0) {\n    @throw([NSException exceptionWithName:@\"Unrecognized Alias\" reason:[NSString stringWithFormat:@\"Unrecognized alias in '%@'\", line] userInfo:nil]);\n  }\n  return line;\n}\n\n/*- (void)processNotification:(id)notification {\n  SlateLogger(@\"Notification: %@\", notification);\n  SlateLogger(@\"Notification Name: <%@>\", [notification name]);\n}*/\n\n- (void)activateLayoutOrSnapshot:(id)name {\n  if ([name isKindOfClass:[Operation class]]) {\n    [name doOperation];\n  } else if ([layouts objectForKey:name] != nil) {\n    [LayoutOperation activateLayout:name];\n  } else if ([snapshots objectForKey:name] != nil) {\n    [ActivateSnapshotOperation activateSnapshot:name remove:NO];\n  }\n}\n\n- (void)checkDefaults {\n  ScreenWrapper *sw = [[ScreenWrapper alloc] init];\n  NSInteger screenCount = [sw getScreenCount];\n  NSMutableArray *resolutions = [[NSMutableArray alloc] initWithCapacity:10];\n  [sw getScreenResolutionStrings:resolutions];\n  [resolutions sortUsingSelector:@selector(compare:)];\n  for (NSInteger i = 0; i < [defaultLayouts count]; i++) {\n    ScreenState *state = [defaultLayouts objectAtIndex:i];\n    // Check count\n    if ([state type] == TYPE_COUNT && [state count] == screenCount) {\n      SlateLogger(@\"onScreenChange count found\");\n      [self activateLayoutOrSnapshot:[state layout]];\n      break;\n    }\n    // Check resolutions\n    if ([resolutions count] == [[state resolutions] count]) {\n      SlateLogger(@\"onScreenChange resolution counts equal. Check %@ vs %@\",resolutions,[state resolutions]);\n      BOOL isEqual = YES;\n      for (NSInteger j = 0; j < [resolutions count]; j++) {\n        if (![[resolutions objectAtIndex:j] isEqualToString:[[state resolutions] objectAtIndex:j]]) {\n          isEqual = NO;\n          break;\n        }\n      }\n      if (isEqual) {\n        SlateLogger(@\"onScreenChange resolution found\");\n        [self activateLayoutOrSnapshot:[state layout]];\n        break;\n      }\n    }\n  }\n\n}\n\n- (void)onScreenChange:(id)notification {\n  SlateLogger(@\"onScreenChange\");\n  if (![ScreenWrapper hasScreenConfigChanged]) return;\n  [self checkDefaults];\n  [[JSController getInstance] runCallbacks:@\"screenConfigurationChanged\" payload:nil];\n}\n\n- (NSDictionary *)snapshotsToDictionary {\n  NSMutableDictionary *snapshotDict = [NSMutableDictionary dictionary];\n  NSArray *keys = [snapshots allKeys];\n  for (NSString *name in keys) {\n    SnapshotList *list = [snapshots objectForKey:name];\n    if (![list saveToDisk]) continue;\n    [snapshotDict setObject:[list toDictionary] forKey:name];\n  }\n  return snapshotDict;\n}\n\n- (void)saveSnapshots {\n  // Build NSDictionary with snapshots\n  NSDictionary *snapshotDict = [self snapshotsToDictionary];\n\n  // Get NSData from NSDictionary\n  NSData *jsonData = [snapshotDict JSONData];\n\n  // Save NSData to file\n  [jsonData writeToURL:[SlateConfig snapshotsFile] atomically:YES];\n}\n\n- (void)addSnapshot:(Snapshot *)snapshot name:(NSString *)name saveToDisk:(BOOL)saveToDisk isStack:(BOOL)isStack stackSize:(NSUInteger)stackSize {\n  SnapshotList *list = [snapshots objectForKey:name];\n  if (list == nil) {\n    list = [[SnapshotList alloc] initWithName:name saveToDisk:saveToDisk isStack:isStack];\n  } else {\n    [list setName:name];\n    [list setSaveToDisk:saveToDisk];\n    [list setIsStack:isStack];\n  }\n  [list addSnapshot:snapshot];\n  [snapshots setObject:list forKey:name];\n\n  [self saveSnapshots];\n}\n\n- (void)deleteSnapshot:(NSString *)name pop:(BOOL)pop {\n  if (pop) {\n    SnapshotList *list = [snapshots objectForKey:name];\n    if (list) {\n      [list popSnapshot:YES];\n    }\n  } else {\n    [snapshots removeObjectForKey:name];\n  }\n\n  [self saveSnapshots];\n}\n\n- (Snapshot *)popSnapshot:(NSString *)name remove:(BOOL)remove {\n  SnapshotList *list = [snapshots objectForKey:name];\n  Snapshot *snapshot = nil;\n  if (list) {\n    snapshot = [list popSnapshot:remove];\n  }\n  [self saveSnapshots];\n  return snapshot;\n}\n\n- (void)setupDefaultConfigs {\n  [self setConfigDefaults:[NSMutableDictionary dictionaryWithCapacity:10]];\n  [configDefaults setObject:DEFAULT_TO_CURRENT_SCREEN_DEFAULT forKey:DEFAULT_TO_CURRENT_SCREEN];\n  [configDefaults setObject:NUDGE_PERCENT_OF_DEFAULT forKey:NUDGE_PERCENT_OF];\n  [configDefaults setObject:RESIZE_PERCENT_OF_DEFAULT forKey:RESIZE_PERCENT_OF];\n  [configDefaults setObject:REPEAT_ON_HOLD_OPS_DEFAULT forKey:REPEAT_ON_HOLD_OPS];\n  [configDefaults setObject:SECONDS_BEFORE_REPEAT_DEFAULT forKey:SECONDS_BEFORE_REPEAT];\n  [configDefaults setObject:SECONDS_BETWEEN_REPEAT_DEFAULT forKey:SECONDS_BETWEEN_REPEAT];\n  [configDefaults setObject:CHECK_DEFAULTS_ON_LOAD_DEFAULT forKey:CHECK_DEFAULTS_ON_LOAD];\n  [configDefaults setObject:FOCUS_CHECK_WIDTH_DEFAULT forKey:FOCUS_CHECK_WIDTH];\n  [configDefaults setObject:FOCUS_CHECK_WIDTH_MAX_DEFAULT forKey:FOCUS_CHECK_WIDTH_MAX];\n  [configDefaults setObject:FOCUS_PREFER_SAME_APP_DEFAULT forKey:FOCUS_PREFER_SAME_APP];\n  [configDefaults setObject:ORDER_SCREENS_LEFT_TO_RIGHT_DEFAULT forKey:ORDER_SCREENS_LEFT_TO_RIGHT];\n  [configDefaults setObject:WINDOW_HINTS_BACKGROUND_COLOR_DEFAULT forKey:WINDOW_HINTS_BACKGROUND_COLOR];\n  [configDefaults setObject:WINDOW_HINTS_FONT_COLOR_DEFAULT forKey:WINDOW_HINTS_FONT_COLOR];\n  [configDefaults setObject:WINDOW_HINTS_FONT_NAME_DEFAULT forKey:WINDOW_HINTS_FONT_NAME];\n  [configDefaults setObject:WINDOW_HINTS_FONT_SIZE_DEFAULT forKey:WINDOW_HINTS_FONT_SIZE];\n  [configDefaults setObject:WINDOW_HINTS_HEIGHT_DEFAULT forKey:WINDOW_HINTS_HEIGHT];\n  [configDefaults setObject:WINDOW_HINTS_WIDTH_DEFAULT forKey:WINDOW_HINTS_WIDTH];\n  [configDefaults setObject:WINDOW_HINTS_DURATION_DEFAULT forKey:WINDOW_HINTS_DURATION];\n  [configDefaults setObject:WINDOW_HINTS_ROUNDED_CORNER_SIZE_DEFAULT forKey:WINDOW_HINTS_ROUNDED_CORNER_SIZE];\n  [configDefaults setObject:WINDOW_HINTS_IGNORE_HIDDEN_WINDOWS_DEFAULT forKey:WINDOW_HINTS_IGNORE_HIDDEN_WINDOWS];\n  [configDefaults setObject:WINDOW_HINTS_TOP_LEFT_X_DEFAULT forKey:WINDOW_HINTS_TOP_LEFT_X];\n  [configDefaults setObject:WINDOW_HINTS_TOP_LEFT_Y_DEFAULT forKey:WINDOW_HINTS_TOP_LEFT_Y];\n  [configDefaults setObject:WINDOW_HINTS_ORDER_DEFAULT forKey:WINDOW_HINTS_ORDER];\n  [configDefaults setObject:WINDOW_HINTS_SHOW_ICONS_DEFAULT forKey:WINDOW_HINTS_SHOW_ICONS];\n  [configDefaults setObject:WINDOW_HINTS_ICON_ALPHA_DEFAULT forKey:WINDOW_HINTS_ICON_ALPHA];\n  [configDefaults setObject:WINDOW_HINTS_SPREAD_DEFAULT forKey:WINDOW_HINTS_SPREAD];\n  [configDefaults setObject:WINDOW_HINTS_SPREAD_SEARCH_WIDTH_DEFAULT forKey:WINDOW_HINTS_SPREAD_SEARCH_WIDTH];\n  [configDefaults setObject:WINDOW_HINTS_SPREAD_SEARCH_HEIGHT_DEFAULT forKey:WINDOW_HINTS_SPREAD_SEARCH_HEIGHT];\n  [configDefaults setObject:WINDOW_HINTS_SPREAD_PADDING_DEFAULT forKey:WINDOW_HINTS_SPREAD_PADDING];\n  [configDefaults setObject:SWITCH_ICON_SIZE_DEFAULT forKey:SWITCH_ICON_SIZE];\n  [configDefaults setObject:SWITCH_ICON_PADDING_DEFAULT forKey:SWITCH_ICON_PADDING];\n  [configDefaults setObject:SWITCH_BACKGROUND_COLOR_DEFAULT forKey:SWITCH_BACKGROUND_COLOR];\n  [configDefaults setObject:SWITCH_SELECTED_BACKGROUND_COLOR_DEFAULT forKey:SWITCH_SELECTED_BACKGROUND_COLOR];\n  [configDefaults setObject:SWITCH_SELECTED_BORDER_COLOR_DEFAULT forKey:SWITCH_SELECTED_BORDER_COLOR];\n  [configDefaults setObject:SWITCH_SELECTED_BORDER_SIZE_DEFAULT forKey:SWITCH_SELECTED_BORDER_SIZE];\n  [configDefaults setObject:SWITCH_ROUNDED_CORNER_SIZE_DEFAULT forKey:SWITCH_ROUNDED_CORNER_SIZE];\n  [configDefaults setObject:SWITCH_ORIENTATION_DEFAULT forKey:SWITCH_ORIENTATION];\n  [configDefaults setObject:SWITCH_SECONDS_BETWEEN_REPEAT_DEFAULT forKey:SWITCH_SECONDS_BETWEEN_REPEAT];\n  [configDefaults setObject:SWITCH_SECONDS_BEFORE_REPEAT_DEFAULT forKey:SWITCH_SECONDS_BEFORE_REPEAT];\n  [configDefaults setObject:SWITCH_STOP_REPEAT_AT_EDGE_DEFAULT forKey:SWITCH_STOP_REPEAT_AT_EDGE];\n  [configDefaults setObject:SWITCH_ONLY_FOCUS_MAIN_WINDOW_DEFAULT forKey:SWITCH_ONLY_FOCUS_MAIN_WINDOW];\n  [configDefaults setObject:SWITCH_FONT_COLOR_DEFAULT forKey:SWITCH_FONT_COLOR];\n  [configDefaults setObject:SWITCH_FONT_SIZE_DEFAULT forKey:SWITCH_FONT_SIZE];\n  [configDefaults setObject:SWITCH_FONT_NAME_DEFAULT forKey:SWITCH_FONT_NAME];\n  [configDefaults setObject:SWITCH_SHOW_TITLES_DEFAULT forKey:SWITCH_SHOW_TITLES];\n  [configDefaults setObject:SWITCH_TYPE_DEFAULT forKey:SWITCH_TYPE];\n  [configDefaults setObject:SWITCH_SELECTED_PADDING_DEFAULT forKey:SWITCH_SELECTED_PADDING];\n  [configDefaults setObject:KEYBOARD_LAYOUT_DEFAULT forKey:KEYBOARD_LAYOUT];\n  [configDefaults setObject:SNAPSHOT_TITLE_MATCH_DEFAULT forKey:SNAPSHOT_TITLE_MATCH];\n  [configDefaults setObject:GRID_BACKGROUND_COLOR_DEFAULT forKey:GRID_BACKGROUND_COLOR];\n  [configDefaults setObject:GRID_ROUNDED_CORNER_SIZE_DEFAULT forKey:GRID_ROUNDED_CORNER_SIZE];\n  [configDefaults setObject:GRID_CELL_BACKGROUND_COLOR_DEFAULT forKey:GRID_CELL_BACKGROUND_COLOR];\n  [configDefaults setObject:GRID_CELL_SELECTED_COLOR_DEFAULT forKey:GRID_CELL_SELECTED_COLOR];\n  [configDefaults setObject:GRID_CELL_ROUNDED_CORNER_SIZE_DEFAULT forKey:GRID_CELL_ROUNDED_CORNER_SIZE];\n  [configDefaults setObject:LAYOUT_FOCUS_ON_ACTIVATE_DEFAULT forKey:LAYOUT_FOCUS_ON_ACTIVATE];\n  [configDefaults setObject:SNAPSHOT_MAX_STACK_SIZE_DEFAULT forKey:SNAPSHOT_MAX_STACK_SIZE];\n  [configDefaults setObject:UNDO_MAX_STACK_SIZE_DEFAULT forKey:UNDO_MAX_STACK_SIZE];\n  [configDefaults setObject:UNDO_OPS_DEFAULT forKey:UNDO_OPS];\n  [configDefaults setObject:MODAL_ESCAPE_KEY_DEFAULT forKey:MODAL_ESCAPE_KEY];\n  [configDefaults setObject:JS_RECEIVE_MOVE_EVENT_DEFAULT forKey:JS_RECEIVE_MOVE_EVENT];\n  [configDefaults setObject:JS_RECEIVE_RESIZE_EVENT_DEFAULT forKey:JS_RECEIVE_RESIZE_EVENT];\n  [self setConfigs:[NSMutableDictionary dictionary]];\n  [self setAppConfigs:[NSMutableDictionary dictionary]];\n  [configs setValuesForKeysWithDictionary:configDefaults];\n}\n\n+ (NSURL *)snapshotsFile {\n  NSFileManager *sharedFM = [NSFileManager defaultManager];\n  NSURL *appSupportDir = [sharedFM applicationSupportDirectory];\n  NSURL *snapshotsFile = nil;\n  if (appSupportDir) {\n    snapshotsFile = [appSupportDir URLByAppendingPathComponent:SNAPSHOTS_FILE];\n  }\n  SlateLogger(@\"TEST ------------- %@\", [snapshotsFile absoluteString]);\n  return snapshotsFile;\n}\n\n@end\n\nvoid onDisplayReconfiguration (CGDirectDisplayID display, CGDisplayChangeSummaryFlags flags, void *userInfo) {\n    SlateLogger(@\"onDisplayReconfiguration\");\n    [(__bridge id)userInfo onScreenChange:nil];\n}\n"
  },
  {
    "path": "Slate/SlateLogger.h",
    "content": "//\n//  SlateLogger.h\n//  Slate\n//\n//  Created by Jigish Patel on 3/5/12.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#ifndef Slate_SlateLogger_h\n#define Slate_SlateLogger_h\n\n#ifdef DEBUG\n#define SlateLogger(...) NSLog(__VA_ARGS__)\n#else\n#define SlateLogger(...)\n#endif\n\n#endif\n"
  },
  {
    "path": "Slate/Snapshot.h",
    "content": "//\n//  Snapshot.h\n//  Slate\n//\n//  Created by Jigish Patel on 2/28/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n\n@class WindowSnapshot;\n\n@interface Snapshot : NSObject {\n@private\n  NSMutableDictionary *apps;\n}\n\n@property  NSMutableDictionary *apps;\n\n- (void)addWindow:(WindowSnapshot *)windowSnapshot app:(NSString *)appName;\n- (NSDictionary *)toDictionary;\n+ (Snapshot *)snapshotFromDictionary:(NSDictionary *)dict;\n\n@end\n"
  },
  {
    "path": "Slate/Snapshot.m",
    "content": "//\n//  Snapshot.m\n//  Slate\n//\n//  Created by Jigish Patel on 2/28/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"Snapshot.h\"\n#import \"WindowSnapshot.h\"\n#import \"Constants.h\"\n\n@implementation Snapshot\n\n@synthesize apps;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [self setApps:[NSMutableDictionary dictionary]];\n  }\n  return self;\n}\n\n- (void)addWindow:(WindowSnapshot *)windowSnapshot app:(NSString *)appName {\n  NSMutableArray *app = [apps objectForKey:appName];\n  if (app == nil) {\n    app = [NSMutableArray array];\n  }\n  [app addObject:windowSnapshot];\n  [apps setObject:app forKey:appName];\n}\n\n- (NSDictionary *)toDictionary {\n  NSMutableDictionary *dict = [NSMutableDictionary dictionary];\n  NSMutableDictionary *appsDict = [NSMutableDictionary dictionary];\n  NSArray *appNames = [apps allKeys];\n  for (NSString *appName in appNames) {\n    NSArray *windows = [apps objectForKey:appName];\n    NSMutableArray *windowDicts = [NSMutableArray array];\n    for (WindowSnapshot *windowSnap in windows) {\n      [windowDicts addObject:[windowSnap toDictionary]];\n    }\n    [appsDict setObject:windowDicts forKey:appName];\n  }\n  [dict setObject:appsDict forKey:APPS];\n  return dict;\n}\n\n+ (Snapshot *)snapshotFromDictionary:(NSDictionary *)dict {\n  Snapshot *s = [[Snapshot alloc] init];\n  NSDictionary *appsDict = [dict objectForKey:APPS];\n  NSArray *appNames = [appsDict allKeys];\n  for (NSString *appName in appNames) {\n    NSArray *windowDicts = [appsDict objectForKey:appName];\n    for (NSDictionary *windowDict in windowDicts) {\n      [s addWindow:[WindowSnapshot windowSnapshotFromDictionary:windowDict] app:appName];\n    }\n  }\n  return s;\n}\n\n\n@end\n"
  },
  {
    "path": "Slate/SnapshotList.h",
    "content": "//\n//  SnapshotList.h\n//  Slate\n//\n//  Created by Jigish Patel on 2/28/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n\n@class Snapshot;\n\n@interface SnapshotList : NSObject {\n@private\n  NSMutableArray *snapshots;\n  NSString *name;\n  BOOL saveToDisk;\n  BOOL isStack;\n  NSInteger stackSize;\n}\n\n@property  NSMutableArray *snapshots;\n@property  NSString *name;\n@property (assign) BOOL saveToDisk;\n@property (assign) BOOL isStack;\n@property (assign) NSInteger stackSize;\n\n- (id)initWithName:(NSString *)theName saveToDisk:(BOOL)theSaveToDisk isStack:(BOOL)theIsStack;\n- (void)addSnapshot:(Snapshot *)snapshot;\n- (Snapshot *)popSnapshot:(BOOL)remove;\n- (NSDictionary *)toDictionary;\n+ (SnapshotList *)snapshotListFromDictionary:(NSDictionary *)dict;\n\n@end\n"
  },
  {
    "path": "Slate/SnapshotList.m",
    "content": "//\n//  SnapshotList.m\n//  Slate\n//\n//  Created by Jigish Patel on 2/28/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"SnapshotList.h\"\n#import \"Snapshot.h\"\n#import \"Constants.h\"\n#import \"SlateConfig.h\"\n\n@implementation SnapshotList\n\n@synthesize snapshots, name, saveToDisk, isStack, stackSize;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [self setSnapshots:[NSMutableArray array]];\n  }\n  return self;\n}\n\n- (id)initWithName:(NSString *)theName saveToDisk:(BOOL)theSaveToDisk isStack:(BOOL)theIsStack {\n  self = [self init];\n  if (self) {\n    [self setName:theName];\n    saveToDisk = theSaveToDisk;\n    isStack = theIsStack;\n    stackSize = [[SlateConfig getInstance] getIntegerConfig:SNAPSHOT_MAX_STACK_SIZE]; // 0 means unlimited\n  }\n  return self;\n}\n\n- (id)initWithName:(NSString *)theName saveToDisk:(BOOL)theSaveToDisk isStack:(BOOL)theIsStack stackSize:(NSUInteger)theStackSize  {\n  self = [self init];\n  if (self) {\n    [self setName:theName];\n    saveToDisk = theSaveToDisk;\n    isStack = theIsStack;\n    stackSize = theStackSize;\n  }\n  return self;\n}\n\n- (void)addSnapshot:(Snapshot *)snapshot {\n  if (isStack) {\n    [snapshots addObject:snapshot];\n    while (stackSize > 0 && [snapshots count] > stackSize) {\n      [snapshots removeObjectAtIndex:0];\n    }\n  } else {\n    [snapshots removeAllObjects];\n    [snapshots addObject:snapshot];\n  }\n}\n\n- (Snapshot *)popSnapshot:(BOOL)remove {\n  if ([snapshots count] <= 0) return nil;\n  Snapshot *returnVal = [snapshots lastObject];\n  if (remove) [snapshots removeLastObject];\n  return returnVal;\n}\n\n- (NSDictionary *)toDictionary {\n  NSMutableDictionary *snapshotList = [NSMutableDictionary dictionary];\n  NSMutableArray *snapshotsArray = [NSMutableArray array];\n  [snapshotList setObject:[self name] forKey:NAME];\n  [snapshotList setObject:[NSNumber numberWithBool:[self saveToDisk]] forKey:SAVE_TO_DISK];\n  [snapshotList setObject:[NSNumber numberWithBool:[self isStack]] forKey:STACK];\n  for (Snapshot *snap in [self snapshots]) {\n    [snapshotsArray addObject:[snap toDictionary]];\n  }\n  [snapshotList setObject:snapshotsArray forKey:SNAPSHOTS];\n  return snapshotList;\n}\n\n+ (SnapshotList *)snapshotListFromDictionary:(NSDictionary *)dict {\n  SnapshotList *sl = [[SnapshotList alloc] initWithName:[dict objectForKey:NAME] saveToDisk:[[dict objectForKey:SAVE_TO_DISK] boolValue] isStack:[[dict objectForKey:STACK] boolValue]];\n  NSArray *snapshotsArray = [dict objectForKey:SNAPSHOTS];\n  for (NSDictionary *snap in snapshotsArray) {\n    [sl addSnapshot:[Snapshot snapshotFromDictionary:snap]];\n  }\n  return sl;\n}\n\n\n@end\n"
  },
  {
    "path": "Slate/SnapshotOperation.h",
    "content": "//\n//  SnapshotOperation.h\n//  Slate\n//\n//  Created by Jigish Patel on 2/28/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"Operation.h\"\n\n@interface SnapshotOperation : Operation {\n@private\n  NSString *name;\n  BOOL saveToDisk;\n  BOOL isStack;\n  NSInteger stackSize;\n}\n\n@property  NSString *name;\n@property (assign) BOOL saveToDisk;\n@property (assign) BOOL isStack;\n@property (assign) NSInteger stackSize;\n\n- (id)initWithName:(NSString *)theName options:(NSString *)options;\n\n+ (id)snapshotOperation;\n+ (id)snapshotOperationFromString:(NSString *)snapshotOperation;\n\n@end\n"
  },
  {
    "path": "Slate/SnapshotOperation.m",
    "content": "//\n//  SnapshotOperation.m\n//  Slate\n//\n//  Created by Jigish Patel on 2/28/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"SnapshotOperation.h\"\n#import \"Constants.h\"\n#import \"Snapshot.h\"\n#import \"WindowSnapshot.h\"\n#import \"SlateConfig.h\"\n#import \"StringTokenizer.h\"\n#import \"SlateLogger.h\"\n#import \"RunningApplications.h\"\n\n@implementation SnapshotOperation\n\n@synthesize name, saveToDisk, isStack, stackSize;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    saveToDisk = NO;\n    isStack = NO;\n    stackSize = [[SlateConfig getInstance] getIntegerConfig:SNAPSHOT_MAX_STACK_SIZE];\n    [self setName:nil];\n  }\n  return self;\n}\n\n- (id)initWithName:(NSString *)theName options:(NSString *)_options {\n  self = [self init];\n  if (self) {\n    [self setStackSize:[[SlateConfig getInstance] getIntegerConfig:SNAPSHOT_MAX_STACK_SIZE]];\n    [self setName:theName];\n    if (_options) {\n      NSArray *optionsTokens = [_options componentsSeparatedByString:SEMICOLON];\n      for (NSInteger i = 0; i < [optionsTokens count]; i++) {\n        NSString *option = [optionsTokens objectAtIndex:i];\n        if ([SAVE_TO_DISK isEqualToString:option]) {\n          saveToDisk = YES;\n        } else if ([STACK isEqualToString:option]) {\n          isStack = YES;\n        }\n      }\n    }\n  }\n  return self;\n}\n\n- (BOOL)doOperation {\n  SlateLogger(@\"----------------- Begin Snapshot Operation -----------------\");\n  BOOL success = [self doOperationWithAccessibilityWrapper:nil screenWrapper:nil];\n  SlateLogger(@\"-----------------  End Snapshot Operation  -----------------\");\n  return success;\n}\n\n- (BOOL)doOperationWithAccessibilityWrapper:(AccessibilityWrapper *)iamnil screenWrapper:(ScreenWrapper *)iamalsonil {\n  [self evalOptionsWithAccessibilityWrapper:iamnil screenWrapper:iamalsonil];\n  Snapshot *snapshot = [[Snapshot alloc] init];\n  for (NSRunningApplication *app in [RunningApplications getInstance]) {\n    NSString *appName = [app localizedName];\n    pid_t appPID = [app processIdentifier];\n    SlateLogger(@\"I see application '%@' with pid '%d'\", appName, appPID);\n    AXUIElementRef appRef = AXUIElementCreateApplication(appPID);\n    CFArrayRef windowsArrRef = [AccessibilityWrapper windowsInApp:appRef];\n    if (!windowsArrRef || CFArrayGetCount(windowsArrRef) == 0) continue;\n    CFMutableArrayRef windowsArr = CFArrayCreateMutableCopy(kCFAllocatorDefault, 0, windowsArrRef);\n    for (NSInteger i = 0; i < CFArrayGetCount(windowsArr); i++) {\n      SlateLogger(@\" Printing Window: %@\", [AccessibilityWrapper getTitle:CFArrayGetValueAtIndex(windowsArr, i)]);\n      NSString *title = [AccessibilityWrapper getTitle:CFArrayGetValueAtIndex(windowsArr, i)];\n      if ([title isEqualToString:@\"\"]) continue;\n      AccessibilityWrapper *aw = [[AccessibilityWrapper alloc] initWithApp:appRef window:CFArrayGetValueAtIndex(windowsArr, i)];\n      NSSize size = [aw getCurrentSize];\n      NSPoint tl = [aw getCurrentTopLeft];\n      [snapshot addWindow:[[WindowSnapshot alloc] initWithAppName:appName title:title topLeft:tl size:size] app:appName];\n    }\n  }\n  [[SlateConfig getInstance] addSnapshot:snapshot name:name saveToDisk:saveToDisk isStack:isStack stackSize:stackSize];\n  return YES;\n}\n\n- (BOOL)testOperation {\n  return YES;\n}\n\n- (NSArray *)requiredOptions {\n  return [NSArray arrayWithObject:OPT_NAME];\n}\n\n- (void)parseOption:(NSString *)_name value:(id)value {\n  if (value == nil) { return; }\n  if ([_name isEqualToString:OPT_NAME]) {\n    if (![value isKindOfClass:[NSString class]]) {\n      @throw([NSException exceptionWithName:[NSString stringWithFormat:@\"Invalid %@\", _name] reason:[NSString stringWithFormat:@\"Invalid %@ '%@'\", _name, value] userInfo:nil]);\n      return;\n    }\n    [self setName:_name];\n  } else if ([_name isEqualToString:OPT_SAVE]) {\n    if (![value isKindOfClass:[NSValue class]] && ![value isKindOfClass:[NSString class]] && ![value isKindOfClass:[NSNumber class]]) {\n      @throw([NSException exceptionWithName:[NSString stringWithFormat:@\"Invalid %@\", _name] reason:[NSString stringWithFormat:@\"Invalid %@ '%@'\", _name, value] userInfo:nil]);\n      return;\n    }\n    [self setSaveToDisk:[value boolValue]];\n  } else if ([_name isEqualToString:OPT_STACK]) {\n    if (![value isKindOfClass:[NSValue class]] && ![value isKindOfClass:[NSString class]] && ![value isKindOfClass:[NSNumber class]]) {\n      @throw([NSException exceptionWithName:[NSString stringWithFormat:@\"Invalid %@\", _name] reason:[NSString stringWithFormat:@\"Invalid %@ '%@'\", _name, value] userInfo:nil]);\n      return;\n    }\n    [self setIsStack:[value boolValue]];\n  }\n}\n\n+ (id)snapshotOperation {\n  return [[SnapshotOperation alloc] init];\n}\n\n+ (id)snapshotOperationFromString:(NSString *)snapshotOperation {\n  // snapshot name options\n  NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n  [StringTokenizer tokenize:snapshotOperation into:tokens maxTokens:3];\n\n  if ([tokens count] < 2) {\n    SlateLogger(@\"ERROR: Invalid Parameters '%@'\", snapshotOperation);\n    @throw([NSException exceptionWithName:@\"Invalid Parameters\" reason:[NSString stringWithFormat:@\"Invalid Parameters in '%@'. Snapshot operations require the following format: 'snapshot name options'\", snapshotOperation] userInfo:nil]);\n  }\n\n  Operation *op = [[SnapshotOperation alloc] initWithName:[tokens objectAtIndex:1] options:([tokens count] > 2 ? [tokens objectAtIndex:2] : nil)];\n  return op;\n}\n\n@end\n"
  },
  {
    "path": "Slate/StringTokenizer.h",
    "content": "//\n//  StringTokenizer.h\n//  Slate\n//\n//  Created by Jigish Patel on 5/26/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n\n\n@interface StringTokenizer : NSObject {}\n\n+ (BOOL)isSpaceChar:(unichar)c;\n+ (BOOL)isQuoteChar:(unichar)c quoteChars:(NSCharacterSet *)quoteChars;\n+ (void)tokenize:(NSString *)s into:(NSMutableArray *)array;\n+ (void)tokenize:(NSString *)s into:(NSMutableArray *)array quoteChars:(NSCharacterSet *)quotes;\n+ (void)tokenize:(NSString *)s into:(NSMutableArray *)array maxTokens:(NSInteger)maxTokens;\n+ (void)tokenize:(NSString *)s into:(NSMutableArray *)array maxTokens:(NSInteger)maxTokens quoteChars:(NSCharacterSet *)quotes;\n+ (void)firstToken:(NSString *)s into:(NSMutableString *)token;\n+ (NSString *)removeQuotes:(NSString *)s quoteChars:(NSCharacterSet *)quoteChars;\n\n@end\n"
  },
  {
    "path": "Slate/StringTokenizer.m",
    "content": "//\n//  StringTokenizer.m\n//  Slate\n//\n//  Created by Jigish Patel on 5/26/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"StringTokenizer.h\"\n\n\n@implementation StringTokenizer\n\n+ (BOOL)isSpaceChar:(unichar)c {\n  return [[NSCharacterSet whitespaceCharacterSet] characterIsMember:c];\n}\n\n+ (BOOL)isQuoteChar:(unichar)c quoteChars:(NSCharacterSet *)quotes {\n  return [quotes characterIsMember:c];\n}\n\n+ (void)tokenize:(NSString *)s into:(NSMutableArray *)array {\n  NSMutableString *token = [[NSMutableString alloc] initWithCapacity:10];\n  for (NSInteger i = 0; i < [s length]; i++) {\n    if ([self isSpaceChar:[s characterAtIndex:i]]) {\n      if (![token isEqualToString:@\"\"]) {\n        [array addObject:[NSString stringWithString:token]];\n        token = [[NSMutableString alloc] initWithCapacity:10];\n      }\n    } else {\n      [token appendFormat:@\"%C\", [s characterAtIndex:i]];\n    }\n  }\n  if (![token isEqualToString:@\"\"]) {\n    [array addObject:[NSString stringWithString:token]];\n  }\n}\n\n+ (void)tokenize:(NSString *)s into:(NSMutableArray *)array quoteChars:(NSCharacterSet *)quotes {\n  NSMutableString *token = [[NSMutableString alloc] initWithCapacity:10];\n  BOOL quoteSeen = NO;\n  char quoteChar = '.';\n  for (NSInteger i = 0; i < [s length]; i++) {\n    if ([self isSpaceChar:[s characterAtIndex:i]]) {\n      if (![token isEqualToString:@\"\"] && !quoteSeen) {\n        [array addObject:[NSString stringWithString:token]];\n        token = [[NSMutableString alloc] initWithCapacity:10];\n      } else if (quoteSeen) {\n        [token appendFormat:@\"%C\", [s characterAtIndex:i]];\n      }\n    } else if ([self isQuoteChar:[s characterAtIndex:i] quoteChars:quotes]) {\n      if (!quoteSeen) {\n        quoteSeen = !quoteSeen;\n        quoteChar = [s characterAtIndex:i];\n      } else if (quoteSeen && [s characterAtIndex:i] == quoteChar) {\n        quoteSeen = !quoteSeen;\n        quoteChar = '.';\n      } else {\n        [token appendFormat:@\"%C\", [s characterAtIndex:i]];\n      }\n    } else {\n      [token appendFormat:@\"%C\", [s characterAtIndex:i]];\n    }\n  }\n  if (![[NSString stringWithString:token] isEqualToString:@\"\"]) {\n    [array addObject:[NSString stringWithString:token]];\n  }\n}\n\n+ (void)tokenize:(NSString *)s into:(NSMutableArray *)array maxTokens:(NSInteger)maxTokens {\n  if (maxTokens <=1) {\n    [array addObject:s];\n    return;\n  }\n  NSInteger numTokens = 0;\n  NSMutableString *token = [[NSMutableString alloc] initWithCapacity:10];\n  for (NSInteger i = 0; i < [s length]; i++) {\n    if ([self isSpaceChar:[s characterAtIndex:i]]) {\n      if (![token isEqualToString:@\"\"] && numTokens < (maxTokens-1)) {\n        numTokens++;\n        [array addObject:[NSString stringWithString:token]];\n        token = [[NSMutableString alloc] initWithCapacity:10];\n      } else if (numTokens >= (maxTokens-1)) {\n        if ([token isEqualToString:@\"\"] && [self isSpaceChar:[s characterAtIndex:i]]) continue;\n        [token appendFormat:@\"%C\", [s characterAtIndex:i]];\n      }\n    } else {\n      [token appendFormat:@\"%C\", [s characterAtIndex:i]];\n    }\n  }\n  if (![[NSString stringWithString:token] isEqualToString:@\"\"]) {\n    [array addObject:[NSString stringWithString:token]];\n  }\n}\n\n+ (void)tokenize:(NSString *)s into:(NSMutableArray *)array maxTokens:(NSInteger)maxTokens quoteChars:(NSCharacterSet *)quotes {\n  if (maxTokens <=1) {\n    [array addObject:s];\n    return;\n  }\n  NSInteger numTokens = 0;\n  NSMutableString *token = [[NSMutableString alloc] initWithCapacity:10];\n  BOOL quoteSeen = NO;\n  unichar quoteChar = '.';\n  for (NSInteger i = 0; i < [s length]; i++) {\n    if ([self isSpaceChar:[s characterAtIndex:i]]) {\n      if (![token isEqualToString:@\"\"] && numTokens < (maxTokens-1) && !quoteSeen) {\n        numTokens++;\n        [array addObject:[NSString stringWithString:token]];\n        token = [[NSMutableString alloc] initWithCapacity:10];\n      } else if (numTokens >= (maxTokens-1) || quoteSeen) {\n        [token appendFormat:@\"%C\", [s characterAtIndex:i]];\n      }\n    } else if (numTokens >= (maxTokens-1)) {\n      [token appendFormat:@\"%C\", [s characterAtIndex:i]];\n    } else if ([self isQuoteChar:[s characterAtIndex:i] quoteChars:quotes]) {\n      if (!quoteSeen) {\n        quoteSeen = !quoteSeen;\n        quoteChar = [s characterAtIndex:i];\n      } else if (quoteSeen && [s characterAtIndex:i] == quoteChar) {\n        quoteSeen = !quoteSeen;\n        quoteChar = '.';\n      } else {\n        [token appendFormat:@\"%C\", [s characterAtIndex:i]];\n      }\n    } else {\n      [token appendFormat:@\"%C\", [s characterAtIndex:i]];\n    }\n  }\n  if (![[NSString stringWithString:token] isEqualToString:@\"\"]) {\n    [array addObject:[NSString stringWithString:token]];\n  }\n}\n\n+ (void)firstToken:(NSString *)s into:(NSMutableString *)token {\n  for (NSInteger i = 0; i < [s length]; i++) {\n    if ([self isSpaceChar:[s characterAtIndex:i]]) {\n      if (![token isEqualToString:@\"\"]) {\n        return;\n      }\n    } else {\n      [token appendFormat:@\"%C\", [s characterAtIndex:i]];\n    }\n  }\n}\n\n+ (NSString *)removeQuotes:(NSString *)s quoteChars:(NSCharacterSet *)quoteChars {\n  if ([StringTokenizer isQuoteChar:[s characterAtIndex:0] quoteChars:quoteChars] &&\n      [StringTokenizer isQuoteChar:[s characterAtIndex:([s length] - 1)] quoteChars:quoteChars]) {\n    return [s substringWithRange:NSMakeRange(1, [s length]-2)];\n  }\n  return s;\n}\n\n@end\n"
  },
  {
    "path": "Slate/SwitchAppQuittingOverlayView.h",
    "content": "//\n//  SwitchAppQuittingOverlayView.h\n//  Slate\n//\n//  Created by Jigish Patel on 3/22/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import <Cocoa/Cocoa.h>\n\n@interface SwitchAppQuittingOverlayView : NSView {\n  BOOL force;\n}\n\n@property BOOL force;\n\n@end\n"
  },
  {
    "path": "Slate/SwitchAppQuittingOverlayView.m",
    "content": "//\n//  SwitchAppQuittingOverlayView.m\n//  Slate\n//\n//  Created by Jigish Patel on 3/22/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"SwitchAppQuittingOverlayView.h\"\n\n@implementation SwitchAppQuittingOverlayView\n\n@synthesize force;\n\n- (id)initWithFrame:(NSRect)frame {\n  self = [super initWithFrame:frame];\n  if (self) {\n    [self setWantsLayer:YES];\n    force = NO;\n  }\n  return self;\n}\n\n- (void)drawRect:(NSRect)dirtyRect {\n  [[NSColor redColor] set];\n  NSBezierPath *path = [NSBezierPath bezierPath];\n  [path moveToPoint:NSMakePoint(self.bounds.origin.x, self.bounds.origin.y)];\n  [path lineToPoint:NSMakePoint(self.bounds.origin.x, self.bounds.origin.y+5)];\n  [path lineToPoint:NSMakePoint(self.bounds.origin.x+self.bounds.size.width-5,\n                                self.bounds.origin.y+self.bounds.size.height)];\n  [path lineToPoint:NSMakePoint(self.bounds.origin.x+self.bounds.size.width,\n                                self.bounds.origin.y+self.bounds.size.height)];\n  [path lineToPoint:NSMakePoint(self.bounds.origin.x+self.bounds.size.width,\n                                self.bounds.origin.y+self.bounds.size.height-5)];\n  [path lineToPoint:NSMakePoint(self.bounds.origin.x+5, self.bounds.origin.y)];\n  [path closePath];\n  [path fill];\n  if (force) {\n    NSBezierPath *path2 = [NSBezierPath bezierPath];\n    [path2 moveToPoint:NSMakePoint(self.bounds.origin.x+self.bounds.size.width, self.bounds.origin.y)];\n    [path2 lineToPoint:NSMakePoint(self.bounds.origin.x+self.bounds.size.width-5, self.bounds.origin.y)];\n    [path2 lineToPoint:NSMakePoint(self.bounds.origin.x, self.bounds.origin.y+self.bounds.size.height-5)];\n    [path2 lineToPoint:NSMakePoint(self.bounds.origin.x, self.bounds.origin.y+self.bounds.size.height)];\n    [path2 lineToPoint:NSMakePoint(self.bounds.origin.x+5, self.bounds.origin.y+self.bounds.size.height)];\n    [path2 lineToPoint:NSMakePoint(self.bounds.origin.x+self.bounds.size.width, self.bounds.origin.y+5)];\n    [path2 closePath];\n    [path2 fill];\n  }\n}\n\n@end\n"
  },
  {
    "path": "Slate/SwitchAppView.h",
    "content": "//\n//  SwitchAppView.h\n//  Slate\n//\n//  Created by Jigish Patel on 3/22/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import <Cocoa/Cocoa.h>\n\n@class SwitchAppQuittingOverlayView;\n\n@interface SwitchAppView : NSView {\n  BOOL selected;\n  BOOL hidden;\n  BOOL quitting;\n  BOOL forceQuitting;\n  NSRunningApplication *app;\n  NSImageView *iconView;\n  NSTextField *textField;\n  SwitchAppQuittingOverlayView *quittingView;\n}\n\n@property (assign) BOOL selected;\n@property (assign) BOOL hidden;\n@property (assign) BOOL quitting;\n@property (assign) BOOL forceQuitting;\n@property NSRunningApplication *app;\n@property NSImageView *iconView;\n@property NSTextField *textField;\n@property SwitchAppQuittingOverlayView *quittingView;\n\n- (void)updateSelected:(BOOL)theSelected;\n- (void)updateApp:(NSRunningApplication *)theApp;\n- (void)updateHidden:(BOOL)theHidden;\n- (void)updateQuitting:(BOOL)theQuitting;\n- (void)updateForceQuitting:(BOOL)theForceQuitting;\n\n@end\n"
  },
  {
    "path": "Slate/SwitchAppView.m",
    "content": "//\n//  SwitchAppView.m\n//  Slate\n//\n//  Created by Jigish Patel on 3/22/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"SwitchAppView.h\"\n#import \"SlateConfig.h\"\n#import \"Constants.h\"\n#import \"SwitchAppQuittingOverlayView.h\"\n\n@implementation SwitchAppView\n\nstatic const float HIDDEN_ALPHA = 0.2;\nstatic const float SHOWN_ALPHA = 1.0;\nstatic const float STROKE_WIDTH = -5;\n\n@synthesize selected, hidden, quitting, forceQuitting, app, iconView, textField, quittingView;\n\nstatic NSColor *switchFontColor = nil;\nstatic NSFont *switchFont = nil;\nstatic float iconSize = -1;\nstatic float iconPadding = -1;\nstatic float switchFontHeight = -1;\n\n- (id)initWithFrame:(NSRect)frame {\n  self = [super initWithFrame:frame];\n  if (self) {\n    selected = NO;\n    hidden = NO;\n    quitting = NO;\n    forceQuitting = NO;\n    iconView = nil;\n    quittingView = nil;\n    [self setWantsLayer:YES];\n    if (switchFontColor == nil) {\n      NSArray *fColorArr = [[SlateConfig getInstance] getArrayConfig:SWITCH_FONT_COLOR];\n      if ([fColorArr count] < 4) fColorArr = [SWITCH_FONT_COLOR_DEFAULT componentsSeparatedByString:SEMICOLON];\n      switchFontColor = [NSColor colorWithDeviceRed:[[fColorArr objectAtIndex:0] floatValue]/255.0\n                                              green:[[fColorArr objectAtIndex:1] floatValue]/255.0\n                                               blue:[[fColorArr objectAtIndex:2] floatValue]/255.0\n                                              alpha:[[fColorArr objectAtIndex:3] floatValue]];\n    }\n    if (switchFont == nil) {\n      switchFont = [NSFont fontWithName:[[SlateConfig getInstance] getConfig:SWITCH_FONT_NAME] size:[[SlateConfig getInstance] getFloatConfig:SWITCH_FONT_SIZE]];\n    }\n    if (iconSize < 0) {\n      iconSize = [[SlateConfig getInstance] getFloatConfig:SWITCH_ICON_SIZE];\n    }\n    if (iconPadding < 0) {\n      iconPadding = [[SlateConfig getInstance] getFloatConfig:SWITCH_ICON_PADDING];\n    }\n    if (switchFontHeight < 0) {\n      NSString *testString = @\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n      NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:[NSFont fontWithName:[[SlateConfig getInstance] getConfig:SWITCH_FONT_NAME]\n                                                                                            size:[[SlateConfig getInstance] getFloatConfig:SWITCH_FONT_SIZE]],\n                                  NSFontAttributeName, nil];\n      NSSize size = [testString sizeWithAttributes:attributes];\n      switchFontHeight = size.height;\n    }\n  }\n  return self;\n}\n\n- (void)updateSelected:(BOOL)theSelected {\n  [self setSelected:theSelected];\n  [self setNeedsDisplay:YES];\n}\n\n- (void)updateApp:(NSRunningApplication *)theApp {\n  [self setApp:theApp];\n  [self setHidden:[theApp isHidden]];\n  if (iconView != nil) {\n    [iconView removeFromSuperview];\n  }\n  if ([[SlateConfig getInstance] getBoolConfig:SWITCH_SHOW_TITLES] && [[[SlateConfig getInstance] getConfig:SWITCH_ORIENTATION] isEqualToString:SWITCH_ORIENTATION_HORIZONTAL]) {\n    iconView = [[NSImageView alloc] initWithFrame:NSMakeRect(iconPadding, self.frame.size.height - iconSize - iconPadding*2, iconSize, iconSize)];\n  } else {\n    iconView = [[NSImageView alloc] initWithFrame:NSMakeRect(iconPadding, iconPadding, iconSize, iconSize)];\n  }\n  NSImage *icon = [app icon];\n  [icon setScalesWhenResized:YES];\n  [icon setSize:NSMakeSize(iconSize, iconSize)];\n  [iconView setImage:icon];\n  [iconView setAlphaValue:(hidden ? HIDDEN_ALPHA : SHOWN_ALPHA)];\n  [self addSubview:iconView];\n  if ([[SlateConfig getInstance] getBoolConfig:SWITCH_SHOW_TITLES]) {\n    if ([[[SlateConfig getInstance] getConfig:SWITCH_ORIENTATION] isEqualToString:SWITCH_ORIENTATION_VERTICAL]) {\n      textField = [[NSTextField alloc] initWithFrame:NSMakeRect(iconSize+iconPadding*2, self.frame.size.height/2 - switchFontHeight/2, self.frame.size.width - iconSize - iconPadding*2, switchFontHeight)];\n    } else {\n      textField = [[NSTextField alloc] initWithFrame:NSMakeRect(0, iconPadding, iconSize+iconPadding*2, self.frame.size.height - iconSize - iconPadding*3)];\n    }\n    NSMutableAttributedString *theTitle = [[NSMutableAttributedString alloc] initWithString:[theApp localizedName]];\n    NSRange everything = NSMakeRange(0, [theTitle length]);\n    [theTitle addAttribute:NSStrokeWidthAttributeName value:[NSNumber numberWithFloat:STROKE_WIDTH] range:everything];\n    [theTitle setAlignment:NSCenterTextAlignment range:everything];\n    [textField setAttributedStringValue:theTitle];\n    [textField setSelectable:NO];\n    [textField setEditable:NO];\n    [textField setBezeled:NO];\n    [textField setBordered:NO];\n    [textField setAlignment:NSCenterTextAlignment];\n    [textField setBackgroundColor:[NSColor clearColor]];\n    [textField setFont:switchFont];\n    [textField setTextColor:switchFontColor];\n    [self addSubview:textField];\n  }\n  [self setNeedsDisplay:YES];\n}\n\n- (void)updateHidden:(BOOL)theHidden {\n  [self setHidden:theHidden];\n  [iconView setAlphaValue:(hidden ? HIDDEN_ALPHA : SHOWN_ALPHA)];\n  [self setNeedsDisplay:YES];\n}\n\n- (void)updateQuitting:(BOOL)theQuitting {\n  [self setQuitting:theQuitting];\n  if (quitting) {\n    quittingView = [[SwitchAppQuittingOverlayView alloc] initWithFrame:NSMakeRect(0, 0, [self frame].size.width, [self frame].size.height)];\n    [self addSubview:quittingView];\n  } else {\n    [quittingView removeFromSuperview];\n  }\n  [self setNeedsDisplay:YES];\n}\n\n- (void)updateForceQuitting:(BOOL)theForceQuitting {\n  [self setForceQuitting:theForceQuitting];\n  if (forceQuitting) {\n    quittingView = [[SwitchAppQuittingOverlayView alloc] initWithFrame:NSMakeRect(0, 0, [self frame].size.width, [self frame].size.height)];\n    [quittingView setForce:YES];\n    [self addSubview:quittingView];\n  } else {\n    [quittingView removeFromSuperview];\n  }\n  [self setNeedsDisplay:YES];\n}\n\n- (void)drawRect:(NSRect)dirtyRect {\n  NSColor *backgroundColor = [NSColor clearColor];\n  NSColor *borderColor = [NSColor clearColor];\n  if (selected) {\n    NSArray *bgColorArr = [[SlateConfig getInstance] getArrayConfig:SWITCH_SELECTED_BACKGROUND_COLOR];\n    if ([bgColorArr count] < 4) bgColorArr = [SWITCH_SELECTED_BACKGROUND_COLOR_DEFAULT componentsSeparatedByString:SEMICOLON];\n    backgroundColor = [NSColor colorWithDeviceRed:[[bgColorArr objectAtIndex:0] floatValue]/255.0\n                                                     green:[[bgColorArr objectAtIndex:1] floatValue]/255.0\n                                                      blue:[[bgColorArr objectAtIndex:2] floatValue]/255.0\n                                                     alpha:[[bgColorArr objectAtIndex:3] floatValue]];\n    NSArray *borderColorArr = [[SlateConfig getInstance] getArrayConfig:SWITCH_SELECTED_BORDER_COLOR];\n    if ([borderColorArr count] < 4) bgColorArr = [SWITCH_SELECTED_BORDER_COLOR_DEFAULT componentsSeparatedByString:SEMICOLON];\n    borderColor = [NSColor colorWithDeviceRed:[[borderColorArr objectAtIndex:0] floatValue]/255.0\n                                        green:[[borderColorArr objectAtIndex:1] floatValue]/255.0\n                                         blue:[[borderColorArr objectAtIndex:2] floatValue]/255.0\n                                        alpha:[[borderColorArr objectAtIndex:3] floatValue]];\n  }\n  float borderSize = [[SlateConfig getInstance] getFloatConfig:SWITCH_SELECTED_BORDER_SIZE];\n  float cornerSize = [[SlateConfig getInstance] getFloatConfig:SWITCH_ROUNDED_CORNER_SIZE];\n  [[NSGraphicsContext currentContext] saveGraphicsState];\n  [[NSGraphicsContext currentContext] setShouldAntialias:YES];\n  if (borderSize > 0 && selected) {\n    [backgroundColor set];\n    [NSBezierPath setDefaultLineWidth:1.0];\n    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:NSMakeRect([self bounds].origin.x+borderSize/2,\n                                                                            [self bounds].origin.y+borderSize/2,\n                                                                            [self bounds].size.width-borderSize,\n                                                                            [self bounds].size.height-borderSize)\n                                                         xRadius:cornerSize\n                                                         yRadius:cornerSize];\n    [path fill];\n    [borderColor set];\n    [NSBezierPath setDefaultLineWidth:borderSize];\n    path = [NSBezierPath bezierPathWithRoundedRect:NSMakeRect([self bounds].origin.x+borderSize/2,\n                                                                            [self bounds].origin.y+borderSize/2,\n                                                                            [self bounds].size.width-borderSize,\n                                                                            [self bounds].size.height-borderSize)\n                                                         xRadius:cornerSize\n                                                         yRadius:cornerSize];\n    [path stroke];\n  } else {\n    [backgroundColor set];\n    [NSBezierPath setDefaultLineWidth:1.0];\n    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:[self bounds] xRadius:cornerSize yRadius:cornerSize];\n    [path fill];\n  }\n  /*if (borderSize > 0 && selected) {\n    [borderColor set];\n    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:[self bounds] xRadius:cornerSize yRadius:cornerSize];\n    [path fill];\n    [backgroundColor set];\n    path = [NSBezierPath bezierPathWithRoundedRect:NSMakeRect([self bounds].origin.x+borderSize,\n                                                                            [self bounds].origin.y+borderSize,\n                                                                            [self bounds].size.width-borderSize*2,\n                                                                            [self bounds].size.height-borderSize*2)\n                                           xRadius:cornerSize\n                                           yRadius:cornerSize];\n    [path fill];\n  } else {\n    [backgroundColor set];\n    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:[self bounds] xRadius:cornerSize yRadius:cornerSize];\n    [path fill];\n  }*/\n  [[NSGraphicsContext currentContext] restoreGraphicsState];\n}\n\n@end\n"
  },
  {
    "path": "Slate/SwitchOperation.h",
    "content": "//\n//  SwitchOperation.h\n//  Slate\n//\n//  Created by Jigish Patel on 3/9/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"Operation.h\"\n#import <Carbon/Carbon.h>\n\n@interface SwitchOperation : Operation {\n  NSMutableArray *switchers;\n  NSMutableArray *switchersToViews;\n  UInt32 modifiers;\n  UInt32 backKeyCode;\n  EventHotKeyRef backHotKeyRef;\n  UInt32 quitKeyCode;\n  EventHotKeyRef quitHotKeyRef;\n  UInt32 fquitKeyCode;\n  EventHotKeyRef fquitHotKeyRef;\n  UInt32 hideKeyCode;\n  EventHotKeyRef hideHotKeyRef;\n}\n\n@property (assign) UInt32 modifiers;\n\n- (void)activateSwitchKey:(EventHotKeyID)key isRepeat:(BOOL)isRepeat;\n- (BOOL)modifiersChanged:(UInt32)was new:(UInt32)new;\n\n+ (id)switchOperation;\n+ (id)switchOperationFromString:(NSString *)switchOperation;\n\n@end\n"
  },
  {
    "path": "Slate/SwitchOperation.m",
    "content": "//\n//  SwitchOperation.m\n//  Slate\n//\n//  Created by Jigish Patel on 3/9/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"SwitchOperation.h\"\n#import \"SwitchWindow.h\"\n#import \"SwitchView.h\"\n#import \"SwitchAppView.h\"\n#import \"SlateLogger.h\"\n#import \"SlateConfig.h\"\n#import \"Constants.h\"\n#import \"RunningApplications.h\"\n#import \"Binding.h\"\n#import \"StringTokenizer.h\"\n\n@interface SwitchOperation() {\n  NSArray *apps;\n  NSMutableArray *appsToQuit;\n  NSMutableArray *appsToForceQuit;\n  NSInteger currentApp;\n}\n@end\n\n@implementation SwitchOperation\n\nstatic const NSString *DEFAULT_BACK_KEY = @\"`\";\nstatic const NSString *DEFAULT_QUIT_KEY = @\"q\";\nstatic const NSString *DEFAULT_FQUIT_KEY = @\"f\";\nstatic const NSString *DEFAULT_HIDE_KEY = @\"h\";\n\n@synthesize modifiers;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    backKeyCode = [[[Binding asciiToCodeDict] objectForKey:DEFAULT_BACK_KEY] unsignedIntValue];\n    quitKeyCode = [[[Binding asciiToCodeDict] objectForKey:DEFAULT_QUIT_KEY] unsignedIntValue];\n    fquitKeyCode = [[[Binding asciiToCodeDict] objectForKey:DEFAULT_FQUIT_KEY] unsignedIntValue];\n    hideKeyCode = [[[Binding asciiToCodeDict] objectForKey:DEFAULT_HIDE_KEY] unsignedIntValue];\n    appsToQuit = [NSMutableArray array];\n    appsToForceQuit = [NSMutableArray array];\n    apps = nil;\n    currentApp = -1;\n    switchers = [NSMutableArray array];\n    switchersToViews = [NSMutableArray array];\n  }\n  return self;\n}\n\n- (id)initWithOptions:(NSString *)_options {\n  self = [super init];\n  if (self) {\n    backKeyCode = [[[Binding asciiToCodeDict] objectForKey:DEFAULT_BACK_KEY] unsignedIntValue];\n    quitKeyCode = [[[Binding asciiToCodeDict] objectForKey:DEFAULT_QUIT_KEY] unsignedIntValue];\n    fquitKeyCode = [[[Binding asciiToCodeDict] objectForKey:DEFAULT_FQUIT_KEY] unsignedIntValue];\n    hideKeyCode = [[[Binding asciiToCodeDict] objectForKey:DEFAULT_HIDE_KEY] unsignedIntValue];\n    NSMutableArray *optionsArr = [NSMutableArray array];\n    [StringTokenizer tokenize:_options into:optionsArr];\n    for (NSString *option in optionsArr) {\n      NSArray *optionTokens = [option componentsSeparatedByString:COLON];\n      if ([optionTokens count] != 2) continue;\n      NSString *keyName = [optionTokens objectAtIndex:0];\n      NSString *keyValue = [optionTokens objectAtIndex:1];\n      NSNumber *keyCode = [[Binding asciiToCodeDict] objectForKey:keyValue];\n      if (keyCode == nil) continue;\n      if ([keyName isEqualToString:BACK]) {\n        backKeyCode = [keyCode unsignedIntValue];\n      } else if ([keyName isEqualToString:QUIT]) {\n        quitKeyCode = [keyCode unsignedIntValue];\n      } else if ([keyName isEqualToString:FORCE_QUIT]) {\n        fquitKeyCode = [keyCode unsignedIntValue];\n      } else if ([keyName isEqualToString:HIDE]) {\n        hideKeyCode = [keyCode unsignedIntValue];\n      }\n    }\n    appsToQuit = [NSMutableArray array];\n    appsToForceQuit = [NSMutableArray array];\n    apps = nil;\n    currentApp = -1;\n    switchers = [NSMutableArray array];\n    switchersToViews = [NSMutableArray array];\n  }\n  return self;\n}\n\n- (BOOL)doOperation {\n  SlateLogger(@\"----------------- Begin Switch Operation -----------------\");\n  ScreenWrapper *sw = [[ScreenWrapper alloc] init];\n  BOOL success = [self doOperationWithAccessibilityWrapper:nil screenWrapper:sw];\n  SlateLogger(@\"-----------------  End Switch Operation  -----------------\");\n  return success;\n}\n\n- (BOOL)doOperationWithAccessibilityWrapper:(AccessibilityWrapper *)aw screenWrapper:(ScreenWrapper *)sw {\n  [self evalOptionsWithAccessibilityWrapper:aw screenWrapper:sw];\n  apps = [NSArray arrayWithArray:[[RunningApplications getInstance] apps]];\n  for (NSRunningApplication *app in apps) {\n    [appsToQuit addObject:[NSNumber numberWithBool:NO]];\n    [appsToForceQuit addObject:[NSNumber numberWithBool:NO]];\n  }\n  float iconSize = [[SlateConfig getInstance] getFloatConfig:SWITCH_ICON_SIZE];\n  float iconPadding = [[SlateConfig getInstance] getFloatConfig:SWITCH_ICON_PADDING];\n  float iconViewSize = iconSize + 2*iconPadding;\n  float selectedPadding = [[SlateConfig getInstance] getFloatConfig:SWITCH_SELECTED_PADDING];\n  NSInteger switcherId = 0;\n  BOOL showTitle = [[SlateConfig getInstance] getBoolConfig:SWITCH_SHOW_TITLES];\n  float titleHeight = 0;\n  float titleWidth = 0;\n  if (showTitle) {\n    NSString *testString = @\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:[NSFont fontWithName:[[SlateConfig getInstance] getConfig:SWITCH_FONT_NAME]\n                                                                                          size:[[SlateConfig getInstance] getFloatConfig:SWITCH_FONT_SIZE]],\n                                                                          NSFontAttributeName, nil];\n    NSSize size = [testString sizeWithAttributes:attributes];\n    titleHeight = size.height + iconPadding;\n    if ([[[SlateConfig getInstance] getConfig:SWITCH_ORIENTATION] isEqualToString:SWITCH_ORIENTATION_VERTICAL]) {\n      // loop through all apps and check size to set title width\n      for (NSRunningApplication *app in apps) {\n        size = [[app localizedName] sizeWithAttributes:attributes];\n        if (titleWidth < size.width) titleWidth = size.width;\n        if (titleHeight < size.height) titleHeight = size.height;\n      }\n    }\n  }\n  for (NSScreen *screen in [sw screens]) {\n    NSRect frame;\n    if ([[[SlateConfig getInstance] getConfig:SWITCH_ORIENTATION] isEqualToString:SWITCH_ORIENTATION_VERTICAL]) {\n      frame = NSMakeRect([screen frame].size.width/2 - (iconViewSize + titleWidth)/2 - selectedPadding,\n                         [screen frame].size.height/2 - ([apps count]*iconViewSize)/2 - selectedPadding,\n                         iconViewSize + titleWidth + selectedPadding*2,\n                         [apps count]*iconViewSize + selectedPadding*2);\n    } else {\n      frame = NSMakeRect([screen frame].size.width/2 - ([apps count]*iconViewSize)/2 - selectedPadding,\n                         [screen frame].size.height/2 - (iconViewSize + titleHeight)/2 - selectedPadding,\n                         [apps count]*iconViewSize + selectedPadding*2,\n                         iconViewSize + titleHeight + selectedPadding*2);\n    }\n    NSWindow *window = [[SwitchWindow alloc] initWithContentRect:frame\n                                                       styleMask:NSBorderlessWindowMask\n                                                         backing:NSBackingStoreBuffered\n                                                           defer:NO\n                                                          screen:screen];\n    [window setReleasedWhenClosed:NO];\n    [window setOpaque:NO];\n    [window setBackgroundColor:[NSColor colorWithDeviceRed:0.0 green:0.0 blue:0.0 alpha:0.0]];\n    [window makeKeyAndOrderFront:NSApp];\n    [window setLevel:(NSScreenSaverWindowLevel - 1)];\n    SwitchView *view = [[SwitchView alloc] initWithFrame:frame];\n    [window setContentView:view];\n    NSWindowController *wc = [[NSWindowController alloc] initWithWindow:window];\n    [switchers addObject:wc];\n    [switchersToViews addObject:[NSMutableArray array]];\n    NSInteger i = 0;\n    for (NSRunningApplication *app in apps) {\n      SwitchAppView *appView;\n      if ([[[SlateConfig getInstance] getConfig:SWITCH_ORIENTATION] isEqualToString:SWITCH_ORIENTATION_VERTICAL]) {\n        appView = [[SwitchAppView alloc] initWithFrame:NSMakeRect(selectedPadding, ([apps count] - i - 1)*iconViewSize + selectedPadding, iconViewSize + titleWidth, iconViewSize)];\n      } else {\n        appView = [[SwitchAppView alloc] initWithFrame:NSMakeRect(i*iconViewSize + selectedPadding, selectedPadding, iconViewSize, iconViewSize + titleHeight)];\n      }\n      [appView updateApp:app];\n      [(NSView *)[[wc window] contentView] addSubview:appView];\n      [[switchersToViews objectAtIndex:switcherId] addObject:appView];\n      i++;\n    }\n    currentApp = [apps count] > 0 ? 1 : 0;\n    [[[switchersToViews objectAtIndex:switcherId] objectAtIndex:currentApp] setSelected:YES];\n    switcherId++;\n  }\n  EventHotKeyID backHotKeyID;\n  backHotKeyID.signature = *[@\"switchKeyBack\" cStringUsingEncoding:NSASCIIStringEncoding];\n  backHotKeyID.id = 1000;\n  RegisterEventHotKey(backKeyCode, modifiers, backHotKeyID, GetEventMonitorTarget(), 0, &backHotKeyRef);\n  EventHotKeyID quitHotKeyID;\n  quitHotKeyID.signature = *[@\"switchKeyQuit\" cStringUsingEncoding:NSASCIIStringEncoding];\n  quitHotKeyID.id = 1001;\n  RegisterEventHotKey(quitKeyCode, modifiers, quitHotKeyID, GetEventMonitorTarget(), 0, &quitHotKeyRef);\n  EventHotKeyID fquitHotKeyID;\n  fquitHotKeyID.signature = *[@\"switchKeyFQuit\" cStringUsingEncoding:NSASCIIStringEncoding];\n  fquitHotKeyID.id = 1002;\n  RegisterEventHotKey(fquitKeyCode, modifiers, fquitHotKeyID, GetEventMonitorTarget(), 0, &fquitHotKeyRef);\n  EventHotKeyID hideHotKeyID;\n  hideHotKeyID.signature = *[@\"switchKeyHide\" cStringUsingEncoding:NSASCIIStringEncoding];\n  hideHotKeyID.id = 1003;\n  RegisterEventHotKey(hideKeyCode, modifiers, hideHotKeyID, GetEventMonitorTarget(), 0, &hideHotKeyRef);\n  return YES;\n}\n\n- (BOOL)testOperation {\n  return YES;\n}\n\n- (void)activateSwitchKey:(EventHotKeyID)key isRepeat:(BOOL)isRepeat {\n  SlateLogger(@\"Activate Switch Key\");\n  NSInteger selectedApp = currentApp+1;\n  if (key.id == 1000) {\n    selectedApp = currentApp == 0 ? (isRepeat && [[SlateConfig getInstance] getBoolConfig:SWITCH_STOP_REPEAT_AT_EDGE] ? 0 : [apps count] - 1) : currentApp - 1;\n    SlateLogger(@\"  Back: %ld\",selectedApp);\n  } else if (key.id == 1001) {\n    if (isRepeat) return;\n    SlateLogger(@\"  Quit: %ld\",currentApp);\n    if ([[appsToForceQuit objectAtIndex:currentApp] boolValue]) {\n      [appsToForceQuit replaceObjectAtIndex:currentApp withObject:[NSNumber numberWithBool:NO]];\n      for (NSInteger switcherId = 0; switcherId < [switchers count]; switcherId++) {\n        [[[switchersToViews objectAtIndex:switcherId] objectAtIndex:currentApp] updateForceQuitting:NO];\n      }\n    }\n    [appsToQuit replaceObjectAtIndex:currentApp withObject:[NSNumber numberWithBool:![[appsToQuit objectAtIndex:currentApp] boolValue]]];\n    for (NSInteger switcherId = 0; switcherId < [switchers count]; switcherId++) {\n      [[[switchersToViews objectAtIndex:switcherId] objectAtIndex:currentApp] updateQuitting:[[appsToQuit objectAtIndex:currentApp] boolValue]];\n    }\n    return;\n  } else if (key.id == 1002) {\n    if (isRepeat) return;\n    SlateLogger(@\"  Force Quit: %ld\",currentApp);\n    if ([[appsToQuit objectAtIndex:currentApp] boolValue]) {\n      [appsToQuit replaceObjectAtIndex:currentApp withObject:[NSNumber numberWithBool:NO]];\n      for (NSInteger switcherId = 0; switcherId < [switchers count]; switcherId++) {\n        [[[switchersToViews objectAtIndex:switcherId] objectAtIndex:currentApp] updateQuitting:NO];\n      }\n    }\n    [appsToForceQuit replaceObjectAtIndex:currentApp withObject:[NSNumber numberWithBool:![[appsToForceQuit objectAtIndex:currentApp] boolValue]]];\n    for (NSInteger switcherId = 0; switcherId < [switchers count]; switcherId++) {\n      [[[switchersToViews objectAtIndex:switcherId] objectAtIndex:currentApp] updateForceQuitting:[[appsToForceQuit objectAtIndex:currentApp] boolValue]];\n    }\n    return;\n  } else if (key.id == 1003) {\n    if (isRepeat) return;\n    NSRunningApplication *cApp = [apps objectAtIndex:currentApp];\n    if ([cApp isHidden]) {\n       SlateLogger(@\"  UnHide: %ld\",currentApp);\n      if ([[SlateConfig getInstance] getBoolConfig:SWITCH_ONLY_FOCUS_MAIN_WINDOW]) {\n        [AccessibilityWrapper focusMainWindow:cApp];\n      } else {\n        [AccessibilityWrapper focusApp:cApp];\n      }\n      for (NSInteger switcherId = 0; switcherId < [switchers count]; switcherId++) {\n        [[[switchersToViews objectAtIndex:switcherId] objectAtIndex:currentApp] updateHidden:NO];\n      }\n    } else {\n       SlateLogger(@\"  Hide: %ld\",currentApp);\n      [cApp hide];\n      for (NSInteger switcherId = 0; switcherId < [switchers count]; switcherId++) {\n        [[[switchersToViews objectAtIndex:switcherId] objectAtIndex:currentApp] updateHidden:YES];\n      }\n    }\n    return;\n  } else if (selectedApp >= [apps count]) {\n    selectedApp = isRepeat && [[SlateConfig getInstance] getBoolConfig:SWITCH_STOP_REPEAT_AT_EDGE] ? [apps count] - 1 : 0;\n  }\n  for (NSInteger switcherId = 0; switcherId < [switchers count]; switcherId++) {\n    SlateLogger(@\"SELECTING %ld,%ld,%ld\",switcherId,currentApp,selectedApp);\n    [[[switchersToViews objectAtIndex:switcherId] objectAtIndex:currentApp] updateSelected:NO];\n    [[[switchersToViews objectAtIndex:switcherId] objectAtIndex:selectedApp] updateSelected:YES];\n  }\n  currentApp = selectedApp;\n}\n\n- (BOOL)modifiersChanged:(UInt32)was new:(UInt32)new {\n  if (was != new) {\n    [self killSwitchers];\n    if ([[apps objectAtIndex:currentApp] isHidden]) { [[apps objectAtIndex:currentApp] unhide]; }\n    if ([[SlateConfig getInstance] getBoolConfig:SWITCH_ONLY_FOCUS_MAIN_WINDOW]) {\n      [AccessibilityWrapper focusMainWindow:[apps objectAtIndex:currentApp]];\n    } else {\n      [AccessibilityWrapper focusApp:[apps objectAtIndex:currentApp]];\n    }\n    return YES;\n  }\n  return NO;\n}\n\n- (void)killSwitchers {\n  for (NSWindowController *controller in switchers) {\n    [controller close];\n  }\n  for (NSMutableArray *views in switchersToViews) {\n    for (NSView *view in views) {\n      [view removeFromSuperview];\n    }\n    [views removeAllObjects];\n  }\n  UnregisterEventHotKey(backHotKeyRef);\n  UnregisterEventHotKey(quitHotKeyRef);\n  UnregisterEventHotKey(fquitHotKeyRef);\n  UnregisterEventHotKey(hideHotKeyRef);\n  NSInteger i = 0;\n  for (NSNumber *appToQuit in appsToQuit) {\n    if ([appToQuit boolValue]) {\n      SlateLogger(@\"Quitting: '%@'\",[[apps objectAtIndex:i] localizedName]);\n      [(NSRunningApplication *)[apps objectAtIndex:i] terminate];\n    }\n    i++;\n  }\n  [appsToQuit removeAllObjects];\n  i = 0;\n  for (NSNumber *appToForceQuit in appsToForceQuit) {\n    if ([appToForceQuit boolValue]) {\n      SlateLogger(@\"Force Quitting: '%@'\",[[apps objectAtIndex:i] localizedName]);\n      [(NSRunningApplication *)[apps objectAtIndex:i] forceTerminate];\n    }\n    i++;\n  }\n  [appsToForceQuit removeAllObjects];\n  [switchers removeAllObjects];\n  [switchersToViews removeAllObjects];\n}\n\n- (void)parseOption:(NSString *)name value:(id)value {\n  if (value == nil) { return; }\n  if (![value isKindOfClass:[NSString class]]) {\n    @throw([NSException exceptionWithName:[NSString stringWithFormat:@\"Invalid %@\", name] reason:[NSString stringWithFormat:@\"Invalid %@ '%@'\", name, value] userInfo:nil]);\n  }\n  if ([name isEqualToString:OPT_BACK]) {\n    backKeyCode = [[[Binding asciiToCodeDict] objectForKey:value] unsignedIntValue];\n  } else if ([name isEqualToString:OPT_QUIT]) {\n    quitKeyCode = [[[Binding asciiToCodeDict] objectForKey:value] unsignedIntValue];\n  } else if ([name isEqualToString:OPT_FORCE_QUIT]) {\n    fquitKeyCode = [[[Binding asciiToCodeDict] objectForKey:value] unsignedIntValue];\n  } else if ([name isEqualToString:OPT_HIDE]) {\n    hideKeyCode = [[[Binding asciiToCodeDict] objectForKey:value] unsignedIntValue];\n  }\n}\n\n+ (id)switchOperation {\n  return [[SwitchOperation alloc] init];\n}\n\n+ (id)switchOperationFromString:(NSString *)switchOperation {\n  // switch option+\n  // options:\n  //   back:[key code]\n  //   quit:[key code]\n  //   force-quit:[key code]\n  //   hide:[key code]\n  NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n  [StringTokenizer tokenize:switchOperation into:tokens maxTokens:2];\n  Operation *op = nil;\n  if ([tokens count] > 1) {\n    op = [[SwitchOperation alloc] initWithOptions:[tokens objectAtIndex:1]];\n  } else {\n    op = [[SwitchOperation alloc] init];\n  }\n  return op;\n}\n\n@end\n"
  },
  {
    "path": "Slate/SwitchView.h",
    "content": "//\n//  SwitchView.h\n//  Slate\n//\n//  Created by Jigish Patel on 3/9/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import <Cocoa/Cocoa.h>\n\n@interface SwitchView : NSView\n\n@end\n"
  },
  {
    "path": "Slate/SwitchView.m",
    "content": "//\n//  SwitchView.m\n//  Slate\n//\n//  Created by Jigish Patel on 3/9/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"SwitchView.h\"\n#import \"SlateConfig.h\"\n#import \"Constants.h\"\n\n@implementation SwitchView\n\n- (id)initWithFrame:(NSRect)frame {\n  self = [super initWithFrame:frame];\n  if (self) [self setWantsLayer:YES];\n  return self;\n}\n\n- (void)drawRect:(NSRect)dirtyRect {\n  NSArray *bgColorArr = [[SlateConfig getInstance] getArrayConfig:SWITCH_BACKGROUND_COLOR];\n  if ([bgColorArr count] < 4) bgColorArr = [SWITCH_BACKGROUND_COLOR_DEFAULT componentsSeparatedByString:SEMICOLON];\n  NSColor *backgroundColor = [NSColor colorWithDeviceRed:[[bgColorArr objectAtIndex:0] floatValue]/255.0\n                                                   green:[[bgColorArr objectAtIndex:1] floatValue]/255.0\n                                                    blue:[[bgColorArr objectAtIndex:2] floatValue]/255.0\n                                                   alpha:[[bgColorArr objectAtIndex:3] floatValue]];\n  [backgroundColor set];\n  float cornerSize = [[SlateConfig getInstance] getFloatConfig:SWITCH_ROUNDED_CORNER_SIZE];\n  NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:[self bounds] xRadius:cornerSize yRadius:cornerSize];\n  [path fill];\n}\n\n@end\n"
  },
  {
    "path": "Slate/SwitchWindow.h",
    "content": "//\n//  SwitchWindow.h\n//  Slate\n//\n//  Created by Jigish Patel on 3/9/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import <Cocoa/Cocoa.h>\n\n@interface SwitchWindow : NSWindow\n\n@end\n"
  },
  {
    "path": "Slate/SwitchWindow.m",
    "content": "//\n//  SwitchWindow.m\n//  Slate\n//\n//  Created by Jigish Patel on 3/9/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"SwitchWindow.h\"\n\n@implementation SwitchWindow\n\n- (BOOL)canBecomeKeyWindow {\n  return YES;\n}\n\n@end\n"
  },
  {
    "path": "Slate/ThrowOperation.h",
    "content": "//\n//  ThrowOperation.h\n//  Slate\n//\n//  Created by Jigish Patel on 1/20/13.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"MoveOperation.h\"\n\n@interface ThrowOperation : MoveOperation\n\n+ (id)throwOperation;\n+ (id)throwOperationFromString:(NSString *)throwOperation;\n\n@end\n"
  },
  {
    "path": "Slate/ThrowOperation.m",
    "content": "//\n//  ThrowOperation.m\n//  Slate\n//\n//  Created by Jigish Patel on 1/20/13.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"ThrowOperation.h\"\n#import \"Constants.h\"\n#import \"StringTokenizer.h\"\n#import \"SlateLogger.h\"\n\n@implementation ThrowOperation\n\n- (NSArray *)requiredOptions {\n  return [NSArray arrayWithObjects:OPT_SCREEN, nil];\n}\n\n- (void)beforeInitOptions {\n  // throw is basically an alias for move with some reasonable defaults for x, y, width, and height\n  [self setTopLeft:[[ExpressionPoint alloc] initWithX:@\"screenOriginX\" y:@\"screenOriginY\"]];\n  [self setDimensions:[[ExpressionPoint alloc] initWithX:@\"windowSizeX\" y:@\"windowSizeY\"]];\n}\n\n+ (id)throwOperation {\n  return [[ThrowOperation alloc] init];\n}\n\n+ (id)throwOperationFromString:(NSString *)throwOperation {\n  // throw <monitor> <optional:style (default is noresize)>\n  NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n  [StringTokenizer tokenize:throwOperation into:tokens];\n\n  if ([tokens count] < 2) {\n    SlateLogger(@\"ERROR: Invalid Parameters '%@'\", throwOperation);\n    @throw([NSException exceptionWithName:@\"Invalid Parameters\" reason:[NSString stringWithFormat:@\"Invalid Parameters in '%@'. Throw operations require the following format: 'throw screen [optional:style]'\", throwOperation] userInfo:nil]);\n  }\n\n  NSString *tl = @\"screenOriginX;screenOriginY\";\n  NSString *dim = @\"windowSizeX;windowSizeY\";\n  if ([tokens count] >= 3) {\n    NSString *style = [tokens objectAtIndex:2];\n    if ([style isEqualToString:RESIZE]) {\n      tl = @\"screenOriginX;screenOriginY\";\n      dim = @\"screenSizeX;screenSizeY\";\n    } else if ([style hasPrefix:RESIZE_WITH_VALUE]) {\n      tl = @\"screenOriginX;screenOriginY\";\n      dim = [[style componentsSeparatedByString:COLON] objectAtIndex:1];\n    } else if ([style isEqualToString:NORESIZE]) {\n      // do nothing\n    } else {\n      SlateLogger(@\"ERROR: Unrecognized style '%@'\", style);\n      @throw([NSException exceptionWithName:@\"Unrecognized Style\" reason:[NSString stringWithFormat:@\"Unrecognized style '%@' in '%@'\", style, throwOperation] userInfo:nil]);\n    }\n  }\n  Operation *op = [[MoveOperation alloc] initWithTopLeft:tl dimensions:dim monitor:[tokens objectAtIndex:1]];\n  return op;\n}\n\n@end\n"
  },
  {
    "path": "Slate/UndoOperation.h",
    "content": "//\n//  UndoOperation.h\n//  Slate\n//\n//  Created by Jigish Patel on 11/27/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"ActivateSnapshotOperation.h\"\n\n@interface UndoOperation : ActivateSnapshotOperation\n\n+ (id)undoOperation;\n+ (id)undoOperationFromString:(NSString *)unused;\n\n@end\n"
  },
  {
    "path": "Slate/UndoOperation.m",
    "content": "//\n//  UndoOperation.m\n//  Slate\n//\n//  Created by Jigish Patel on 11/27/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"UndoOperation.h\"\n#import \"Constants.h\"\n#import \"SlateAppDelegate.h\"\n\n@implementation UndoOperation\n\n- (NSArray *)requiredOptions {\n  return [NSArray array];\n}\n\n+ (id)undoOperation {\n  [(SlateAppDelegate *)[NSApp delegate] setHasUndoOperation:YES];\n  return [[UndoOperation alloc] initWithName:UNDO_SNAPSHOT options:DELETE];\n}\n\n+ (id)undoOperationFromString:(NSString *)unused {\n  return [UndoOperation undoOperation];\n}\n\n@end\n"
  },
  {
    "path": "Slate/VisibilityOperation.h",
    "content": "//\n//  VisibilityOperation.h\n//  Slate\n//\n//  Created by Jigish Patel on 10/7/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"Operation.h\"\n\ntypedef enum {\n  VisibilityOperationTypeUnknown,\n  VisibilityOperationTypeShow,\n  VisibilityOperationTypeHide,\n  VisibilityOperationTypeToggle\n} VisibilityOperationType;\n\n@interface VisibilityOperation : Operation {\n@private\n  VisibilityOperationType type;\n  NSArray *apps;\n}\n\n@property (assign) VisibilityOperationType type;\n@property NSArray *apps;\n\n- (id)initWithType:(VisibilityOperationType)theType apps:(NSArray *)theApps;\n- (void)applyVisibilityToApp:(NSRunningApplication *)app;\n\n+ (id)visibilityOperation;\n+ (id)visibilityOperationFromString:(NSString *)visibilityOperation;\n\n@end\n"
  },
  {
    "path": "Slate/VisibilityOperation.m",
    "content": "//\n//  VisibilityOperation.m\n//  Slate\n//\n//  Created by Jigish Patel on 10/7/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"VisibilityOperation.h\"\n#import \"StringTokenizer.h\"\n#import \"SlateLogger.h\"\n#import \"Constants.h\"\n#import \"RunningApplications.h\"\n\n@implementation VisibilityOperation\n\n@synthesize type, apps;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n    [self setType:VisibilityOperationTypeUnknown];\n    [self setApps:nil];\n  }\n  return self;\n}\n\n- (id)initWithType:(VisibilityOperationType)theType apps:(NSArray *)theApps {\n  self = [super init];\n  if (self) {\n    [self setType:theType];\n    [self setApps:theApps];\n  }\n  return self;\n}\n\n- (BOOL)doOperation {\n  SlateLogger(@\"----------------- Begin Visibility Operation -----------------\");\n  // We don't use the passed in AccessibilityWrapper or ScreenWrapper so they are nil. No need to waste time creating them here.\n  BOOL success = [self doOperationWithAccessibilityWrapper:nil screenWrapper:nil];\n  SlateLogger(@\"-----------------  End Visibility Operation  -----------------\");\n  return success;\n}\n\n- (void)applyVisibilityToApp:(NSRunningApplication *)app {\n  if ([self type] == VisibilityOperationTypeShow) {\n    [app unhide];\n  } else if ([self type] == VisibilityOperationTypeHide) {\n    [app hide];\n  } else if ([self type] == VisibilityOperationTypeToggle) {\n    if ([app isHidden]) {\n      [app unhide];\n    } else {\n      [app hide];\n    }\n  }\n}\n\n- (BOOL)doOperationWithAccessibilityWrapper:(AccessibilityWrapper *)iamnil screenWrapper:(ScreenWrapper *)iamalsonil {\n  [self evalOptionsWithAccessibilityWrapper:iamnil screenWrapper:iamalsonil];\n  for (NSString *appName in [self apps]) {\n    NSRunningApplication *app = nil;\n    if ([CURRENT isEqualToString:appName]) {\n      app = [RunningApplications focusedApp];\n    } else if ([ALL isEqualToString:appName]) {\n      // run through ALL THE APPS\n      for (NSRunningApplication *theApp in [RunningApplications getInstance]) {\n        [self applyVisibilityToApp:theApp];\n      }\n      continue;\n    } else if ([appName hasPrefix:ALL_BUT]) {\n      NSString *skipApp = [StringTokenizer removeQuotes:[appName stringByReplacingOccurrencesOfString:ALL_BUT withString:EMPTY] quoteChars:[NSCharacterSet characterSetWithCharactersInString:QUOTES]];\n      // run through ALL THE APPS\n      if ([skipApp isEqualToString:CURRENT]) {\n        skipApp = [[RunningApplications focusedApp] localizedName];\n      }\n      for (NSRunningApplication *theApp in [RunningApplications getInstance]) {\n        if ([skipApp isEqualToString:[theApp localizedName]]) continue;\n        [self applyVisibilityToApp:theApp];\n      }\n      continue;\n    } else {\n      app = [[[RunningApplications getInstance] appNameToApp] objectForKey:appName];\n    }\n    [self applyVisibilityToApp:app];\n  }\n  return YES;\n}\n\n- (BOOL)testOperation {\n  if ([self type] == VisibilityOperationTypeUnknown)\n    @throw [NSException exceptionWithName:@\"Unknown Type\" reason:@\"type\" userInfo:nil];\n  return YES;\n}\n\n- (void)beforeInitOptions {\n  if ([SHOW isEqualToString:[self opName]]) {\n    [self setType:VisibilityOperationTypeShow];\n  } else if ([HIDE isEqualToString:[self opName]]) {\n    [self setType:VisibilityOperationTypeHide];\n  } else if ([TOGGLE isEqualToString:[self opName]]) {\n    [self setType:VisibilityOperationTypeToggle];\n  } else {\n    // should never happen\n    @throw([NSException exceptionWithName:@\"Invalid Type\" reason:[NSString stringWithFormat:@\"Invalid visibility type '%@'\", [self opName]] userInfo:nil]);\n  }\n}\n\n- (void)parseOption:(NSString *)name value:(id)value {\n  if (value == nil) { return; }\n  if ([name isEqualToString:OPT_APP]) {\n    if ([value isKindOfClass:[NSString class]]) {\n      [self setApps:[NSArray arrayWithObject:value]];\n    } else if ([value isKindOfClass:[NSArray class]]) {\n      [self setApps:value];\n    } else { // app should be a string or an array\n      @throw([NSException exceptionWithName:[NSString stringWithFormat:@\"Invalid %@\", name] reason:[NSString stringWithFormat:@\"Invalid %@ '%@'\", name, value] userInfo:nil]);\n    }\n  }\n}\n\n+ (id)visibilityOperation {\n  return [[VisibilityOperation alloc] init];\n}\n\n+ (id)visibilityOperationFromString:(NSString *)visibilityOperation {\n  // hide|show|toggle apps\n  NSMutableArray *tokens = [[NSMutableArray alloc] initWithCapacity:10];\n  [StringTokenizer tokenize:visibilityOperation into:tokens maxTokens:2];\n\n  if ([tokens count] < 2) {\n    SlateLogger(@\"ERROR: Invalid Parameters '%@'\", visibilityOperation);\n    @throw([NSException exceptionWithName:@\"Invalid Parameters\" reason:[NSString stringWithFormat:@\"Invalid Parameters in '%@'. Visibility operations require the following format: 'hide|show|toggle apps'\", visibilityOperation] userInfo:nil]);\n  }\n\n  VisibilityOperationType theType = VisibilityOperationTypeUnknown;\n  NSString *typeStr = [tokens objectAtIndex:0];\n  if ([SHOW isEqualToString:typeStr]) {\n    theType = VisibilityOperationTypeShow;\n  } else if ([HIDE isEqualToString:typeStr]) {\n    theType = VisibilityOperationTypeHide;\n  } else if ([TOGGLE isEqualToString:typeStr]) {\n    theType = VisibilityOperationTypeToggle;\n  }\n\n  NSString *appsStr = [tokens objectAtIndex:1];\n  NSArray *appsArrayWithQuotes = [appsStr componentsSeparatedByString:COMMA];\n  NSMutableArray *appsArray = [NSMutableArray array];\n  for (NSString *appWithQuotes in appsArrayWithQuotes) {\n    [appsArray addObject:[StringTokenizer removeQuotes:appWithQuotes quoteChars:[NSCharacterSet characterSetWithCharactersInString:QUOTES]]];\n  }\n\n  Operation *op = [[VisibilityOperation alloc] initWithType:theType apps:appsArray];\n  return op;\n}\n\n@end\n"
  },
  {
    "path": "Slate/WindowInfoView.h",
    "content": "//\n//  WindowInfoView.h\n//  Slate\n//\n//  Created by Jigish Patel on 2/27/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import <Cocoa/Cocoa.h>\n\n@interface WindowInfoView : NSTextView {\n  NSDate *lastDraw;\n}\n- (void)genText;\n@end\n"
  },
  {
    "path": "Slate/WindowInfoView.m",
    "content": "//\n//  WindowInfoView.m\n//  Slate\n//\n//  Created by Jigish Patel on 2/27/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"WindowInfoView.h\"\n#import \"AccessibilityWrapper.h\"\n#import \"ScreenWrapper.h\"\n#import \"SlateLogger.h\"\n#import \"RunningApplications.h\"\n\n@implementation WindowInfoView\n\n- (id)initWithFrame:(NSRect)frame {\n  self = [super initWithFrame:frame];\n  if (self) {\n    [self setSelectable:YES];\n    [self genText];\n    lastDraw = [NSDate dateWithTimeIntervalSince1970:0];\n  }\n  return self;\n}\n\n- (void)viewWillDraw {\n  NSDate *now = [NSDate date];\n  if ([now timeIntervalSinceDate:lastDraw] < 5) { return; } // refresh every 5 seconds\n  lastDraw = now;\n  [self genText];\n}\n\n- (void)genText {\n  SlateLogger(@\"WindowInfoView gen text.\");\n  NSString *text = @\"----------------- Screens -----------------\\n\";\n  ScreenWrapper *sw = [[ScreenWrapper alloc] init];\n  NSMutableArray *resolutions = [NSMutableArray array];\n  [sw getScreenResolutionStrings:resolutions];\n  for (NSInteger i = 0; i < [resolutions count]; i++) {\n    text = [text stringByAppendingFormat:@\"Left To Right ID: %ld\\n  OS X ID: %ld\\n  Resolution: %@\\n\", [sw convertDefaultOrderToLeftToRightOrder:i], i, [resolutions objectAtIndex:i]];\n  }\n\n  text = [text stringByAppendingString:@\"\\n----------------- Windows -----------------\\n\" ];\n  for (NSRunningApplication *app in [RunningApplications getInstance]) {\n    NSString *appName = [app localizedName];\n    pid_t appPID = [app processIdentifier];\n    SlateLogger(@\"I see application '%@' with pid '%d'\", appName, appPID);\n    text = [text stringByAppendingFormat:@\"\\nApplication: %@\\n\", appName];\n    // Yes, I am aware that the following blocks are inefficient. Deal with it.\n    AXUIElementRef appRef = AXUIElementCreateApplication(appPID);\n    CFArrayRef windowsArrRef = [AccessibilityWrapper windowsInApp:appRef];\n    if (!windowsArrRef || CFArrayGetCount(windowsArrRef) == 0) continue;\n    CFMutableArrayRef windowsArr = CFArrayCreateMutableCopy(kCFAllocatorDefault, 0, windowsArrRef);\n    for (NSInteger i = 0; i < CFArrayGetCount(windowsArr); i++) {\n      SlateLogger(@\" Printing Window: %@\", [AccessibilityWrapper getTitle:CFArrayGetValueAtIndex(windowsArr, i)]);\n      NSString *title = [AccessibilityWrapper getTitle:CFArrayGetValueAtIndex(windowsArr, i)];\n      if ([title isEqualToString:@\"\"]) continue;\n      AccessibilityWrapper *aw = [[AccessibilityWrapper alloc] initWithApp:appRef window:CFArrayGetValueAtIndex(windowsArr, i)];\n      NSSize size = [aw getCurrentSize];\n      NSPoint badTL = [aw getCurrentTopLeft];\n      NSInteger badScreenID = [sw getScreenIdForRect:NSMakeRect(badTL.x, badTL.y, size.width, size.height)];\n      NSInteger screenID = [sw convertDefaultOrderToLeftToRightOrder:badScreenID];\n      NSPoint tl = [sw convertTopLeftToScreenRelative:badTL screen:badScreenID];\n      text = [text stringByAppendingFormat:@\"  Window: '%@'\\n    Screen ID (Left to Right): %ld\\n    Size: (%ld, %ld)\\n    Top Left: (screenOriginX+%ld, screenOriginY+%ld)\\n\", title, screenID, (NSInteger)size.width, (NSInteger)size.height, (NSInteger)tl.x, (NSInteger)tl.y];\n    }\n  }\n  [self setString:text];\n}\n\n@end\n"
  },
  {
    "path": "Slate/WindowSnapshot.h",
    "content": "//\n//  WindowSnapshot.h\n//  Slate\n//\n//  Created by Jigish Patel on 2/28/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n\n@interface WindowSnapshot : NSObject {\n@private\n  NSString *appName;\n  NSString *title;\n  NSPoint topLeft;\n  NSSize size;\n}\n\n@property  NSString *appName;\n@property  NSString *title;\n@property (assign) NSPoint topLeft;\n@property (assign) NSSize size;\n\n- (id)initWithAppName:(NSString *)theAppName title:(NSString *)theTitle topLeft:(NSPoint)theTopLeft size:(NSSize)theSize;\n- (NSDictionary *)toDictionary;\n+ (WindowSnapshot *)windowSnapshotFromDictionary:(NSDictionary *)dict;\n\n@end\n"
  },
  {
    "path": "Slate/WindowSnapshot.m",
    "content": "//\n//  WindowSnapshot.m\n//  Slate\n//\n//  Created by Jigish Patel on 2/28/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"WindowSnapshot.h\"\n#import \"Constants.h\"\n\n@implementation WindowSnapshot\n\n@synthesize appName, title, topLeft, size;\n\n- (id)init {\n  self = [super init];\n  return self;\n}\n\n- (id)initWithAppName:(NSString *)theAppName title:(NSString *)theTitle topLeft:(NSPoint)theTopLeft size:(NSSize)theSize {\n  self = [self init];\n  if (self) {\n    [self setAppName:theAppName];\n    [self setTitle:theTitle];\n    [self setTopLeft:theTopLeft];\n    [self setSize:theSize];\n  }\n  return self;\n}\n\n- (NSDictionary *)toDictionary {\n  return [NSDictionary dictionaryWithObjectsAndKeys:\n          appName, APP_NAME,\n          title, TITLE,\n          [NSNumber numberWithFloat:topLeft.x], X,\n          [NSNumber numberWithFloat:topLeft.y], Y,\n          [NSNumber numberWithFloat:size.width], WIDTH,\n          [NSNumber numberWithFloat:size.height], HEIGHT, nil];\n}\n\n+ (WindowSnapshot *)windowSnapshotFromDictionary:(NSDictionary *)dict {\n  return [[WindowSnapshot alloc] initWithAppName:[dict objectForKey:APP_NAME]\n                                           title:[dict objectForKey:TITLE]\n                                         topLeft:NSMakePoint([[dict objectForKey:X] floatValue], [[dict objectForKey:Y] floatValue])\n                                            size:NSMakeSize([[dict objectForKey:WIDTH] floatValue], [[dict objectForKey:HEIGHT] floatValue])];\n}\n\n\n@end\n"
  },
  {
    "path": "Slate/WindowState.h",
    "content": "//\n//  WindowState.h\n//  Slate\n//\n//  Created by Jigish Patel on 6/13/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <Foundation/Foundation.h>\n\n\n@interface WindowState : NSObject <NSCopying> {\n@private\n  pid_t appPID;\n  NSSize size;\n  NSPoint topLeft;\n}\n\n@property (assign) pid_t appPID;\n@property (assign) NSSize size;\n@property (assign) NSPoint topLeft;\n\n- (id)init:(AccessibilityWrapper *)aw;\n\n@end\n"
  },
  {
    "path": "Slate/WindowState.m",
    "content": "//\n//  WindowState.m\n//  Slate\n//\n//  Created by Jigish Patel on 6/13/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"AccessibilityWrapper.h\"\n#import \"WindowState.h\"\n\n\n@implementation WindowState\n\n@synthesize appPID;\n@synthesize size;\n@synthesize topLeft;\n\n- (id)init {\n  self = [super init];\n  if (self) {\n  }\n  return self;\n}\n\n- (id)init:(AccessibilityWrapper *)aw {\n  self = [self init];\n  if (self && [aw inited]) {\n    [self setAppPID:[AccessibilityWrapper processIdentifierOfUIElement:[aw window]]];\n    [self setSize:[aw getCurrentSize]];\n    [self setTopLeft:[aw getCurrentTopLeft]];\n  }\n  return self;\n}\n\n- (id)copyWithZone:(NSZone *)zone {\n  WindowState *other = [[WindowState alloc] init];\n  [other setAppPID:[self appPID]];\n  [other setSize:[self size]];\n  [other setTopLeft:[self topLeft]];\n  return other;\n}\n\n- (BOOL)isEqual:(NSObject *)other {\n  if ([other isKindOfClass:[WindowState class]]) {\n    return [(WindowState *)other appPID] == [self appPID] && NSEqualSizes([(WindowState *)other size],[self size]) && NSEqualPoints([(WindowState *)other topLeft], [self topLeft]);\n  }\n  return NO;\n}\n\n- (NSUInteger)hash {\n  NSUInteger prime = 31;\n  NSUInteger result = prime * 1 + [self appPID];\n  result = prime * result + [self size].width;\n  result = prime * result + [self size].height;\n  result = prime * result + [self topLeft].x;\n  result = prime * result + [self topLeft].y;\n  return result;\n}\n\n@end\n"
  },
  {
    "path": "Slate/default.slate",
    "content": "# This is the default .slate file.\n# If no ~/.slate file exists this is the file that will be used.\n\nconfig defaultToCurrentScreen true\nconfig nudgePercentOf screenSize\nconfig resizePercentOf screenSize\n\n# Resize Bindings\nbind right:alt       resize +10% +0\nbind left:alt        resize -10% +0\nbind up:alt          resize +0   -10%\nbind down:alt        resize +0   +10%\nbind right:ctrl;alt  resize -10% +0 bottom-right\nbind left:ctrl;alt   resize +10% +0 bottom-right\nbind up:ctrl;alt     resize +0   +10% bottom-right\nbind down:ctrl;alt   resize +0   -10% bottom-right\n\n# Push Bindings\nbind right:ctrl;cmd  push right bar-resize:screenSizeX/3\nbind left:ctrl;cmd   push left  bar-resize:screenSizeX/3\nbind up:ctrl;cmd     push up    bar-resize:screenSizeY/2\nbind down:ctrl;cmd   push down  bar-resize:screenSizeY/2\n\n# Nudge Bindings\nbind right:shift;alt nudge +10% +0\nbind left:shift;alt  nudge -10% +0\nbind up:shift;alt    nudge +0   -10%\nbind down:shift;alt  nudge +0   +10%\n\n# Throw Bindings\nbind 1:ctrl;alt         throw 0 resize\nbind 2:ctrl;alt         throw 1 resize\nbind 3:ctrl;alt         throw 2 resize\nbind right:ctrl;alt;cmd throw right resize\nbind left:ctrl;alt;cmd  throw left  resize\nbind up:ctrl;alt;cmd    throw up    resize\nbind down:ctrl;alt;cmd  throw down  resize\n\n# Focus Bindings\nbind right:cmd    focus right\nbind left:cmd     focus left\nbind up:cmd       focus up\nbind down:cmd     focus down\nbind up:cmd;alt   focus behind\nbind down:cmd;alt focus behind\n\n# Window Hints\nbind esc:cmd hint"
  },
  {
    "path": "Slate/en.lproj/Credits.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg1252\\cocoartf1138\\cocoasubrtf510\n{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}\n{\\colortbl;\\red255\\green255\\blue255;}\n\\vieww10800\\viewh8400\\viewkind0\n\\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx2800\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\n\n\\f0\\b\\fs24 \\cf0 Links\\\n\\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx2800\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\\pardirnatural\n{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/jigish/slate\"}}{\\fldrslt \n\\b0 \\cf0 Home Page}}\n\\b0 \\\n{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/jigish/slate/wiki/JavaScript-Configs\"}}{\\fldrslt JavaScript Configs}}\n\\b \\\n\\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx2800\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\n\\cf0 \\\nDevelopment\n\\b0 \\\nJigish Patel & {\\field{\\*\\fldinst{HYPERLINK \"https://github.com/jigish/slate/graphs/contributors\"}}{\\fldrslt Contributors\\\n\\\n}}\n\\b Utilising{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/jigish/slate/graphs/contributors\"}}{\\fldrslt \n\\b0 \\\nJSONKit\\\nSparkle}}\n\\b0 \\\n\\\n\n\\b Licensing\n\\b0 \\\nGPLv3 \\'a9 Jigish Patel 2011}"
  },
  {
    "path": "Slate/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "Slate/en.lproj/MainMenu.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<archive type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"7.10\">\n\t<data>\n\t\t<int key=\"IBDocument.SystemTarget\">1070</int>\n\t\t<string key=\"IBDocument.SystemVersion\">11E53</string>\n\t\t<string key=\"IBDocument.InterfaceBuilderVersion\">2182</string>\n\t\t<string key=\"IBDocument.AppKitVersion\">1138.47</string>\n\t\t<string key=\"IBDocument.HIToolboxVersion\">569.00</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginVersions\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t<string key=\"NS.object.0\">2182</string>\n\t\t</object>\n\t\t<object class=\"NSArray\" key=\"IBDocument.IntegratedClassDependencies\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<string>NSView</string>\n\t\t\t<string>NSMenu</string>\n\t\t\t<string>NSScrollView</string>\n\t\t\t<string>NSWindowTemplate</string>\n\t\t\t<string>NSMenuItem</string>\n\t\t\t<string>NSSplitView</string>\n\t\t\t<string>NSTextView</string>\n\t\t\t<string>NSCustomView</string>\n\t\t\t<string>NSUserDefaultsController</string>\n\t\t\t<string>NSScroller</string>\n\t\t\t<string>NSCustomObject</string>\n\t\t</object>\n\t\t<object class=\"NSArray\" key=\"IBDocument.PluginDependencies\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t</object>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.Metadata\">\n\t\t\t<string key=\"NS.key.0\">PluginDependencyRecalculationVersion</string>\n\t\t\t<integer value=\"1\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<object class=\"NSMutableArray\" key=\"IBDocument.RootObjects\" id=\"1048\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"NSCustomObject\" id=\"1021\">\n\t\t\t\t<string key=\"NSClassName\">NSApplication</string>\n\t\t\t</object>\n\t\t\t<object class=\"NSCustomObject\" id=\"1014\">\n\t\t\t\t<string key=\"NSClassName\">FirstResponder</string>\n\t\t\t</object>\n\t\t\t<object class=\"NSCustomObject\" id=\"1050\">\n\t\t\t\t<string key=\"NSClassName\">NSApplication</string>\n\t\t\t</object>\n\t\t\t<object class=\"NSMenu\" id=\"649796088\">\n\t\t\t\t<string key=\"NSTitle\">AMainMenu</string>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<object class=\"NSMenuItem\" id=\"694149608\">\n\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"649796088\"/>\n\t\t\t\t\t\t<string key=\"NSTitle\">Slate</string>\n\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t<object class=\"NSCustomResource\" key=\"NSOnImage\" id=\"35465992\">\n\t\t\t\t\t\t\t<string key=\"NSClassName\">NSImage</string>\n\t\t\t\t\t\t\t<string key=\"NSResourceName\">NSMenuCheckmark</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSCustomResource\" key=\"NSMixedImage\" id=\"502551668\">\n\t\t\t\t\t\t\t<string key=\"NSClassName\">NSImage</string>\n\t\t\t\t\t\t\t<string key=\"NSResourceName\">NSMenuMixedState</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"110575045\">\n\t\t\t\t\t\t\t<string key=\"NSTitle\">Slate</string>\n\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"609285721\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"110575045\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Preferences…</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">,</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"481834944\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"110575045\"/>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"1046388886\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"110575045\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Services</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"752062318\">\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Services</string>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSName\">_NSServicesMenu</string>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"646227648\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"110575045\"/>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"755159360\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"110575045\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Hide Slate</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">h</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"342932134\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"110575045\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Hide Others</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">h</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1572864</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"908899353\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"110575045\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Show All</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"336480265\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"110575045\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Quit Slate</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">q</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<string key=\"NSName\">_NSAppleMenu</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMenuItem\" id=\"379814623\">\n\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"649796088\"/>\n\t\t\t\t\t\t<string key=\"NSTitle\">File</string>\n\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"720053764\">\n\t\t\t\t\t\t\t<string key=\"NSTitle\">File</string>\n\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"705341025\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"720053764\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">New</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">n</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"722745758\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"720053764\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Open…</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">o</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"1025936716\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"720053764\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Open Recent</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"1065607017\">\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Open Recent</string>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"759406840\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"1065607017\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Clear Menu</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSName\">_NSRecentDocumentsMenu</string>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"425164168\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"720053764\"/>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"776162233\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"720053764\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Close</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">w</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"1023925487\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"720053764\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Save</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">s</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"117038363\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"720053764\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Save As…</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">S</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1179648</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"579971712\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"720053764\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Revert to Saved</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"1010469920\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"720053764\"/>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"294629803\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"720053764\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Page Setup...</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">P</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1179648</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSToolTip\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"49223823\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"720053764\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Print…</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">p</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMenuItem\" id=\"952259628\">\n\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"649796088\"/>\n\t\t\t\t\t\t<string key=\"NSTitle\">Edit</string>\n\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"789758025\">\n\t\t\t\t\t\t\t<string key=\"NSTitle\">Edit</string>\n\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"1058277027\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"789758025\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Undo</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">z</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"790794224\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"789758025\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Redo</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">Z</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1179648</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"1040322652\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"789758025\"/>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"296257095\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"789758025\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Cut</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">x</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"860595796\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"789758025\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Copy</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">c</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"29853731\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"789758025\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Paste</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">v</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"82994268\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"789758025\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Paste and Match Style</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">V</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1572864</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"437104165\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"789758025\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Delete</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"583158037\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"789758025\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Select All</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">a</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"212016141\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"789758025\"/>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"892235320\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"789758025\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Find</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"963351320\">\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Find</string>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"447796847\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"963351320\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Find…</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">f</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTag\">1</int>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"326711663\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"963351320\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Find Next</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">g</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTag\">2</int>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"270902937\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"963351320\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Find Previous</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">G</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1179648</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTag\">3</int>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"159080638\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"963351320\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Use Selection for Find</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">e</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTag\">7</int>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"88285865\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"963351320\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Jump to Selection</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">j</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"972420730\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"789758025\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Spelling and Grammar</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"769623530\">\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Spelling and Grammar</string>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"679648819\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"769623530\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Show Spelling and Grammar</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">:</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"96193923\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"769623530\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Check Document Now</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">;</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"859480356\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"769623530\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"948374510\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"769623530\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Check Spelling While Typing</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"967646866\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"769623530\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Check Grammar With Spelling</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"795346622\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"769623530\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Correct Spelling Automatically</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"507821607\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"789758025\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Substitutions</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"698887838\">\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Substitutions</string>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"65139061\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"698887838\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Show Substitutions</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"19036812\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"698887838\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"605118523\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"698887838\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Smart Copy/Paste</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">f</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTag\">1</int>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"197661976\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"698887838\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Smart Quotes</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">g</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTag\">2</int>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"672708820\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"698887838\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Smart Dashes</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"708854459\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"698887838\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Smart Links</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">G</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1179648</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTag\">3</int>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"537092702\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"698887838\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Text Replacement</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"288088188\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"789758025\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Transformations</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"579392910\">\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Transformations</string>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"1060694897\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"579392910\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Make Upper Case</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"879586729\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"579392910\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Make Lower Case</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"56570060\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"579392910\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Capitalize</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"676164635\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"789758025\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Speech</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"785027613\">\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Speech</string>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"731782645\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"785027613\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Start Speaking</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"680220178\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"785027613\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Stop Speaking</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMenuItem\" id=\"302598603\">\n\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"649796088\"/>\n\t\t\t\t\t\t<string key=\"NSTitle\">Format</string>\n\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"941447902\">\n\t\t\t\t\t\t\t<string key=\"NSTitle\">Format</string>\n\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"792887677\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"941447902\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Font</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"786677654\">\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Font</string>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"159677712\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"786677654\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Show Fonts</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">t</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"305399458\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"786677654\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Bold</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">b</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTag\">2</int>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"814362025\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"786677654\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Italic</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">i</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTag\">1</int>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"330926929\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"786677654\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Underline</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">u</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"533507878\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"786677654\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"158063935\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"786677654\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Bigger</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">+</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTag\">3</int>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"885547335\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"786677654\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Smaller</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">-</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTag\">4</int>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"901062459\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"786677654\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"767671776\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"786677654\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Kern</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"175441468\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Kern</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"252969304\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"175441468\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Use Default</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"766922938\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"175441468\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Use None</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"677519740\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"175441468\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Tighten</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"238351151\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"175441468\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Loosen</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"691570813\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"786677654\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Ligature</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"1058217995\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Ligature</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"706297211\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"1058217995\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Use Default</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"568384683\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"1058217995\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Use None</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"663508465\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"1058217995\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Use All</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"769124883\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"786677654\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Baseline</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"18263474\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Baseline</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"257962622\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"18263474\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Use Default</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"644725453\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"18263474\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Superscript</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"1037576581\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"18263474\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Subscript</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"941806246\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"18263474\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Raise</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"1045724900\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"18263474\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Lower</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"739652853\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"786677654\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"1012600125\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"786677654\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Show Colors</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">C</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"214559597\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"786677654\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"596732606\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"786677654\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Copy Style</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">c</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1572864</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"393423671\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"786677654\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Paste Style</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">v</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1572864</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSName\">_NSFontMenu</string>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"215659978\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"941447902\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Text</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"446991534\">\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Text</string>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"875092757\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"446991534\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Align Left</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">{</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"630155264\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"446991534\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Center</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">|</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"945678886\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"446991534\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Justify</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"512868991\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"446991534\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Align Right</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">}</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"163117631\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"446991534\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"31516759\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"446991534\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Writing Direction</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"956096989\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Writing Direction</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"257099033\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"956096989\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Paragraph</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"551969625\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"956096989\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string type=\"base64-UTF8\" key=\"NSTitle\">CURlZmF1bHQ</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"249532473\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"956096989\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string type=\"base64-UTF8\" key=\"NSTitle\">CUxlZnQgdG8gUmlnaHQ</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"607364498\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"956096989\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string type=\"base64-UTF8\" key=\"NSTitle\">CVJpZ2h0IHRvIExlZnQ</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"508151438\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"956096989\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"981751889\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"956096989\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Selection</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"380031999\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"956096989\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string type=\"base64-UTF8\" key=\"NSTitle\">CURlZmF1bHQ</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"825984362\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"956096989\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string type=\"base64-UTF8\" key=\"NSTitle\">CUxlZnQgdG8gUmlnaHQ</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"560145579\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"956096989\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string type=\"base64-UTF8\" key=\"NSTitle\">CVJpZ2h0IHRvIExlZnQ</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"908105787\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"446991534\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"644046920\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"446991534\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Show Ruler</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"231811626\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"446991534\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Copy Ruler</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">c</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1310720</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"883618387\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"446991534\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Paste Ruler</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">v</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1310720</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMenuItem\" id=\"586577488\">\n\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"649796088\"/>\n\t\t\t\t\t\t<string key=\"NSTitle\">View</string>\n\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"466310130\">\n\t\t\t\t\t\t\t<string key=\"NSTitle\">View</string>\n\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"102151532\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"466310130\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Show Toolbar</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">t</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1572864</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"237841660\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"466310130\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Customize Toolbar…</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMenuItem\" id=\"713487014\">\n\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"649796088\"/>\n\t\t\t\t\t\t<string key=\"NSTitle\">Window</string>\n\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"835318025\">\n\t\t\t\t\t\t\t<string key=\"NSTitle\">Window</string>\n\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"1011231497\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"835318025\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Minimize</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">m</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"575023229\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"835318025\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Zoom</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"299356726\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"835318025\"/>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"625202149\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"835318025\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Bring All to Front</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<string key=\"NSName\">_NSWindowsMenu</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMenuItem\" id=\"448692316\">\n\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"649796088\"/>\n\t\t\t\t\t\t<string key=\"NSTitle\">Help</string>\n\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"992780483\">\n\t\t\t\t\t\t\t<string key=\"NSTitle\">Help</string>\n\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"105068016\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"992780483\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Slate Help</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">?</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<string key=\"NSName\">_NSHelpMenu</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"NSName\">_NSMainMenu</string>\n\t\t\t</object>\n\t\t\t<object class=\"NSMenu\" id=\"429482039\">\n\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<object class=\"NSMenuItem\" id=\"304266470\">\n\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"429482039\"/>\n\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMenuItem\" id=\"922665584\">\n\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"429482039\"/>\n\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMenuItem\" id=\"1056857174\">\n\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"429482039\"/>\n\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMenuItem\" id=\"445239525\">\n\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"429482039\"/>\n\t\t\t\t\t\t<string key=\"NSTitle\">Check for Updates...</string>\n\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMenuItem\" id=\"758309769\">\n\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"429482039\"/>\n\t\t\t\t\t\t<string key=\"NSTitle\">Automatically Check for Updates</string>\n\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMenuItem\" id=\"960948370\">\n\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"429482039\"/>\n\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMenuItem\" id=\"632727374\">\n\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"429482039\"/>\n\t\t\t\t\t\t<string key=\"NSTitle\">Quit Slate</string>\n\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"35465992\"/>\n\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"502551668\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSCustomObject\" id=\"976324537\">\n\t\t\t\t<string key=\"NSClassName\">SlateAppDelegate</string>\n\t\t\t</object>\n\t\t\t<object class=\"NSCustomObject\" id=\"755631768\">\n\t\t\t\t<string key=\"NSClassName\">NSFontManager</string>\n\t\t\t</object>\n\t\t\t<object class=\"NSWindowTemplate\" id=\"283673920\">\n\t\t\t\t<int key=\"NSWindowStyleMask\">15</int>\n\t\t\t\t<int key=\"NSWindowBacking\">2</int>\n\t\t\t\t<string key=\"NSWindowRect\">{{100, 100}, {480, 470}}</string>\n\t\t\t\t<int key=\"NSWTFlags\">611845120</int>\n\t\t\t\t<string key=\"NSWindowTitle\">Slate - Current Window Info</string>\n\t\t\t\t<string key=\"NSWindowClass\">NSWindow</string>\n\t\t\t\t<nil key=\"NSViewClass\"/>\n\t\t\t\t<nil key=\"NSUserInterfaceItemIdentifier\"/>\n\t\t\t\t<object class=\"NSView\" key=\"NSWindowView\" id=\"904579032\">\n\t\t\t\t\t<reference key=\"NSNextResponder\"/>\n\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSScrollView\" id=\"358241600\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"904579032\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">286</int>\n\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t<object class=\"NSClipView\" id=\"825391227\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"358241600\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">2304</int>\n\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextView\" id=\"213582190\">\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"825391227\"/>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">2322</int>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableSet\" key=\"NSDragTypes\">\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSArray\" key=\"set.sortedObjects\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string>Apple HTML pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string>Apple PDF pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string>Apple PICT pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string>Apple PNG pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string>Apple URL pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string>CorePasteboardFlavorType 0x6D6F6F76</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NSColor pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NSFilenamesPboardType</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NSStringPboardType</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NeXT Encapsulated PostScript v1.2 pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NeXT RTFD pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NeXT Rich Text Format v1.0 pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NeXT TIFF v4.0 pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NeXT font pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NeXT ruler pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string>WebURLsWithTitlesPboardType</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string>public.url</string>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrameSize\">{480, 133}</string>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"825391227\"/>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"137230258\"/>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:13</string>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextContainer\" key=\"NSTextContainer\" id=\"51103231\">\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSLayoutManager\" key=\"NSLayoutManager\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextStorage\" key=\"NSTextStorage\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableString\" key=\"NSString\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<characters key=\"NS.bytes\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<nil key=\"NSDelegate\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSTextContainers\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference ref=\"51103231\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSLMFlags\">134</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<nil key=\"NSDelegate\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSTextView\" ref=\"213582190\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<double key=\"NSWidth\">480</double>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTCFlags\">1</int>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextViewSharedData\" key=\"NSSharedData\">\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSFlags\">67121127</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTextCheckingTypes\">0</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<nil key=\"NSMarkedAttributes\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSBackgroundColor\" id=\"1013869928\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSDictionary\" key=\"NSSelectedAttributes\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NSBackgroundColor</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NSColor</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" id=\"572114043\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">6</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSCatalogName\">System</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSColorName\">selectedTextBackgroundColor</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSColor\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MC42NjY2NjY2NjY3AA</bytes>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" id=\"385023875\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">6</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSCatalogName\">System</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSColorName\">selectedTextColor</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSColor\" id=\"630939172\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MAA</bytes>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSInsertionColor\" ref=\"630939172\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSDictionary\" key=\"NSLinkAttributes\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NSColor</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NSCursor</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NSUnderline</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" id=\"803511153\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">1</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bytes key=\"NSRGB\">MCAwIDEAA</bytes>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSCursor\" id=\"471376124\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSHotSpot\">{8, -8}</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCursorType\">13</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<integer value=\"1\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t<nil key=\"NSDefaultParagraphStyle\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<nil key=\"NSTextFinder\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSPreferredTextFinderStyle\">1</int>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTVFlags\">6</int>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSMaxSize\">{480, 10000000}</string>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSMinize\">{238, 133}</string>\n\t\t\t\t\t\t\t\t\t\t\t<nil key=\"NSDelegate\"/>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{1, 1}, {480, 470}}</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"358241600\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"213582190\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:11</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSDocView\" ref=\"213582190\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSBGColor\" ref=\"1013869928\"/>\n\t\t\t\t\t\t\t\t\t<object class=\"NSCursor\" key=\"NSCursor\">\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSHotSpot\">{4, 5}</string>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSImage\" key=\"NSImage\">\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSImageFlags\">79691776</int>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSArray\" key=\"NSReps\">\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSArray\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<integer value=\"5\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSURL\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<nil key=\"NS.base\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NS.relative\">file://localhost/Applications/Xcode.app/Contents/SharedFrameworks/DVTKit.framework/Resources/DVTIbeamCursor.tiff</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSColor\" id=\"277409464\">\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MCAwAA</bytes>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<int key=\"NScvFlags\">4</int>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSScroller\" id=\"137230258\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"358241600\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{466, 1}, {15, 470}}</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"358241600\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:84</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSTarget\" ref=\"358241600\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">_doScroller:</string>\n\t\t\t\t\t\t\t\t\t<double key=\"NSCurValue\">1</double>\n\t\t\t\t\t\t\t\t\t<double key=\"NSPercent\">0.85256409645080566</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSScroller\" id=\"426536104\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"358241600\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">-2147483392</int>\n\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{-100, -100}, {87, 18}}</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"358241600\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"825391227\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:33</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSsFlags\">1</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSTarget\" ref=\"358241600\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">_doScroller:</string>\n\t\t\t\t\t\t\t\t\t<double key=\"NSCurValue\">1</double>\n\t\t\t\t\t\t\t\t\t<double key=\"NSPercent\">0.94565218687057495</double>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{-1, -1}, {482, 472}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"904579032\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"426536104\"/>\n\t\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t\t<int key=\"NSsFlags\">133138</int>\n\t\t\t\t\t\t\t<reference key=\"NSVScroller\" ref=\"137230258\"/>\n\t\t\t\t\t\t\t<reference key=\"NSHScroller\" ref=\"426536104\"/>\n\t\t\t\t\t\t\t<reference key=\"NSContentView\" ref=\"825391227\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<string key=\"NSFrameSize\">{480, 470}</string>\n\t\t\t\t\t<reference key=\"NSSuperview\"/>\n\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"358241600\"/>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"NSScreenRect\">{{0, 0}, {1680, 1028}}</string>\n\t\t\t\t<string key=\"NSMaxSize\">{10000000000000, 10000000000000}</string>\n\t\t\t\t<bool key=\"NSWindowIsRestorable\">YES</bool>\n\t\t\t</object>\n\t\t\t<object class=\"NSWindowTemplate\" id=\"865126744\">\n\t\t\t\t<int key=\"NSWindowStyleMask\">15</int>\n\t\t\t\t<int key=\"NSWindowBacking\">2</int>\n\t\t\t\t<string key=\"NSWindowRect\">{{200, 200}, {1400, 700}}</string>\n\t\t\t\t<int key=\"NSWTFlags\">611845120</int>\n\t\t\t\t<string key=\"NSWindowTitle\">Slate - Configuration Helper</string>\n\t\t\t\t<string key=\"NSWindowClass\">NSWindow</string>\n\t\t\t\t<nil key=\"NSViewClass\"/>\n\t\t\t\t<nil key=\"NSUserInterfaceItemIdentifier\"/>\n\t\t\t\t<string key=\"NSWindowContentMinSize\">{1400, 800}</string>\n\t\t\t\t<object class=\"NSView\" key=\"NSWindowView\" id=\"361597867\">\n\t\t\t\t\t<reference key=\"NSNextResponder\"/>\n\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSSplitView\" id=\"344465982\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"361597867\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">286</int>\n\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t<object class=\"NSCustomView\" id=\"417103217\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"344465982\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t\t\t<string key=\"NSFrameSize\">{695, 700}</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"344465982\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"587476981\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:11</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSClassName\">ConfigurationHelperView</string>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSScrollView\" id=\"587476981\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"344465982\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSClipView\" id=\"653232742\">\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"587476981\"/>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">2304</int>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextView\" id=\"923129638\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"653232742\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">2322</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableSet\" key=\"NSDragTypes\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSArray\" key=\"set.sortedObjects\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>Apple HTML pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>Apple PDF pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>Apple PICT pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>Apple PNG pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>Apple URL pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>CorePasteboardFlavorType 0x6D6F6F76</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NSColor pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NSFilenamesPboardType</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NSStringPboardType</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NeXT Encapsulated PostScript v1.2 pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NeXT RTFD pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NeXT Rich Text Format v1.0 pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NeXT TIFF v4.0 pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NeXT font pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NeXT ruler pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>WebURLsWithTitlesPboardType</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>public.url</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrameSize\">{693, 14}</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"653232742\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"38398561\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:13</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextContainer\" key=\"NSTextContainer\" id=\"1041123843\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSLayoutManager\" key=\"NSLayoutManager\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextStorage\" key=\"NSTextStorage\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableString\" key=\"NSString\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<characters key=\"NS.bytes\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<nil key=\"NSDelegate\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSTextContainers\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference ref=\"1041123843\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSLMFlags\">134</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<nil key=\"NSDelegate\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSTextView\" ref=\"923129638\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<double key=\"NSWidth\">693</double>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTCFlags\">1</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextViewSharedData\" key=\"NSSharedData\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSFlags\">67121127</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTextCheckingTypes\">0</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<nil key=\"NSMarkedAttributes\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSBackgroundColor\" ref=\"1013869928\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSDictionary\" key=\"NSSelectedAttributes\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NSBackgroundColor</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NSColor</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference ref=\"572114043\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference ref=\"385023875\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSInsertionColor\" ref=\"630939172\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSDictionary\" key=\"NSLinkAttributes\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NSColor</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NSCursor</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NSUnderline</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference ref=\"803511153\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference ref=\"471376124\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<integer value=\"1\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<nil key=\"NSDefaultParagraphStyle\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<nil key=\"NSTextFinder\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSPreferredTextFinderStyle\">1</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTVFlags\">6</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSMaxSize\">{757, 10000000}</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSMinize\">{68, 0}</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<nil key=\"NSDelegate\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{1, 1}, {693, 698}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"587476981\"/>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"923129638\"/>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:11</string>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSDocView\" ref=\"923129638\"/>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSBGColor\" ref=\"1013869928\"/>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSCursor\" key=\"NSCursor\">\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSHotSpot\">{4, 5}</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSImage\" key=\"NSImage\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSImageFlags\">79691776</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSArray\" key=\"NSReps\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSArray\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<integer value=\"5\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSURL\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<nil key=\"NS.base\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NS.relative\">file://localhost/Applications/Xcode.app/Contents/SharedFrameworks/DVTKit.framework/Resources/DVTIbeamCursor.tiff</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSColor\" ref=\"277409464\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NScvFlags\">4</int>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSScroller\" id=\"38398561\">\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"587476981\"/>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{679, 1}, {15, 698}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"587476981\"/>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\"/>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:84</string>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSTarget\" ref=\"587476981\"/>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">_doScroller:</string>\n\t\t\t\t\t\t\t\t\t\t\t<double key=\"NSCurValue\">1</double>\n\t\t\t\t\t\t\t\t\t\t\t<double key=\"NSPercent\">0.85256409645080566</double>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSScroller\" id=\"225262690\">\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"587476981\"/>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">-2147483392</int>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{-100, -100}, {87, 18}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"587476981\"/>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"653232742\"/>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:33</string>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSsFlags\">1</int>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSTarget\" ref=\"587476981\"/>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">_doScroller:</string>\n\t\t\t\t\t\t\t\t\t\t\t<double key=\"NSCurValue\">1</double>\n\t\t\t\t\t\t\t\t\t\t\t<double key=\"NSPercent\">0.94565218687057495</double>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{705, 0}, {695, 700}}</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"344465982\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"225262690\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSsFlags\">133138</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSVScroller\" ref=\"38398561\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSHScroller\" ref=\"225262690\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSContentView\" ref=\"653232742\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<string key=\"NSFrameSize\">{1400, 700}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"361597867\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"417103217\"/>\n\t\t\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:9</string>\n\t\t\t\t\t\t\t<bool key=\"NSIsVertical\">YES</bool>\n\t\t\t\t\t\t\t<int key=\"NSDividerStyle\">3</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<string key=\"NSFrameSize\">{1400, 700}</string>\n\t\t\t\t\t<reference key=\"NSSuperview\"/>\n\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t<reference key=\"NSNextKeyView\" ref=\"344465982\"/>\n\t\t\t\t\t<string key=\"NSReuseIdentifierKey\">_NS:20</string>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"NSScreenRect\">{{0, 0}, {1680, 1028}}</string>\n\t\t\t\t<string key=\"NSMinSize\">{1400, 822}</string>\n\t\t\t\t<string key=\"NSMaxSize\">{10000000000000, 10000000000000}</string>\n\t\t\t\t<bool key=\"NSWindowIsRestorable\">YES</bool>\n\t\t\t</object>\n\t\t\t<object class=\"NSCustomObject\" id=\"757407638\">\n\t\t\t\t<string key=\"NSClassName\">SUUpdater</string>\n\t\t\t</object>\n\t\t\t<object class=\"NSUserDefaultsController\" id=\"788651749\">\n\t\t\t\t<bool key=\"NSSharedInstance\">YES</bool>\n\t\t\t</object>\n\t\t</object>\n\t\t<object class=\"IBObjectContainer\" key=\"IBDocument.Objects\">\n\t\t\t<object class=\"NSMutableArray\" key=\"connectionRecords\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">terminate:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1050\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"336480265\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">554</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">terminate:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1050\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"632727374\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">564</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">delegate</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1021\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"976324537\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">495</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">performMiniaturize:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"1011231497\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">37</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">arrangeInFront:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"625202149\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">39</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">print:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"49223823\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">86</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">runPageLayout:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"294629803\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">87</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">clearRecentDocuments:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"759406840\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">127</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">performClose:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"776162233\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">193</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">toggleContinuousSpellChecking:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"948374510\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">222</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">undo:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"1058277027\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">223</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">copy:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"860595796\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">224</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">checkSpelling:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"96193923\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">225</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">paste:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"29853731\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">226</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">stopSpeaking:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"680220178\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">227</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">cut:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"296257095\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">228</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">showGuessPanel:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"679648819\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">230</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">redo:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"790794224\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">231</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">selectAll:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"583158037\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">232</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">startSpeaking:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"731782645\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">233</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">delete:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"437104165\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">235</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">performZoom:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"575023229\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">240</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">performFindPanelAction:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"447796847\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">241</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">centerSelectionInVisibleArea:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"88285865\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">245</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">toggleGrammarChecking:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"967646866\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">347</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">toggleSmartInsertDelete:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"605118523\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">355</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">toggleAutomaticQuoteSubstitution:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"197661976\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">356</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">toggleAutomaticLinkDetection:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"708854459\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">357</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">saveDocument:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"1023925487\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">362</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">saveDocumentAs:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"117038363\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">363</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">revertDocumentToSaved:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"579971712\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">364</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">runToolbarCustomizationPalette:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"237841660\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">365</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">toggleToolbarShown:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"102151532\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">366</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">hide:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"755159360\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">367</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">hideOtherApplications:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"342932134\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">368</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">unhideAllApplications:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"908899353\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">370</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">newDocument:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"705341025\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">373</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">openDocument:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"722745758\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">374</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">raiseBaseline:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"941806246\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">426</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">lowerBaseline:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"1045724900\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">427</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">copyFont:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"596732606\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">428</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">subscript:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"1037576581\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">429</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">superscript:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"644725453\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">430</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">tightenKerning:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"677519740\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">431</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">underline:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"330926929\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">432</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">orderFrontColorPanel:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"1012600125\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">433</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">useAllLigatures:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"663508465\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">434</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">loosenKerning:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"238351151\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">435</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">pasteFont:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"393423671\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">436</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">unscript:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"257962622\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">437</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">useStandardKerning:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"252969304\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">438</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">useStandardLigatures:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"706297211\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">439</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">turnOffLigatures:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"568384683\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">440</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">turnOffKerning:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"766922938\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">441</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">toggleAutomaticSpellingCorrection:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"795346622\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">456</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">orderFrontSubstitutionsPanel:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"65139061\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">458</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">toggleAutomaticDashSubstitution:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"672708820\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">461</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">toggleAutomaticTextReplacement:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"537092702\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">463</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">uppercaseWord:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"1060694897\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">464</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">capitalizeWord:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"56570060\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">467</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">lowercaseWord:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"879586729\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">468</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">pasteAsPlainText:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"82994268\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">486</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">performFindPanelAction:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"326711663\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">487</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">performFindPanelAction:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"270902937\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">488</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">performFindPanelAction:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"159080638\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">489</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">showHelp:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"105068016\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">493</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">alignCenter:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"630155264\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">518</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">pasteRuler:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"883618387\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">519</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">toggleRuler:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"644046920\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">520</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">alignRight:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"512868991\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">521</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">copyRuler:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"231811626\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">522</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">alignJustified:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"945678886\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">523</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">alignLeft:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"875092757\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">524</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">makeBaseWritingDirectionNatural:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"551969625\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">525</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">makeBaseWritingDirectionLeftToRight:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"249532473\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">526</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">makeBaseWritingDirectionRightToLeft:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"607364498\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">527</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">makeTextWritingDirectionNatural:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"380031999\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">528</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">makeTextWritingDirectionLeftToRight:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"825984362\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">529</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">makeTextWritingDirectionRightToLeft:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"560145579\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">530</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">addFontTrait:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"755631768\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"305399458\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">421</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">addFontTrait:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"755631768\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"814362025\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">422</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">modifyFont:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"755631768\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"885547335\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">423</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">orderFrontFontPanel:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"755631768\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"159677712\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">424</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">modifyFont:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"755631768\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"158063935\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">425</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">statusMenu</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"976324537\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"429482039\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">547</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">windowInfo</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"976324537\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"283673920\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">567</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">configHelper</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"976324537\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"865126744\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">626</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">configHelperTextView</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"976324537\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"923129638\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">651</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">checkForUpdates:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"757407638\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"445239525\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">660</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBBindingConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">value: automaticallyChecksForUpdates</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"758309769\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"757407638\"/>\n\t\t\t\t\t\t<object class=\"NSNibBindingConnector\" key=\"connector\">\n\t\t\t\t\t\t\t<reference key=\"NSSource\" ref=\"758309769\"/>\n\t\t\t\t\t\t\t<reference key=\"NSDestination\" ref=\"757407638\"/>\n\t\t\t\t\t\t\t<string key=\"NSLabel\">value: automaticallyChecksForUpdates</string>\n\t\t\t\t\t\t\t<string key=\"NSBinding\">value</string>\n\t\t\t\t\t\t\t<string key=\"NSKeyPath\">automaticallyChecksForUpdates</string>\n\t\t\t\t\t\t\t<object class=\"NSDictionary\" key=\"NSOptions\">\n\t\t\t\t\t\t\t\t<string key=\"NS.key.0\">NSConditionallySetsEnabled</string>\n\t\t\t\t\t\t\t\t<boolean value=\"NO\" key=\"NS.object.0\"/>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<int key=\"NSNibBindingConnectorVersion\">2</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">674</int>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"IBMutableOrderedSet\" key=\"objectRecords\">\n\t\t\t\t<object class=\"NSArray\" key=\"orderedObjects\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">0</int>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"object\" id=\"0\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"children\" ref=\"1048\"/>\n\t\t\t\t\t\t<nil key=\"parent\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1021\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">File's Owner</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1014\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">First Responder</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-3</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1050\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">Application</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">29</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"649796088\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"713487014\"/>\n\t\t\t\t\t\t\t<reference ref=\"694149608\"/>\n\t\t\t\t\t\t\t<reference ref=\"952259628\"/>\n\t\t\t\t\t\t\t<reference ref=\"379814623\"/>\n\t\t\t\t\t\t\t<reference ref=\"586577488\"/>\n\t\t\t\t\t\t\t<reference ref=\"302598603\"/>\n\t\t\t\t\t\t\t<reference ref=\"448692316\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">19</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"713487014\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"835318025\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"649796088\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">56</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"694149608\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"110575045\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"649796088\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">217</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"952259628\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"789758025\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"649796088\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">83</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"379814623\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"720053764\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"649796088\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">81</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"720053764\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"1023925487\"/>\n\t\t\t\t\t\t\t<reference ref=\"117038363\"/>\n\t\t\t\t\t\t\t<reference ref=\"49223823\"/>\n\t\t\t\t\t\t\t<reference ref=\"722745758\"/>\n\t\t\t\t\t\t\t<reference ref=\"705341025\"/>\n\t\t\t\t\t\t\t<reference ref=\"1025936716\"/>\n\t\t\t\t\t\t\t<reference ref=\"294629803\"/>\n\t\t\t\t\t\t\t<reference ref=\"776162233\"/>\n\t\t\t\t\t\t\t<reference ref=\"425164168\"/>\n\t\t\t\t\t\t\t<reference ref=\"579971712\"/>\n\t\t\t\t\t\t\t<reference ref=\"1010469920\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"379814623\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">75</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1023925487\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"720053764\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">80</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"117038363\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"720053764\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">78</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"49223823\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"720053764\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">72</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"722745758\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"720053764\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">82</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"705341025\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"720053764\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">124</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1025936716\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"1065607017\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"720053764\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">77</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"294629803\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"720053764\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">73</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"776162233\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"720053764\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">79</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"425164168\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"720053764\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">112</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"579971712\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"720053764\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">74</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1010469920\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"720053764\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">125</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1065607017\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"759406840\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1025936716\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">126</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"759406840\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1065607017\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">205</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"789758025\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"437104165\"/>\n\t\t\t\t\t\t\t<reference ref=\"583158037\"/>\n\t\t\t\t\t\t\t<reference ref=\"1058277027\"/>\n\t\t\t\t\t\t\t<reference ref=\"212016141\"/>\n\t\t\t\t\t\t\t<reference ref=\"296257095\"/>\n\t\t\t\t\t\t\t<reference ref=\"29853731\"/>\n\t\t\t\t\t\t\t<reference ref=\"860595796\"/>\n\t\t\t\t\t\t\t<reference ref=\"1040322652\"/>\n\t\t\t\t\t\t\t<reference ref=\"790794224\"/>\n\t\t\t\t\t\t\t<reference ref=\"892235320\"/>\n\t\t\t\t\t\t\t<reference ref=\"972420730\"/>\n\t\t\t\t\t\t\t<reference ref=\"676164635\"/>\n\t\t\t\t\t\t\t<reference ref=\"507821607\"/>\n\t\t\t\t\t\t\t<reference ref=\"288088188\"/>\n\t\t\t\t\t\t\t<reference ref=\"82994268\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"952259628\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">202</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"437104165\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"789758025\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">198</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"583158037\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"789758025\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">207</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1058277027\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"789758025\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">214</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"212016141\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"789758025\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">199</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"296257095\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"789758025\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">203</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"29853731\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"789758025\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">197</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"860595796\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"789758025\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">206</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1040322652\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"789758025\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">215</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"790794224\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"789758025\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">218</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"892235320\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"963351320\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"789758025\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">216</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"972420730\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"769623530\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"789758025\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">200</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"769623530\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"948374510\"/>\n\t\t\t\t\t\t\t<reference ref=\"96193923\"/>\n\t\t\t\t\t\t\t<reference ref=\"679648819\"/>\n\t\t\t\t\t\t\t<reference ref=\"967646866\"/>\n\t\t\t\t\t\t\t<reference ref=\"859480356\"/>\n\t\t\t\t\t\t\t<reference ref=\"795346622\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"972420730\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">219</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"948374510\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"769623530\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">201</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"96193923\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"769623530\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">204</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"679648819\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"769623530\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">220</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"963351320\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"270902937\"/>\n\t\t\t\t\t\t\t<reference ref=\"88285865\"/>\n\t\t\t\t\t\t\t<reference ref=\"159080638\"/>\n\t\t\t\t\t\t\t<reference ref=\"326711663\"/>\n\t\t\t\t\t\t\t<reference ref=\"447796847\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"892235320\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">213</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"270902937\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"963351320\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">210</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"88285865\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"963351320\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">221</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"159080638\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"963351320\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">208</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"326711663\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"963351320\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">209</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"447796847\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"963351320\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">57</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"110575045\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"755159360\"/>\n\t\t\t\t\t\t\t<reference ref=\"908899353\"/>\n\t\t\t\t\t\t\t<reference ref=\"646227648\"/>\n\t\t\t\t\t\t\t<reference ref=\"609285721\"/>\n\t\t\t\t\t\t\t<reference ref=\"481834944\"/>\n\t\t\t\t\t\t\t<reference ref=\"1046388886\"/>\n\t\t\t\t\t\t\t<reference ref=\"342932134\"/>\n\t\t\t\t\t\t\t<reference ref=\"336480265\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"694149608\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">134</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"755159360\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"110575045\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">150</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"908899353\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"110575045\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">144</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"646227648\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"110575045\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">129</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"609285721\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"110575045\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">143</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"481834944\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"110575045\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">131</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1046388886\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"752062318\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"110575045\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">145</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"342932134\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"110575045\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">130</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"752062318\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1046388886\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">24</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"835318025\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"299356726\"/>\n\t\t\t\t\t\t\t<reference ref=\"625202149\"/>\n\t\t\t\t\t\t\t<reference ref=\"575023229\"/>\n\t\t\t\t\t\t\t<reference ref=\"1011231497\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"713487014\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">92</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"299356726\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"835318025\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">5</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"625202149\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"835318025\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">239</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"575023229\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"835318025\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">23</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1011231497\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"835318025\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">295</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"586577488\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"466310130\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"649796088\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">296</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"466310130\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"102151532\"/>\n\t\t\t\t\t\t\t<reference ref=\"237841660\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"586577488\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">297</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"102151532\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"466310130\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">298</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"237841660\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"466310130\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">211</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"676164635\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"785027613\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"789758025\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">212</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"785027613\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"680220178\"/>\n\t\t\t\t\t\t\t<reference ref=\"731782645\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"676164635\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">195</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"680220178\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"785027613\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">196</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"731782645\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"785027613\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">346</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"967646866\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"769623530\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">348</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"507821607\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"698887838\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"789758025\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">349</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"698887838\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"605118523\"/>\n\t\t\t\t\t\t\t<reference ref=\"197661976\"/>\n\t\t\t\t\t\t\t<reference ref=\"708854459\"/>\n\t\t\t\t\t\t\t<reference ref=\"65139061\"/>\n\t\t\t\t\t\t\t<reference ref=\"19036812\"/>\n\t\t\t\t\t\t\t<reference ref=\"672708820\"/>\n\t\t\t\t\t\t\t<reference ref=\"537092702\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"507821607\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">350</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"605118523\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"698887838\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">351</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"197661976\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"698887838\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">354</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"708854459\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"698887838\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">375</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"302598603\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"941447902\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"649796088\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">376</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"941447902\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"792887677\"/>\n\t\t\t\t\t\t\t<reference ref=\"215659978\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"302598603\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">377</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"792887677\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"786677654\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"941447902\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">388</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"786677654\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"159677712\"/>\n\t\t\t\t\t\t\t<reference ref=\"305399458\"/>\n\t\t\t\t\t\t\t<reference ref=\"814362025\"/>\n\t\t\t\t\t\t\t<reference ref=\"330926929\"/>\n\t\t\t\t\t\t\t<reference ref=\"533507878\"/>\n\t\t\t\t\t\t\t<reference ref=\"158063935\"/>\n\t\t\t\t\t\t\t<reference ref=\"885547335\"/>\n\t\t\t\t\t\t\t<reference ref=\"901062459\"/>\n\t\t\t\t\t\t\t<reference ref=\"767671776\"/>\n\t\t\t\t\t\t\t<reference ref=\"691570813\"/>\n\t\t\t\t\t\t\t<reference ref=\"769124883\"/>\n\t\t\t\t\t\t\t<reference ref=\"739652853\"/>\n\t\t\t\t\t\t\t<reference ref=\"1012600125\"/>\n\t\t\t\t\t\t\t<reference ref=\"214559597\"/>\n\t\t\t\t\t\t\t<reference ref=\"596732606\"/>\n\t\t\t\t\t\t\t<reference ref=\"393423671\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"792887677\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">389</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"159677712\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"786677654\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">390</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"305399458\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"786677654\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">391</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"814362025\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"786677654\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">392</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"330926929\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"786677654\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">393</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"533507878\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"786677654\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">394</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"158063935\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"786677654\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">395</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"885547335\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"786677654\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">396</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"901062459\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"786677654\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">397</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"767671776\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"175441468\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"786677654\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">398</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"691570813\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"1058217995\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"786677654\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">399</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"769124883\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"18263474\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"786677654\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">400</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"739652853\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"786677654\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">401</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1012600125\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"786677654\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">402</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"214559597\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"786677654\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">403</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"596732606\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"786677654\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">404</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"393423671\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"786677654\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">405</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"18263474\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"257962622\"/>\n\t\t\t\t\t\t\t<reference ref=\"644725453\"/>\n\t\t\t\t\t\t\t<reference ref=\"1037576581\"/>\n\t\t\t\t\t\t\t<reference ref=\"941806246\"/>\n\t\t\t\t\t\t\t<reference ref=\"1045724900\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"769124883\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">406</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"257962622\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"18263474\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">407</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"644725453\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"18263474\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">408</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1037576581\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"18263474\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">409</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"941806246\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"18263474\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">410</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1045724900\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"18263474\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">411</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1058217995\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"706297211\"/>\n\t\t\t\t\t\t\t<reference ref=\"568384683\"/>\n\t\t\t\t\t\t\t<reference ref=\"663508465\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"691570813\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">412</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"706297211\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1058217995\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">413</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"568384683\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1058217995\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">414</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"663508465\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1058217995\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">415</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"175441468\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"252969304\"/>\n\t\t\t\t\t\t\t<reference ref=\"766922938\"/>\n\t\t\t\t\t\t\t<reference ref=\"677519740\"/>\n\t\t\t\t\t\t\t<reference ref=\"238351151\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"767671776\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">416</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"252969304\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"175441468\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">417</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"766922938\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"175441468\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">418</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"677519740\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"175441468\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">419</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"238351151\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"175441468\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">420</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"755631768\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">450</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"288088188\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"579392910\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"789758025\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">451</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"579392910\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"1060694897\"/>\n\t\t\t\t\t\t\t<reference ref=\"879586729\"/>\n\t\t\t\t\t\t\t<reference ref=\"56570060\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"288088188\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">452</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1060694897\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"579392910\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">453</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"859480356\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"769623530\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">454</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"795346622\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"769623530\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">457</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"65139061\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"698887838\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">459</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"19036812\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"698887838\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">460</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"672708820\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"698887838\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">462</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"537092702\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"698887838\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">465</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"879586729\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"579392910\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">466</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"56570060\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"579392910\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">485</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"82994268\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"789758025\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">490</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"448692316\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"992780483\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"649796088\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">491</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"992780483\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"105068016\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"448692316\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">492</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"105068016\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"992780483\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">494</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"976324537\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">Slate App Delegate</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">496</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"215659978\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"446991534\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"941447902\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">497</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"446991534\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"875092757\"/>\n\t\t\t\t\t\t\t<reference ref=\"630155264\"/>\n\t\t\t\t\t\t\t<reference ref=\"945678886\"/>\n\t\t\t\t\t\t\t<reference ref=\"512868991\"/>\n\t\t\t\t\t\t\t<reference ref=\"163117631\"/>\n\t\t\t\t\t\t\t<reference ref=\"31516759\"/>\n\t\t\t\t\t\t\t<reference ref=\"908105787\"/>\n\t\t\t\t\t\t\t<reference ref=\"644046920\"/>\n\t\t\t\t\t\t\t<reference ref=\"231811626\"/>\n\t\t\t\t\t\t\t<reference ref=\"883618387\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"215659978\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">498</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"875092757\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"446991534\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">499</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"630155264\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"446991534\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">500</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"945678886\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"446991534\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">501</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"512868991\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"446991534\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">502</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"163117631\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"446991534\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">503</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"31516759\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"956096989\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"446991534\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">504</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"908105787\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"446991534\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">505</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"644046920\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"446991534\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">506</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"231811626\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"446991534\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">507</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"883618387\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"446991534\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">508</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"956096989\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"257099033\"/>\n\t\t\t\t\t\t\t<reference ref=\"551969625\"/>\n\t\t\t\t\t\t\t<reference ref=\"249532473\"/>\n\t\t\t\t\t\t\t<reference ref=\"607364498\"/>\n\t\t\t\t\t\t\t<reference ref=\"508151438\"/>\n\t\t\t\t\t\t\t<reference ref=\"981751889\"/>\n\t\t\t\t\t\t\t<reference ref=\"380031999\"/>\n\t\t\t\t\t\t\t<reference ref=\"825984362\"/>\n\t\t\t\t\t\t\t<reference ref=\"560145579\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"31516759\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">509</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"257099033\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"956096989\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">510</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"551969625\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"956096989\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">511</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"249532473\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"956096989\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">512</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"607364498\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"956096989\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">513</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"508151438\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"956096989\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">514</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"981751889\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"956096989\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">515</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"380031999\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"956096989\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">516</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"825984362\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"956096989\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">517</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"560145579\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"956096989\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">543</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"429482039\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"632727374\"/>\n\t\t\t\t\t\t\t<reference ref=\"304266470\"/>\n\t\t\t\t\t\t\t<reference ref=\"1056857174\"/>\n\t\t\t\t\t\t\t<reference ref=\"922665584\"/>\n\t\t\t\t\t\t\t<reference ref=\"445239525\"/>\n\t\t\t\t\t\t\t<reference ref=\"960948370\"/>\n\t\t\t\t\t\t\t<reference ref=\"758309769\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">553</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"336480265\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"110575045\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">563</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"632727374\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"429482039\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">236</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"304266470\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"429482039\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">149</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1056857174\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"429482039\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">565</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"283673920\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"904579032\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">566</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"904579032\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"358241600\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"283673920\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">609</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"358241600\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"213582190\"/>\n\t\t\t\t\t\t\t<reference ref=\"426536104\"/>\n\t\t\t\t\t\t\t<reference ref=\"137230258\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"904579032\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">610</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"213582190\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"358241600\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">611</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"426536104\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"358241600\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">612</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"137230258\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"358241600\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">613</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"865126744\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"361597867\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">614</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"361597867\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"344465982\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"865126744\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">652</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"344465982\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"417103217\"/>\n\t\t\t\t\t\t\t<reference ref=\"587476981\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"361597867\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">653</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"417103217\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"344465982\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">647</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"587476981\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"38398561\"/>\n\t\t\t\t\t\t\t<reference ref=\"225262690\"/>\n\t\t\t\t\t\t\t<reference ref=\"923129638\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"344465982\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">650</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"38398561\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"587476981\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">649</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"225262690\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"587476981\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">648</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"923129638\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"587476981\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">655</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"922665584\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"429482039\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">657</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"757407638\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">659</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"445239525\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"429482039\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">661</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"960948370\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"429482039\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">665</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"788651749\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">668</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"758309769\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"429482039\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"flattenedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<string>-1.IBPluginDependency</string>\n\t\t\t\t\t<string>-2.IBPluginDependency</string>\n\t\t\t\t\t<string>-3.IBPluginDependency</string>\n\t\t\t\t\t<string>112.IBPluginDependency</string>\n\t\t\t\t\t<string>124.IBPluginDependency</string>\n\t\t\t\t\t<string>125.IBPluginDependency</string>\n\t\t\t\t\t<string>126.IBPluginDependency</string>\n\t\t\t\t\t<string>129.IBPluginDependency</string>\n\t\t\t\t\t<string>130.IBPluginDependency</string>\n\t\t\t\t\t<string>131.IBPluginDependency</string>\n\t\t\t\t\t<string>134.IBPluginDependency</string>\n\t\t\t\t\t<string>143.IBPluginDependency</string>\n\t\t\t\t\t<string>144.IBPluginDependency</string>\n\t\t\t\t\t<string>145.IBPluginDependency</string>\n\t\t\t\t\t<string>149.IBPluginDependency</string>\n\t\t\t\t\t<string>150.IBPluginDependency</string>\n\t\t\t\t\t<string>19.IBPluginDependency</string>\n\t\t\t\t\t<string>195.IBPluginDependency</string>\n\t\t\t\t\t<string>196.IBPluginDependency</string>\n\t\t\t\t\t<string>197.IBPluginDependency</string>\n\t\t\t\t\t<string>198.IBPluginDependency</string>\n\t\t\t\t\t<string>199.IBPluginDependency</string>\n\t\t\t\t\t<string>200.IBPluginDependency</string>\n\t\t\t\t\t<string>201.IBPluginDependency</string>\n\t\t\t\t\t<string>202.IBPluginDependency</string>\n\t\t\t\t\t<string>203.IBPluginDependency</string>\n\t\t\t\t\t<string>204.IBPluginDependency</string>\n\t\t\t\t\t<string>205.IBPluginDependency</string>\n\t\t\t\t\t<string>206.IBPluginDependency</string>\n\t\t\t\t\t<string>207.IBPluginDependency</string>\n\t\t\t\t\t<string>208.IBPluginDependency</string>\n\t\t\t\t\t<string>209.IBPluginDependency</string>\n\t\t\t\t\t<string>210.IBPluginDependency</string>\n\t\t\t\t\t<string>211.IBPluginDependency</string>\n\t\t\t\t\t<string>212.IBPluginDependency</string>\n\t\t\t\t\t<string>213.IBPluginDependency</string>\n\t\t\t\t\t<string>214.IBPluginDependency</string>\n\t\t\t\t\t<string>215.IBPluginDependency</string>\n\t\t\t\t\t<string>216.IBPluginDependency</string>\n\t\t\t\t\t<string>217.IBPluginDependency</string>\n\t\t\t\t\t<string>218.IBPluginDependency</string>\n\t\t\t\t\t<string>219.IBPluginDependency</string>\n\t\t\t\t\t<string>220.IBPluginDependency</string>\n\t\t\t\t\t<string>221.IBPluginDependency</string>\n\t\t\t\t\t<string>23.IBPluginDependency</string>\n\t\t\t\t\t<string>236.IBPluginDependency</string>\n\t\t\t\t\t<string>239.IBPluginDependency</string>\n\t\t\t\t\t<string>24.IBPluginDependency</string>\n\t\t\t\t\t<string>29.IBPluginDependency</string>\n\t\t\t\t\t<string>295.IBPluginDependency</string>\n\t\t\t\t\t<string>296.IBPluginDependency</string>\n\t\t\t\t\t<string>297.IBPluginDependency</string>\n\t\t\t\t\t<string>298.IBPluginDependency</string>\n\t\t\t\t\t<string>346.IBPluginDependency</string>\n\t\t\t\t\t<string>348.IBPluginDependency</string>\n\t\t\t\t\t<string>349.IBPluginDependency</string>\n\t\t\t\t\t<string>350.IBPluginDependency</string>\n\t\t\t\t\t<string>351.IBPluginDependency</string>\n\t\t\t\t\t<string>354.IBPluginDependency</string>\n\t\t\t\t\t<string>375.IBPluginDependency</string>\n\t\t\t\t\t<string>376.IBPluginDependency</string>\n\t\t\t\t\t<string>377.IBPluginDependency</string>\n\t\t\t\t\t<string>388.IBPluginDependency</string>\n\t\t\t\t\t<string>389.IBPluginDependency</string>\n\t\t\t\t\t<string>390.IBPluginDependency</string>\n\t\t\t\t\t<string>391.IBPluginDependency</string>\n\t\t\t\t\t<string>392.IBPluginDependency</string>\n\t\t\t\t\t<string>393.IBPluginDependency</string>\n\t\t\t\t\t<string>394.IBPluginDependency</string>\n\t\t\t\t\t<string>395.IBPluginDependency</string>\n\t\t\t\t\t<string>396.IBPluginDependency</string>\n\t\t\t\t\t<string>397.IBPluginDependency</string>\n\t\t\t\t\t<string>398.IBPluginDependency</string>\n\t\t\t\t\t<string>399.IBPluginDependency</string>\n\t\t\t\t\t<string>400.IBPluginDependency</string>\n\t\t\t\t\t<string>401.IBPluginDependency</string>\n\t\t\t\t\t<string>402.IBPluginDependency</string>\n\t\t\t\t\t<string>403.IBPluginDependency</string>\n\t\t\t\t\t<string>404.IBPluginDependency</string>\n\t\t\t\t\t<string>405.IBPluginDependency</string>\n\t\t\t\t\t<string>406.IBPluginDependency</string>\n\t\t\t\t\t<string>407.IBPluginDependency</string>\n\t\t\t\t\t<string>408.IBPluginDependency</string>\n\t\t\t\t\t<string>409.IBPluginDependency</string>\n\t\t\t\t\t<string>410.IBPluginDependency</string>\n\t\t\t\t\t<string>411.IBPluginDependency</string>\n\t\t\t\t\t<string>412.IBPluginDependency</string>\n\t\t\t\t\t<string>413.IBPluginDependency</string>\n\t\t\t\t\t<string>414.IBPluginDependency</string>\n\t\t\t\t\t<string>415.IBPluginDependency</string>\n\t\t\t\t\t<string>416.IBPluginDependency</string>\n\t\t\t\t\t<string>417.IBPluginDependency</string>\n\t\t\t\t\t<string>418.IBPluginDependency</string>\n\t\t\t\t\t<string>419.IBPluginDependency</string>\n\t\t\t\t\t<string>420.IBPluginDependency</string>\n\t\t\t\t\t<string>450.IBPluginDependency</string>\n\t\t\t\t\t<string>451.IBPluginDependency</string>\n\t\t\t\t\t<string>452.IBPluginDependency</string>\n\t\t\t\t\t<string>453.IBPluginDependency</string>\n\t\t\t\t\t<string>454.IBPluginDependency</string>\n\t\t\t\t\t<string>457.IBPluginDependency</string>\n\t\t\t\t\t<string>459.IBPluginDependency</string>\n\t\t\t\t\t<string>460.IBPluginDependency</string>\n\t\t\t\t\t<string>462.IBPluginDependency</string>\n\t\t\t\t\t<string>465.IBPluginDependency</string>\n\t\t\t\t\t<string>466.IBPluginDependency</string>\n\t\t\t\t\t<string>485.IBPluginDependency</string>\n\t\t\t\t\t<string>490.IBPluginDependency</string>\n\t\t\t\t\t<string>491.IBPluginDependency</string>\n\t\t\t\t\t<string>492.IBPluginDependency</string>\n\t\t\t\t\t<string>494.IBPluginDependency</string>\n\t\t\t\t\t<string>496.IBPluginDependency</string>\n\t\t\t\t\t<string>497.IBPluginDependency</string>\n\t\t\t\t\t<string>498.IBPluginDependency</string>\n\t\t\t\t\t<string>499.IBPluginDependency</string>\n\t\t\t\t\t<string>5.IBPluginDependency</string>\n\t\t\t\t\t<string>500.IBPluginDependency</string>\n\t\t\t\t\t<string>501.IBPluginDependency</string>\n\t\t\t\t\t<string>502.IBPluginDependency</string>\n\t\t\t\t\t<string>503.IBPluginDependency</string>\n\t\t\t\t\t<string>504.IBPluginDependency</string>\n\t\t\t\t\t<string>505.IBPluginDependency</string>\n\t\t\t\t\t<string>506.IBPluginDependency</string>\n\t\t\t\t\t<string>507.IBPluginDependency</string>\n\t\t\t\t\t<string>508.IBPluginDependency</string>\n\t\t\t\t\t<string>509.IBPluginDependency</string>\n\t\t\t\t\t<string>510.IBPluginDependency</string>\n\t\t\t\t\t<string>511.IBPluginDependency</string>\n\t\t\t\t\t<string>512.IBPluginDependency</string>\n\t\t\t\t\t<string>513.IBPluginDependency</string>\n\t\t\t\t\t<string>514.IBPluginDependency</string>\n\t\t\t\t\t<string>515.IBPluginDependency</string>\n\t\t\t\t\t<string>516.IBPluginDependency</string>\n\t\t\t\t\t<string>517.IBPluginDependency</string>\n\t\t\t\t\t<string>543.IBPluginDependency</string>\n\t\t\t\t\t<string>553.IBPluginDependency</string>\n\t\t\t\t\t<string>56.IBPluginDependency</string>\n\t\t\t\t\t<string>563.IBPluginDependency</string>\n\t\t\t\t\t<string>565.IBNSWindowAutoPositionCentersHorizontal</string>\n\t\t\t\t\t<string>565.IBNSWindowAutoPositionCentersVertical</string>\n\t\t\t\t\t<string>565.IBPluginDependency</string>\n\t\t\t\t\t<string>565.NSWindowTemplate.visibleAtLaunch</string>\n\t\t\t\t\t<string>566.IBPluginDependency</string>\n\t\t\t\t\t<string>57.IBPluginDependency</string>\n\t\t\t\t\t<string>609.IBPluginDependency</string>\n\t\t\t\t\t<string>610.CustomClassName</string>\n\t\t\t\t\t<string>610.IBPluginDependency</string>\n\t\t\t\t\t<string>611.IBPluginDependency</string>\n\t\t\t\t\t<string>612.IBPluginDependency</string>\n\t\t\t\t\t<string>613.IBNSWindowAutoPositionCentersHorizontal</string>\n\t\t\t\t\t<string>613.IBNSWindowAutoPositionCentersVertical</string>\n\t\t\t\t\t<string>613.IBPluginDependency</string>\n\t\t\t\t\t<string>613.NSWindowTemplate.visibleAtLaunch</string>\n\t\t\t\t\t<string>614.IBPluginDependency</string>\n\t\t\t\t\t<string>647.IBPluginDependency</string>\n\t\t\t\t\t<string>648.IBPluginDependency</string>\n\t\t\t\t\t<string>649.IBPluginDependency</string>\n\t\t\t\t\t<string>650.IBPluginDependency</string>\n\t\t\t\t\t<string>652.IBPluginDependency</string>\n\t\t\t\t\t<string>653.IBPluginDependency</string>\n\t\t\t\t\t<string>655.IBPluginDependency</string>\n\t\t\t\t\t<string>657.IBPluginDependency</string>\n\t\t\t\t\t<string>659.IBPluginDependency</string>\n\t\t\t\t\t<string>661.IBPluginDependency</string>\n\t\t\t\t\t<string>665.IBPluginDependency</string>\n\t\t\t\t\t<string>668.IBPluginDependency</string>\n\t\t\t\t\t<string>72.IBPluginDependency</string>\n\t\t\t\t\t<string>73.IBPluginDependency</string>\n\t\t\t\t\t<string>74.IBPluginDependency</string>\n\t\t\t\t\t<string>75.IBPluginDependency</string>\n\t\t\t\t\t<string>77.IBPluginDependency</string>\n\t\t\t\t\t<string>78.IBPluginDependency</string>\n\t\t\t\t\t<string>79.IBPluginDependency</string>\n\t\t\t\t\t<string>80.IBPluginDependency</string>\n\t\t\t\t\t<string>81.IBPluginDependency</string>\n\t\t\t\t\t<string>82.IBPluginDependency</string>\n\t\t\t\t\t<string>83.IBPluginDependency</string>\n\t\t\t\t\t<string>92.IBPluginDependency</string>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"NSArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"NO\"/>\n\t\t\t\t\t<boolean value=\"NO\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"NO\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>WindowInfoView</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"NO\"/>\n\t\t\t\t\t<boolean value=\"NO\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"NO\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"unlocalizedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<reference key=\"dict.values\" ref=\"0\"/>\n\t\t\t</object>\n\t\t\t<nil key=\"activeLocalization\"/>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"localizations\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<reference key=\"dict.values\" ref=\"0\"/>\n\t\t\t</object>\n\t\t\t<nil key=\"sourceID\"/>\n\t\t\t<int key=\"maxID\">677</int>\n\t\t</object>\n\t\t<object class=\"IBClassDescriber\" key=\"IBDocument.Classes\">\n\t\t\t<object class=\"NSMutableArray\" key=\"referencedPartialClassDescriptions\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">ConfigurationHelperView</string>\n\t\t\t\t\t<string key=\"superclassName\">NSView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/ConfigurationHelperView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SUUpdater</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"actions\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">checkForUpdates:</string>\n\t\t\t\t\t\t<string key=\"NS.object.0\">id</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"actionInfosByName\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">checkForUpdates:</string>\n\t\t\t\t\t\t<object class=\"IBActionInfo\" key=\"NS.object.0\">\n\t\t\t\t\t\t\t<string key=\"name\">checkForUpdates:</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">delegate</string>\n\t\t\t\t\t\t<string key=\"NS.object.0\">id</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"toOneOutletInfosByName\">\n\t\t\t\t\t\t<string key=\"NS.key.0\">delegate</string>\n\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\" key=\"NS.object.0\">\n\t\t\t\t\t\t\t<string key=\"name\">delegate</string>\n\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/SUUpdater.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">SlateAppDelegate</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>configHelper</string>\n\t\t\t\t\t\t\t<string>configHelperTextView</string>\n\t\t\t\t\t\t\t<string>statusMenu</string>\n\t\t\t\t\t\t\t<string>windowInfo</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>NSWindow</string>\n\t\t\t\t\t\t\t<string>NSTextView</string>\n\t\t\t\t\t\t\t<string>NSMenu</string>\n\t\t\t\t\t\t\t<string>NSWindow</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"toOneOutletInfosByName\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>configHelper</string>\n\t\t\t\t\t\t\t<string>configHelperTextView</string>\n\t\t\t\t\t\t\t<string>statusMenu</string>\n\t\t\t\t\t\t\t<string>windowInfo</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">configHelper</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSWindow</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">configHelperTextView</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSTextView</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">statusMenu</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSMenu</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">windowInfo</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSWindow</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/SlateAppDelegate.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">WindowInfoView</string>\n\t\t\t\t\t<string key=\"superclassName\">NSTextView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">./Classes/WindowInfoView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t</object>\n\t\t<int key=\"IBDocument.localizationMode\">0</int>\n\t\t<string key=\"IBDocument.TargetRuntimeIdentifier\">IBCocoaFramework</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDevelopmentDependencies\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>\n\t\t\t<integer value=\"3000\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<bool key=\"IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion\">YES</bool>\n\t\t<int key=\"IBDocument.defaultPropertyAccessControl\">3</int>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.LastKnownImageSizes\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<string>NSMenuCheckmark</string>\n\t\t\t\t<string>NSMenuMixedState</string>\n\t\t\t</object>\n\t\t\t<object class=\"NSArray\" key=\"dict.values\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<string>{11, 11}</string>\n\t\t\t\t<string>{10, 3}</string>\n\t\t\t</object>\n\t\t</object>\n\t</data>\n</archive>\n"
  },
  {
    "path": "Slate/initialize.js",
    "content": "(function(_controller, _info) {\n  var slate = window.slate = {\n    log: function() {\n      var msg = Array.prototype.slice.call(arguments, 0).join(\" \");\n      return _controller.log(msg);\n    },\n\n    config: function(key, callback) {\n      if (_.isFunction(callback)) {\n        return _controller.configFunction(key, callback);\n      } else if (_.isString(callback) || _.isNumber(callback) || _.isBoolean(callback)) {\n        return _controller.configNative(key, callback);\n      } else if (_.isArray(callback)) {\n        return _controller.configNative(key, callback.join(';'));\n      }\n      throw \"Invalid \"+key+\" \"+callback;\n    },\n\n    configAll: function(configMap) {\n      for (key in configMap) {\n        slate.config(key, configMap[key]);\n      }\n    },\n\n    bind: function(key, callback, repeat) {\n      if (_.isFunction(callback)) {\n        return _controller.bindFunction(key, callback, repeat);\n      } else if (_.isObject(callback)) {\n        return _controller.bindNative(key, callback, repeat);\n      }\n      throw \"bind failed, second parameter must be an operation or a function. was: \"+callback;\n    },\n\n    bindAll: function(bindMap) {\n      for(key in bindMap) {\n        if (_.isArray(bindMap[key]) && _.size(bindMap[key]) >= 2) {\n          slate.bind(key, bindMap[key][0], bindMap[key][1]);\n        } else if (_.isArray(bindMap[key]) && _.size(bindMap[key]) == 1) {\n          slate.bind(key, bindMap[key][0]);\n        } else {\n          slate.bind(key, bindMap[key]);\n        }\n      }\n    },\n\n    operationFromString: function(opString) {\n      if (!_.isString(opString)) {\n        throw \"Operation String must be a string. Was: \"+opString;\n      }\n      return _controller.operationFromString(opString);\n    },\n\n    operation : function(name, opts) {\n      if (!_.isString(name)) {\n        throw \"Operation name must be a string. Was: \"+name;\n      }\n      if (opts !== undefined && !_.isObject(opts)) {\n        throw \"Operation options must be undefined or a hash. Was: \"+opts;\n      }\n      return _controller.operation(name, opts);\n    },\n\n    doOperation : function(name, opts) {\n      if (!_.isString(name)) {\n        throw \"Operation name must be a string. Was: \"+name;\n      }\n      if (opts !== undefined && !_.isObject(opts)) {\n        throw \"Operation options must be undefined or a hash. Was: \"+opts;\n      }\n      return _controller.doOperation(name, opts);\n    },\n\n    source : function(path) {\n      if (!_.isString(path)) {\n        throw \"Source path must be a string. Was: \"+path;\n      }\n      return _controller.source(path);\n    },\n\n    layout : function(name, hash) {\n      if (!_.isString(name)) {\n        throw \"layout name must be a string. Was: \"+path;\n      }\n      if (!_.isObject(hash)) {\n        throw \"layout app hash should be a hash, was: \"+path;\n      }\n      return _controller.layout(name, hash);\n    },\n\n    default : function(screenConfig, thething) {\n      if (!_.isNumber(screenConfig) && !_.isString(screenConfig) && !_.isArray(screenConfig)) {\n        throw \"default screen config should be a number, string, or array, was: \"+screenConfig;\n      }\n      if (thething !== undefined && thething !== null &&\n          (_.isObject(thething) || _.isFunction(thething) || _.isString(thething))) {\n        return _controller.default(screenConfig, thething);\n      }\n      throw \"default action should be a function, operation, or string, was: \"+thething;\n    },\n\n    shell : function(commandAndArgs, wait, path) {\n      if (!_.isString(commandAndArgs)) {\n        throw \"shell command should be a string, was: \"+commandAndArgs;\n      }\n      if (path === null) { path = undefined; }\n      if (path !== undefined && !_.isString(path)) {\n        throw \"path should be undefined or a string, was: \"+path;\n      }\n      if (wait === null || wait === undefined) { wait = false; }\n      if (!_.isBoolean(wait)) {\n        throw \"wait should be a boolean, was: \"+wait;\n      }\n      return _controller.shell(commandAndArgs, wait, path);\n    },\n\n    on : function(what, callback) {\n      if (!_.isString(what)) {\n        throw \"on failed, first parameter must be a string. was: \"+what;\n      }\n      if (!_.isFunction(callback)) {\n        throw \"on failed, second parameter must be a function. was: \"+callback;\n      }\n      return _controller.on(what, callback);\n    }\n  };\n\n  window.S = window.slate;\n  window.S.cfg = window.S.config;\n  window.S.cfga = window.S.configAll;\n  window.S.bnd = window.S.bind;\n  window.S.bnda = window.S.bindAll;\n  window.S.op = window.S.operation;\n  window.S.doop = window.S.doOperation;\n  window.S.opstr = window.S.operationFromString;\n  window.S.src = window.S.source;\n  window.S.lay = window.S.layout;\n  window.S.def = window.S.default;\n  window.S.sh = window.S.shell;\n  window.S.info = _info;\n  var methods = window.S.info.jsMethods();\n  _.each(methods, function(method) {\n    if (window.S[method] !== undefined) {\n      throw \"OMGWTFBBQ!!!\";\n    }\n    window.S[method] = _.bind(_info[method], _info);\n  });\n  window.S.log(\"JS INIT FINISHED\");\n})(window._controller, window._info);\n"
  },
  {
    "path": "Slate/main.m",
    "content": "//\n//  main.m\n//  Slate\n//\n//  Created by Jigish Patel on 5/18/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <Cocoa/Cocoa.h>\n\nint main(int argc, char *argv[]) {\n  return NSApplicationMain(argc, (const char **)argv);\n}\n"
  },
  {
    "path": "Slate/slate-mock.js",
    "content": "var opNum = 0;\nwindow._controller = {\n  log : function(msg) {\n    console.log(msg);\n  },\n  bindFunction : function(k, c, r) {\n    console.log(\"Mock bind function \"+callback+\" to \"+k+\" with repeat \"+r);\n  },\n  bindNative : function(k, c, r) {\n    console.log(\"Mock bind operation \"+callback+\" to \"+k+\" with repeat \"+r);\n  },\n  configFunction : function(k, c) {\n    console.log(\"Mock config function \"+k+\" = \"+c);\n  },\n  configNative : function(k, c) {\n    console.log(\"Mock config native \"+k+\" = \"+c);\n  },\n  doOperation : function(op) {\n    console.log(\"Mock do operation \"+op);\n    return true;\n  },\n  operation : function(op, opts) {\n    console.log(\"Mock create operation \"+op+\" with opts \"+opts);\n    opNum++;\n    return \"javascript:operation[\"+opNum+\"]\";\n  },\n  operationFromString : function(str) {\n    opNum++;\n    return \"javascript:operation[\"+opNum+\"]\";\n  }\n}\n"
  },
  {
    "path": "Slate/slate-test.html",
    "content": "<html>\n  <head>\n    <script src='underscore.js'></script>\n    <script src='slate-mock.js'></script>\n    <script src='initialize.js'></script>\n  </head>\n  <body>\n  </body>\n</html>\n"
  },
  {
    "path": "Slate/underscore.js",
    "content": "(function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,v=e.reduce,h=e.reduceRight,g=e.filter,d=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,_=Object.keys,j=i.bind,w=function(n){return n instanceof w?n:this instanceof w?(this._wrapped=n,void 0):new w(n)};\"undefined\"!=typeof exports?(\"undefined\"!=typeof module&&module.exports&&(exports=module.exports=w),exports._=w):n._=w,w.VERSION=\"1.4.3\";var A=w.each=w.forEach=function(n,t,e){if(null!=n)if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a in n)if(w.has(n,a)&&t.call(e,n[a],a,n)===r)return};w.map=w.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e[e.length]=t.call(r,n,u,i)}),e)};var O=\"Reduce of empty array with no initial value\";w.reduce=w.foldl=w.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduce===v)return e&&(t=w.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(O);return r},w.reduceRight=w.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduceRight===h)return e&&(t=w.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=w.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(O);return r},w.find=w.detect=function(n,t,r){var e;return E(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},w.filter=w.select=function(n,t,r){var e=[];return null==n?e:g&&n.filter===g?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&(e[e.length]=n)}),e)},w.reject=function(n,t,r){return w.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},w.every=w.all=function(n,t,e){t||(t=w.identity);var u=!0;return null==n?u:d&&n.every===d?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var E=w.some=w.any=function(n,t,e){t||(t=w.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};w.contains=w.include=function(n,t){return null==n?!1:y&&n.indexOf===y?-1!=n.indexOf(t):E(n,function(n){return n===t})},w.invoke=function(n,t){var r=o.call(arguments,2);return w.map(n,function(n){return(w.isFunction(t)?t:n[t]).apply(n,r)})},w.pluck=function(n,t){return w.map(n,function(n){return n[t]})},w.where=function(n,t){return w.isEmpty(t)?[]:w.filter(n,function(n){for(var r in t)if(t[r]!==n[r])return!1;return!0})},w.max=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.max.apply(Math,n);if(!t&&w.isEmpty(n))return-1/0;var e={computed:-1/0,value:-1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a>=e.computed&&(e={value:n,computed:a})}),e.value},w.min=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.min.apply(Math,n);if(!t&&w.isEmpty(n))return 1/0;var e={computed:1/0,value:1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;e.computed>a&&(e={value:n,computed:a})}),e.value},w.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=w.random(r++),e[r-1]=e[t],e[t]=n}),e};var F=function(n){return w.isFunction(n)?n:function(t){return t[n]}};w.sortBy=function(n,t,r){var e=F(t);return w.pluck(w.map(n,function(n,t,u){return{value:n,index:t,criteria:e.call(r,n,t,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||void 0===r)return 1;if(e>r||void 0===e)return-1}return n.index<t.index?-1:1}),\"value\")};var k=function(n,t,r,e){var u={},i=F(t||w.identity);return A(n,function(t,a){var o=i.call(r,t,a,n);e(u,o,t)}),u};w.groupBy=function(n,t,r){return k(n,t,r,function(n,t,r){(w.has(n,t)?n[t]:n[t]=[]).push(r)})},w.countBy=function(n,t,r){return k(n,t,r,function(n,t){w.has(n,t)||(n[t]=0),n[t]++})},w.sortedIndex=function(n,t,r,e){r=null==r?w.identity:F(r);for(var u=r.call(e,t),i=0,a=n.length;a>i;){var o=i+a>>>1;u>r.call(e,n[o])?i=o+1:a=o}return i},w.toArray=function(n){return n?w.isArray(n)?o.call(n):n.length===+n.length?w.map(n,w.identity):w.values(n):[]},w.size=function(n){return null==n?0:n.length===+n.length?n.length:w.keys(n).length},w.first=w.head=w.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:o.call(n,0,t)},w.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},w.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},w.rest=w.tail=w.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},w.compact=function(n){return w.filter(n,w.identity)};var R=function(n,t,r){return A(n,function(n){w.isArray(n)?t?a.apply(r,n):R(n,t,r):r.push(n)}),r};w.flatten=function(n,t){return R(n,t,[])},w.without=function(n){return w.difference(n,o.call(arguments,1))},w.uniq=w.unique=function(n,t,r,e){w.isFunction(t)&&(e=r,r=t,t=!1);var u=r?w.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:w.contains(a,r))||(a.push(r),i.push(n[e]))}),i},w.union=function(){return w.uniq(c.apply(e,arguments))},w.intersection=function(n){var t=o.call(arguments,1);return w.filter(w.uniq(n),function(n){return w.every(t,function(t){return w.indexOf(t,n)>=0})})},w.difference=function(n){var t=c.apply(e,o.call(arguments,1));return w.filter(n,function(n){return!w.contains(t,n)})},w.zip=function(){for(var n=o.call(arguments),t=w.max(w.pluck(n,\"length\")),r=Array(t),e=0;t>e;e++)r[e]=w.pluck(n,\"\"+e);return r},w.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},w.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if(\"number\"!=typeof r)return e=w.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},w.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},w.range=function(n,t,r){1>=arguments.length&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=Array(e);e>u;)i[u++]=n,n+=r;return i};var I=function(){};w.bind=function(n,t){var r,e;if(n.bind===j&&j)return j.apply(n,o.call(arguments,1));if(!w.isFunction(n))throw new TypeError;return r=o.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(o.call(arguments)));I.prototype=n.prototype;var u=new I;I.prototype=null;var i=n.apply(u,r.concat(o.call(arguments)));return Object(i)===i?i:u}},w.bindAll=function(n){var t=o.call(arguments,1);return 0==t.length&&(t=w.functions(n)),A(t,function(t){n[t]=w.bind(n[t],n)}),n},w.memoize=function(n,t){var r={};return t||(t=w.identity),function(){var e=t.apply(this,arguments);return w.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},w.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},w.defer=function(n){return w.delay.apply(w,[n,1].concat(o.call(arguments,1)))},w.throttle=function(n,t){var r,e,u,i,a=0,o=function(){a=new Date,u=null,i=n.apply(r,e)};return function(){var c=new Date,l=t-(c-a);return r=this,e=arguments,0>=l?(clearTimeout(u),u=null,a=c,i=n.apply(r,e)):u||(u=setTimeout(o,l)),i}},w.debounce=function(n,t,r){var e,u;return function(){var i=this,a=arguments,o=function(){e=null,r||(u=n.apply(i,a))},c=r&&!e;return clearTimeout(e),e=setTimeout(o,t),c&&(u=n.apply(i,a)),u}},w.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},w.wrap=function(n,t){return function(){var r=[n];return a.apply(r,arguments),t.apply(this,r)}},w.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},w.after=function(n,t){return 0>=n?t():function(){return 1>--n?t.apply(this,arguments):void 0}},w.keys=_||function(n){if(n!==Object(n))throw new TypeError(\"Invalid object\");var t=[];for(var r in n)w.has(n,r)&&(t[t.length]=r);return t},w.values=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push(n[r]);return t},w.pairs=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push([r,n[r]]);return t},w.invert=function(n){var t={};for(var r in n)w.has(n,r)&&(t[n[r]]=r);return t},w.functions=w.methods=function(n){var t=[];for(var r in n)w.isFunction(n[r])&&t.push(r);return t.sort()},w.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},w.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},w.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)w.contains(r,u)||(t[u]=n[u]);return t},w.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)null==n[r]&&(n[r]=t[r])}),n},w.clone=function(n){return w.isObject(n)?w.isArray(n)?n.slice():w.extend({},n):n},w.tap=function(n,t){return t(n),n};var S=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof w&&(n=n._wrapped),t instanceof w&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case\"[object String]\":return n==t+\"\";case\"[object Number]\":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case\"[object Date]\":case\"[object Boolean]\":return+n==+t;case\"[object RegExp]\":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if(\"object\"!=typeof n||\"object\"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;r.push(n),e.push(t);var a=0,o=!0;if(\"[object Array]\"==u){if(a=n.length,o=a==t.length)for(;a--&&(o=S(n[a],t[a],r,e)););}else{var c=n.constructor,f=t.constructor;if(c!==f&&!(w.isFunction(c)&&c instanceof c&&w.isFunction(f)&&f instanceof f))return!1;for(var s in n)if(w.has(n,s)&&(a++,!(o=w.has(t,s)&&S(n[s],t[s],r,e))))break;if(o){for(s in t)if(w.has(t,s)&&!a--)break;o=!a}}return r.pop(),e.pop(),o};w.isEqual=function(n,t){return S(n,t,[],[])},w.isEmpty=function(n){if(null==n)return!0;if(w.isArray(n)||w.isString(n))return 0===n.length;for(var t in n)if(w.has(n,t))return!1;return!0},w.isElement=function(n){return!(!n||1!==n.nodeType)},w.isArray=x||function(n){return\"[object Array]\"==l.call(n)},w.isObject=function(n){return n===Object(n)},A([\"Arguments\",\"Function\",\"String\",\"Number\",\"Date\",\"RegExp\"],function(n){w[\"is\"+n]=function(t){return l.call(t)==\"[object \"+n+\"]\"}}),w.isArguments(arguments)||(w.isArguments=function(n){return!(!n||!w.has(n,\"callee\"))}),w.isFunction=function(n){return\"function\"==typeof n},w.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},w.isNaN=function(n){return w.isNumber(n)&&n!=+n},w.isBoolean=function(n){return n===!0||n===!1||\"[object Boolean]\"==l.call(n)},w.isNull=function(n){return null===n},w.isUndefined=function(n){return void 0===n},w.has=function(n,t){return f.call(n,t)},w.noConflict=function(){return n._=t,this},w.identity=function(n){return n},w.times=function(n,t,r){for(var e=Array(n),u=0;n>u;u++)e[u]=t.call(r,u);return e},w.random=function(n,t){return null==t&&(t=n,n=0),n+(0|Math.random()*(t-n+1))};var T={escape:{\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#x27;\",\"/\":\"&#x2F;\"}};T.unescape=w.invert(T.escape);var M={escape:RegExp(\"[\"+w.keys(T.escape).join(\"\")+\"]\",\"g\"),unescape:RegExp(\"(\"+w.keys(T.unescape).join(\"|\")+\")\",\"g\")};w.each([\"escape\",\"unescape\"],function(n){w[n]=function(t){return null==t?\"\":(\"\"+t).replace(M[n],function(t){return T[n][t]})}}),w.result=function(n,t){if(null==n)return null;var r=n[t];return w.isFunction(r)?r.call(n):r},w.mixin=function(n){A(w.functions(n),function(t){var r=w[t]=n[t];w.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),z.call(this,r.apply(w,n))}})};var N=0;w.uniqueId=function(n){var t=\"\"+ ++N;return n?n+t:t},w.templateSettings={evaluate:/<%([\\s\\S]+?)%>/g,interpolate:/<%=([\\s\\S]+?)%>/g,escape:/<%-([\\s\\S]+?)%>/g};var q=/(.)^/,B={\"'\":\"'\",\"\\\\\":\"\\\\\",\"\\r\":\"r\",\"\\n\":\"n\",\"\t\":\"t\",\"\\u2028\":\"u2028\",\"\\u2029\":\"u2029\"},D=/\\\\|'|\\r|\\n|\\t|\\u2028|\\u2029/g;w.template=function(n,t,r){r=w.defaults({},r,w.templateSettings);var e=RegExp([(r.escape||q).source,(r.interpolate||q).source,(r.evaluate||q).source].join(\"|\")+\"|$\",\"g\"),u=0,i=\"__p+='\";n.replace(e,function(t,r,e,a,o){return i+=n.slice(u,o).replace(D,function(n){return\"\\\\\"+B[n]}),r&&(i+=\"'+\\n((__t=(\"+r+\"))==null?'':_.escape(__t))+\\n'\"),e&&(i+=\"'+\\n((__t=(\"+e+\"))==null?'':__t)+\\n'\"),a&&(i+=\"';\\n\"+a+\"\\n__p+='\"),u=o+t.length,t}),i+=\"';\\n\",r.variable||(i=\"with(obj||{}){\\n\"+i+\"}\\n\"),i=\"var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\\n\"+i+\"return __p;\\n\";try{var a=Function(r.variable||\"obj\",\"_\",i)}catch(o){throw o.source=i,o}if(t)return a(t,w);var c=function(n){return a.call(this,n,w)};return c.source=\"function(\"+(r.variable||\"obj\")+\"){\\n\"+i+\"}\",c},w.chain=function(n){return w(n).chain()};var z=function(n){return this._chain?w(n).chain():n};w.mixin(w),A([\"pop\",\"push\",\"reverse\",\"shift\",\"sort\",\"splice\",\"unshift\"],function(n){var t=e[n];w.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),\"shift\"!=n&&\"splice\"!=n||0!==r.length||delete r[0],z.call(this,r)}}),A([\"concat\",\"join\",\"slice\"],function(n){var t=e[n];w.prototype[n]=function(){return z.call(this,t.apply(this._wrapped,arguments))}}),w.extend(w.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this);"
  },
  {
    "path": "Slate/utils.js",
    "content": "(function(controller) {\n  for (key in _) {\n    window[\"_\"+key+\"_\"] = _[key];\n  }\n\n  var _typeof_ = window._typeof_ = function(obj) {\n    if (_.isString(obj)) { return \"string\"; }\n    if (_.isArray(obj)) { return \"array\"; }\n    if (_.isFunction(obj)) { return \"function\"; }\n    if (_.isObject(obj)) { return \"object\"; }\n    if (_.isNumber(obj)) { return \"number\"; }\n    if (_.isBoolean(obj)) { return \"boolean\"; }\n    return \"unknown\";\n  }\n\n  var _array_ = window._array_ = function() { return []; }\n  var _array_with_ = window._array_with_ = function() { return Array.prototype.slice.call(arguments, 0); }\n  var _hash_ = window._hash_ = function() { return {}; }\n})(window._controller);"
  },
  {
    "path": "Slate.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\t3AA7D09116A6ED1200C81A67 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3AA7D09016A6ED1200C81A67 /* WebKit.framework */; };\n\t\t3AA7D09516A6EE0200C81A67 /* JSController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AA7D09416A6EE0200C81A67 /* JSController.m */; };\n\t\t3AA7D09D16A6FC9B00C81A67 /* initialize.js in Resources */ = {isa = PBXBuildFile; fileRef = 3AA7D09A16A6FAE100C81A67 /* initialize.js */; };\n\t\t3B1E86EE16B3627A001B9090 /* JSOperationWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B1E86ED16B3627A001B9090 /* JSOperationWrapper.m */; };\n\t\t3B3335AD14FC1EA900F72638 /* WindowInfoView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B3335AC14FC1EA900F72638 /* WindowInfoView.m */; };\n\t\t3B34F39115462323004090BB /* NSFileManager+ApplicationSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B34F39015462323004090BB /* NSFileManager+ApplicationSupport.m */; };\n\t\t3B38E04816AB8BBF00603901 /* underscore.js in Resources */ = {isa = PBXBuildFile; fileRef = 3B38E04616AB8B3500603901 /* underscore.js */; };\n\t\t3B3C41A01501ADC600C1E927 /* HintOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B3C419F1501ADC600C1E927 /* HintOperation.m */; };\n\t\t3B3C41A31501BE8600C1E927 /* HintWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B3C41A21501BE8600C1E927 /* HintWindow.m */; };\n\t\t3B3E241013A5F59E00B0D762 /* WindowState.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B3E240F13A5F59E00B0D762 /* WindowState.m */; };\n\t\t3B40AC2113A73530006C9A5C /* Layout.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B40AC2013A73530006C9A5C /* Layout.m */; };\n\t\t3B40AC2413A743B0006C9A5C /* LayoutOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B40AC2313A743AF006C9A5C /* LayoutOperation.m */; };\n\t\t3B42D72F13A831E7009103A0 /* ApplicationOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B42D72E13A831E6009103A0 /* ApplicationOptions.m */; };\n\t\t3B4CDD00150ACA6800B819E2 /* SwitchOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B4CDCFF150ACA6800B819E2 /* SwitchOperation.m */; };\n\t\t3B4CDD03150AD68000B819E2 /* SwitchView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B4CDD02150AD68000B819E2 /* SwitchView.m */; };\n\t\t3B4CDD06150AD69500B819E2 /* SwitchWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B4CDD05150AD69500B819E2 /* SwitchWindow.m */; };\n\t\t3B58153C1502FB7D0078D568 /* HintView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B58153B1502FB7D0078D568 /* HintView.m */; };\n\t\t3B5B1B7C1665871E00D5B1B5 /* UndoOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B5B1B7B1665871D00D5B1B5 /* UndoOperation.m */; };\n\t\t3B65CF251576CDF10063D298 /* ASCIIToCode_Dvorak.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B65CF241576CDF10063D298 /* ASCIIToCode_Dvorak.plist */; };\n\t\t3B66A56213ADBDFD0015EDD5 /* ScreenWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B66A56113ADBDFD0015EDD5 /* ScreenWrapper.m */; };\n\t\t3B7DDCDF16AE1E290087CD12 /* JSInfoWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B7DDCDE16AE1E290087CD12 /* JSInfoWrapper.m */; };\n\t\t3B7DDCE416AE301D0087CD12 /* JSWindowWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B7DDCE316AE301D0087CD12 /* JSWindowWrapper.m */; };\n\t\t3B7DDCE716AE35840087CD12 /* JSApplicationWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B7DDCE616AE35840087CD12 /* JSApplicationWrapper.m */; };\n\t\t3B7DDCEA16AE90FF0087CD12 /* JSScreenWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B7DDCE916AE90FF0087CD12 /* JSScreenWrapper.m */; };\n\t\t3B7EB3A7138F3F6800EBEC2B /* ResizeOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B7EB3A6138F3F6800EBEC2B /* ResizeOperation.m */; };\n\t\t3B7EB475138F691800EBEC2B /* Constants.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B7EB474138F691800EBEC2B /* Constants.m */; };\n\t\t3B7EB4CC138F72D900EBEC2B /* StringTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B7EB4CB138F72D900EBEC2B /* StringTokenizer.m */; };\n\t\t3B84A552150552DC006E2194 /* ConfigurationHelperView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B84A551150552DC006E2194 /* ConfigurationHelperView.m */; };\n\t\t3B883A0D1627725200FF3D8C /* RelaunchOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B883A0C1627725200FF3D8C /* RelaunchOperation.m */; };\n\t\t3B8B5523161A1E5C00E21A6C /* NSString+Indicies.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B8B5522161A1E5C00E21A6C /* NSString+Indicies.m */; };\n\t\t3B8B5527161A1FDF00E21A6C /* TestNSString+Indicies.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B8B5526161A1FDF00E21A6C /* TestNSString+Indicies.m */; };\n\t\t3B9B3007151BDD960069D95E /* RunningApplications.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B9B3006151BDD960069D95E /* RunningApplications.m */; };\n\t\t3B9B301E151BFC330069D95E /* SwitchAppView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B9B301D151BFC330069D95E /* SwitchAppView.m */; };\n\t\t3B9B3021151C830F0069D95E /* SwitchAppQuittingOverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B9B3020151C830E0069D95E /* SwitchAppQuittingOverlayView.m */; };\n\t\t3BA1BA58162DD3630026774E /* TestNSString+Levenshtein.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BA1BA57162DD3630026774E /* TestNSString+Levenshtein.m */; };\n\t\t3BA1BA5C162DD7190026774E /* TestMathUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BA1BA5B162DD7190026774E /* TestMathUtils.m */; };\n\t\t3BA1BA62162DDFEF0026774E /* TestExpressionPoint.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BA1BA61162DDFEF0026774E /* TestExpressionPoint.m */; };\n\t\t3BA1BA65162E01A30026774E /* TestStringTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BA1BA64162E01A20026774E /* TestStringTokenizer.m */; };\n\t\t3BA1BA68162F3E530026774E /* ShellOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BA1BA67162F3E530026774E /* ShellOperation.m */; };\n\t\t3BA1BA6B162F4CFF0026774E /* ShellUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BA1BA6A162F4CFF0026774E /* ShellUtils.m */; };\n\t\t3BA1BA6E162F51760026774E /* TestShellUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BA1BA6D162F51760026774E /* TestShellUtils.m */; };\n\t\t3BA7485913B1D0F500CFA792 /* MathUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BA7485813B1D0F500CFA792 /* MathUtils.m */; };\n\t\t3BA85C9A16276DAB00FAAF0B /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3BA85C9916276DAB00FAAF0B /* Sparkle.framework */; };\n\t\t3BA85C9B16276E9E00FAAF0B /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 3BA85C9916276DAB00FAAF0B /* Sparkle.framework */; };\n\t\t3BADA37213A2C1ED009E21D8 /* AccessibilityWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BADA37113A2C1ED009E21D8 /* AccessibilityWrapper.m */; };\n\t\t3BB5380413AEDA1B0005CFFC /* ScreenState.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BB5380313AEDA190005CFFC /* ScreenState.m */; };\n\t\t3BBD24BA1580206C00940ABF /* default.slate in Resources */ = {isa = PBXBuildFile; fileRef = 3BBD24B91580206C00940ABF /* default.slate */; };\n\t\t3BC9E96F15005925002FD1FA /* ActivateSnapshotOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BC9E96E15005925002FD1FA /* ActivateSnapshotOperation.m */; };\n\t\t3BC9E97315005F8F002FD1FA /* NSString+Levenshtein.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BC9E97215005F8F002FD1FA /* NSString+Levenshtein.m */; };\n\t\t3BCE40F513B15FF300804615 /* FocusOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BCE40F413B15FF300804615 /* FocusOperation.m */; };\n\t\t3BD8191D14FDC0CE003D63BC /* DeleteSnapshotOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BD8191C14FDC0CE003D63BC /* DeleteSnapshotOperation.m */; };\n\t\t3BDC2B5B1391C55400B0D151 /* ChainOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BDC2B5A1391C55400B0D151 /* ChainOperation.m */; };\n\t\t3BDDA17A14FD95E200829D2A /* SnapshotOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BDDA17914FD95E200829D2A /* SnapshotOperation.m */; };\n\t\t3BDDA17D14FDA50C00829D2A /* Snapshot.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BDDA17C14FDA50C00829D2A /* Snapshot.m */; };\n\t\t3BDDA18014FDA55600829D2A /* WindowSnapshot.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BDDA17F14FDA55600829D2A /* WindowSnapshot.m */; };\n\t\t3BDDA18314FDAA6600829D2A /* SnapshotList.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BDDA18214FDAA6600829D2A /* SnapshotList.m */; };\n\t\t3BE0736816AF3C9B00D33DB0 /* utils.js in Resources */ = {isa = PBXBuildFile; fileRef = 3BE0736516AF3C3F00D33DB0 /* utils.js */; };\n\t\t3BE0736B16AF735A00D33DB0 /* JSWrapperUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BE0736A16AF735A00D33DB0 /* JSWrapperUtils.m */; };\n\t\t3BE0736E16AFB5CA00D33DB0 /* JSOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BE0736D16AFB5CA00D33DB0 /* JSOperation.m */; };\n\t\t3BE702B3161F9D5000260716 /* SequenceOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BE702B2161F9D5000260716 /* SequenceOperation.m */; };\n\t\t3BF39E1214FDB16F0083E9C4 /* JSONKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BF39E1114FDB16F0083E9C4 /* JSONKit.m */; settings = {COMPILER_FLAGS = \"-fno-objc-arc\"; }; };\n\t\t3BF57C9B1621686900C0F89B /* statusActive.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 3BF57C9A1621686900C0F89B /* statusActive.pdf */; };\n\t\t3BF57C9E16216C2200C0F89B /* VisibilityOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BF57C9D16216C2200C0F89B /* VisibilityOperation.m */; };\n\t\t3BFC8A6A15FAAD9D00B16139 /* GridOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BFC8A6915FAAD9D00B16139 /* GridOperation.m */; };\n\t\t3BFC8A6D15FABC9700B16139 /* GridView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BFC8A6C15FABC9600B16139 /* GridView.m */; };\n\t\t3BFC8A7015FABCBE00B16139 /* GridWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BFC8A6F15FABCBD00B16139 /* GridWindow.m */; };\n\t\t3BFC8A7315FE5CD700B16139 /* GridCellView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BFC8A7215FE5CD700B16139 /* GridCellView.m */; };\n\t\t3BFF7D7116AC784B00A8CB0E /* PushOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BFF7D7016AC784A00A8CB0E /* PushOperation.m */; };\n\t\t3BFF7D7516AC7B3D00A8CB0E /* NudgeOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BFF7D7416AC7B3C00A8CB0E /* NudgeOperation.m */; };\n\t\t3BFF7D7816AC7E2900A8CB0E /* ThrowOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BFF7D7716AC7E2800A8CB0E /* ThrowOperation.m */; };\n\t\t3BFF7D7B16AC7FF600A8CB0E /* CornerOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BFF7D7A16AC7FF600A8CB0E /* CornerOperation.m */; };\n\t\t4747E1EF13877C160005180C /* icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 4747E1EE13877C150005180C /* icon.icns */; };\n\t\t4786D53513882381004554B1 /* ASCIIToCode.plist in Resources */ = {isa = PBXBuildFile; fileRef = 4786D53413882381004554B1 /* ASCIIToCode.plist */; };\n\t\t47C4A2941384E8890066B6DE /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 47C4A2931384E8890066B6DE /* Cocoa.framework */; };\n\t\t47C4A29E1384E8890066B6DE /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 47C4A29C1384E8890066B6DE /* InfoPlist.strings */; };\n\t\t47C4A2A11384E8890066B6DE /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 47C4A2A01384E8890066B6DE /* main.m */; };\n\t\t47C4A2A41384E8890066B6DE /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 47C4A2A21384E8890066B6DE /* Credits.rtf */; };\n\t\t47C4A2A71384E8890066B6DE /* SlateAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 47C4A2A61384E8890066B6DE /* SlateAppDelegate.m */; };\n\t\t47C4A2AA1384E8890066B6DE /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 47C4A2A81384E8890066B6DE /* MainMenu.xib */; };\n\t\t47C4A2B11384E8890066B6DE /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 47C4A2931384E8890066B6DE /* Cocoa.framework */; };\n\t\t47C4A2B91384E8890066B6DE /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 47C4A2B71384E8890066B6DE /* InfoPlist.strings */; };\n\t\t47C4A2BC1384E8890066B6DE /* SlateTests.h in Resources */ = {isa = PBXBuildFile; fileRef = 47C4A2BB1384E8890066B6DE /* SlateTests.h */; };\n\t\t47C4A2BE1384E8890066B6DE /* SlateTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 47C4A2BD1384E8890066B6DE /* SlateTests.m */; };\n\t\t47C4A2C81384E8B10066B6DE /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 47C4A2C71384E8B10066B6DE /* Carbon.framework */; };\n\t\t47C4A2CB1384EA510066B6DE /* SlateConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 47C4A2CA1384EA510066B6DE /* SlateConfig.m */; };\n\t\t47C4A2CE1384F26A0066B6DE /* Binding.m in Sources */ = {isa = PBXBuildFile; fileRef = 47C4A2CD1384F26A0066B6DE /* Binding.m */; };\n\t\t47C4A2D11384F3E10066B6DE /* Operation.m in Sources */ = {isa = PBXBuildFile; fileRef = 47C4A2D01384F3E10066B6DE /* Operation.m */; };\n\t\t47C4A2D41384F4A60066B6DE /* MoveOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 47C4A2D31384F4A60066B6DE /* MoveOperation.m */; };\n\t\t47C4A2D71384F5DE0066B6DE /* ExpressionPoint.m in Sources */ = {isa = PBXBuildFile; fileRef = 47C4A2D61384F5DE0066B6DE /* ExpressionPoint.m */; };\n\t\t5EB99A0216A7526400760915 /* ASCIIToCode_Azerty.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5EB99A0116A7526400760915 /* ASCIIToCode_Azerty.plist */; };\n\t\t7F44A9AA16621A9D00222908 /* ASCIIToCode_Colemak.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7F44A9A916621A9D00222908 /* ASCIIToCode_Colemak.plist */; };\n\t\tB3D087D0160577FB008A7FC6 /* status.pdf in Resources */ = {isa = PBXBuildFile; fileRef = B3D087CF160577FB008A7FC6 /* status.pdf */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t47C4A2B21384E8890066B6DE /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 47C4A2861384E8890066B6DE /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 47C4A28E1384E8890066B6DE;\n\t\t\tremoteInfo = Slate;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t3B4D0C3615A3691900B39242 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t3BA85C9B16276E9E00FAAF0B /* Sparkle.framework in CopyFiles */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t3AA7D09016A6ED1200C81A67 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };\n\t\t3AA7D09316A6EE0200C81A67 /* JSController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSController.h; sourceTree = \"<group>\"; };\n\t\t3AA7D09416A6EE0200C81A67 /* JSController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSController.m; sourceTree = \"<group>\"; };\n\t\t3AA7D09A16A6FAE100C81A67 /* initialize.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = initialize.js; sourceTree = \"<group>\"; };\n\t\t3B1E86EC16B3627A001B9090 /* JSOperationWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSOperationWrapper.h; sourceTree = \"<group>\"; };\n\t\t3B1E86ED16B3627A001B9090 /* JSOperationWrapper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSOperationWrapper.m; sourceTree = \"<group>\"; };\n\t\t3B3335AB14FC1EA900F72638 /* WindowInfoView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WindowInfoView.h; sourceTree = \"<group>\"; };\n\t\t3B3335AC14FC1EA900F72638 /* WindowInfoView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WindowInfoView.m; sourceTree = \"<group>\"; };\n\t\t3B34F38F15462323004090BB /* NSFileManager+ApplicationSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSFileManager+ApplicationSupport.h\"; sourceTree = \"<group>\"; };\n\t\t3B34F39015462323004090BB /* NSFileManager+ApplicationSupport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSFileManager+ApplicationSupport.m\"; sourceTree = \"<group>\"; };\n\t\t3B38E04616AB8B3500603901 /* underscore.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = underscore.js; sourceTree = \"<group>\"; };\n\t\t3B3C419E1501ADC600C1E927 /* HintOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HintOperation.h; sourceTree = \"<group>\"; };\n\t\t3B3C419F1501ADC600C1E927 /* HintOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HintOperation.m; sourceTree = \"<group>\"; };\n\t\t3B3C41A11501BE8500C1E927 /* HintWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HintWindow.h; sourceTree = \"<group>\"; };\n\t\t3B3C41A21501BE8600C1E927 /* HintWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HintWindow.m; sourceTree = \"<group>\"; };\n\t\t3B3E240E13A5F59E00B0D762 /* WindowState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WindowState.h; sourceTree = \"<group>\"; };\n\t\t3B3E240F13A5F59E00B0D762 /* WindowState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WindowState.m; sourceTree = \"<group>\"; };\n\t\t3B40AC1F13A73530006C9A5C /* Layout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Layout.h; sourceTree = \"<group>\"; };\n\t\t3B40AC2013A73530006C9A5C /* Layout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Layout.m; sourceTree = \"<group>\"; };\n\t\t3B40AC2213A743AE006C9A5C /* LayoutOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LayoutOperation.h; sourceTree = \"<group>\"; };\n\t\t3B40AC2313A743AF006C9A5C /* LayoutOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LayoutOperation.m; sourceTree = \"<group>\"; };\n\t\t3B42D72D13A831E6009103A0 /* ApplicationOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApplicationOptions.h; sourceTree = \"<group>\"; };\n\t\t3B42D72E13A831E6009103A0 /* ApplicationOptions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ApplicationOptions.m; sourceTree = \"<group>\"; };\n\t\t3B4CDCFE150ACA6800B819E2 /* SwitchOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SwitchOperation.h; sourceTree = \"<group>\"; };\n\t\t3B4CDCFF150ACA6800B819E2 /* SwitchOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SwitchOperation.m; sourceTree = \"<group>\"; };\n\t\t3B4CDD01150AD68000B819E2 /* SwitchView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SwitchView.h; sourceTree = \"<group>\"; };\n\t\t3B4CDD02150AD68000B819E2 /* SwitchView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SwitchView.m; sourceTree = \"<group>\"; };\n\t\t3B4CDD04150AD69500B819E2 /* SwitchWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SwitchWindow.h; sourceTree = \"<group>\"; };\n\t\t3B4CDD05150AD69500B819E2 /* SwitchWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SwitchWindow.m; sourceTree = \"<group>\"; };\n\t\t3B58153A1502FB7D0078D568 /* HintView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HintView.h; sourceTree = \"<group>\"; };\n\t\t3B58153B1502FB7D0078D568 /* HintView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HintView.m; sourceTree = \"<group>\"; };\n\t\t3B58154215054EBD0078D568 /* SlateLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SlateLogger.h; sourceTree = \"<group>\"; };\n\t\t3B5B1B7A1665871D00D5B1B5 /* UndoOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UndoOperation.h; sourceTree = \"<group>\"; };\n\t\t3B5B1B7B1665871D00D5B1B5 /* UndoOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UndoOperation.m; sourceTree = \"<group>\"; };\n\t\t3B65CF241576CDF10063D298 /* ASCIIToCode_Dvorak.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = ASCIIToCode_Dvorak.plist; sourceTree = \"<group>\"; };\n\t\t3B66A56013ADBDFD0015EDD5 /* ScreenWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScreenWrapper.h; sourceTree = \"<group>\"; };\n\t\t3B66A56113ADBDFD0015EDD5 /* ScreenWrapper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScreenWrapper.m; sourceTree = \"<group>\"; };\n\t\t3B7DDCDD16AE1E290087CD12 /* JSInfoWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSInfoWrapper.h; sourceTree = \"<group>\"; };\n\t\t3B7DDCDE16AE1E290087CD12 /* JSInfoWrapper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSInfoWrapper.m; sourceTree = \"<group>\"; };\n\t\t3B7DDCE216AE301D0087CD12 /* JSWindowWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSWindowWrapper.h; sourceTree = \"<group>\"; };\n\t\t3B7DDCE316AE301D0087CD12 /* JSWindowWrapper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSWindowWrapper.m; sourceTree = \"<group>\"; };\n\t\t3B7DDCE516AE35840087CD12 /* JSApplicationWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSApplicationWrapper.h; sourceTree = \"<group>\"; };\n\t\t3B7DDCE616AE35840087CD12 /* JSApplicationWrapper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSApplicationWrapper.m; sourceTree = \"<group>\"; };\n\t\t3B7DDCE816AE90FF0087CD12 /* JSScreenWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSScreenWrapper.h; sourceTree = \"<group>\"; };\n\t\t3B7DDCE916AE90FF0087CD12 /* JSScreenWrapper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSScreenWrapper.m; sourceTree = \"<group>\"; };\n\t\t3B7EB3A5138F3F6800EBEC2B /* ResizeOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResizeOperation.h; sourceTree = \"<group>\"; };\n\t\t3B7EB3A6138F3F6800EBEC2B /* ResizeOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ResizeOperation.m; sourceTree = \"<group>\"; };\n\t\t3B7EB473138F691800EBEC2B /* Constants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = Constants.h; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };\n\t\t3B7EB474138F691800EBEC2B /* Constants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = Constants.m; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.objc; };\n\t\t3B7EB4CA138F72D900EBEC2B /* StringTokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringTokenizer.h; sourceTree = \"<group>\"; };\n\t\t3B7EB4CB138F72D900EBEC2B /* StringTokenizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StringTokenizer.m; sourceTree = \"<group>\"; };\n\t\t3B84A550150552DC006E2194 /* ConfigurationHelperView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConfigurationHelperView.h; sourceTree = \"<group>\"; };\n\t\t3B84A551150552DC006E2194 /* ConfigurationHelperView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ConfigurationHelperView.m; sourceTree = \"<group>\"; };\n\t\t3B883A0B1627725200FF3D8C /* RelaunchOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RelaunchOperation.h; sourceTree = \"<group>\"; };\n\t\t3B883A0C1627725200FF3D8C /* RelaunchOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RelaunchOperation.m; sourceTree = \"<group>\"; };\n\t\t3B8B5521161A1E5C00E21A6C /* NSString+Indicies.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSString+Indicies.h\"; sourceTree = \"<group>\"; };\n\t\t3B8B5522161A1E5C00E21A6C /* NSString+Indicies.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSString+Indicies.m\"; sourceTree = \"<group>\"; };\n\t\t3B8B5525161A1FDF00E21A6C /* TestNSString+Indicies.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"TestNSString+Indicies.h\"; sourceTree = \"<group>\"; };\n\t\t3B8B5526161A1FDF00E21A6C /* TestNSString+Indicies.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"TestNSString+Indicies.m\"; sourceTree = \"<group>\"; };\n\t\t3B9B3005151BDD960069D95E /* RunningApplications.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RunningApplications.h; sourceTree = \"<group>\"; };\n\t\t3B9B3006151BDD960069D95E /* RunningApplications.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RunningApplications.m; sourceTree = \"<group>\"; };\n\t\t3B9B301C151BFC330069D95E /* SwitchAppView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SwitchAppView.h; sourceTree = \"<group>\"; };\n\t\t3B9B301D151BFC330069D95E /* SwitchAppView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SwitchAppView.m; sourceTree = \"<group>\"; };\n\t\t3B9B301F151C830E0069D95E /* SwitchAppQuittingOverlayView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SwitchAppQuittingOverlayView.h; sourceTree = \"<group>\"; };\n\t\t3B9B3020151C830E0069D95E /* SwitchAppQuittingOverlayView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SwitchAppQuittingOverlayView.m; sourceTree = \"<group>\"; };\n\t\t3BA1BA56162DD3630026774E /* TestNSString+Levenshtein.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"TestNSString+Levenshtein.h\"; sourceTree = \"<group>\"; };\n\t\t3BA1BA57162DD3630026774E /* TestNSString+Levenshtein.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"TestNSString+Levenshtein.m\"; sourceTree = \"<group>\"; };\n\t\t3BA1BA5A162DD7190026774E /* TestMathUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestMathUtils.h; sourceTree = \"<group>\"; };\n\t\t3BA1BA5B162DD7190026774E /* TestMathUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestMathUtils.m; sourceTree = \"<group>\"; };\n\t\t3BA1BA60162DDFEF0026774E /* TestExpressionPoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestExpressionPoint.h; sourceTree = \"<group>\"; };\n\t\t3BA1BA61162DDFEF0026774E /* TestExpressionPoint.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestExpressionPoint.m; sourceTree = \"<group>\"; };\n\t\t3BA1BA63162E01A20026774E /* TestStringTokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestStringTokenizer.h; sourceTree = \"<group>\"; };\n\t\t3BA1BA64162E01A20026774E /* TestStringTokenizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestStringTokenizer.m; sourceTree = \"<group>\"; };\n\t\t3BA1BA66162F3E530026774E /* ShellOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShellOperation.h; sourceTree = \"<group>\"; };\n\t\t3BA1BA67162F3E530026774E /* ShellOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ShellOperation.m; sourceTree = \"<group>\"; };\n\t\t3BA1BA69162F4CFE0026774E /* ShellUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShellUtils.h; sourceTree = \"<group>\"; };\n\t\t3BA1BA6A162F4CFF0026774E /* ShellUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ShellUtils.m; sourceTree = \"<group>\"; };\n\t\t3BA1BA6C162F51760026774E /* TestShellUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestShellUtils.h; sourceTree = \"<group>\"; };\n\t\t3BA1BA6D162F51760026774E /* TestShellUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestShellUtils.m; sourceTree = \"<group>\"; };\n\t\t3BA7485713B1D0F500CFA792 /* MathUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MathUtils.h; sourceTree = \"<group>\"; };\n\t\t3BA7485813B1D0F500CFA792 /* MathUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MathUtils.m; sourceTree = \"<group>\"; };\n\t\t3BA85C9916276DAB00FAAF0B /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sparkle.framework; sourceTree = \"<group>\"; };\n\t\t3BADA37013A2C1ED009E21D8 /* AccessibilityWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AccessibilityWrapper.h; sourceTree = \"<group>\"; };\n\t\t3BADA37113A2C1ED009E21D8 /* AccessibilityWrapper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = AccessibilityWrapper.m; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.objc; };\n\t\t3BB5380213AEDA190005CFFC /* ScreenState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScreenState.h; sourceTree = \"<group>\"; };\n\t\t3BB5380313AEDA190005CFFC /* ScreenState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScreenState.m; sourceTree = \"<group>\"; };\n\t\t3BBD24B91580206C00940ABF /* default.slate */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = default.slate; sourceTree = \"<group>\"; };\n\t\t3BC9E96D15005925002FD1FA /* ActivateSnapshotOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ActivateSnapshotOperation.h; sourceTree = \"<group>\"; };\n\t\t3BC9E96E15005925002FD1FA /* ActivateSnapshotOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ActivateSnapshotOperation.m; sourceTree = \"<group>\"; };\n\t\t3BC9E97115005F8F002FD1FA /* NSString+Levenshtein.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSString+Levenshtein.h\"; sourceTree = \"<group>\"; };\n\t\t3BC9E97215005F8F002FD1FA /* NSString+Levenshtein.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSString+Levenshtein.m\"; sourceTree = \"<group>\"; };\n\t\t3BCE40F313B15FF300804615 /* FocusOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FocusOperation.h; sourceTree = \"<group>\"; };\n\t\t3BCE40F413B15FF300804615 /* FocusOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FocusOperation.m; sourceTree = \"<group>\"; };\n\t\t3BD8191B14FDC0CE003D63BC /* DeleteSnapshotOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeleteSnapshotOperation.h; sourceTree = \"<group>\"; };\n\t\t3BD8191C14FDC0CE003D63BC /* DeleteSnapshotOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DeleteSnapshotOperation.m; sourceTree = \"<group>\"; };\n\t\t3BDC2B591391C55400B0D151 /* ChainOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChainOperation.h; sourceTree = \"<group>\"; };\n\t\t3BDC2B5A1391C55400B0D151 /* ChainOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ChainOperation.m; sourceTree = \"<group>\"; };\n\t\t3BDDA17814FD95E200829D2A /* SnapshotOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SnapshotOperation.h; sourceTree = \"<group>\"; };\n\t\t3BDDA17914FD95E200829D2A /* SnapshotOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SnapshotOperation.m; sourceTree = \"<group>\"; };\n\t\t3BDDA17B14FDA50C00829D2A /* Snapshot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Snapshot.h; sourceTree = \"<group>\"; };\n\t\t3BDDA17C14FDA50C00829D2A /* Snapshot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Snapshot.m; sourceTree = \"<group>\"; };\n\t\t3BDDA17E14FDA55600829D2A /* WindowSnapshot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WindowSnapshot.h; sourceTree = \"<group>\"; };\n\t\t3BDDA17F14FDA55600829D2A /* WindowSnapshot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WindowSnapshot.m; sourceTree = \"<group>\"; };\n\t\t3BDDA18114FDAA6600829D2A /* SnapshotList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SnapshotList.h; sourceTree = \"<group>\"; };\n\t\t3BDDA18214FDAA6600829D2A /* SnapshotList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SnapshotList.m; sourceTree = \"<group>\"; };\n\t\t3BE0736516AF3C3F00D33DB0 /* utils.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = utils.js; sourceTree = \"<group>\"; };\n\t\t3BE0736916AF735A00D33DB0 /* JSWrapperUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSWrapperUtils.h; sourceTree = \"<group>\"; };\n\t\t3BE0736A16AF735A00D33DB0 /* JSWrapperUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSWrapperUtils.m; sourceTree = \"<group>\"; };\n\t\t3BE0736C16AFB5C900D33DB0 /* JSOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSOperation.h; sourceTree = \"<group>\"; };\n\t\t3BE0736D16AFB5CA00D33DB0 /* JSOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSOperation.m; sourceTree = \"<group>\"; };\n\t\t3BE702B1161F9D5000260716 /* SequenceOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SequenceOperation.h; sourceTree = \"<group>\"; };\n\t\t3BE702B2161F9D5000260716 /* SequenceOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SequenceOperation.m; sourceTree = \"<group>\"; };\n\t\t3BF39E1014FDB16F0083E9C4 /* JSONKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSONKit.h; sourceTree = \"<group>\"; };\n\t\t3BF39E1114FDB16F0083E9C4 /* JSONKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = JSONKit.m; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.objc; };\n\t\t3BF57C9A1621686900C0F89B /* statusActive.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = statusActive.pdf; path = Slate/statusActive.pdf; sourceTree = \"<group>\"; };\n\t\t3BF57C9C16216C2200C0F89B /* VisibilityOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VisibilityOperation.h; sourceTree = \"<group>\"; };\n\t\t3BF57C9D16216C2200C0F89B /* VisibilityOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VisibilityOperation.m; sourceTree = \"<group>\"; };\n\t\t3BFC8A6815FAAD9D00B16139 /* GridOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GridOperation.h; sourceTree = \"<group>\"; };\n\t\t3BFC8A6915FAAD9D00B16139 /* GridOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GridOperation.m; sourceTree = \"<group>\"; };\n\t\t3BFC8A6B15FABC9600B16139 /* GridView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GridView.h; sourceTree = \"<group>\"; };\n\t\t3BFC8A6C15FABC9600B16139 /* GridView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GridView.m; sourceTree = \"<group>\"; };\n\t\t3BFC8A6E15FABCBD00B16139 /* GridWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GridWindow.h; sourceTree = \"<group>\"; };\n\t\t3BFC8A6F15FABCBD00B16139 /* GridWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GridWindow.m; sourceTree = \"<group>\"; };\n\t\t3BFC8A7115FE5CD600B16139 /* GridCellView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GridCellView.h; sourceTree = \"<group>\"; };\n\t\t3BFC8A7215FE5CD700B16139 /* GridCellView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GridCellView.m; sourceTree = \"<group>\"; };\n\t\t3BFF7D6F16AC784A00A8CB0E /* PushOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PushOperation.h; sourceTree = \"<group>\"; };\n\t\t3BFF7D7016AC784A00A8CB0E /* PushOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PushOperation.m; sourceTree = \"<group>\"; };\n\t\t3BFF7D7316AC7B3C00A8CB0E /* NudgeOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NudgeOperation.h; sourceTree = \"<group>\"; };\n\t\t3BFF7D7416AC7B3C00A8CB0E /* NudgeOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NudgeOperation.m; sourceTree = \"<group>\"; };\n\t\t3BFF7D7616AC7E2800A8CB0E /* ThrowOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThrowOperation.h; sourceTree = \"<group>\"; };\n\t\t3BFF7D7716AC7E2800A8CB0E /* ThrowOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ThrowOperation.m; sourceTree = \"<group>\"; };\n\t\t3BFF7D7916AC7FF500A8CB0E /* CornerOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CornerOperation.h; sourceTree = \"<group>\"; };\n\t\t3BFF7D7A16AC7FF600A8CB0E /* CornerOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CornerOperation.m; sourceTree = \"<group>\"; };\n\t\t4747E1EE13877C150005180C /* icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = icon.icns; path = Slate/icon.icns; sourceTree = \"<group>\"; };\n\t\t4786D53413882381004554B1 /* ASCIIToCode.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = ASCIIToCode.plist; sourceTree = \"<group>\"; };\n\t\t47C4A28F1384E8890066B6DE /* Slate.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Slate.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t47C4A2931384E8890066B6DE /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };\n\t\t47C4A2961384E8890066B6DE /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };\n\t\t47C4A2971384E8890066B6DE /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };\n\t\t47C4A2981384E8890066B6DE /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\t47C4A29B1384E8890066B6DE /* Slate-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"Slate-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t47C4A29D1384E8890066B6DE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t47C4A29F1384E8890066B6DE /* Slate-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"Slate-Prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t47C4A2A01384E8890066B6DE /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\t47C4A2A31384E8890066B6DE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = \"<group>\"; };\n\t\t47C4A2A51384E8890066B6DE /* SlateAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SlateAppDelegate.h; sourceTree = \"<group>\"; };\n\t\t47C4A2A61384E8890066B6DE /* SlateAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = SlateAppDelegate.m; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.objc; };\n\t\t47C4A2A91384E8890066B6DE /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = \"<group>\"; };\n\t\t47C4A2B01384E8890066B6DE /* SlateTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SlateTests.octest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t47C4A2B61384E8890066B6DE /* SlateTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"SlateTests-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t47C4A2B81384E8890066B6DE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t47C4A2BA1384E8890066B6DE /* SlateTests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"SlateTests-Prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t47C4A2BB1384E8890066B6DE /* SlateTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SlateTests.h; sourceTree = \"<group>\"; };\n\t\t47C4A2BD1384E8890066B6DE /* SlateTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SlateTests.m; sourceTree = \"<group>\"; };\n\t\t47C4A2C71384E8B10066B6DE /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };\n\t\t47C4A2C91384EA510066B6DE /* SlateConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SlateConfig.h; sourceTree = \"<group>\"; };\n\t\t47C4A2CA1384EA510066B6DE /* SlateConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = SlateConfig.m; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.objc; };\n\t\t47C4A2CC1384F26A0066B6DE /* Binding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Binding.h; sourceTree = \"<group>\"; };\n\t\t47C4A2CD1384F26A0066B6DE /* Binding.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = Binding.m; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.objc; };\n\t\t47C4A2CF1384F3E10066B6DE /* Operation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = Operation.h; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };\n\t\t47C4A2D01384F3E10066B6DE /* Operation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = Operation.m; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.objc; };\n\t\t47C4A2D21384F4A60066B6DE /* MoveOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = MoveOperation.h; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };\n\t\t47C4A2D31384F4A60066B6DE /* MoveOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = MoveOperation.m; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.objc; };\n\t\t47C4A2D51384F5DD0066B6DE /* ExpressionPoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExpressionPoint.h; sourceTree = \"<group>\"; };\n\t\t47C4A2D61384F5DE0066B6DE /* ExpressionPoint.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ExpressionPoint.m; sourceTree = \"<group>\"; };\n\t\t5EB99A0116A7526400760915 /* ASCIIToCode_Azerty.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = ASCIIToCode_Azerty.plist; sourceTree = \"<group>\"; };\n\t\t7F44A9A916621A9D00222908 /* ASCIIToCode_Colemak.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = ASCIIToCode_Colemak.plist; sourceTree = \"<group>\"; };\n\t\tB3D087CF160577FB008A7FC6 /* status.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; name = status.pdf; path = Slate/status.pdf; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t47C4A28C1384E8890066B6DE /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t47C4A2C81384E8B10066B6DE /* Carbon.framework in Frameworks */,\n\t\t\t\t47C4A2941384E8890066B6DE /* Cocoa.framework in Frameworks */,\n\t\t\t\t3BA85C9A16276DAB00FAAF0B /* Sparkle.framework in Frameworks */,\n\t\t\t\t3AA7D09116A6ED1200C81A67 /* WebKit.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t47C4A2AC1384E8890066B6DE /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t47C4A2B11384E8890066B6DE /* Cocoa.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t3B4D0C3815A3721E00B39242 /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3B7DDCE116AE2FEC0087CD12 /* JavaScript */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B7DDCE516AE35840087CD12 /* JSApplicationWrapper.h */,\n\t\t\t\t3B7DDCE616AE35840087CD12 /* JSApplicationWrapper.m */,\n\t\t\t\t3AA7D09316A6EE0200C81A67 /* JSController.h */,\n\t\t\t\t3AA7D09416A6EE0200C81A67 /* JSController.m */,\n\t\t\t\t3B7DDCDD16AE1E290087CD12 /* JSInfoWrapper.h */,\n\t\t\t\t3B7DDCDE16AE1E290087CD12 /* JSInfoWrapper.m */,\n\t\t\t\t3B1E86EC16B3627A001B9090 /* JSOperationWrapper.h */,\n\t\t\t\t3B1E86ED16B3627A001B9090 /* JSOperationWrapper.m */,\n\t\t\t\t3B7DDCE816AE90FF0087CD12 /* JSScreenWrapper.h */,\n\t\t\t\t3B7DDCE916AE90FF0087CD12 /* JSScreenWrapper.m */,\n\t\t\t\t3B7DDCE216AE301D0087CD12 /* JSWindowWrapper.h */,\n\t\t\t\t3B7DDCE316AE301D0087CD12 /* JSWindowWrapper.m */,\n\t\t\t\t3BE0736916AF735A00D33DB0 /* JSWrapperUtils.h */,\n\t\t\t\t3BE0736A16AF735A00D33DB0 /* JSWrapperUtils.m */,\n\t\t\t\t3AA7D09A16A6FAE100C81A67 /* initialize.js */,\n\t\t\t\t3B38E04616AB8B3500603901 /* underscore.js */,\n\t\t\t\t3BE0736516AF3C3F00D33DB0 /* utils.js */,\n\t\t\t);\n\t\t\tname = JavaScript;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3B8B5524161A1FC600E21A6C /* Categories */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B8B5525161A1FDF00E21A6C /* TestNSString+Indicies.h */,\n\t\t\t\t3B8B5526161A1FDF00E21A6C /* TestNSString+Indicies.m */,\n\t\t\t\t3BA1BA56162DD3630026774E /* TestNSString+Levenshtein.h */,\n\t\t\t\t3BA1BA57162DD3630026774E /* TestNSString+Levenshtein.m */,\n\t\t\t);\n\t\t\tname = Categories;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3BA1BA59162DD6F20026774E /* Common */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3BA1BA60162DDFEF0026774E /* TestExpressionPoint.h */,\n\t\t\t\t3BA1BA61162DDFEF0026774E /* TestExpressionPoint.m */,\n\t\t\t\t3BA1BA5A162DD7190026774E /* TestMathUtils.h */,\n\t\t\t\t3BA1BA5B162DD7190026774E /* TestMathUtils.m */,\n\t\t\t\t3BA1BA6C162F51760026774E /* TestShellUtils.h */,\n\t\t\t\t3BA1BA6D162F51760026774E /* TestShellUtils.m */,\n\t\t\t\t3BA1BA63162E01A20026774E /* TestStringTokenizer.h */,\n\t\t\t\t3BA1BA64162E01A20026774E /* TestStringTokenizer.m */,\n\t\t\t);\n\t\t\tname = Common;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3BC9E97015005F5F002FD1FA /* Categories */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B8B5521161A1E5C00E21A6C /* NSString+Indicies.h */,\n\t\t\t\t3B8B5522161A1E5C00E21A6C /* NSString+Indicies.m */,\n\t\t\t\t3BC9E97115005F8F002FD1FA /* NSString+Levenshtein.h */,\n\t\t\t\t3BC9E97215005F8F002FD1FA /* NSString+Levenshtein.m */,\n\t\t\t\t3B34F38F15462323004090BB /* NSFileManager+ApplicationSupport.h */,\n\t\t\t\t3B34F39015462323004090BB /* NSFileManager+ApplicationSupport.m */,\n\t\t\t);\n\t\t\tname = Categories;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3BF39E0F14FDB16F0083E9C4 /* JSONKit */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3BF39E1014FDB16F0083E9C4 /* JSONKit.h */,\n\t\t\t\t3BF39E1114FDB16F0083E9C4 /* JSONKit.m */,\n\t\t\t);\n\t\t\tpath = JSONKit;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4747E1F013877D260005180C /* icons */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3BF57C9A1621686900C0F89B /* statusActive.pdf */,\n\t\t\t\tB3D087CF160577FB008A7FC6 /* status.pdf */,\n\t\t\t\t4747E1EE13877C150005180C /* icon.icns */,\n\t\t\t);\n\t\t\tname = icons;\n\t\t\tpath = ..;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t478293E513859BA000452C07 /* Config */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t47C4A2CC1384F26A0066B6DE /* Binding.h */,\n\t\t\t\t47C4A2CD1384F26A0066B6DE /* Binding.m */,\n\t\t\t\t3B40AC1F13A73530006C9A5C /* Layout.h */,\n\t\t\t\t3B40AC2013A73530006C9A5C /* Layout.m */,\n\t\t\t\t47C4A2C91384EA510066B6DE /* SlateConfig.h */,\n\t\t\t\t47C4A2CA1384EA510066B6DE /* SlateConfig.m */,\n\t\t\t\t3B42D72D13A831E6009103A0 /* ApplicationOptions.h */,\n\t\t\t\t3B42D72E13A831E6009103A0 /* ApplicationOptions.m */,\n\t\t\t\t3BDDA17B14FDA50C00829D2A /* Snapshot.h */,\n\t\t\t\t3BDDA17C14FDA50C00829D2A /* Snapshot.m */,\n\t\t\t\t3BDDA18114FDAA6600829D2A /* SnapshotList.h */,\n\t\t\t\t3BDDA18214FDAA6600829D2A /* SnapshotList.m */,\n\t\t\t\t3BDDA17E14FDA55600829D2A /* WindowSnapshot.h */,\n\t\t\t\t3BDDA17F14FDA55600829D2A /* WindowSnapshot.m */,\n\t\t\t\t3BBD24B91580206C00940ABF /* default.slate */,\n\t\t\t);\n\t\t\tname = Config;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t478293E713859BED00452C07 /* Operation */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3BC9E96D15005925002FD1FA /* ActivateSnapshotOperation.h */,\n\t\t\t\t3BC9E96E15005925002FD1FA /* ActivateSnapshotOperation.m */,\n\t\t\t\t3BDC2B591391C55400B0D151 /* ChainOperation.h */,\n\t\t\t\t3BDC2B5A1391C55400B0D151 /* ChainOperation.m */,\n\t\t\t\t3BFF7D7916AC7FF500A8CB0E /* CornerOperation.h */,\n\t\t\t\t3BFF7D7A16AC7FF600A8CB0E /* CornerOperation.m */,\n\t\t\t\t3BD8191B14FDC0CE003D63BC /* DeleteSnapshotOperation.h */,\n\t\t\t\t3BD8191C14FDC0CE003D63BC /* DeleteSnapshotOperation.m */,\n\t\t\t\t3BCE40F313B15FF300804615 /* FocusOperation.h */,\n\t\t\t\t3BCE40F413B15FF300804615 /* FocusOperation.m */,\n\t\t\t\t3BFC8A7115FE5CD600B16139 /* GridCellView.h */,\n\t\t\t\t3BFC8A7215FE5CD700B16139 /* GridCellView.m */,\n\t\t\t\t3BFC8A6815FAAD9D00B16139 /* GridOperation.h */,\n\t\t\t\t3BFC8A6915FAAD9D00B16139 /* GridOperation.m */,\n\t\t\t\t3BFC8A6B15FABC9600B16139 /* GridView.h */,\n\t\t\t\t3BFC8A6C15FABC9600B16139 /* GridView.m */,\n\t\t\t\t3BFC8A6E15FABCBD00B16139 /* GridWindow.h */,\n\t\t\t\t3BFC8A6F15FABCBD00B16139 /* GridWindow.m */,\n\t\t\t\t3B3C419E1501ADC600C1E927 /* HintOperation.h */,\n\t\t\t\t3B3C419F1501ADC600C1E927 /* HintOperation.m */,\n\t\t\t\t3B58153A1502FB7D0078D568 /* HintView.h */,\n\t\t\t\t3B58153B1502FB7D0078D568 /* HintView.m */,\n\t\t\t\t3B3C41A11501BE8500C1E927 /* HintWindow.h */,\n\t\t\t\t3B3C41A21501BE8600C1E927 /* HintWindow.m */,\n\t\t\t\t3BE0736C16AFB5C900D33DB0 /* JSOperation.h */,\n\t\t\t\t3BE0736D16AFB5CA00D33DB0 /* JSOperation.m */,\n\t\t\t\t3B40AC2213A743AE006C9A5C /* LayoutOperation.h */,\n\t\t\t\t3B40AC2313A743AF006C9A5C /* LayoutOperation.m */,\n\t\t\t\t47C4A2D21384F4A60066B6DE /* MoveOperation.h */,\n\t\t\t\t47C4A2D31384F4A60066B6DE /* MoveOperation.m */,\n\t\t\t\t3BFF7D7316AC7B3C00A8CB0E /* NudgeOperation.h */,\n\t\t\t\t3BFF7D7416AC7B3C00A8CB0E /* NudgeOperation.m */,\n\t\t\t\t47C4A2CF1384F3E10066B6DE /* Operation.h */,\n\t\t\t\t47C4A2D01384F3E10066B6DE /* Operation.m */,\n\t\t\t\t3BFF7D6F16AC784A00A8CB0E /* PushOperation.h */,\n\t\t\t\t3BFF7D7016AC784A00A8CB0E /* PushOperation.m */,\n\t\t\t\t3B883A0B1627725200FF3D8C /* RelaunchOperation.h */,\n\t\t\t\t3B883A0C1627725200FF3D8C /* RelaunchOperation.m */,\n\t\t\t\t3B7EB3A5138F3F6800EBEC2B /* ResizeOperation.h */,\n\t\t\t\t3B7EB3A6138F3F6800EBEC2B /* ResizeOperation.m */,\n\t\t\t\t3BE702B1161F9D5000260716 /* SequenceOperation.h */,\n\t\t\t\t3BE702B2161F9D5000260716 /* SequenceOperation.m */,\n\t\t\t\t3BA1BA66162F3E530026774E /* ShellOperation.h */,\n\t\t\t\t3BA1BA67162F3E530026774E /* ShellOperation.m */,\n\t\t\t\t3BDDA17814FD95E200829D2A /* SnapshotOperation.h */,\n\t\t\t\t3BDDA17914FD95E200829D2A /* SnapshotOperation.m */,\n\t\t\t\t3B9B301F151C830E0069D95E /* SwitchAppQuittingOverlayView.h */,\n\t\t\t\t3B9B3020151C830E0069D95E /* SwitchAppQuittingOverlayView.m */,\n\t\t\t\t3B9B301C151BFC330069D95E /* SwitchAppView.h */,\n\t\t\t\t3B9B301D151BFC330069D95E /* SwitchAppView.m */,\n\t\t\t\t3B4CDCFE150ACA6800B819E2 /* SwitchOperation.h */,\n\t\t\t\t3B4CDCFF150ACA6800B819E2 /* SwitchOperation.m */,\n\t\t\t\t3B4CDD01150AD68000B819E2 /* SwitchView.h */,\n\t\t\t\t3B4CDD02150AD68000B819E2 /* SwitchView.m */,\n\t\t\t\t3B4CDD04150AD69500B819E2 /* SwitchWindow.h */,\n\t\t\t\t3B4CDD05150AD69500B819E2 /* SwitchWindow.m */,\n\t\t\t\t3BFF7D7616AC7E2800A8CB0E /* ThrowOperation.h */,\n\t\t\t\t3BFF7D7716AC7E2800A8CB0E /* ThrowOperation.m */,\n\t\t\t\t3B5B1B7A1665871D00D5B1B5 /* UndoOperation.h */,\n\t\t\t\t3B5B1B7B1665871D00D5B1B5 /* UndoOperation.m */,\n\t\t\t\t3BF57C9C16216C2200C0F89B /* VisibilityOperation.h */,\n\t\t\t\t3BF57C9D16216C2200C0F89B /* VisibilityOperation.m */,\n\t\t\t);\n\t\t\tname = Operation;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t478293E813859C0B00452C07 /* Common */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5EB99A0116A7526400760915 /* ASCIIToCode_Azerty.plist */,\n\t\t\t\t4786D53413882381004554B1 /* ASCIIToCode.plist */,\n\t\t\t\t7F44A9A916621A9D00222908 /* ASCIIToCode_Colemak.plist */,\n\t\t\t\t3B65CF241576CDF10063D298 /* ASCIIToCode_Dvorak.plist */,\n\t\t\t\t3BADA37013A2C1ED009E21D8 /* AccessibilityWrapper.h */,\n\t\t\t\t3BADA37113A2C1ED009E21D8 /* AccessibilityWrapper.m */,\n\t\t\t\t3B7EB473138F691800EBEC2B /* Constants.h */,\n\t\t\t\t3B7EB474138F691800EBEC2B /* Constants.m */,\n\t\t\t\t47C4A2D51384F5DD0066B6DE /* ExpressionPoint.h */,\n\t\t\t\t47C4A2D61384F5DE0066B6DE /* ExpressionPoint.m */,\n\t\t\t\t3BA7485713B1D0F500CFA792 /* MathUtils.h */,\n\t\t\t\t3BA7485813B1D0F500CFA792 /* MathUtils.m */,\n\t\t\t\t3B9B3005151BDD960069D95E /* RunningApplications.h */,\n\t\t\t\t3B9B3006151BDD960069D95E /* RunningApplications.m */,\n\t\t\t\t3BB5380213AEDA190005CFFC /* ScreenState.h */,\n\t\t\t\t3BB5380313AEDA190005CFFC /* ScreenState.m */,\n\t\t\t\t3B66A56013ADBDFD0015EDD5 /* ScreenWrapper.h */,\n\t\t\t\t3B66A56113ADBDFD0015EDD5 /* ScreenWrapper.m */,\n\t\t\t\t3BA1BA69162F4CFE0026774E /* ShellUtils.h */,\n\t\t\t\t3BA1BA6A162F4CFF0026774E /* ShellUtils.m */,\n\t\t\t\t3B58154215054EBD0078D568 /* SlateLogger.h */,\n\t\t\t\t3B7EB4CA138F72D900EBEC2B /* StringTokenizer.h */,\n\t\t\t\t3B7EB4CB138F72D900EBEC2B /* StringTokenizer.m */,\n\t\t\t\t3B3E240E13A5F59E00B0D762 /* WindowState.h */,\n\t\t\t\t3B3E240F13A5F59E00B0D762 /* WindowState.m */,\n\t\t\t);\n\t\t\tname = Common;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t47C4A2841384E8890066B6DE = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B4D0C3815A3721E00B39242 /* Resources */,\n\t\t\t\t47C4A2991384E8890066B6DE /* Slate */,\n\t\t\t\t47C4A2B41384E8890066B6DE /* SlateTests */,\n\t\t\t\t47C4A2921384E8890066B6DE /* Frameworks */,\n\t\t\t\t47C4A2901384E8890066B6DE /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t47C4A2901384E8890066B6DE /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t47C4A28F1384E8890066B6DE /* Slate.app */,\n\t\t\t\t47C4A2B01384E8890066B6DE /* SlateTests.octest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t47C4A2921384E8890066B6DE /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3BA85C9916276DAB00FAAF0B /* Sparkle.framework */,\n\t\t\t\t47C4A2C71384E8B10066B6DE /* Carbon.framework */,\n\t\t\t\t47C4A2931384E8890066B6DE /* Cocoa.framework */,\n\t\t\t\t47C4A2951384E8890066B6DE /* Other Frameworks */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t47C4A2951384E8890066B6DE /* Other Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3AA7D09016A6ED1200C81A67 /* WebKit.framework */,\n\t\t\t\t47C4A2961384E8890066B6DE /* AppKit.framework */,\n\t\t\t\t47C4A2971384E8890066B6DE /* CoreData.framework */,\n\t\t\t\t47C4A2981384E8890066B6DE /* Foundation.framework */,\n\t\t\t);\n\t\t\tname = \"Other Frameworks\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t47C4A2991384E8890066B6DE /* Slate */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4747E1F013877D260005180C /* icons */,\n\t\t\t\t3BC9E97015005F5F002FD1FA /* Categories */,\n\t\t\t\t3BF39E0F14FDB16F0083E9C4 /* JSONKit */,\n\t\t\t\t478293E813859C0B00452C07 /* Common */,\n\t\t\t\t3B7DDCE116AE2FEC0087CD12 /* JavaScript */,\n\t\t\t\t478293E513859BA000452C07 /* Config */,\n\t\t\t\t478293E713859BED00452C07 /* Operation */,\n\t\t\t\t47C4A29A1384E8890066B6DE /* Supporting Files */,\n\t\t\t\t47C4A2A81384E8890066B6DE /* MainMenu.xib */,\n\t\t\t\t3B84A550150552DC006E2194 /* ConfigurationHelperView.h */,\n\t\t\t\t3B84A551150552DC006E2194 /* ConfigurationHelperView.m */,\n\t\t\t\t47C4A2A51384E8890066B6DE /* SlateAppDelegate.h */,\n\t\t\t\t47C4A2A61384E8890066B6DE /* SlateAppDelegate.m */,\n\t\t\t\t3B3335AB14FC1EA900F72638 /* WindowInfoView.h */,\n\t\t\t\t3B3335AC14FC1EA900F72638 /* WindowInfoView.m */,\n\t\t\t);\n\t\t\tpath = Slate;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t47C4A29A1384E8890066B6DE /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t47C4A29B1384E8890066B6DE /* Slate-Info.plist */,\n\t\t\t\t47C4A29C1384E8890066B6DE /* InfoPlist.strings */,\n\t\t\t\t47C4A29F1384E8890066B6DE /* Slate-Prefix.pch */,\n\t\t\t\t47C4A2A01384E8890066B6DE /* main.m */,\n\t\t\t\t47C4A2A21384E8890066B6DE /* Credits.rtf */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t47C4A2B41384E8890066B6DE /* SlateTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B8B5524161A1FC600E21A6C /* Categories */,\n\t\t\t\t3BA1BA59162DD6F20026774E /* Common */,\n\t\t\t\t47C4A2BB1384E8890066B6DE /* SlateTests.h */,\n\t\t\t\t47C4A2BD1384E8890066B6DE /* SlateTests.m */,\n\t\t\t\t47C4A2B51384E8890066B6DE /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = SlateTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t47C4A2B51384E8890066B6DE /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t47C4A2B61384E8890066B6DE /* SlateTests-Info.plist */,\n\t\t\t\t47C4A2B71384E8890066B6DE /* InfoPlist.strings */,\n\t\t\t\t47C4A2BA1384E8890066B6DE /* SlateTests-Prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t47C4A28E1384E8890066B6DE /* Slate */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 47C4A2C11384E8890066B6DE /* Build configuration list for PBXNativeTarget \"Slate\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t47C4A28B1384E8890066B6DE /* Sources */,\n\t\t\t\t47C4A28C1384E8890066B6DE /* Frameworks */,\n\t\t\t\t47C4A28D1384E8890066B6DE /* Resources */,\n\t\t\t\t3B4D0C3615A3691900B39242 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Slate;\n\t\t\tproductName = Slate;\n\t\t\tproductReference = 47C4A28F1384E8890066B6DE /* Slate.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t47C4A2AF1384E8890066B6DE /* SlateTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 47C4A2C41384E8890066B6DE /* Build configuration list for PBXNativeTarget \"SlateTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t47C4A2AB1384E8890066B6DE /* Sources */,\n\t\t\t\t47C4A2AC1384E8890066B6DE /* Frameworks */,\n\t\t\t\t47C4A2AD1384E8890066B6DE /* Resources */,\n\t\t\t\t47C4A2AE1384E8890066B6DE /* ShellScript */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t47C4A2B31384E8890066B6DE /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = SlateTests;\n\t\t\tproductName = SlateTests;\n\t\t\tproductReference = 47C4A2B01384E8890066B6DE /* SlateTests.octest */;\n\t\t\tproductType = \"com.apple.product-type.bundle\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t47C4A2861384E8890066B6DE /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0450;\n\t\t\t};\n\t\t\tbuildConfigurationList = 47C4A2891384E8890066B6DE /* Build configuration list for PBXProject \"Slate\" */;\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);\n\t\t\tmainGroup = 47C4A2841384E8890066B6DE;\n\t\t\tproductRefGroup = 47C4A2901384E8890066B6DE /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t47C4A28E1384E8890066B6DE /* Slate */,\n\t\t\t\t47C4A2AF1384E8890066B6DE /* SlateTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t47C4A28D1384E8890066B6DE /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t47C4A29E1384E8890066B6DE /* InfoPlist.strings in Resources */,\n\t\t\t\t47C4A2A41384E8890066B6DE /* Credits.rtf in Resources */,\n\t\t\t\t47C4A2AA1384E8890066B6DE /* MainMenu.xib in Resources */,\n\t\t\t\t4747E1EF13877C160005180C /* icon.icns in Resources */,\n\t\t\t\t4786D53513882381004554B1 /* ASCIIToCode.plist in Resources */,\n\t\t\t\t3B65CF251576CDF10063D298 /* ASCIIToCode_Dvorak.plist in Resources */,\n\t\t\t\t3BBD24BA1580206C00940ABF /* default.slate in Resources */,\n\t\t\t\tB3D087D0160577FB008A7FC6 /* status.pdf in Resources */,\n\t\t\t\t3BF57C9B1621686900C0F89B /* statusActive.pdf in Resources */,\n\t\t\t\t7F44A9AA16621A9D00222908 /* ASCIIToCode_Colemak.plist in Resources */,\n\t\t\t\t5EB99A0216A7526400760915 /* ASCIIToCode_Azerty.plist in Resources */,\n\t\t\t\t3B38E04816AB8BBF00603901 /* underscore.js in Resources */,\n\t\t\t\t3BE0736816AF3C9B00D33DB0 /* utils.js in Resources */,\n\t\t\t\t3AA7D09D16A6FC9B00C81A67 /* initialize.js in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t47C4A2AD1384E8890066B6DE /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t47C4A2B91384E8890066B6DE /* InfoPlist.strings in Resources */,\n\t\t\t\t47C4A2BC1384E8890066B6DE /* SlateTests.h 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\t47C4A2AE1384E8890066B6DE /* ShellScript */ = {\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\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"# Run the unit tests in this test bundle.\\n\\\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\\\"\\n\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t47C4A28B1384E8890066B6DE /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t47C4A2A11384E8890066B6DE /* main.m in Sources */,\n\t\t\t\t47C4A2A71384E8890066B6DE /* SlateAppDelegate.m in Sources */,\n\t\t\t\t47C4A2CB1384EA510066B6DE /* SlateConfig.m in Sources */,\n\t\t\t\t47C4A2CE1384F26A0066B6DE /* Binding.m in Sources */,\n\t\t\t\t47C4A2D11384F3E10066B6DE /* Operation.m in Sources */,\n\t\t\t\t47C4A2D41384F4A60066B6DE /* MoveOperation.m in Sources */,\n\t\t\t\t47C4A2D71384F5DE0066B6DE /* ExpressionPoint.m in Sources */,\n\t\t\t\t3B7EB3A7138F3F6800EBEC2B /* ResizeOperation.m in Sources */,\n\t\t\t\t3B7EB475138F691800EBEC2B /* Constants.m in Sources */,\n\t\t\t\t3B7EB4CC138F72D900EBEC2B /* StringTokenizer.m in Sources */,\n\t\t\t\t3BDC2B5B1391C55400B0D151 /* ChainOperation.m in Sources */,\n\t\t\t\t3BADA37213A2C1ED009E21D8 /* AccessibilityWrapper.m in Sources */,\n\t\t\t\t3B3E241013A5F59E00B0D762 /* WindowState.m in Sources */,\n\t\t\t\t3B40AC2113A73530006C9A5C /* Layout.m in Sources */,\n\t\t\t\t3B40AC2413A743B0006C9A5C /* LayoutOperation.m in Sources */,\n\t\t\t\t3B42D72F13A831E7009103A0 /* ApplicationOptions.m in Sources */,\n\t\t\t\t3B66A56213ADBDFD0015EDD5 /* ScreenWrapper.m in Sources */,\n\t\t\t\t3BB5380413AEDA1B0005CFFC /* ScreenState.m in Sources */,\n\t\t\t\t3BCE40F513B15FF300804615 /* FocusOperation.m in Sources */,\n\t\t\t\t3BA7485913B1D0F500CFA792 /* MathUtils.m in Sources */,\n\t\t\t\t3B3335AD14FC1EA900F72638 /* WindowInfoView.m in Sources */,\n\t\t\t\t3BDDA17A14FD95E200829D2A /* SnapshotOperation.m in Sources */,\n\t\t\t\t3BDDA17D14FDA50C00829D2A /* Snapshot.m in Sources */,\n\t\t\t\t3BDDA18014FDA55600829D2A /* WindowSnapshot.m in Sources */,\n\t\t\t\t3BDDA18314FDAA6600829D2A /* SnapshotList.m in Sources */,\n\t\t\t\t3BF39E1214FDB16F0083E9C4 /* JSONKit.m in Sources */,\n\t\t\t\t3BD8191D14FDC0CE003D63BC /* DeleteSnapshotOperation.m in Sources */,\n\t\t\t\t3BC9E96F15005925002FD1FA /* ActivateSnapshotOperation.m in Sources */,\n\t\t\t\t3BC9E97315005F8F002FD1FA /* NSString+Levenshtein.m in Sources */,\n\t\t\t\t3B3C41A01501ADC600C1E927 /* HintOperation.m in Sources */,\n\t\t\t\t3B3C41A31501BE8600C1E927 /* HintWindow.m in Sources */,\n\t\t\t\t3B58153C1502FB7D0078D568 /* HintView.m in Sources */,\n\t\t\t\t3B84A552150552DC006E2194 /* ConfigurationHelperView.m in Sources */,\n\t\t\t\t3B4CDD00150ACA6800B819E2 /* SwitchOperation.m in Sources */,\n\t\t\t\t3B4CDD03150AD68000B819E2 /* SwitchView.m in Sources */,\n\t\t\t\t3B4CDD06150AD69500B819E2 /* SwitchWindow.m in Sources */,\n\t\t\t\t3B9B3007151BDD960069D95E /* RunningApplications.m in Sources */,\n\t\t\t\t3B9B301E151BFC330069D95E /* SwitchAppView.m in Sources */,\n\t\t\t\t3B9B3021151C830F0069D95E /* SwitchAppQuittingOverlayView.m in Sources */,\n\t\t\t\t3B34F39115462323004090BB /* NSFileManager+ApplicationSupport.m in Sources */,\n\t\t\t\t3BFC8A6A15FAAD9D00B16139 /* GridOperation.m in Sources */,\n\t\t\t\t3BFC8A6D15FABC9700B16139 /* GridView.m in Sources */,\n\t\t\t\t3BFC8A7015FABCBE00B16139 /* GridWindow.m in Sources */,\n\t\t\t\t3BFC8A7315FE5CD700B16139 /* GridCellView.m in Sources */,\n\t\t\t\t3B8B5523161A1E5C00E21A6C /* NSString+Indicies.m in Sources */,\n\t\t\t\t3BE702B3161F9D5000260716 /* SequenceOperation.m in Sources */,\n\t\t\t\t3BF57C9E16216C2200C0F89B /* VisibilityOperation.m in Sources */,\n\t\t\t\t3B883A0D1627725200FF3D8C /* RelaunchOperation.m in Sources */,\n\t\t\t\t3BA1BA68162F3E530026774E /* ShellOperation.m in Sources */,\n\t\t\t\t3BA1BA6B162F4CFF0026774E /* ShellUtils.m in Sources */,\n\t\t\t\t3B5B1B7C1665871E00D5B1B5 /* UndoOperation.m in Sources */,\n\t\t\t\t3AA7D09516A6EE0200C81A67 /* JSController.m in Sources */,\n\t\t\t\t3BFF7D7116AC784B00A8CB0E /* PushOperation.m in Sources */,\n\t\t\t\t3BFF7D7516AC7B3D00A8CB0E /* NudgeOperation.m in Sources */,\n\t\t\t\t3BFF7D7816AC7E2900A8CB0E /* ThrowOperation.m in Sources */,\n\t\t\t\t3BFF7D7B16AC7FF600A8CB0E /* CornerOperation.m in Sources */,\n\t\t\t\t3B7DDCDF16AE1E290087CD12 /* JSInfoWrapper.m in Sources */,\n\t\t\t\t3B7DDCE416AE301D0087CD12 /* JSWindowWrapper.m in Sources */,\n\t\t\t\t3B7DDCE716AE35840087CD12 /* JSApplicationWrapper.m in Sources */,\n\t\t\t\t3B7DDCEA16AE90FF0087CD12 /* JSScreenWrapper.m in Sources */,\n\t\t\t\t3BE0736B16AF735A00D33DB0 /* JSWrapperUtils.m in Sources */,\n\t\t\t\t3BE0736E16AFB5CA00D33DB0 /* JSOperation.m in Sources */,\n\t\t\t\t3B1E86EE16B3627A001B9090 /* JSOperationWrapper.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t47C4A2AB1384E8890066B6DE /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t47C4A2BE1384E8890066B6DE /* SlateTests.m in Sources */,\n\t\t\t\t3B8B5527161A1FDF00E21A6C /* TestNSString+Indicies.m in Sources */,\n\t\t\t\t3BA1BA58162DD3630026774E /* TestNSString+Levenshtein.m in Sources */,\n\t\t\t\t3BA1BA5C162DD7190026774E /* TestMathUtils.m in Sources */,\n\t\t\t\t3BA1BA62162DDFEF0026774E /* TestExpressionPoint.m in Sources */,\n\t\t\t\t3BA1BA65162E01A30026774E /* TestStringTokenizer.m in Sources */,\n\t\t\t\t3BA1BA6E162F51760026774E /* TestShellUtils.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t47C4A2B31384E8890066B6DE /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 47C4A28E1384E8890066B6DE /* Slate */;\n\t\t\ttargetProxy = 47C4A2B21384E8890066B6DE /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t47C4A29C1384E8890066B6DE /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t47C4A29D1384E8890066B6DE /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t47C4A2A21384E8890066B6DE /* Credits.rtf */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t47C4A2A31384E8890066B6DE /* en */,\n\t\t\t);\n\t\t\tname = Credits.rtf;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t47C4A2A81384E8890066B6DE /* MainMenu.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t47C4A2A91384E8890066B6DE /* en */,\n\t\t\t);\n\t\t\tname = MainMenu.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t47C4A2B71384E8890066B6DE /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t47C4A2B81384E8890066B6DE /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t47C4A2BF1384E8890066B6DE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_32_64_BIT)\";\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = DEBUG;\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.6;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t47C4A2C01384E8890066B6DE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_32_64_BIT)\";\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_VERSION = com.apple.compilers.llvm.clang.1_0;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.6;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t47C4A2C21384E8890066B6DE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_64_BIT)\";\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEPLOYMENT_LOCATION = YES;\n\t\t\t\tDSTROOT = \"tmp/$(PROJECT_NAME).dst\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)\\\"\",\n\t\t\t\t);\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_ENABLE_OBJC_EXCEPTIONS = YES;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Slate/Slate-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Slate/Slate-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_APPS_DIR)\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.6;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t47C4A2C31384E8890066B6DE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_64_BIT)\";\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEPLOYMENT_LOCATION = YES;\n\t\t\t\tDSTROOT = \"tmp/$(PROJECT_NAME).dst\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)\\\"\",\n\t\t\t\t);\n\t\t\t\tGCC_ENABLE_OBJC_EXCEPTIONS = YES;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Slate/Slate-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Slate/Slate-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_APPS_DIR)\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.6;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t47C4A2C51384E8890066B6DE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_64_BIT)\";\n\t\t\t\tBUNDLE_LOADER = \"$(BUILT_PRODUCTS_DIR)/Slate.app/Contents/MacOS/Slate\";\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(DEVELOPER_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_ENABLE_OBJC_EXCEPTIONS = YES;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"SlateTests/SlateTests-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"SlateTests/SlateTests-Info.plist\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\tSenTestingKit,\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTEST_HOST = \"$(BUNDLE_LOADER)\";\n\t\t\t\tWRAPPER_EXTENSION = octest;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t47C4A2C61384E8890066B6DE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tARCHS = \"$(ARCHS_STANDARD_64_BIT)\";\n\t\t\t\tBUNDLE_LOADER = \"$(BUILT_PRODUCTS_DIR)/Slate.app/Contents/MacOS/Slate\";\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(DEVELOPER_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tGCC_ENABLE_OBJC_EXCEPTIONS = YES;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"SlateTests/SlateTests-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"SlateTests/SlateTests-Info.plist\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\tSenTestingKit,\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTEST_HOST = \"$(BUNDLE_LOADER)\";\n\t\t\t\tWRAPPER_EXTENSION = octest;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t47C4A2891384E8890066B6DE /* Build configuration list for PBXProject \"Slate\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t47C4A2BF1384E8890066B6DE /* Debug */,\n\t\t\t\t47C4A2C01384E8890066B6DE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t47C4A2C11384E8890066B6DE /* Build configuration list for PBXNativeTarget \"Slate\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t47C4A2C21384E8890066B6DE /* Debug */,\n\t\t\t\t47C4A2C31384E8890066B6DE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t47C4A2C41384E8890066B6DE /* Build configuration list for PBXNativeTarget \"SlateTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t47C4A2C51384E8890066B6DE /* Debug */,\n\t\t\t\t47C4A2C61384E8890066B6DE /* 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 = 47C4A2861384E8890066B6DE /* Project object */;\n}\n"
  },
  {
    "path": "Slate.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Slate.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "SlateTests/SlateTests-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.slate.${PRODUCT_NAME:rfc1034identifier}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "SlateTests/SlateTests-Prefix.pch",
    "content": "//\n// Prefix header for all source files of the 'SlateTests' target in the 'SlateTests' project\n//\n\n#ifdef __OBJC__\n    #import <Cocoa/Cocoa.h>\n#endif\n"
  },
  {
    "path": "SlateTests/SlateTests.h",
    "content": "//\n//  SlateTests.h\n//  Slate\n//\n//  Created by Jigish Patel on 5/18/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <SenTestingKit/SenTestingKit.h>\n\n\n@interface SlateTests : SenTestCase {\n@private\n\n}\n\n@end\n"
  },
  {
    "path": "SlateTests/SlateTests.m",
    "content": "//\n//  SlateTests.m\n//  Slate\n//\n//  Created by Jigish Patel on 5/18/11.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"SlateTests.h\"\n\n\n@implementation SlateTests\n\n- (void)setUp\n{\n    [super setUp];\n\n    // Set-up code here.\n}\n\n- (void)tearDown\n{\n    // Tear-down code here.\n\n    [super tearDown];\n}\n\n- (void)testExample\n{\n    STAssertTrue(true, @\"Unit tests are not implemented yet in SlateTests\");\n}\n\n@end\n"
  },
  {
    "path": "SlateTests/TestExpressionPoint.h",
    "content": "//\n//  TestExpressionPoint.h\n//  Slate\n//\n//  Created by Jigish Patel on 10/16/12.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <SenTestingKit/SenTestingKit.h>\n\n@interface TestExpressionPoint : SenTestCase\n\n@end\n"
  },
  {
    "path": "SlateTests/TestExpressionPoint.m",
    "content": "//\n//  TestExpressionPoint.m\n//  Slate\n//\n//  Created by Jigish Patel on 10/16/12.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"TestExpressionPoint.h\"\n#import \"ExpressionPoint.h\"\n\n@implementation TestExpressionPoint\n\n/*\n- (NSPoint)getPointWithDict:(NSDictionary *)values;\n- (NSSize)getSizeWithDict:(NSDictionary *)values;\n\n+ (float)expToFloat:(NSString *)exp withDict:(NSDictionary *)values;\n*/\n\n- (void)testInitandProperties {\n  NSString *x = @\"x\";\n  NSString *y = @\"y\";\n  ExpressionPoint *a = [[ExpressionPoint alloc] initWithX:x y:y];\n  STAssertEquals([a x], x, @\"x should be x\");\n  STAssertEquals([a y], y, @\"y should be y\");\n  [a setX:y];\n  [a setY:x];\n  STAssertEquals([a x], y, @\"x should be y\");\n  STAssertEquals([a y], x, @\"y should be x\");\n}\n\n- (void)testGetPointWithDict {\n  NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:\n                        [NSNumber numberWithInteger:5], @\"var1\",\n                        [NSNumber numberWithInteger:10], @\"var2\",\n                        [NSNumber numberWithInteger:2], @\"var3\", nil];\n  ExpressionPoint *a = [[ExpressionPoint alloc] initWithX:@\"var1+var2\" y:@\"var1*var2\"];\n  NSPoint p = [a getPointWithDict:dict];\n  STAssertTrue(NSEqualPoints(p, NSMakePoint(15, 50)), @\"Shit should work\");\n  [a setX:@\"sqrt((var2/var3)*var1)+count({1,2,3})\"]; // 5 + 3\n  [a setY:@\"var3**var2+sum({1,2,3})\"]; // 1024 + 6\n  p = [a getPointWithDict:dict];\n  STAssertTrue(NSEqualPoints(p, NSMakePoint(8, 1030)), @\"Shit should work\");\n  [a setX:@\"min({1,2,3})+max({4,5,6})\"]; // 1 + 6\n  [a setY:@\"average({1,2,3,4})+median({1,2,3,10,15})\"]; // 2.5 + 3\n  p = [a getPointWithDict:dict];\n  STAssertTrue(NSEqualPoints(p, NSMakePoint(7, 5.5)), @\"Shit should work\");\n  [a setX:@\"floor(3.9)+(stddev({1,2,3,4,5}))**2\"]; // 3 + 2\n  [a setY:@\"log(1000)+ln(exp(5))\"]; // 3 + 5\n  p = [a getPointWithDict:dict];\n  STAssertTrue(NSEqualPoints(p, NSMakePoint(5, 8)), @\"Shit should work\");\n  [a setX:@\"ceiling(2.1)+abs(-2)\"]; // 3 + 2\n  [a setY:@\"trunc(3.232472398472834723)\"]; // 3\n  p = [a getPointWithDict:dict];\n  STAssertTrue(NSEqualPoints(p, NSMakePoint(5, 3)), @\"Shit should work\");\n  [a setX:@\"random()\"]; // 0 <= me < 1\n  [a setY:@\"randomn(10)\"]; // 0 <= me < 10\n  p = [a getPointWithDict:dict];\n  STAssertTrue(p.x >= 0 && p.x < 1 && p.y >= 0 && p.y < 10, @\"Shit should work\");\n}\n\n- (void)testGetSizeWithDict {\n  NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:\n                        [NSNumber numberWithInteger:5], @\"var1\",\n                        [NSNumber numberWithInteger:10], @\"var2\",\n                        [NSNumber numberWithInteger:2], @\"var3\", nil];\n  ExpressionPoint *a = [[ExpressionPoint alloc] initWithX:@\"var1+var2\" y:@\"var1*var2\"];\n  NSSize p = [a getSizeWithDict:dict];\n  STAssertTrue(NSEqualSizes(p, NSMakeSize(15, 50)), @\"Shit should work\");\n  [a setX:@\"sqrt((var2/var3)*var1)+count({1,2,3})\"]; // 5 + 3\n  [a setY:@\"var3**var2+sum({1,2,3})\"]; // 1024 + 6\n  p = [a getSizeWithDict:dict];\n  STAssertTrue(NSEqualSizes(p, NSMakeSize(8, 1030)), @\"Shit should work\");\n  [a setX:@\"min({1,2,3})+max({4,5,6})\"]; // 1 + 6\n  [a setY:@\"average({1,2,3,4})+median({1,2,3,10,15})\"]; // 2.5 + 3\n  p = [a getSizeWithDict:dict];\n  STAssertTrue(NSEqualSizes(p, NSMakeSize(7, 5.5)), @\"Shit should work\");\n  [a setX:@\"floor(3.9)+(stddev({1,2,3,4,5}))**2\"]; // 3 + 2\n  [a setY:@\"log(1000)+ln(exp(5))\"]; // 3 + 5\n  p = [a getSizeWithDict:dict];\n  STAssertTrue(NSEqualSizes(p, NSMakeSize(5, 8)), @\"Shit should work\");\n  [a setX:@\"ceiling(2.1)+abs(-2)\"]; // 3 + 2\n  [a setY:@\"trunc(3.232472398472834723)\"]; // 3\n  p = [a getSizeWithDict:dict];\n  STAssertTrue(NSEqualSizes(p, NSMakeSize(5, 3)), @\"Shit should work\");\n  [a setX:@\"random()\"]; // 0 <= me < 1\n  [a setY:@\"randomn(10)\"]; // 0 <= me < 10\n  p = [a getSizeWithDict:dict];\n  STAssertTrue(p.width >= 0 && p.width < 1 && p.height >= 0 && p.height < 10, @\"Shit should work\");\n}\n\n@end\n"
  },
  {
    "path": "SlateTests/TestMathUtils.h",
    "content": "//\n//  TestMathUtils.h\n//  Slate\n//\n//  Created by Jigish Patel on 10/16/12.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <SenTestingKit/SenTestingKit.h>\n\n@interface TestMathUtils : SenTestCase\n\n@end\n"
  },
  {
    "path": "SlateTests/TestMathUtils.m",
    "content": "//\n//  TestMathUtils.m\n//  Slate\n//\n//  Created by Jigish Patel on 10/16/12.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"TestMathUtils.h\"\n#import \"MathUtils.h\"\n\n@implementation TestMathUtils\n\n- (void)testIsRectBiggerThan {\n  NSRect a = NSMakeRect(0, 0, 100, 100);\n  NSRect b = NSMakeRect(0, 0, 200, 90);\n  NSRect c = NSMakeRect(0, 0, 90, 200);\n  NSRect d = NSMakeRect(0, 0, 200, 200);\n  NSRect e = NSMakeRect(0, 0, 200, 1);\n  NSRect f = NSMakeRect(0, 0, 1, 200);\n  NSRect g = NSMakeRect(1000, 1000, 1, 1);\n  NSRect h = NSMakeRect(1000, 1000, 101, 101);\n  STAssertFalse([MathUtils isRect:a biggerThan:b], @\"0,0,100,100 should be smaller than 0,0,200,90\");\n  STAssertFalse([MathUtils isRect:a biggerThan:c], @\"0,0,100,100 should be smaller than 0,0,90,200\");\n  STAssertFalse([MathUtils isRect:a biggerThan:d], @\"0,0,100,100 should be smaller than 0,0,200,200\");\n  STAssertTrue([MathUtils isRect:a biggerThan:e], @\"0,0,100,100 should be bigger than 0,0,200,1\");\n  STAssertTrue([MathUtils isRect:a biggerThan:f], @\"0,0,100,100 should be bigger than 0,0,1,200\");\n  STAssertTrue([MathUtils isRect:a biggerThan:g], @\"0,0,100,100 should be bigger than 1000,1000,1,1\");\n  STAssertFalse([MathUtils isRect:a biggerThan:h], @\"0,0,100,100 should be smaller than 1000,1000,101,101\");\n}\n\n- (void)testFlipYCoordinateOfRectWithReference {\n  NSRect a = NSMakeRect(0, 0, 100, 100);\n  NSRect b = NSMakeRect(0, 0, 1000, 1000);\n  NSRect flipped = [MathUtils flipYCoordinateOfRect:a withReference:b];\n  STAssertTrue(NSEqualRects(flipped, NSMakeRect(0,900,100,100)), @\"Flipping should work\");\n  a = NSMakeRect(0,-100, 100, 1500);\n  b = NSMakeRect(0, 0, 1000, 1000);\n  flipped = [MathUtils flipYCoordinateOfRect:a withReference:b];\n  STAssertTrue(NSEqualRects(flipped, NSMakeRect(0,-400,100,1500)), @\"Flipping should work\");\n}\n\n- (void)testScaleRectFactor {\n  NSRect a = NSMakeRect(100, 200, 100, 200);\n  NSRect scaled = [MathUtils scaleRect:a factor:2.0];\n  STAssertTrue(NSEqualRects(scaled, NSMakeRect(100,200,200,400)), @\"Scaling should work\");\n  a = NSMakeRect(100, 200, 100, 200);\n  scaled = [MathUtils scaleRect:a factor:0.5];\n  STAssertTrue(NSEqualRects(scaled, NSMakeRect(100,200,50,100)), @\"Scaling should work\");\n  a = NSMakeRect(100, 200, 100, 200);\n  scaled = [MathUtils scaleRect:a factor:2.5];\n  STAssertTrue(NSEqualRects(scaled, NSMakeRect(100,200,250,500)), @\"Scaling should work\");\n}\n\n- (void)testWeightedIntersectionOfAndWeight {\n  NSRect a = NSMakeRect(0, 0, 100, 100);\n  NSRect b = NSMakeRect(1000, 1000, 100, 100);\n  NSRect c = NSMakeRect(0, 0, 50, 50);\n  NSRect d = NSMakeRect(50, 50, 100, 100);\n  NSRect intersection = [MathUtils weightedIntersectionOf:a and:b weight:1];\n  STAssertTrue(NSEqualRects(intersection, NSMakeRect(0, 0, 0, 0)), @\"Weighted Intersection should work\");\n  intersection = [MathUtils weightedIntersectionOf:a and:b weight:2];\n  STAssertTrue(NSEqualRects(intersection, NSMakeRect(0, 0, 0, 0)), @\"Weighted Intersection should work\");\n  intersection = [MathUtils weightedIntersectionOf:a and:b weight:0.5];\n  STAssertTrue(NSEqualRects(intersection, NSMakeRect(0, 0, 0, 0)), @\"Weighted Intersection should work\");\n  intersection = [MathUtils weightedIntersectionOf:a and:c weight:1];\n  STAssertTrue(NSEqualRects(intersection, NSMakeRect(0, 0, 50, 50)), @\"Weighted Intersection should work\");\n  intersection = [MathUtils weightedIntersectionOf:a and:c weight:2];\n  STAssertTrue(NSEqualRects(intersection, NSMakeRect(0, 0, 100, 100)), @\"Weighted Intersection should work\");\n  intersection = [MathUtils weightedIntersectionOf:a and:c weight:0.5];\n  STAssertTrue(NSEqualRects(intersection, NSMakeRect(0, 0, 25, 25)), @\"Weighted Intersection should work\");\n  intersection = [MathUtils weightedIntersectionOf:a and:d weight:1];\n  STAssertTrue(NSEqualRects(intersection, NSMakeRect(50, 50, 50, 50)), @\"Weighted Intersection should work\");\n  intersection = [MathUtils weightedIntersectionOf:a and:d weight:2];\n  STAssertTrue(NSEqualRects(intersection, NSMakeRect(50, 50, 100, 100)), @\"Weighted Intersection should work\");\n  intersection = [MathUtils weightedIntersectionOf:a and:d weight:0.5];\n  STAssertTrue(NSEqualRects(intersection, NSMakeRect(50, 50, 25, 25)), @\"Weighted Intersection should work\");\n}\n\n@end\n"
  },
  {
    "path": "SlateTests/TestNSString+Indicies.h",
    "content": "//\n//  TestNSString+Indicies.h\n//  Slate\n//\n//  Created by Jigish Patel on 10/1/12.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <SenTestingKit/SenTestingKit.h>\n\n@interface TestNSString_Indicies : SenTestCase\n\n@end\n"
  },
  {
    "path": "SlateTests/TestNSString+Indicies.m",
    "content": "//\n//  TestNSString+Indicies.m\n//  Slate\n//\n//  Created by Jigish Patel on 10/1/12.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"TestNSString+Indicies.h\"\n#import \"NSString+Indicies.h\"\n\n@implementation TestNSString_Indicies\n\n- (void)testIndexOfString {\n  NSString *test = @\"hello&i%am-a$test#string\";\n  STAssertEquals([test indexOfString:@\"&\"], (NSInteger)5, @\"index of & should be 5\");\n  STAssertEquals([test indexOfString:@\"0\"], (NSInteger)-1, @\"index of 0 should be -1\");\n  STAssertEquals([test indexOfString:@\"hello\"], (NSInteger)0, @\"index of hello should be 0\");\n  STAssertEquals([test indexOfString:@\"g\"], (NSInteger)([test length]-1), @\"index of 0 should be ld\", [test length]-1);\n}\n\n- (void)testIndexOfChar {\n  NSString *test = @\"hello&i%am-a$test#string\";\n  STAssertEquals([test indexOfChar:'&'], (NSInteger)5, @\"index of & should be 5\");\n  STAssertEquals([test indexOfChar:'0'], (NSInteger)-1, @\"index of 0 should be -1\");\n  STAssertEquals([test indexOfChar:'h'], (NSInteger)0, @\"index of h should be 0\");\n  STAssertEquals([test indexOfChar:'g'], (NSInteger)([test length]-1), @\"index of g should be %ld\", [test length]-1);\n}\n\n@end\n"
  },
  {
    "path": "SlateTests/TestNSString+Levenshtein.h",
    "content": "//\n//  TestNSString+Levenshtein.h\n//  Slate\n//\n//  Created by Jigish Patel on 10/16/12.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <SenTestingKit/SenTestingKit.h>\n\n@interface TestNSString_Levenshtein : SenTestCase\n\n@end\n"
  },
  {
    "path": "SlateTests/TestNSString+Levenshtein.m",
    "content": "//\n//  TestNSString+Levenshtein.m\n//  Slate\n//\n//  Created by Jigish Patel on 10/16/12.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"TestNSString+Levenshtein.h\"\n#import \"NSString+Levenshtein.h\"\n\n@implementation TestNSString_Levenshtein\n\n- (void)testLevenshteinDistance {\n  NSString *a = @\"hello\";\n  NSString *b = @\"helo\";\n  NSString *c = @\"hallo\";\n  NSString *d = @\"helllo\";\n  NSString *e = @\"hldla\";\n  STAssertEquals([a levenshteinDistance:b], (float)1, @\"Levenshtein Distance between hello and helo should be 1\");\n  STAssertEquals([a levenshteinDistance:c], (float)1, @\"Levenshtein Distance between hello and hallo should be 1\");\n  STAssertEquals([a levenshteinDistance:d], (float)1, @\"Levenshtein Distance between hello and helllo should be 1\");\n  STAssertEquals([a levenshteinDistance:e], (float)3, @\"Levenshtein Distance between hello and hldlo should be 3\");\n}\n\n- (void)testSequentialDistance {\n  NSString *a = @\"hello\";\n  NSString *b= @\"hell\";\n  NSString *c = @\"hallo\";\n  NSString *d = @\"ello\";\n  NSString *e = @\"helllo\";\n  NSString *f = @\"heldlo\";\n  STAssertEquals([a sequentialDistance:b], (float)4, @\"Sequential Distance between hello and hell should be 4\");\n  STAssertEquals([a sequentialDistance:c], (float)1, @\"Sequential Distance between hello and hallo should be 1\");\n  STAssertEquals([a sequentialDistance:d], (float)0, @\"Sequential Distance between hello and hallo should be 0\");\n  STAssertEquals([a sequentialDistance:e], (float)4, @\"Sequential Distance between hello and ello should be 4\");\n  STAssertEquals([a sequentialDistance:f], (float)3, @\"Sequential Distance between hello and heldlo should be 3\");\n}\n\n@end\n"
  },
  {
    "path": "SlateTests/TestShellUtils.h",
    "content": "//\n//  TestShellUtils.h\n//  Slate\n//\n//  Created by Jigish Patel on 10/17/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import <SenTestingKit/SenTestingKit.h>\n\n@interface TestShellUtils : SenTestCase\n\n@end\n"
  },
  {
    "path": "SlateTests/TestShellUtils.m",
    "content": "//\n//  TestShellUtils.m\n//  Slate\n//\n//  Created by Jigish Patel on 10/17/12.\n//  Copyright 2012 Jigish Patel. All rights reserved.\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\n#import \"TestShellUtils.h\"\n#import \"ShellUtils.h\"\n\n@implementation TestShellUtils\n\n- (void)testCommandExists {\n  STAssertTrue([ShellUtils commandExists:@\"command\"], @\"command should exist\");\n  STAssertTrue([ShellUtils commandExists:@\"/usr/bin/command\"], @\"/usr/bin/command should exist\");\n  STAssertFalse([ShellUtils commandExists:@\"/usr/command\"], @\"/usr/command should not exist\");\n  STAssertFalse([ShellUtils commandExists:@\"oogabooga\"], @\"oogabooga should not exist\");\n  STAssertFalse([ShellUtils commandExists:nil], @\"nil should not exist\");\n  STAssertFalse([ShellUtils commandExists:@\"\"], @\"empty string should not exist\");\n}\n\n- (void)testRun {\n  NSTask *task = [ShellUtils run:@\"/bin/ls\" args:[NSArray arrayWithObject:@\"-al\"] wait:YES path:nil];\n  STAssertFalse([task isRunning], @\"Task should no longer be running\");\n  STAssertEquals([task terminationStatus], 0, @\"Status should be 0\");\n  task = [ShellUtils run:@\"/usr/bin/find\" args:[NSArray arrayWithObjects:@\"/\", @\"-name\", @\"\\\"hello\\\"\", nil] wait:NO path:@\"/usr\"];\n  STAssertTrue([task isRunning], @\"Task should still be running\");\n  STAssertTrue([[task currentDirectoryPath] isEqualToString:@\"/usr\"], @\"current path should be /usr\");\n  [task terminate];\n  [task waitUntilExit];\n  STAssertFalse([task isRunning], @\"Task should no longer be running\");\n  STAssertEquals([task terminationStatus], 15, @\"Status should be 15\");\n}\n\n- (void)testRunWithQuotedArgs {\n  NSString *result = [ShellUtils run:@\"/bin/echo 'with single' \\\"and double quotes\\\"\" wait:YES path:@\"/\"];\n  NSError *err = nil;\n  NSRegularExpression *testRegex = [NSRegularExpression regularExpressionWithPattern:@\"with single and double quotes\" options:0 error:&err];\n  int found = [testRegex numberOfMatchesInString:result options:0 range:NSMakeRange(0, [result length])];\n  STAssertEquals(found, 1, @\"Result should include all strings\");\n}\n\n@end\n"
  },
  {
    "path": "SlateTests/TestStringTokenizer.h",
    "content": "//\n//  TestStringTokenizer.h\n//  Slate\n//\n//  Created by Jigish Patel on 10/16/12.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import <SenTestingKit/SenTestingKit.h>\n\n@interface TestStringTokenizer : SenTestCase\n\n@end\n"
  },
  {
    "path": "SlateTests/TestStringTokenizer.m",
    "content": "//\n//  TestStringTokenizer.m\n//  Slate\n//\n//  Created by Jigish Patel on 10/16/12.\n//  Copyright 2011 Jigish Patel. All rights reserved.\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\n#import \"TestStringTokenizer.h\"\n#import \"StringTokenizer.h\"\n\n@implementation TestStringTokenizer\n\n/*\n + (void)tokenize:(NSString *)s into:(NSMutableArray *)array;\n + (void)tokenize:(NSString *)s into:(NSMutableArray *)array maxTokens:(NSInteger)maxTokens;\n + (void)tokenize:(NSString *)s into:(NSMutableArray *)array maxTokens:(NSInteger)maxTokens quoteChars:(NSCharacterSet *)quotes;\n + (void)firstToken:(NSString *)s into:(NSMutableString *)token;\n + (NSString *)removeQuotes:(NSString *)s quoteChars:(NSCharacterSet *)quoteChars;\n*/\n\n- (void)testIsSpaceChar {\n  STAssertTrue([StringTokenizer isSpaceChar:' '], @\"work.\");\n  STAssertTrue([StringTokenizer isSpaceChar:'\\t'], @\"work.\");\n}\n\n- (void)testIsQuoteChar {\n  NSCharacterSet *cs = [NSCharacterSet characterSetWithCharactersInString:@\"\"];\n  STAssertFalse([StringTokenizer isQuoteChar:'\"' quoteChars:cs], @\"stuff\");\n  cs = [NSCharacterSet characterSetWithCharactersInString:@\"\\\"\"];\n  STAssertTrue([StringTokenizer isQuoteChar:'\"' quoteChars:cs], @\"stuff\");\n  cs = [NSCharacterSet characterSetWithCharactersInString:@\"'\"];\n  STAssertFalse([StringTokenizer isQuoteChar:'\"' quoteChars:cs], @\"stuff\");\n  cs = [NSCharacterSet characterSetWithCharactersInString:@\"\\\"'\"];\n  STAssertTrue([StringTokenizer isQuoteChar:'\"' quoteChars:cs], @\"stuff\");\n  cs = [NSCharacterSet characterSetWithCharactersInString:@\"\\\"'\"];\n  STAssertTrue([StringTokenizer isQuoteChar:'\\'' quoteChars:cs], @\"stuff\");\n}\n\n- (void)testTokenizeInto {\n  NSMutableArray *arr = [NSMutableArray array];\n  [StringTokenizer tokenize:@\"hi tokenize\\t\\t  me\" into:arr];\n  STAssertTrue([arr count] == 3, @\"shit should work\");\n  STAssertTrue([[arr objectAtIndex:0] isEqualToString:@\"hi\"], @\"work damnit\");\n  STAssertTrue([[arr objectAtIndex:1] isEqualToString:@\"tokenize\"], @\"wtf\");\n  STAssertTrue([[arr objectAtIndex:2] isEqualToString:@\"me\"], @\"OMGWTFBBQ\");\n  arr = [NSMutableArray array];\n  [StringTokenizer tokenize:@\"hitokenizeme\" into:arr];\n  STAssertTrue([arr count] == 1, @\"shit should work\");\n  STAssertTrue([[arr objectAtIndex:0] isEqualToString:@\"hitokenizeme\"], @\"work damnit\");\n  arr = [NSMutableArray array];\n  [StringTokenizer tokenize:@\"\" into:arr];\n  STAssertTrue([arr count] == 0, @\"shit should work\");\n}\n\n- (void)testTokenizeIntoQuoteChars {\n  NSMutableArray *arr = [NSMutableArray array];\n  NSCharacterSet *cs = [NSCharacterSet characterSetWithCharactersInString:@\"\\\"'\"];\n  [StringTokenizer tokenize:@\"hi tokenize\\t\\t  me\" into:arr quoteChars:cs];\n  STAssertTrue([arr count] == 3, @\"shit should work\");\n  STAssertTrue([[arr objectAtIndex:0] isEqualToString:@\"hi\"], @\"work damnit\");\n  STAssertTrue([[arr objectAtIndex:1] isEqualToString:@\"tokenize\"], @\"wtf\");\n  STAssertTrue([[arr objectAtIndex:2] isEqualToString:@\"me\"], @\"OMGWTFBBQ\");\n  arr = [NSMutableArray array];\n  [StringTokenizer tokenize:@\"\" into:arr quoteChars:cs];\n  STAssertTrue([arr count] == 0, @\"shit should work\");\n  arr = [NSMutableArray array];\n  [StringTokenizer tokenize:@\"hi 'tokenize\\t\\t  me'\" into:arr maxTokens:100 quoteChars:cs];\n  STAssertTrue([arr count] == 2, @\"shit should work\");\n  STAssertTrue([[arr objectAtIndex:0] isEqualToString:@\"hi\"], @\"work damnit\");\n  STAssertTrue([[arr objectAtIndex:1] isEqualToString:@\"tokenize\\t\\t  me\"], @\"wtf\");\n}\n\n- (void)testTokenizeIntoMaxTokens {\n  NSMutableArray *arr = [NSMutableArray array];\n  [StringTokenizer tokenize:@\"hi tokenize\\t\\t  me\" into:arr maxTokens:100];\n  STAssertTrue([arr count] == 3, @\"shit should work\");\n  STAssertTrue([[arr objectAtIndex:0] isEqualToString:@\"hi\"], @\"work damnit\");\n  STAssertTrue([[arr objectAtIndex:1] isEqualToString:@\"tokenize\"], @\"wtf\");\n  STAssertTrue([[arr objectAtIndex:2] isEqualToString:@\"me\"], @\"OMGWTFBBQ\");\n  arr = [NSMutableArray array];\n  [StringTokenizer tokenize:@\"hi tokenize\\t\\t  me\" into:arr maxTokens:2];\n  STAssertTrue([arr count] == 2, @\"shit should work\");\n  STAssertTrue([[arr objectAtIndex:0] isEqualToString:@\"hi\"], @\"work damnit\");\n  STAssertTrue([[arr objectAtIndex:1] isEqualToString:@\"tokenize\\t\\t  me\"], @\"wtf\");\n  arr = [NSMutableArray array];\n  [StringTokenizer tokenize:@\"hi tokenize me\" into:arr maxTokens:1];\n  STAssertTrue([arr count] == 1, @\"shit should work\");\n  STAssertTrue([[arr objectAtIndex:0] isEqualToString:@\"hi tokenize me\"], @\"work damnit\");\n  arr = [NSMutableArray array];\n  [StringTokenizer tokenize:@\"\" into:arr maxTokens:1000];\n  STAssertTrue([arr count] == 0, @\"shit should work\");\n}\n\n- (void)testTokenizeIntoMaxTokensQuoteChars {\n  NSMutableArray *arr = [NSMutableArray array];\n  NSCharacterSet *cs = [NSCharacterSet characterSetWithCharactersInString:@\"\\\"'\"];\n  [StringTokenizer tokenize:@\"hi tokenize\\t\\t  me\" into:arr maxTokens:100 quoteChars:cs];\n  STAssertTrue([arr count] == 3, @\"shit should work\");\n  STAssertTrue([[arr objectAtIndex:0] isEqualToString:@\"hi\"], @\"work damnit\");\n  STAssertTrue([[arr objectAtIndex:1] isEqualToString:@\"tokenize\"], @\"wtf\");\n  STAssertTrue([[arr objectAtIndex:2] isEqualToString:@\"me\"], @\"OMGWTFBBQ\");\n  arr = [NSMutableArray array];\n  [StringTokenizer tokenize:@\"hi tokenize\\t\\t  me\" into:arr maxTokens:2 quoteChars:cs];\n  STAssertTrue([arr count] == 2, @\"shit should work\");\n  STAssertTrue([[arr objectAtIndex:0] isEqualToString:@\"hi\"], @\"work damnit\");\n  STAssertTrue([[arr objectAtIndex:1] isEqualToString:@\"tokenize\\t\\t  me\"], @\"wtf\");\n  arr = [NSMutableArray array];\n  [StringTokenizer tokenize:@\"hi tokenize me\" into:arr maxTokens:1 quoteChars:cs];\n  STAssertTrue([arr count] == 1, @\"shit should work\");\n  STAssertTrue([[arr objectAtIndex:0] isEqualToString:@\"hi tokenize me\"], @\"work damnit\");\n  arr = [NSMutableArray array];\n  [StringTokenizer tokenize:@\"\" into:arr maxTokens:1000 quoteChars:cs];\n  STAssertTrue([arr count] == 0, @\"shit should work\");\n  arr = [NSMutableArray array];\n  [StringTokenizer tokenize:@\"hi 'tokenize\\t\\t  me'\" into:arr maxTokens:100 quoteChars:cs];\n  STAssertTrue([arr count] == 2, @\"shit should work\");\n  STAssertTrue([[arr objectAtIndex:0] isEqualToString:@\"hi\"], @\"work damnit\");\n  STAssertTrue([[arr objectAtIndex:1] isEqualToString:@\"tokenize\\t\\t  me\"], @\"wtf\");\n  arr = [NSMutableArray array];\n  [StringTokenizer tokenize:@\"hi 'tokenize\\t\\t  \\\"me\\\"'\" into:arr maxTokens:100 quoteChars:cs];\n  STAssertTrue([arr count] == 2, @\"shit should work\");\n  STAssertTrue([[arr objectAtIndex:0] isEqualToString:@\"hi\"], @\"work damnit\");\n  STAssertTrue([[arr objectAtIndex:1] isEqualToString:@\"tokenize\\t\\t  \\\"me\\\"\"], @\"wtf\");\n  arr = [NSMutableArray array];\n  [StringTokenizer tokenize:@\"hi 'tokenize\\t\\t  \\\"me\\\"'\" into:arr quoteChars:cs];\n  STAssertTrue([arr count] == 2, @\"shit should work\");\n  STAssertTrue([[arr objectAtIndex:0] isEqualToString:@\"hi\"], @\"work damnit\");\n  STAssertTrue([[arr objectAtIndex:1] isEqualToString:@\"tokenize\\t\\t  \\\"me\\\"\"], @\"wtf\");\n}\n\n@end\n"
  },
  {
    "path": "SlateTests/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Headers/SUAppcast.h",
    "content": "//\n//  SUAppcast.h\n//  Sparkle\n//\n//  Created by Andy Matuschak on 3/12/06.\n//  Copyright 2006 Andy Matuschak. All rights reserved.\n//\n\n#ifndef SUAPPCAST_H\n#define SUAPPCAST_H\n\n@class SUAppcastItem;\n@interface SUAppcast : NSObject {\n\tNSArray *items;\n\tNSString *userAgentString;\n\tid delegate;\n\tNSMutableData *incrementalData;\n}\n\n- (void)fetchAppcastFromURL:(NSURL *)url;\n- (void)setDelegate:delegate;\n- (void)setUserAgentString:(NSString *)userAgentString;\n\n- (NSArray *)items;\n\n@end\n\n@interface NSObject (SUAppcastDelegate)\n- (void)appcastDidFinishLoading:(SUAppcast *)appcast;\n- (void)appcast:(SUAppcast *)appcast failedToLoadWithError:(NSError *)error;\n@end\n\n#endif\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Headers/SUAppcastItem.h",
    "content": "//\n//  SUAppcastItem.h\n//  Sparkle\n//\n//  Created by Andy Matuschak on 3/12/06.\n//  Copyright 2006 Andy Matuschak. All rights reserved.\n//\n\n#ifndef SUAPPCASTITEM_H\n#define SUAPPCASTITEM_H\n\n@interface SUAppcastItem : NSObject {\n\tNSString *title;\n\tNSDate *date;\n\tNSString *itemDescription;\n\t\n\tNSURL *releaseNotesURL;\n\t\n\tNSString *DSASignature;\t\n\tNSString *minimumSystemVersion;\n\t\n\tNSURL *fileURL;\n\tNSString *versionString;\n\tNSString *displayVersionString;\n\t\n\tNSDictionary *propertiesDictionary;\n}\n\n// Initializes with data from a dictionary provided by the RSS class.\n- initWithDictionary:(NSDictionary *)dict;\n\n- (NSString *)title;\n- (NSString *)versionString;\n- (NSString *)displayVersionString;\n- (NSDate *)date;\n- (NSString *)itemDescription;\n- (NSURL *)releaseNotesURL;\n- (NSURL *)fileURL;\n- (NSString *)DSASignature;\n- (NSString *)minimumSystemVersion;\n\n// Returns the dictionary provided in initWithDictionary; this might be useful later for extensions.\n- (NSDictionary *)propertiesDictionary;\n\n@end\n\n#endif\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Headers/SUUpdater.h",
    "content": "//\n//  SUUpdater.h\n//  Sparkle\n//\n//  Created by Andy Matuschak on 1/4/06.\n//  Copyright 2006 Andy Matuschak. All rights reserved.\n//\n\n#ifndef SUUPDATER_H\n#define SUUPDATER_H\n\n#import <Sparkle/SUVersionComparisonProtocol.h>\n\n@class SUUpdateDriver, SUAppcastItem, SUHost, SUAppcast;\n@interface SUUpdater : NSObject {\n\tNSTimer *checkTimer;\n\tSUUpdateDriver *driver;\n\t\n\tSUHost *host;\n\tIBOutlet id delegate;\n}\n\n+ (SUUpdater *)sharedUpdater;\n+ (SUUpdater *)updaterForBundle:(NSBundle *)bundle;\n- (NSBundle *)hostBundle;\n\n- (void)setDelegate:(id)delegate;\n- delegate;\n\n- (void)setAutomaticallyChecksForUpdates:(BOOL)automaticallyChecks;\n- (BOOL)automaticallyChecksForUpdates;\n\n- (void)setUpdateCheckInterval:(NSTimeInterval)interval;\n- (NSTimeInterval)updateCheckInterval;\n\n- (void)setFeedURL:(NSURL *)feedURL;\n- (NSURL *)feedURL;\n\n- (void)setSendsSystemProfile:(BOOL)sendsSystemProfile;\n- (BOOL)sendsSystemProfile;\n\n- (void)setAutomaticallyDownloadsUpdates:(BOOL)automaticallyDownloadsUpdates;\n- (BOOL)automaticallyDownloadsUpdates;\n\n// This IBAction is meant for a main menu item. Hook up any menu item to this action,\n// and Sparkle will check for updates and report back its findings verbosely.\n- (IBAction)checkForUpdates:sender;\n\n// This kicks off an update meant to be programmatically initiated. That is, it will display no UI unless it actually finds an update,\n// in which case it proceeds as usual. If the fully automated updating is turned on, however, this will invoke that behavior, and if an\n// update is found, it will be downloaded and prepped for installation.\n- (void)checkForUpdatesInBackground;\n\n// Date of last update check. Returns null if no check has been performed.\n- (NSDate*)lastUpdateCheckDate;\n\n// This begins a \"probing\" check for updates which will not actually offer to update to that version. The delegate methods, though,\n// (up to updater:didFindValidUpdate: and updaterDidNotFindUpdate:), are called, so you can use that information in your UI.\n- (void)checkForUpdateInformation;\n\n// Call this to appropriately schedule or cancel the update checking timer according to the preferences for time interval and automatic checks. This call does not change the date of the next check, but only the internal NSTimer.\n- (void)resetUpdateCycle;\n\n- (BOOL)updateInProgress;\n@end\n\n@interface NSObject (SUUpdaterDelegateInformalProtocol)\n// This method allows you to add extra parameters to the appcast URL, potentially based on whether or not Sparkle will also be sending along the system profile. This method should return an array of dictionaries with keys: \"key\", \"value\", \"displayKey\", \"displayValue\", the latter two being specifically for display to the user.\n- (NSArray *)feedParametersForUpdater:(SUUpdater *)updater sendingSystemProfile:(BOOL)sendingProfile;\n\n// Use this to override the default behavior for Sparkle prompting the user about automatic update checks.\n- (BOOL)updaterShouldPromptForPermissionToCheckForUpdates:(SUUpdater *)bundle;\n\n// Implement this if you want to do some special handling with the appcast once it finishes loading.\n- (void)updater:(SUUpdater *)updater didFinishLoadingAppcast:(SUAppcast *)appcast;\n\n// If you're using special logic or extensions in your appcast, implement this to use your own logic for finding\n// a valid update, if any, in the given appcast.\n- (SUAppcastItem *)bestValidUpdateInAppcast:(SUAppcast *)appcast forUpdater:(SUUpdater *)bundle;\n\n// Sent when a valid update is found by the update driver.\n- (void)updater:(SUUpdater *)updater didFindValidUpdate:(SUAppcastItem *)update;\n\n// Sent when a valid update is not found.\n- (void)updaterDidNotFindUpdate:(SUUpdater *)update;\n\n// Sent immediately before installing the specified update.\n- (void)updater:(SUUpdater *)updater willInstallUpdate:(SUAppcastItem *)update;\n\n// Return YES to delay the relaunch until you do some processing; invoke the given NSInvocation to continue.\n- (BOOL)updater:(SUUpdater *)updater shouldPostponeRelaunchForUpdate:(SUAppcastItem *)update untilInvoking:(NSInvocation *)invocation;\n\n// Called immediately before relaunching.\n- (void)updaterWillRelaunchApplication:(SUUpdater *)updater;\n\n// This method allows you to provide a custom version comparator.\n// If you don't implement this method or return nil, the standard version comparator will be used.\n- (id <SUVersionComparison>)versionComparatorForUpdater:(SUUpdater *)updater;\n\n// Returns the path which is used to relaunch the client after the update is installed. By default, the path of the host bundle.\n- (NSString *)pathToRelaunchForUpdater:(SUUpdater *)updater;\n\n@end\n\n// Define some minimum intervals to avoid DOS-like checking attacks. These are in seconds.\n#ifdef DEBUG\n#define SU_MIN_CHECK_INTERVAL 60\n#else\n#define SU_MIN_CHECK_INTERVAL 60*60\n#endif\n\n#ifdef DEBUG\n#define SU_DEFAULT_CHECK_INTERVAL 60\n#else\n#define SU_DEFAULT_CHECK_INTERVAL 60*60*24\n#endif\n\n#endif\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h",
    "content": "//\n//  SUVersionComparisonProtocol.h\n//  Sparkle\n//\n//  Created by Andy Matuschak on 12/21/07.\n//  Copyright 2007 Andy Matuschak. All rights reserved.\n//\n\n#ifndef SUVERSIONCOMPARISONPROTOCOL_H\n#define SUVERSIONCOMPARISONPROTOCOL_H\n\n/*!\n    @protocol\n    @abstract    Implement this protocol to provide version comparison facilities for Sparkle.\n*/\n@protocol SUVersionComparison\n\n/*!\n    @method     \n    @abstract   An abstract method to compare two version strings.\n    @discussion Should return NSOrderedAscending if b > a, NSOrderedDescending if b < a, and NSOrderedSame if they are equivalent.\n*/\n- (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB;\n\n@end\n\n#endif\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Headers/Sparkle.h",
    "content": "//\n//  Sparkle.h\n//  Sparkle\n//\n//  Created by Andy Matuschak on 3/16/06. (Modified by CDHW on 23/12/07)\n//  Copyright 2006 Andy Matuschak. All rights reserved.\n//\n\n#ifndef SPARKLE_H\n#define SPARKLE_H\n\n// This list should include the shared headers. It doesn't matter if some of them aren't shared (unless\n// there are name-space collisions) so we can list all of them to start with:\n\n#import <Sparkle/SUUpdater.h>\n\n#import <Sparkle/SUAppcast.h>\n#import <Sparkle/SUAppcastItem.h>\n#import <Sparkle/SUVersionComparisonProtocol.h>\n\n#endif\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>Sparkle</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>org.andymatuschak.Sparkle</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>Sparkle</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.5 Beta 6</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>313</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/License.txt",
    "content": "Copyright (c) 2006 Andy Matuschak\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."
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/SUModelTranslation.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>ADP2,1</key>\n\t<string>Developer Transition Kit</string>\n\t<key>MacBook1,1</key>\n\t<string>MacBook (Core Duo)</string>\n\t<key>MacBook2,1</key>\n\t<string>MacBook (Core 2 Duo)</string>\n\t<key>MacBook4,1</key>\n\t<string>MacBook (Core 2 Duo Feb 2008)</string>\n\t<key>MacBookAir1,1</key>\n\t<string>MacBook Air (January 2008)</string>\n\t<key>MacBookPro1,1</key>\n\t<string>MacBook Pro Core Duo (15-inch)</string>\n\t<key>MacBookPro1,2</key>\n\t<string>MacBook Pro Core Duo (17-inch)</string>\n\t<key>MacBookPro2,1</key>\n\t<string>MacBook Pro Core 2 Duo (17-inch)</string>\n\t<key>MacBookPro2,2</key>\n\t<string>MacBook Pro Core 2 Duo (15-inch)</string>\n\t<key>MacBookPro3,1</key>\n\t<string>MacBook Pro Core 2 Duo (15-inch LED, Core 2 Duo)</string>\n\t<key>MacBookPro3,2</key>\n\t<string>MacBook Pro Core 2 Duo (17-inch HD, Core 2 Duo)</string>\n\t<key>MacBookPro4,1</key>\n\t<string>MacBook Pro (Core 2 Duo Feb 2008)</string>\n\t<key>MacPro1,1</key>\n\t<string>Mac Pro (four-core)</string>\n\t<key>MacPro2,1</key>\n\t<string>Mac Pro (eight-core)</string>\n\t<key>MacPro3,1</key>\n\t<string>Mac Pro (January 2008 4- or 8- core \"Harpertown\")</string>\n\t<key>Macmini1,1</key>\n\t<string>Mac Mini (Core Solo/Duo)</string>\n\t<key>PowerBook1,1</key>\n\t<string>PowerBook G3</string>\n\t<key>PowerBook2,1</key>\n\t<string>iBook G3</string>\n\t<key>PowerBook2,2</key>\n\t<string>iBook G3 (FireWire)</string>\n\t<key>PowerBook2,3</key>\n\t<string>iBook G3</string>\n\t<key>PowerBook2,4</key>\n\t<string>iBook G3</string>\n\t<key>PowerBook3,1</key>\n\t<string>PowerBook G3 (FireWire)</string>\n\t<key>PowerBook3,2</key>\n\t<string>PowerBook G4</string>\n\t<key>PowerBook3,3</key>\n\t<string>PowerBook G4 (Gigabit Ethernet)</string>\n\t<key>PowerBook3,4</key>\n\t<string>PowerBook G4 (DVI)</string>\n\t<key>PowerBook3,5</key>\n\t<string>PowerBook G4 (1GHz / 867MHz)</string>\n\t<key>PowerBook4,1</key>\n\t<string>iBook G3 (Dual USB, Late 2001)</string>\n\t<key>PowerBook4,2</key>\n\t<string>iBook G3 (16MB VRAM)</string>\n\t<key>PowerBook4,3</key>\n\t<string>iBook G3 Opaque 16MB VRAM, 32MB VRAM, Early 2003)</string>\n\t<key>PowerBook5,1</key>\n\t<string>PowerBook G4 (17 inch)</string>\n\t<key>PowerBook5,2</key>\n\t<string>PowerBook G4 (15 inch FW 800)</string>\n\t<key>PowerBook5,3</key>\n\t<string>PowerBook G4 (17-inch 1.33GHz)</string>\n\t<key>PowerBook5,4</key>\n\t<string>PowerBook G4 (15 inch 1.5/1.33GHz)</string>\n\t<key>PowerBook5,5</key>\n\t<string>PowerBook G4 (17-inch 1.5GHz)</string>\n\t<key>PowerBook5,6</key>\n\t<string>PowerBook G4 (15 inch 1.67GHz/1.5GHz)</string>\n\t<key>PowerBook5,7</key>\n\t<string>PowerBook G4 (17-inch 1.67GHz)</string>\n\t<key>PowerBook5,8</key>\n\t<string>PowerBook G4 (Double layer SD, 15 inch)</string>\n\t<key>PowerBook5,9</key>\n\t<string>PowerBook G4 (Double layer SD, 17 inch)</string>\n\t<key>PowerBook6,1</key>\n\t<string>PowerBook G4 (12 inch)</string>\n\t<key>PowerBook6,2</key>\n\t<string>PowerBook G4 (12 inch, DVI)</string>\n\t<key>PowerBook6,3</key>\n\t<string>iBook G4</string>\n\t<key>PowerBook6,4</key>\n\t<string>PowerBook G4 (12 inch 1.33GHz)</string>\n\t<key>PowerBook6,5</key>\n\t<string>iBook G4 (Early-Late 2004)</string>\n\t<key>PowerBook6,7</key>\n\t<string>iBook G4 (Mid 2005)</string>\n\t<key>PowerBook6,8</key>\n\t<string>PowerBook G4 (12 inch 1.5GHz)</string>\n\t<key>PowerMac1,1</key>\n\t<string>Power Macintosh G3 (Blue &amp; White)</string>\n\t<key>PowerMac1,2</key>\n\t<string>Power Macintosh G4 (PCI Graphics)</string>\n\t<key>PowerMac10,1</key>\n\t<string>Mac Mini G4</string>\n\t<key>PowerMac10,2</key>\n\t<string>Mac Mini (Late 2005)</string>\n\t<key>PowerMac11,2</key>\n\t<string>Power Macintosh G5 (Late 2005)</string>\n\t<key>PowerMac12,1</key>\n\t<string>iMac G5 (iSight)</string>\n\t<key>PowerMac2,1</key>\n\t<string>iMac G3 (Slot-loading CD-ROM)</string>\n\t<key>PowerMac2,2</key>\n\t<string>iMac G3 (Summer 2000)</string>\n\t<key>PowerMac3,1</key>\n\t<string>Power Macintosh G4 (AGP Graphics)</string>\n\t<key>PowerMac3,2</key>\n\t<string>Power Macintosh G4 (AGP Graphics)</string>\n\t<key>PowerMac3,3</key>\n\t<string>Power Macintosh G4 (Gigabit Ethernet)</string>\n\t<key>PowerMac3,4</key>\n\t<string>Power Macintosh G4 (Digital Audio)</string>\n\t<key>PowerMac3,5</key>\n\t<string>Power Macintosh G4 (Quick Silver)</string>\n\t<key>PowerMac3,6</key>\n\t<string>Power Macintosh G4 (Mirrored Drive Door)</string>\n\t<key>PowerMac4,1</key>\n\t<string>iMac G3 (Early/Summer 2001)</string>\n\t<key>PowerMac4,2</key>\n\t<string>iMac G4 (Flat Panel)</string>\n\t<key>PowerMac4,4</key>\n\t<string>eMac</string>\n\t<key>PowerMac4,5</key>\n\t<string>iMac G4 (17-inch Flat Panel)</string>\n\t<key>PowerMac5,1</key>\n\t<string>Power Macintosh G4 Cube</string>\n\t<key>PowerMac6,1</key>\n\t<string>iMac G4 (USB 2.0)</string>\n\t<key>PowerMac6,3</key>\n\t<string>iMac G4 (20-inch Flat Panel)</string>\n\t<key>PowerMac6,4</key>\n\t<string>eMac (USB 2.0, 2005)</string>\n\t<key>PowerMac7,2</key>\n\t<string>Power Macintosh G5</string>\n\t<key>PowerMac7,3</key>\n\t<string>Power Macintosh G5</string>\n\t<key>PowerMac8,1</key>\n\t<string>iMac G5</string>\n\t<key>PowerMac8,2</key>\n\t<string>iMac G5 (Ambient Light Sensor)</string>\n\t<key>PowerMac9,1</key>\n\t<string>Power Macintosh G5 (Late 2005)</string>\n\t<key>RackMac1,1</key>\n\t<string>Xserve G4</string>\n\t<key>RackMac1,2</key>\n\t<string>Xserve G4 (slot-loading, cluster node)</string>\n\t<key>RackMac3,1</key>\n\t<string>Xserve G5</string>\n\t<key>Xserve1,1</key>\n\t<string>Xserve (Intel Xeon)</string>\n\t<key>Xserve2,1</key>\n\t<string>Xserve (January 2008 quad-core)</string>\n\t<key>iMac1,1</key>\n\t<string>iMac G3 (Rev A-D)</string>\n\t<key>iMac4,1</key>\n\t<string>iMac (Core Duo)</string>\n\t<key>iMac4,2</key>\n\t<string>iMac for Education (17-inch, Core Duo)</string>\n\t<key>iMac5,1</key>\n\t<string>iMac (Core 2 Duo, 17 or 20 inch, SuperDrive)</string>\n\t<key>iMac5,2</key>\n\t<string>iMac (Core 2 Duo, 17 inch, Combo Drive)</string>\n\t<key>iMac6,1</key>\n\t<string>iMac (Core 2 Duo, 24 inch, SuperDrive)</string>\n\t<key>iMac8,1</key>\n\t<string>iMac (April 2008)</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/SUStatus.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUStatusController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>actionButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>progressBar</key>\n\t\t\t\t<string>NSProgressIndicator</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/SUStatus.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>10A96</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>installUpdate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>remindMeLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>skipThisVersion</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>description</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>releaseNotesView</key>\n\t\t\t\t<string>WebView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>658</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9C7010</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>installUpdate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>remindMeLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>skipThisVersion</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>description</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>releaseNotesView</key>\n\t\t\t\t<string>WebView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>18</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>10A96</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t\t<integer>41</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>10A96</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>installUpdate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>remindMeLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>skipThisVersion</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>description</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>releaseNotesView</key>\n\t\t\t\t<string>WebView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>629</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array/>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>installUpdate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>remindMeLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>skipThisVersion</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>description</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>releaseNotesView</key>\n\t\t\t\t<string>WebView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>629</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array/>\n\t<key>IBSystem Version</key>\n\t<string>9E17</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>629</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array/>\n\t<key>IBSystem Version</key>\n\t<string>9E17</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>installUpdate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>remindMeLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>skipThisVersion</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>description</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>releaseNotesView</key>\n\t\t\t\t<string>WebView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>5</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>629</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>installUpdate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>remindMeLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>skipThisVersion</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>description</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>releaseNotesView</key>\n\t\t\t\t<string>WebView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>629</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array/>\n\t<key>IBSystem Version</key>\n\t<string>9E17</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>629</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array/>\n\t<key>IBSystem Version</key>\n\t<string>9E17</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9E17</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>installUpdate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>remindMeLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>skipThisVersion</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>description</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>releaseNotesView</key>\n\t\t\t\t<string>WebView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9E17</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array/>\n\t<key>IBSystem Version</key>\n\t<string>9E17</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>10A96</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/classes.nib",
    "content": "{\n    IBClasses =     (\n                {\n            CLASS = FirstResponder;\n            LANGUAGE = ObjC;\n            SUPERCLASS = NSObject;\n        },\n                {\n            CLASS = NSApplication;\n            LANGUAGE = ObjC;\n            SUPERCLASS = NSResponder;\n        },\n                {\n            CLASS = NSObject;\n            LANGUAGE = ObjC;\n        },\n                {\n            ACTIONS =             {\n                installUpdate = id;\n                remindMeLater = id;\n                skipThisVersion = id;\n            };\n            CLASS = SUUpdateAlert;\n            LANGUAGE = ObjC;\n            OUTLETS =             {\n                delegate = id;\n                description = NSTextField;\n                releaseNotesView = WebView;\n            };\n            SUPERCLASS = SUWindowController;\n        },\n                {\n            CLASS = SUWindowController;\n            LANGUAGE = ObjC;\n            SUPERCLASS = NSWindowController;\n        }\n    );\n    IBVersion = 1;\n}"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBDocumentLocation</key>\n\t<string>69 14 356 240 0 0 1280 778 </string>\n\t<key>IBFramework Version</key>\n\t<string>489.0</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>10A96</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "VERSION",
    "content": "Current Version: 1.0.25\n\n----------------- 1.0.25 ----------------\n\nUpdates to javascript configs\n- Issue #239 - add events and event listeners\n- Issue #252 - allow for integers in screenForRef\n- Issue #241 - fix order of operations related issues in corner operation\n- Issue #233 - allow numbers in options for move based operations\n- fix doop on window object\n- fix screenCount\nIssue #240 - add link to about page\nIssue #250 - load default config file properly\nMerge Pull Request #248 - fix undo for move based operations\nMerge Pull Request #253 - allow quoted arguments in shell operation\n\n----------------- 1.0.24 ----------------\n\nfix stupid bug.\n\n----------------- 1.0.23 ----------------\n\nUpdates to javascript configs\n- Issue #220 - one-off operations\n- Issue #222 - don't auto-fail js operations if there is no window focused\n- Issue #218 - add isMovable and isResizable to windows\n- Issue #221 - add aliases for more functions\n- Issue #219 - add visibleRect to screen\nIssue #206 - fix a crash\nIssue #217 - better error when a key is unrecognized\nFix some minor memory leaks\n\n----------------- 1.0.22 ----------------\n\nUpdates to javascript configs\n- add dup function to operations\n- slate.log now will show the message on the OS X Console for easier debugging\n\n----------------- 1.0.21 ----------------\n\nRandom fixes to javascript configs\n- Sequence and Chain can now take functions as well as objects\n- screen object rect() function should now work properly\nFixed a bug with grid operation that did not take orderScreensLeftToRight into account\nRemoved all logging in Slate. if you want to see the logs, use the debug version of Slate from the repo.\n\n----------------- 1.0.20 ----------------\n\nRandom fixes to javascript configs\nnudgePercentOf and resizePercentOf now default to screenSize because that just makes more sense.\nAdded some documentation for javascript configs on the Wiki. more incoming.\n\n----------------- 1.0.19 ----------------\n\nImplement Issue #91 - [BETA] javascript config file (no documentation yet)\nImplement Issue #172 - modal mode toggle\n\n----------------- 1.0.18 ----------------\n\nFix Issue #209 - fix modal bindings\nWIP Issue #91 - javascript config file (no documentation yet)\n\n----------------- 1.0.17 ----------------\n\nMerge Pull Request #191 - (Fix Issue #190)\nMerge Pull Request #166 - (Fix Issue #130)\nMerge Pull Request #204\nMerge Pull Request #185\n\n----------------- 1.0.16 ----------------\n\nAdd REPEAT_LAST and TITLE_ORDER_REGEX to layouts\n\n----------------- 1.0.15 ----------------\n\nFix Issue #177 - slate now will detect the first screen change properly when checkDefaultsOnLoad is false.\n                 also, the following quoted string is now allowed: 'hello, I am a string with \"nested\" quotes'\n\n----------------- 1.0.14 ----------------\n\nImplement Issue #171 - undoOps config\nImplement Issue #179 - allow BEFORE and AFTER operations for layout\nImplement Issue #176 - allow WindowInfo to be selectable\n\n----------------- 1.0.13 ----------------\n\nImplement Issue #165 - undo operation\nMerge Pull Request #146\nMerge Pull Request #143 (windowHintsIconAlpha)\nMerge Pull request #161 (Colemak Support)\n\n----------------- 1.0.12 ----------------\n\nImplement Issue #121 - enable fn as modifier\nPartially implement issue #85 - added shell operation\n\n----------------- 1.0.11 ----------------\n\nImplement Issue #131 - better load config\nImplement Issue #125 - modal key with modifiers\n\"Load Config\" is now \"Relaunch and Load Config\" to maintain a clean Slate (get it!?)\nUpdate Sparkle\n\n----------------- 1.0.10 ----------------\n\nMerge Pull Request #111 (hint icons and associated configs)\n\n----------------- 1.0.9 -----------------\n\nAdd ability to hide, show, and toggle all apps or all except one single app\n\n----------------- 1.0.8 -----------------\n\nAdd ability to hide, show and toggle the current app\n\n----------------- 1.0.7 -----------------\n\nImplement Issue #118 (hide, show, and toggle operations)\nImplement Issue #117 (focus an application)\nImplement Issue #103 (layoutFocusOnActivate config)\nImplement Issue #100 (modal commands)\nMerged Pull Request #119\nMerged Pull Request #115\nMerged Pull Request #93\n\n----------------- 1.0.6 -----------------\n\nFixed Issue #109\nImplement Issue #114 (sequence operation)\n\n----------------- 1.0.5 -----------------\n\nProperly Fix Issue #92\n\n----------------- 1.0.4 -----------------\n\nFixed Issue #92\nDMG Installation\n\n----------------- 1.0.3 -----------------\n\nUpgrade Xcode project\nAdd Grid Operation! Bind a key to open a grid that you can use to one-off resize a window\nAdded the following configs for grid:\n  gridBackgroundColor\n  gridRoundedCornerSize\n  gridCellBackgroundColor\n  gridCellSelectedColor\n  gridCellRoundedCornerSize\n\n----------------- 1.0.2 -----------------\n\nFixed Issue #76 - Added config snapshotTitleMatch\n\n----------------- 1.0.1 -----------------\n\nFixed sparkle.\n\n----------------- 1.0.0 -----------------\n\nbump version cause I feel like it. From now on users who had a symlink from the git to /Applications should\n  remove the symlink and just download the latest version from the downloads page on github. Sparkle will\n  update you when you need it.\n\n----------------- 0.6.0 -----------------\n\nLet there be SPARKLE! Slate now has automatic updates through Sparkle!\n\n----------------- 0.5.12 ----------------\n\nDefaults can now trigger snapshots!\n\n----------------- 0.5.11 ----------------\n\nUpdate Snapshot menu items to persist and not delete\nAdded \"Launch Slate on Login\" menu item\n\n----------------- 0.5.10 ----------------\n\nFix Issue #72, #74\nAdd a default config if no .slate file exists in ~/ to appease the App Store testers.\n\n----------------- 0.5.9 -----------------\n\nFix Issue #70 (Dvorak Support)\n\n----------------- 0.5.8 -----------------\n\nFix Issue #69\n\n----------------- 0.5.7 -----------------\n\nFix Issue #63\n\n----------------- 0.5.6 -----------------\n\nFix Issue #66\nSnapshots are now stored in the Application Support directory\n\n----------------- 0.5.5 -----------------\n\nNew Icon\n\n----------------- 0.5.4 -----------------\n\nFix bad access error\n\n----------------- 0.5.3 -----------------\n\nFix Issue #58, #60, #61, #62\nFixed exception on cmd+shift+tab with default switch operation\nFixed switch op to properly switch to hidden apps\n\n----------------- 0.5.2 -----------------\n\nAdd Configs:\n  secondsBeforeRepeat\n  switchSecondsBeforeRepeat\nChanged Configs:\n  secondsBetweenRepeat (Default 0.1 - was 0.2)\n  switchSecondsBetweenRepeat (Default 0.05 - was 0.1)\n\n----------------- 0.5.1 -----------------\n\nFix Issue #56 (unrecognized selector on startup for Mac OS X 10.6)\n\n----------------- 0.5.0 -----------------\n\nFix Issue #32\nRelease version of Switch operation\nAdd/Update configs:\n  switchOrientation\n  switchSecondsBetweenRepeat\n  switchStopRepeatAtEdge\n  switchOnlyFocusMainWindow\n  switchIconPadding\n  switchFontSize\n  switchFontColor\n  switchFontName\n  switchShowTitles\n  switchType\n  switchSelectedPadding\n  switchSelectedColor -> switchSelectedBackgroundColor\n  switchSelectedBorderColor\n  switchSelectedBorderSize\n  switchRoundedCornerSize\n  windowHintOrder \"persist\" mode\n\n----------------- 0.4.19 ----------------\n\nFix Issue #50, #51, #52\nBeta version of Switch operation (Issue #32 WIP)\nChange windowHintsTopLeftX and windowHintsTopLeftY to array configs (array of expressions)\nAdd windowHintsOrder config\nAdd support for cmd+tab and cmd+shift+tab bindings (this completely disables the default mac app switcher)\nChange array config format to use semi-colon as a separator instead of colon. This affects:\n  windowHintsFontColor\n  windowHintsBackgroundColor\n  switchBackgroundColor\n  switchSelectedColor\n\n----------------- 0.4.18 ----------------\n\nFix Issue #45, #47, #48\nPressing ESC will dismiss window hints\nApps will now be ordered by last use for all operations that loop through apps\nMinor UI related performance enhancements for window hints (faster rounded rectangle drawing)\nPre-release version of Switch operation (use at your own risk!)\n\n----------------- 0.4.17 ----------------\n\nFix Issue #36, #37, #38, #42\nAdd windowHintsIgnoreHiddenWindows config\nAdd ability to use expressions for windowHintsHeight and windowHintsWidth configs\nAdd windowHintsTopLeftX and windowHintsTopLeftY configs\nAdd menu options to Take/Activate Snapshots\n\n----------------- 0.4.16 ----------------\n\nPerformance improvements for Window Hints and other minor bug fixes\n\n----------------- 0.4.15 ----------------\n\nFix Issues #34, #35, #40\nAdded windowHintsRoundedCornerSize config\nFixed Current Window Info menu option to allow scroll\n\n----------------- 0.4.14 ----------------\n\nAdded Window Hints\n\n----------------- 0.4.13 ----------------\n\nSwitch to ARC (no new feature or bug fixes, but should have better memory management and performance)\n\n----------------- 0.4.12 ----------------\n\nAdded Snapshot operations\n\n----------------- 0.4.11 ----------------\n\nAdded Current Window Info menu option (Issue #20)\n\n----------------- 0.4.10 ----------------\n\nFixed Issue #25 - Binding parse error when starting up Slate when referencing unconnected screens\n\n----------------- 0.4.9 -----------------\n\nAdded \"orderScreensLeftToRight\" config (default is true)\nAdded new monitor identifier \"ordered\"\n\nNOTE: This version changes the way screenIDs are ordered by default! If you want the old style ordering, set\n      \"orderScreensLeftToRight\" to false.\n\n----------------- 0.4.8 -----------------\n\nFixed some memory leaks\n\n----------------- 0.4.7 -----------------\n\nAdded whitelist checking to SlateConfig\n\n----------------- 0.4.6 -----------------\n\nAdded the \"focusCheckWidthMax\" config\n\n----------------- 0.4.5 -----------------\n\nFixed bug in \"focus\" operation that caused some apps to be skipped\nFixed bug in \"focus\" operation that caused same-app switching to be weird\n\n----------------- 0.4.4 -----------------\n\nAdded the \"focus\" directive\nAdded the \"focusCheckWidth\" config\nAdded the \"focusPreferSameApp\" config\nFixed all MoveOperation variants to default to semicolon separators\n\n----------------- 0.4.3 -----------------\n\nFixed bug in StringTokenizer that caused leading spaces in aliases\n\n----------------- 0.4.2 -----------------\n\nAdded the \"if_exists\" option for the source directive\n\n----------------- 0.4.1 -----------------\n\nAdded the \"source\" directive\n\n-----------------  0.4  -----------------\n\nAdded the \"default\" directive\nAdded the \"checkDefaultsOnLoad\" config\n\n----------------- 0.3.4 -----------------\n\nAdded the ability to specify resolutions for screens\nAdded the ability to specify relative locations for screens\nAdded the ability to specify screen for push and corner\nRevamped screen geometry to be more accurate\n\n-----------------------------------------\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Headers/SUAppcast.h",
    "content": "//\n//  SUAppcast.h\n//  Sparkle\n//\n//  Created by Andy Matuschak on 3/12/06.\n//  Copyright 2006 Andy Matuschak. All rights reserved.\n//\n\n#ifndef SUAPPCAST_H\n#define SUAPPCAST_H\n\n@class SUAppcastItem;\n@interface SUAppcast : NSObject {\n\tNSArray *items;\n\tNSString *userAgentString;\n\tid delegate;\n\tNSMutableData *incrementalData;\n}\n\n- (void)fetchAppcastFromURL:(NSURL *)url;\n- (void)setDelegate:delegate;\n- (void)setUserAgentString:(NSString *)userAgentString;\n\n- (NSArray *)items;\n\n@end\n\n@interface NSObject (SUAppcastDelegate)\n- (void)appcastDidFinishLoading:(SUAppcast *)appcast;\n- (void)appcast:(SUAppcast *)appcast failedToLoadWithError:(NSError *)error;\n@end\n\n#endif\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h",
    "content": "//\n//  SUAppcastItem.h\n//  Sparkle\n//\n//  Created by Andy Matuschak on 3/12/06.\n//  Copyright 2006 Andy Matuschak. All rights reserved.\n//\n\n#ifndef SUAPPCASTITEM_H\n#define SUAPPCASTITEM_H\n\n@interface SUAppcastItem : NSObject {\n\tNSString *title;\n\tNSDate *date;\n\tNSString *itemDescription;\n\t\n\tNSURL *releaseNotesURL;\n\t\n\tNSString *DSASignature;\t\n\tNSString *minimumSystemVersion;\n\t\n\tNSURL *fileURL;\n\tNSString *versionString;\n\tNSString *displayVersionString;\n\t\n\tNSDictionary *propertiesDictionary;\n}\n\n// Initializes with data from a dictionary provided by the RSS class.\n- initWithDictionary:(NSDictionary *)dict;\n\n- (NSString *)title;\n- (NSString *)versionString;\n- (NSString *)displayVersionString;\n- (NSDate *)date;\n- (NSString *)itemDescription;\n- (NSURL *)releaseNotesURL;\n- (NSURL *)fileURL;\n- (NSString *)DSASignature;\n- (NSString *)minimumSystemVersion;\n\n// Returns the dictionary provided in initWithDictionary; this might be useful later for extensions.\n- (NSDictionary *)propertiesDictionary;\n\n@end\n\n#endif\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Headers/SUUpdater.h",
    "content": "//\n//  SUUpdater.h\n//  Sparkle\n//\n//  Created by Andy Matuschak on 1/4/06.\n//  Copyright 2006 Andy Matuschak. All rights reserved.\n//\n\n#ifndef SUUPDATER_H\n#define SUUPDATER_H\n\n#import <Sparkle/SUVersionComparisonProtocol.h>\n\n@class SUUpdateDriver, SUAppcastItem, SUHost, SUAppcast;\n@interface SUUpdater : NSObject {\n\tNSTimer *checkTimer;\n\tSUUpdateDriver *driver;\n\t\n\tSUHost *host;\n\tIBOutlet id delegate;\n}\n\n+ (SUUpdater *)sharedUpdater;\n+ (SUUpdater *)updaterForBundle:(NSBundle *)bundle;\n- (NSBundle *)hostBundle;\n\n- (void)setDelegate:(id)delegate;\n- delegate;\n\n- (void)setAutomaticallyChecksForUpdates:(BOOL)automaticallyChecks;\n- (BOOL)automaticallyChecksForUpdates;\n\n- (void)setUpdateCheckInterval:(NSTimeInterval)interval;\n- (NSTimeInterval)updateCheckInterval;\n\n- (void)setFeedURL:(NSURL *)feedURL;\n- (NSURL *)feedURL;\n\n- (void)setSendsSystemProfile:(BOOL)sendsSystemProfile;\n- (BOOL)sendsSystemProfile;\n\n- (void)setAutomaticallyDownloadsUpdates:(BOOL)automaticallyDownloadsUpdates;\n- (BOOL)automaticallyDownloadsUpdates;\n\n// This IBAction is meant for a main menu item. Hook up any menu item to this action,\n// and Sparkle will check for updates and report back its findings verbosely.\n- (IBAction)checkForUpdates:sender;\n\n// This kicks off an update meant to be programmatically initiated. That is, it will display no UI unless it actually finds an update,\n// in which case it proceeds as usual. If the fully automated updating is turned on, however, this will invoke that behavior, and if an\n// update is found, it will be downloaded and prepped for installation.\n- (void)checkForUpdatesInBackground;\n\n// Date of last update check. Returns null if no check has been performed.\n- (NSDate*)lastUpdateCheckDate;\n\n// This begins a \"probing\" check for updates which will not actually offer to update to that version. The delegate methods, though,\n// (up to updater:didFindValidUpdate: and updaterDidNotFindUpdate:), are called, so you can use that information in your UI.\n- (void)checkForUpdateInformation;\n\n// Call this to appropriately schedule or cancel the update checking timer according to the preferences for time interval and automatic checks. This call does not change the date of the next check, but only the internal NSTimer.\n- (void)resetUpdateCycle;\n\n- (BOOL)updateInProgress;\n@end\n\n@interface NSObject (SUUpdaterDelegateInformalProtocol)\n// This method allows you to add extra parameters to the appcast URL, potentially based on whether or not Sparkle will also be sending along the system profile. This method should return an array of dictionaries with keys: \"key\", \"value\", \"displayKey\", \"displayValue\", the latter two being specifically for display to the user.\n- (NSArray *)feedParametersForUpdater:(SUUpdater *)updater sendingSystemProfile:(BOOL)sendingProfile;\n\n// Use this to override the default behavior for Sparkle prompting the user about automatic update checks.\n- (BOOL)updaterShouldPromptForPermissionToCheckForUpdates:(SUUpdater *)bundle;\n\n// Implement this if you want to do some special handling with the appcast once it finishes loading.\n- (void)updater:(SUUpdater *)updater didFinishLoadingAppcast:(SUAppcast *)appcast;\n\n// If you're using special logic or extensions in your appcast, implement this to use your own logic for finding\n// a valid update, if any, in the given appcast.\n- (SUAppcastItem *)bestValidUpdateInAppcast:(SUAppcast *)appcast forUpdater:(SUUpdater *)bundle;\n\n// Sent when a valid update is found by the update driver.\n- (void)updater:(SUUpdater *)updater didFindValidUpdate:(SUAppcastItem *)update;\n\n// Sent when a valid update is not found.\n- (void)updaterDidNotFindUpdate:(SUUpdater *)update;\n\n// Sent immediately before installing the specified update.\n- (void)updater:(SUUpdater *)updater willInstallUpdate:(SUAppcastItem *)update;\n\n// Return YES to delay the relaunch until you do some processing; invoke the given NSInvocation to continue.\n- (BOOL)updater:(SUUpdater *)updater shouldPostponeRelaunchForUpdate:(SUAppcastItem *)update untilInvoking:(NSInvocation *)invocation;\n\n// Called immediately before relaunching.\n- (void)updaterWillRelaunchApplication:(SUUpdater *)updater;\n\n// This method allows you to provide a custom version comparator.\n// If you don't implement this method or return nil, the standard version comparator will be used.\n- (id <SUVersionComparison>)versionComparatorForUpdater:(SUUpdater *)updater;\n\n// Returns the path which is used to relaunch the client after the update is installed. By default, the path of the host bundle.\n- (NSString *)pathToRelaunchForUpdater:(SUUpdater *)updater;\n\n@end\n\n// Define some minimum intervals to avoid DOS-like checking attacks. These are in seconds.\n#ifdef DEBUG\n#define SU_MIN_CHECK_INTERVAL 60\n#else\n#define SU_MIN_CHECK_INTERVAL 60*60\n#endif\n\n#ifdef DEBUG\n#define SU_DEFAULT_CHECK_INTERVAL 60\n#else\n#define SU_DEFAULT_CHECK_INTERVAL 60*60*24\n#endif\n\n#endif\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h",
    "content": "//\n//  SUVersionComparisonProtocol.h\n//  Sparkle\n//\n//  Created by Andy Matuschak on 12/21/07.\n//  Copyright 2007 Andy Matuschak. All rights reserved.\n//\n\n#ifndef SUVERSIONCOMPARISONPROTOCOL_H\n#define SUVERSIONCOMPARISONPROTOCOL_H\n\n/*!\n    @protocol\n    @abstract    Implement this protocol to provide version comparison facilities for Sparkle.\n*/\n@protocol SUVersionComparison\n\n/*!\n    @method     \n    @abstract   An abstract method to compare two version strings.\n    @discussion Should return NSOrderedAscending if b > a, NSOrderedDescending if b < a, and NSOrderedSame if they are equivalent.\n*/\n- (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB;\n\n@end\n\n#endif\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Headers/Sparkle.h",
    "content": "//\n//  Sparkle.h\n//  Sparkle\n//\n//  Created by Andy Matuschak on 3/16/06. (Modified by CDHW on 23/12/07)\n//  Copyright 2006 Andy Matuschak. All rights reserved.\n//\n\n#ifndef SPARKLE_H\n#define SPARKLE_H\n\n// This list should include the shared headers. It doesn't matter if some of them aren't shared (unless\n// there are name-space collisions) so we can list all of them to start with:\n\n#import <Sparkle/SUUpdater.h>\n\n#import <Sparkle/SUAppcast.h>\n#import <Sparkle/SUAppcastItem.h>\n#import <Sparkle/SUVersionComparisonProtocol.h>\n\n#endif\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>Sparkle</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>org.andymatuschak.Sparkle</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>Sparkle</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.5 Beta 6</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>313</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/License.txt",
    "content": "Copyright (c) 2006 Andy Matuschak\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."
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/SUModelTranslation.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>ADP2,1</key>\n\t<string>Developer Transition Kit</string>\n\t<key>MacBook1,1</key>\n\t<string>MacBook (Core Duo)</string>\n\t<key>MacBook2,1</key>\n\t<string>MacBook (Core 2 Duo)</string>\n\t<key>MacBook4,1</key>\n\t<string>MacBook (Core 2 Duo Feb 2008)</string>\n\t<key>MacBookAir1,1</key>\n\t<string>MacBook Air (January 2008)</string>\n\t<key>MacBookPro1,1</key>\n\t<string>MacBook Pro Core Duo (15-inch)</string>\n\t<key>MacBookPro1,2</key>\n\t<string>MacBook Pro Core Duo (17-inch)</string>\n\t<key>MacBookPro2,1</key>\n\t<string>MacBook Pro Core 2 Duo (17-inch)</string>\n\t<key>MacBookPro2,2</key>\n\t<string>MacBook Pro Core 2 Duo (15-inch)</string>\n\t<key>MacBookPro3,1</key>\n\t<string>MacBook Pro Core 2 Duo (15-inch LED, Core 2 Duo)</string>\n\t<key>MacBookPro3,2</key>\n\t<string>MacBook Pro Core 2 Duo (17-inch HD, Core 2 Duo)</string>\n\t<key>MacBookPro4,1</key>\n\t<string>MacBook Pro (Core 2 Duo Feb 2008)</string>\n\t<key>MacPro1,1</key>\n\t<string>Mac Pro (four-core)</string>\n\t<key>MacPro2,1</key>\n\t<string>Mac Pro (eight-core)</string>\n\t<key>MacPro3,1</key>\n\t<string>Mac Pro (January 2008 4- or 8- core \"Harpertown\")</string>\n\t<key>Macmini1,1</key>\n\t<string>Mac Mini (Core Solo/Duo)</string>\n\t<key>PowerBook1,1</key>\n\t<string>PowerBook G3</string>\n\t<key>PowerBook2,1</key>\n\t<string>iBook G3</string>\n\t<key>PowerBook2,2</key>\n\t<string>iBook G3 (FireWire)</string>\n\t<key>PowerBook2,3</key>\n\t<string>iBook G3</string>\n\t<key>PowerBook2,4</key>\n\t<string>iBook G3</string>\n\t<key>PowerBook3,1</key>\n\t<string>PowerBook G3 (FireWire)</string>\n\t<key>PowerBook3,2</key>\n\t<string>PowerBook G4</string>\n\t<key>PowerBook3,3</key>\n\t<string>PowerBook G4 (Gigabit Ethernet)</string>\n\t<key>PowerBook3,4</key>\n\t<string>PowerBook G4 (DVI)</string>\n\t<key>PowerBook3,5</key>\n\t<string>PowerBook G4 (1GHz / 867MHz)</string>\n\t<key>PowerBook4,1</key>\n\t<string>iBook G3 (Dual USB, Late 2001)</string>\n\t<key>PowerBook4,2</key>\n\t<string>iBook G3 (16MB VRAM)</string>\n\t<key>PowerBook4,3</key>\n\t<string>iBook G3 Opaque 16MB VRAM, 32MB VRAM, Early 2003)</string>\n\t<key>PowerBook5,1</key>\n\t<string>PowerBook G4 (17 inch)</string>\n\t<key>PowerBook5,2</key>\n\t<string>PowerBook G4 (15 inch FW 800)</string>\n\t<key>PowerBook5,3</key>\n\t<string>PowerBook G4 (17-inch 1.33GHz)</string>\n\t<key>PowerBook5,4</key>\n\t<string>PowerBook G4 (15 inch 1.5/1.33GHz)</string>\n\t<key>PowerBook5,5</key>\n\t<string>PowerBook G4 (17-inch 1.5GHz)</string>\n\t<key>PowerBook5,6</key>\n\t<string>PowerBook G4 (15 inch 1.67GHz/1.5GHz)</string>\n\t<key>PowerBook5,7</key>\n\t<string>PowerBook G4 (17-inch 1.67GHz)</string>\n\t<key>PowerBook5,8</key>\n\t<string>PowerBook G4 (Double layer SD, 15 inch)</string>\n\t<key>PowerBook5,9</key>\n\t<string>PowerBook G4 (Double layer SD, 17 inch)</string>\n\t<key>PowerBook6,1</key>\n\t<string>PowerBook G4 (12 inch)</string>\n\t<key>PowerBook6,2</key>\n\t<string>PowerBook G4 (12 inch, DVI)</string>\n\t<key>PowerBook6,3</key>\n\t<string>iBook G4</string>\n\t<key>PowerBook6,4</key>\n\t<string>PowerBook G4 (12 inch 1.33GHz)</string>\n\t<key>PowerBook6,5</key>\n\t<string>iBook G4 (Early-Late 2004)</string>\n\t<key>PowerBook6,7</key>\n\t<string>iBook G4 (Mid 2005)</string>\n\t<key>PowerBook6,8</key>\n\t<string>PowerBook G4 (12 inch 1.5GHz)</string>\n\t<key>PowerMac1,1</key>\n\t<string>Power Macintosh G3 (Blue &amp; White)</string>\n\t<key>PowerMac1,2</key>\n\t<string>Power Macintosh G4 (PCI Graphics)</string>\n\t<key>PowerMac10,1</key>\n\t<string>Mac Mini G4</string>\n\t<key>PowerMac10,2</key>\n\t<string>Mac Mini (Late 2005)</string>\n\t<key>PowerMac11,2</key>\n\t<string>Power Macintosh G5 (Late 2005)</string>\n\t<key>PowerMac12,1</key>\n\t<string>iMac G5 (iSight)</string>\n\t<key>PowerMac2,1</key>\n\t<string>iMac G3 (Slot-loading CD-ROM)</string>\n\t<key>PowerMac2,2</key>\n\t<string>iMac G3 (Summer 2000)</string>\n\t<key>PowerMac3,1</key>\n\t<string>Power Macintosh G4 (AGP Graphics)</string>\n\t<key>PowerMac3,2</key>\n\t<string>Power Macintosh G4 (AGP Graphics)</string>\n\t<key>PowerMac3,3</key>\n\t<string>Power Macintosh G4 (Gigabit Ethernet)</string>\n\t<key>PowerMac3,4</key>\n\t<string>Power Macintosh G4 (Digital Audio)</string>\n\t<key>PowerMac3,5</key>\n\t<string>Power Macintosh G4 (Quick Silver)</string>\n\t<key>PowerMac3,6</key>\n\t<string>Power Macintosh G4 (Mirrored Drive Door)</string>\n\t<key>PowerMac4,1</key>\n\t<string>iMac G3 (Early/Summer 2001)</string>\n\t<key>PowerMac4,2</key>\n\t<string>iMac G4 (Flat Panel)</string>\n\t<key>PowerMac4,4</key>\n\t<string>eMac</string>\n\t<key>PowerMac4,5</key>\n\t<string>iMac G4 (17-inch Flat Panel)</string>\n\t<key>PowerMac5,1</key>\n\t<string>Power Macintosh G4 Cube</string>\n\t<key>PowerMac6,1</key>\n\t<string>iMac G4 (USB 2.0)</string>\n\t<key>PowerMac6,3</key>\n\t<string>iMac G4 (20-inch Flat Panel)</string>\n\t<key>PowerMac6,4</key>\n\t<string>eMac (USB 2.0, 2005)</string>\n\t<key>PowerMac7,2</key>\n\t<string>Power Macintosh G5</string>\n\t<key>PowerMac7,3</key>\n\t<string>Power Macintosh G5</string>\n\t<key>PowerMac8,1</key>\n\t<string>iMac G5</string>\n\t<key>PowerMac8,2</key>\n\t<string>iMac G5 (Ambient Light Sensor)</string>\n\t<key>PowerMac9,1</key>\n\t<string>Power Macintosh G5 (Late 2005)</string>\n\t<key>RackMac1,1</key>\n\t<string>Xserve G4</string>\n\t<key>RackMac1,2</key>\n\t<string>Xserve G4 (slot-loading, cluster node)</string>\n\t<key>RackMac3,1</key>\n\t<string>Xserve G5</string>\n\t<key>Xserve1,1</key>\n\t<string>Xserve (Intel Xeon)</string>\n\t<key>Xserve2,1</key>\n\t<string>Xserve (January 2008 quad-core)</string>\n\t<key>iMac1,1</key>\n\t<string>iMac G3 (Rev A-D)</string>\n\t<key>iMac4,1</key>\n\t<string>iMac (Core Duo)</string>\n\t<key>iMac4,2</key>\n\t<string>iMac for Education (17-inch, Core Duo)</string>\n\t<key>iMac5,1</key>\n\t<string>iMac (Core 2 Duo, 17 or 20 inch, SuperDrive)</string>\n\t<key>iMac5,2</key>\n\t<string>iMac (Core 2 Duo, 17 inch, Combo Drive)</string>\n\t<key>iMac6,1</key>\n\t<string>iMac (Core 2 Duo, 24 inch, SuperDrive)</string>\n\t<key>iMac8,1</key>\n\t<string>iMac (April 2008)</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/SUStatus.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUStatusController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>actionButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>progressBar</key>\n\t\t\t\t<string>NSProgressIndicator</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/SUStatus.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>10A96</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>installUpdate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>remindMeLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>skipThisVersion</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>description</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>releaseNotesView</key>\n\t\t\t\t<string>WebView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>658</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9C7010</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>installUpdate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>remindMeLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>skipThisVersion</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>description</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>releaseNotesView</key>\n\t\t\t\t<string>WebView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>18</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>10A96</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t\t<integer>41</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>10A96</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>installUpdate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>remindMeLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>skipThisVersion</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>description</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>releaseNotesView</key>\n\t\t\t\t<string>WebView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>629</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array/>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>installUpdate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>remindMeLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>skipThisVersion</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>description</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>releaseNotesView</key>\n\t\t\t\t<string>WebView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>629</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array/>\n\t<key>IBSystem Version</key>\n\t<string>9E17</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>629</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array/>\n\t<key>IBSystem Version</key>\n\t<string>9E17</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>installUpdate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>remindMeLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>skipThisVersion</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>description</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>releaseNotesView</key>\n\t\t\t\t<string>WebView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>5</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>629</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>installUpdate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>remindMeLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>skipThisVersion</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>description</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>releaseNotesView</key>\n\t\t\t\t<string>WebView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>629</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array/>\n\t<key>IBSystem Version</key>\n\t<string>9E17</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>629</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array/>\n\t<key>IBSystem Version</key>\n\t<string>9E17</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9E17</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>installUpdate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>remindMeLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>skipThisVersion</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>description</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>releaseNotesView</key>\n\t\t\t\t<string>WebView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9E17</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array/>\n\t<key>IBSystem Version</key>\n\t<string>9E17</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>10A96</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/classes.nib",
    "content": "{\n    IBClasses =     (\n                {\n            CLASS = FirstResponder;\n            LANGUAGE = ObjC;\n            SUPERCLASS = NSObject;\n        },\n                {\n            CLASS = NSApplication;\n            LANGUAGE = ObjC;\n            SUPERCLASS = NSResponder;\n        },\n                {\n            CLASS = NSObject;\n            LANGUAGE = ObjC;\n        },\n                {\n            ACTIONS =             {\n                installUpdate = id;\n                remindMeLater = id;\n                skipThisVersion = id;\n            };\n            CLASS = SUUpdateAlert;\n            LANGUAGE = ObjC;\n            OUTLETS =             {\n                delegate = id;\n                description = NSTextField;\n                releaseNotesView = WebView;\n            };\n            SUPERCLASS = SUWindowController;\n        },\n                {\n            CLASS = SUWindowController;\n            LANGUAGE = ObjC;\n            SUPERCLASS = NSWindowController;\n        }\n    );\n    IBVersion = 1;\n}"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBDocumentLocation</key>\n\t<string>69 14 356 240 0 0 1280 778 </string>\n\t<key>IBFramework Version</key>\n\t<string>489.0</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>10A96</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/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>BuildMachineOSBuild</key>\n\t<string>11G63</string>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>Slate</string>\n\t<key>CFBundleIconFile</key>\n\t<string>icon.icns</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.slate.Slate</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>Slate</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0.25</string>\n\t<key>DTCompiler</key>\n\t<string>com.apple.compilers.llvm.clang.1_0</string>\n\t<key>DTPlatformBuild</key>\n\t<string>4G1004</string>\n\t<key>DTPlatformVersion</key>\n\t<string>GM</string>\n\t<key>DTSDKBuild</key>\n\t<string>12C37</string>\n\t<key>DTSDKName</key>\n\t<string>macosx10.8</string>\n\t<key>DTXcode</key>\n\t<string>0451</string>\n\t<key>DTXcodeBuild</key>\n\t<string>4G1004</string>\n\t<key>LSApplicationCategoryType</key>\n\t<string>public.app-category.utilities</string>\n\t<key>LSBackgroundOnly</key>\n\t<false/>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>10.6</string>\n\t<key>LSUIElement</key>\n\t<true/>\n\t<key>NSMainNibFile</key>\n\t<string>MainMenu</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n\t<key>SUFeedURL</key>\n\t<string>https://www.ninjamonkeysoftware.com/slate/appcast.xml</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/PkgInfo",
    "content": "APPL????"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Resources/ASCIIToCode.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>&apos;</key>\n\t<integer>39</integer>\n\t<key>,</key>\n\t<integer>43</integer>\n\t<key>-</key>\n\t<integer>27</integer>\n\t<key>.</key>\n\t<integer>47</integer>\n\t<key>/</key>\n\t<integer>44</integer>\n\t<key>0</key>\n\t<integer>29</integer>\n\t<key>1</key>\n\t<integer>18</integer>\n\t<key>2</key>\n\t<integer>19</integer>\n\t<key>3</key>\n\t<integer>20</integer>\n\t<key>4</key>\n\t<integer>21</integer>\n\t<key>5</key>\n\t<integer>23</integer>\n\t<key>6</key>\n\t<integer>22</integer>\n\t<key>7</key>\n\t<integer>26</integer>\n\t<key>8</key>\n\t<integer>28</integer>\n\t<key>9</key>\n\t<integer>25</integer>\n\t<key>;</key>\n\t<integer>41</integer>\n\t<key>=</key>\n\t<integer>24</integer>\n\t<key>`</key>\n\t<integer>50</integer>\n\t<key>a</key>\n\t<integer>0</integer>\n\t<key>b</key>\n\t<integer>11</integer>\n\t<key>backslash</key>\n\t<integer>42</integer>\n\t<key>c</key>\n\t<integer>8</integer>\n\t<key>caps</key>\n\t<integer>57</integer>\n\t<key>d</key>\n\t<integer>2</integer>\n\t<key>delete</key>\n\t<integer>51</integer>\n\t<key>down</key>\n\t<integer>125</integer>\n\t<key>e</key>\n\t<integer>14</integer>\n\t<key>end</key>\n\t<integer>119</integer>\n\t<key>esc</key>\n\t<integer>53</integer>\n\t<key>f</key>\n\t<integer>3</integer>\n\t<key>f1</key>\n\t<integer>122</integer>\n\t<key>f10</key>\n\t<integer>109</integer>\n\t<key>f11</key>\n\t<integer>103</integer>\n\t<key>f12</key>\n\t<integer>111</integer>\n\t<key>f13</key>\n\t<integer>105</integer>\n\t<key>f14</key>\n\t<integer>107</integer>\n\t<key>f15</key>\n\t<integer>113</integer>\n\t<key>f16</key>\n\t<integer>106</integer>\n\t<key>f17</key>\n\t<integer>64</integer>\n\t<key>f18</key>\n\t<integer>79</integer>\n\t<key>f19</key>\n\t<integer>80</integer>\n\t<key>f2</key>\n\t<integer>120</integer>\n\t<key>f20</key>\n\t<integer>90</integer>\n\t<key>f3</key>\n\t<integer>99</integer>\n\t<key>f4</key>\n\t<integer>118</integer>\n\t<key>f5</key>\n\t<integer>96</integer>\n\t<key>f6</key>\n\t<integer>97</integer>\n\t<key>f7</key>\n\t<integer>98</integer>\n\t<key>f8</key>\n\t<integer>100</integer>\n\t<key>f9</key>\n\t<integer>101</integer>\n\t<key>g</key>\n\t<integer>5</integer>\n\t<key>h</key>\n\t<integer>4</integer>\n\t<key>help</key>\n\t<integer>114</integer>\n\t<key>home</key>\n\t<integer>115</integer>\n\t<key>i</key>\n\t<integer>34</integer>\n\t<key>j</key>\n\t<integer>38</integer>\n\t<key>k</key>\n\t<integer>40</integer>\n\t<key>l</key>\n\t<integer>37</integer>\n\t<key>left</key>\n\t<integer>123</integer>\n\t<key>m</key>\n\t<integer>46</integer>\n\t<key>mute</key>\n\t<integer>74</integer>\n\t<key>n</key>\n\t<integer>45</integer>\n\t<key>o</key>\n\t<integer>31</integer>\n\t<key>p</key>\n\t<integer>35</integer>\n\t<key>pad*</key>\n\t<integer>67</integer>\n\t<key>pad+</key>\n\t<integer>69</integer>\n\t<key>pad-</key>\n\t<integer>78</integer>\n\t<key>pad.</key>\n\t<integer>65</integer>\n\t<key>pad/</key>\n\t<integer>75</integer>\n\t<key>pad0</key>\n\t<integer>82</integer>\n\t<key>pad1</key>\n\t<integer>83</integer>\n\t<key>pad2</key>\n\t<integer>84</integer>\n\t<key>pad3</key>\n\t<integer>85</integer>\n\t<key>pad4</key>\n\t<integer>86</integer>\n\t<key>pad5</key>\n\t<integer>87</integer>\n\t<key>pad6</key>\n\t<integer>88</integer>\n\t<key>pad7</key>\n\t<integer>89</integer>\n\t<key>pad8</key>\n\t<integer>91</integer>\n\t<key>pad9</key>\n\t<integer>92</integer>\n\t<key>pad=</key>\n\t<integer>81</integer>\n\t<key>padClear</key>\n\t<integer>71</integer>\n\t<key>padEnter</key>\n\t<integer>76</integer>\n\t<key>pageDown</key>\n\t<integer>121</integer>\n\t<key>pageUp</key>\n\t<integer>116</integer>\n\t<key>q</key>\n\t<integer>12</integer>\n\t<key>r</key>\n\t<integer>15</integer>\n\t<key>return</key>\n\t<integer>36</integer>\n\t<key>right</key>\n\t<integer>124</integer>\n\t<key>s</key>\n\t<integer>1</integer>\n\t<key>space</key>\n\t<integer>49</integer>\n\t<key>t</key>\n\t<integer>17</integer>\n\t<key>tab</key>\n\t<integer>48</integer>\n\t<key>u</key>\n\t<integer>32</integer>\n\t<key>up</key>\n\t<integer>126</integer>\n\t<key>v</key>\n\t<integer>9</integer>\n\t<key>w</key>\n\t<integer>13</integer>\n\t<key>x</key>\n\t<integer>7</integer>\n\t<key>y</key>\n\t<integer>16</integer>\n\t<key>z</key>\n\t<integer>6</integer>\n\t<key>[</key>\n\t<integer>33</integer>\n\t<key>]</key>\n\t<integer>30</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Resources/ASCIIToCode_Azerty.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>help</key>\n\t<integer>114</integer>\n\t<key>mute</key>\n\t<integer>74</integer>\n\t<key>pageUp</key>\n\t<integer>116</integer>\n\t<key>f13</key>\n\t<integer>105</integer>\n\t<key>down</key>\n\t<integer>125</integer>\n\t<key>f3</key>\n\t<integer>99</integer>\n\t<key>padClear</key>\n\t<integer>71</integer>\n\t<key>&apos;</key>\n\t<integer>39</integer>\n\t<key>]</key>\n\t<integer>30</integer>\n\t<key>,</key>\n\t<integer>46</integer>\n\t<key>.</key>\n\t<integer>47</integer>\n\t<key>0</key>\n\t<integer>29</integer>\n\t<key>2</key>\n\t<integer>19</integer>\n\t<key>4</key>\n\t<integer>21</integer>\n\t<key>6</key>\n\t<integer>22</integer>\n\t<key>8</key>\n\t<integer>28</integer>\n\t<key>return</key>\n\t<integer>36</integer>\n\t<key>caps</key>\n\t<integer>57</integer>\n\t<key>pageDown</key>\n\t<integer>121</integer>\n\t<key>f19</key>\n\t<integer>80</integer>\n\t<key>`</key>\n\t<integer>50</integer>\n\t<key>b</key>\n\t<integer>11</integer>\n\t<key>d</key>\n\t<integer>2</integer>\n\t<key>f</key>\n\t<integer>3</integer>\n\t<key>h</key>\n\t<integer>4</integer>\n\t<key>j</key>\n\t<integer>38</integer>\n\t<key>l</key>\n\t<integer>37</integer>\n\t<key>n</key>\n\t<integer>45</integer>\n\t<key>p</key>\n\t<integer>35</integer>\n\t<key>f18</key>\n\t<integer>79</integer>\n\t<key>r</key>\n\t<integer>15</integer>\n\t<key>t</key>\n\t<integer>17</integer>\n\t<key>v</key>\n\t<integer>9</integer>\n\t<key>f12</key>\n\t<integer>111</integer>\n\t<key>x</key>\n\t<integer>7</integer>\n\t<key>f10</key>\n\t<integer>109</integer>\n\t<key>z</key>\n\t<integer>13</integer>\n\t<key>f16</key>\n\t<integer>106</integer>\n\t<key>f17</key>\n\t<integer>64</integer>\n\t<key>f14</key>\n\t<integer>107</integer>\n\t<key>delete</key>\n\t<integer>51</integer>\n\t<key>f1</key>\n\t<integer>122</integer>\n\t<key>f2</key>\n\t<integer>120</integer>\n\t<key>right</key>\n\t<integer>124</integer>\n\t<key>f4</key>\n\t<integer>118</integer>\n\t<key>f5</key>\n\t<integer>96</integer>\n\t<key>f6</key>\n\t<integer>97</integer>\n\t<key>f7</key>\n\t<integer>98</integer>\n\t<key>f8</key>\n\t<integer>100</integer>\n\t<key>f9</key>\n\t<integer>101</integer>\n\t<key>backslash</key>\n\t<integer>42</integer>\n\t<key>up</key>\n\t<integer>126</integer>\n\t<key>tab</key>\n\t<integer>48</integer>\n\t<key>home</key>\n\t<integer>115</integer>\n\t<key>5</key>\n\t<integer>23</integer>\n\t<key>end</key>\n\t<integer>119</integer>\n\t<key>space</key>\n\t<integer>49</integer>\n\t<key>-</key>\n\t<integer>27</integer>\n\t<key>/</key>\n\t<integer>44</integer>\n\t<key>1</key>\n\t<integer>18</integer>\n\t<key>3</key>\n\t<integer>20</integer>\n\t<key>f20</key>\n\t<integer>90</integer>\n\t<key>esc</key>\n\t<integer>53</integer>\n\t<key>7</key>\n\t<integer>26</integer>\n\t<key>9</key>\n\t<integer>25</integer>\n\t<key>;</key>\n\t<integer>41</integer>\n\t<key>=</key>\n\t<integer>24</integer>\n\t<key>padEnter</key>\n\t<integer>76</integer>\n\t<key>pad+</key>\n\t<integer>69</integer>\n\t<key>pad*</key>\n\t<integer>67</integer>\n\t<key>pad-</key>\n\t<integer>78</integer>\n\t<key>pad/</key>\n\t<integer>75</integer>\n\t<key>pad.</key>\n\t<integer>65</integer>\n\t<key>pad1</key>\n\t<integer>83</integer>\n\t<key>pad0</key>\n\t<integer>82</integer>\n\t<key>pad3</key>\n\t<integer>85</integer>\n\t<key>pad2</key>\n\t<integer>84</integer>\n\t<key>pad5</key>\n\t<integer>87</integer>\n\t<key>pad4</key>\n\t<integer>86</integer>\n\t<key>pad7</key>\n\t<integer>89</integer>\n\t<key>pad6</key>\n\t<integer>88</integer>\n\t<key>pad9</key>\n\t<integer>92</integer>\n\t<key>pad8</key>\n\t<integer>91</integer>\n\t<key>[</key>\n\t<integer>33</integer>\n\t<key>pad=</key>\n\t<integer>81</integer>\n\t<key>a</key>\n\t<integer>12</integer>\n\t<key>c</key>\n\t<integer>8</integer>\n\t<key>f11</key>\n\t<integer>103</integer>\n\t<key>e</key>\n\t<integer>14</integer>\n\t<key>g</key>\n\t<integer>5</integer>\n\t<key>i</key>\n\t<integer>34</integer>\n\t<key>k</key>\n\t<integer>40</integer>\n\t<key>m</key>\n\t<integer>41</integer>\n\t<key>o</key>\n\t<integer>31</integer>\n\t<key>q</key>\n\t<integer>0</integer>\n\t<key>s</key>\n\t<integer>1</integer>\n\t<key>u</key>\n\t<integer>32</integer>\n\t<key>w</key>\n\t<integer>6</integer>\n\t<key>y</key>\n\t<integer>16</integer>\n\t<key>f15</key>\n\t<integer>113</integer>\n\t<key>left</key>\n\t<integer>123</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Resources/ASCIIToCode_Colemak.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>help</key>\n\t<integer>114</integer>\n\t<key>mute</key>\n\t<integer>74</integer>\n\t<key>pageUp</key>\n\t<integer>116</integer>\n\t<key>f13</key>\n\t<integer>105</integer>\n\t<key>down</key>\n\t<integer>125</integer>\n\t<key>f3</key>\n\t<integer>99</integer>\n\t<key>padClear</key>\n\t<integer>71</integer>\n\t<key>&apos;</key>\n\t<integer>39</integer>\n\t<key>]</key>\n\t<integer>30</integer>\n\t<key>,</key>\n\t<integer>43</integer>\n\t<key>.</key>\n\t<integer>47</integer>\n\t<key>0</key>\n\t<integer>29</integer>\n\t<key>2</key>\n\t<integer>19</integer>\n\t<key>4</key>\n\t<integer>21</integer>\n\t<key>6</key>\n\t<integer>22</integer>\n\t<key>8</key>\n\t<integer>28</integer>\n\t<key>return</key>\n\t<integer>36</integer>\n\t<key>caps</key>\n\t<integer>57</integer>\n\t<key>pageDown</key>\n\t<integer>121</integer>\n\t<key>f19</key>\n\t<integer>80</integer>\n\t<key>`</key>\n\t<integer>50</integer>\n\t<key>b</key>\n\t<integer>11</integer>\n\t<key>d</key>\n\t<integer>5</integer>\n\t<key>f</key>\n\t<integer>14</integer>\n\t<key>h</key>\n\t<integer>4</integer>\n\t<key>j</key>\n\t<integer>16</integer>\n\t<key>l</key>\n\t<integer>32</integer>\n\t<key>n</key>\n\t<integer>38</integer>\n\t<key>p</key>\n\t<integer>15</integer>\n\t<key>f18</key>\n\t<integer>79</integer>\n\t<key>r</key>\n\t<integer>1</integer>\n\t<key>t</key>\n\t<integer>3</integer>\n\t<key>v</key>\n\t<integer>9</integer>\n\t<key>f12</key>\n\t<integer>111</integer>\n\t<key>x</key>\n\t<integer>7</integer>\n\t<key>f10</key>\n\t<integer>109</integer>\n\t<key>z</key>\n\t<integer>6</integer>\n\t<key>f16</key>\n\t<integer>106</integer>\n\t<key>f17</key>\n\t<integer>64</integer>\n\t<key>f14</key>\n\t<integer>107</integer>\n\t<key>delete</key>\n\t<integer>51</integer>\n\t<key>f1</key>\n\t<integer>122</integer>\n\t<key>f2</key>\n\t<integer>120</integer>\n\t<key>right</key>\n\t<integer>124</integer>\n\t<key>f4</key>\n\t<integer>118</integer>\n\t<key>f5</key>\n\t<integer>96</integer>\n\t<key>f6</key>\n\t<integer>97</integer>\n\t<key>f7</key>\n\t<integer>98</integer>\n\t<key>f8</key>\n\t<integer>100</integer>\n\t<key>f9</key>\n\t<integer>101</integer>\n\t<key>backslash</key>\n\t<integer>42</integer>\n\t<key>up</key>\n\t<integer>126</integer>\n\t<key>tab</key>\n\t<integer>48</integer>\n\t<key>home</key>\n\t<integer>115</integer>\n\t<key>5</key>\n\t<integer>23</integer>\n\t<key>end</key>\n\t<integer>119</integer>\n\t<key>space</key>\n\t<integer>49</integer>\n\t<key>-</key>\n\t<integer>27</integer>\n\t<key>/</key>\n\t<integer>44</integer>\n\t<key>1</key>\n\t<integer>18</integer>\n\t<key>3</key>\n\t<integer>20</integer>\n\t<key>f20</key>\n\t<integer>90</integer>\n\t<key>esc</key>\n\t<integer>53</integer>\n\t<key>7</key>\n\t<integer>26</integer>\n\t<key>9</key>\n\t<integer>25</integer>\n\t<key>;</key>\n\t<integer>35</integer>\n\t<key>=</key>\n\t<integer>24</integer>\n\t<key>padEnter</key>\n\t<integer>76</integer>\n\t<key>pad+</key>\n\t<integer>69</integer>\n\t<key>pad*</key>\n\t<integer>67</integer>\n\t<key>pad-</key>\n\t<integer>78</integer>\n\t<key>pad/</key>\n\t<integer>75</integer>\n\t<key>pad.</key>\n\t<integer>65</integer>\n\t<key>pad1</key>\n\t<integer>83</integer>\n\t<key>pad0</key>\n\t<integer>82</integer>\n\t<key>pad3</key>\n\t<integer>85</integer>\n\t<key>pad2</key>\n\t<integer>84</integer>\n\t<key>pad5</key>\n\t<integer>87</integer>\n\t<key>pad4</key>\n\t<integer>86</integer>\n\t<key>pad7</key>\n\t<integer>89</integer>\n\t<key>pad6</key>\n\t<integer>88</integer>\n\t<key>pad9</key>\n\t<integer>92</integer>\n\t<key>pad8</key>\n\t<integer>91</integer>\n\t<key>[</key>\n\t<integer>33</integer>\n\t<key>pad=</key>\n\t<integer>81</integer>\n\t<key>a</key>\n\t<integer>0</integer>\n\t<key>c</key>\n\t<integer>8</integer>\n\t<key>f11</key>\n\t<integer>103</integer>\n\t<key>e</key>\n\t<integer>40</integer>\n\t<key>g</key>\n\t<integer>17</integer>\n\t<key>i</key>\n\t<integer>37</integer>\n\t<key>k</key>\n\t<integer>45</integer>\n\t<key>m</key>\n\t<integer>46</integer>\n\t<key>o</key>\n\t<integer>41</integer>\n\t<key>q</key>\n\t<integer>12</integer>\n\t<key>s</key>\n\t<integer>2</integer>\n\t<key>u</key>\n\t<integer>34</integer>\n\t<key>w</key>\n\t<integer>13</integer>\n\t<key>y</key>\n\t<integer>31</integer>\n\t<key>f15</key>\n\t<integer>113</integer>\n\t<key>left</key>\n\t<integer>123</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Resources/ASCIIToCode_Dvorak.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>-</key>\n\t<integer>39</integer>\n\t<key>w</key>\n\t<integer>43</integer>\n\t<key>[</key>\n\t<integer>27</integer>\n\t<key>v</key>\n\t<integer>47</integer>\n\t<key>z</key>\n\t<integer>44</integer>\n\t<key>0</key>\n\t<integer>29</integer>\n\t<key>1</key>\n\t<integer>18</integer>\n\t<key>2</key>\n\t<integer>19</integer>\n\t<key>3</key>\n\t<integer>20</integer>\n\t<key>4</key>\n\t<integer>21</integer>\n\t<key>5</key>\n\t<integer>23</integer>\n\t<key>6</key>\n\t<integer>22</integer>\n\t<key>7</key>\n\t<integer>26</integer>\n\t<key>8</key>\n\t<integer>28</integer>\n\t<key>9</key>\n\t<integer>25</integer>\n\t<key>s</key>\n\t<integer>41</integer>\n\t<key>]</key>\n\t<integer>24</integer>\n\t<key>`</key>\n\t<integer>50</integer>\n\t<key>a</key>\n\t<integer>0</integer>\n\t<key>x</key>\n\t<integer>11</integer>\n\t<key>backslash</key>\n\t<integer>42</integer>\n\t<key>j</key>\n\t<integer>8</integer>\n\t<key>caps</key>\n\t<integer>57</integer>\n\t<key>e</key>\n\t<integer>2</integer>\n\t<key>delete</key>\n\t<integer>51</integer>\n\t<key>down</key>\n\t<integer>125</integer>\n\t<key>.</key>\n\t<integer>14</integer>\n\t<key>end</key>\n\t<integer>119</integer>\n\t<key>esc</key>\n\t<integer>53</integer>\n\t<key>u</key>\n\t<integer>3</integer>\n\t<key>f1</key>\n\t<integer>122</integer>\n\t<key>f10</key>\n\t<integer>109</integer>\n\t<key>f11</key>\n\t<integer>103</integer>\n\t<key>f12</key>\n\t<integer>111</integer>\n\t<key>f13</key>\n\t<integer>105</integer>\n\t<key>f14</key>\n\t<integer>107</integer>\n\t<key>f15</key>\n\t<integer>113</integer>\n\t<key>f16</key>\n\t<integer>106</integer>\n\t<key>f17</key>\n\t<integer>64</integer>\n\t<key>f18</key>\n\t<integer>79</integer>\n\t<key>f19</key>\n\t<integer>80</integer>\n\t<key>f2</key>\n\t<integer>120</integer>\n\t<key>f20</key>\n\t<integer>90</integer>\n\t<key>f3</key>\n\t<integer>99</integer>\n\t<key>f4</key>\n\t<integer>118</integer>\n\t<key>f5</key>\n\t<integer>96</integer>\n\t<key>f6</key>\n\t<integer>97</integer>\n\t<key>f7</key>\n\t<integer>98</integer>\n\t<key>f8</key>\n\t<integer>100</integer>\n\t<key>f9</key>\n\t<integer>101</integer>\n\t<key>i</key>\n\t<integer>5</integer>\n\t<key>d</key>\n\t<integer>4</integer>\n\t<key>help</key>\n\t<integer>114</integer>\n\t<key>home</key>\n\t<integer>115</integer>\n\t<key>c</key>\n\t<integer>34</integer>\n\t<key>h</key>\n\t<integer>38</integer>\n\t<key>t</key>\n\t<integer>40</integer>\n\t<key>n</key>\n\t<integer>37</integer>\n\t<key>left</key>\n\t<integer>123</integer>\n\t<key>m</key>\n\t<integer>46</integer>\n\t<key>mute</key>\n\t<integer>74</integer>\n\t<key>b</key>\n\t<integer>45</integer>\n\t<key>r</key>\n\t<integer>31</integer>\n\t<key>l</key>\n\t<integer>35</integer>\n\t<key>pad*</key>\n\t<integer>67</integer>\n\t<key>pad+</key>\n\t<integer>69</integer>\n\t<key>pad-</key>\n\t<integer>78</integer>\n\t<key>pad.</key>\n\t<integer>65</integer>\n\t<key>pad/</key>\n\t<integer>75</integer>\n\t<key>pad0</key>\n\t<integer>82</integer>\n\t<key>pad1</key>\n\t<integer>83</integer>\n\t<key>pad2</key>\n\t<integer>84</integer>\n\t<key>pad3</key>\n\t<integer>85</integer>\n\t<key>pad4</key>\n\t<integer>86</integer>\n\t<key>pad5</key>\n\t<integer>87</integer>\n\t<key>pad6</key>\n\t<integer>88</integer>\n\t<key>pad7</key>\n\t<integer>89</integer>\n\t<key>pad8</key>\n\t<integer>91</integer>\n\t<key>pad9</key>\n\t<integer>92</integer>\n\t<key>pad=</key>\n\t<integer>81</integer>\n\t<key>padClear</key>\n\t<integer>71</integer>\n\t<key>padEnter</key>\n\t<integer>76</integer>\n\t<key>pageDown</key>\n\t<integer>121</integer>\n\t<key>pageUp</key>\n\t<integer>116</integer>\n\t<key>&apos;</key>\n\t<integer>12</integer>\n\t<key>p</key>\n\t<integer>15</integer>\n\t<key>return</key>\n\t<integer>36</integer>\n\t<key>right</key>\n\t<integer>124</integer>\n\t<key>o</key>\n\t<integer>1</integer>\n\t<key>space</key>\n\t<integer>49</integer>\n\t<key>y</key>\n\t<integer>17</integer>\n\t<key>tab</key>\n\t<integer>48</integer>\n\t<key>g</key>\n\t<integer>32</integer>\n\t<key>up</key>\n\t<integer>126</integer>\n\t<key>k</key>\n\t<integer>9</integer>\n\t<key>,</key>\n\t<integer>13</integer>\n\t<key>q</key>\n\t<integer>7</integer>\n\t<key>f</key>\n\t<integer>16</integer>\n\t<key>;</key>\n\t<integer>6</integer>\n\t<key>/</key>\n\t<integer>33</integer>\n\t<key>=</key>\n\t<integer>30</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Resources/default.slate",
    "content": "# This is the default .slate file.\n# If no ~/.slate file exists this is the file that will be used.\n\nconfig defaultToCurrentScreen true\nconfig nudgePercentOf screenSize\nconfig resizePercentOf screenSize\n\n# Resize Bindings\nbind right:alt       resize +10% +0\nbind left:alt        resize -10% +0\nbind up:alt          resize +0   -10%\nbind down:alt        resize +0   +10%\nbind right:ctrl;alt  resize -10% +0 bottom-right\nbind left:ctrl;alt   resize +10% +0 bottom-right\nbind up:ctrl;alt     resize +0   +10% bottom-right\nbind down:ctrl;alt   resize +0   -10% bottom-right\n\n# Push Bindings\nbind right:ctrl;cmd  push right bar-resize:screenSizeX/3\nbind left:ctrl;cmd   push left  bar-resize:screenSizeX/3\nbind up:ctrl;cmd     push up    bar-resize:screenSizeY/2\nbind down:ctrl;cmd   push down  bar-resize:screenSizeY/2\n\n# Nudge Bindings\nbind right:shift;alt nudge +10% +0\nbind left:shift;alt  nudge -10% +0\nbind up:shift;alt    nudge +0   -10%\nbind down:shift;alt  nudge +0   +10%\n\n# Throw Bindings\nbind 1:ctrl;alt         throw 0 resize\nbind 2:ctrl;alt         throw 1 resize\nbind 3:ctrl;alt         throw 2 resize\nbind right:ctrl;alt;cmd throw right resize\nbind left:ctrl;alt;cmd  throw left  resize\nbind up:ctrl;alt;cmd    throw up    resize\nbind down:ctrl;alt;cmd  throw down  resize\n\n# Focus Bindings\nbind right:cmd    focus right\nbind left:cmd     focus left\nbind up:cmd       focus up\nbind down:cmd     focus down\nbind up:cmd;alt   focus behind\nbind down:cmd;alt focus behind\n\n# Window Hints\nbind esc:cmd hint"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Resources/en.lproj/Credits.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg1252\\cocoartf1138\\cocoasubrtf510\n{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}\n{\\colortbl;\\red255\\green255\\blue255;}\n\\vieww10800\\viewh8400\\viewkind0\n\\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx2800\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\n\n\\f0\\b\\fs24 \\cf0 Links\\\n\\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx2800\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\\pardirnatural\n{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/jigish/slate\"}}{\\fldrslt \n\\b0 \\cf0 Home Page}}\n\\b0 \\\n{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/jigish/slate/wiki/JavaScript-Configs\"}}{\\fldrslt JavaScript Configs}}\n\\b \\\n\\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx2800\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\n\\cf0 \\\nDevelopment\n\\b0 \\\nJigish Patel & {\\field{\\*\\fldinst{HYPERLINK \"https://github.com/jigish/slate/graphs/contributors\"}}{\\fldrslt Contributors\\\n\\\n}}\n\\b Utilising{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/jigish/slate/graphs/contributors\"}}{\\fldrslt \n\\b0 \\\nJSONKit\\\nSparkle}}\n\\b0 \\\n\\\n\n\\b Licensing\n\\b0 \\\nGPLv3 \\'a9 Jigish Patel 2011}"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Resources/initialize.js",
    "content": "(function(_controller, _info) {\n  var slate = window.slate = {\n    log: function() {\n      var msg = Array.prototype.slice.call(arguments, 0).join(\" \");\n      return _controller.log(msg);\n    },\n\n    config: function(key, callback) {\n      if (_.isFunction(callback)) {\n        return _controller.configFunction(key, callback);\n      } else if (_.isString(callback) || _.isNumber(callback) || _.isBoolean(callback)) {\n        return _controller.configNative(key, callback);\n      } else if (_.isArray(callback)) {\n        return _controller.configNative(key, callback.join(';'));\n      }\n      throw \"Invalid \"+key+\" \"+callback;\n    },\n\n    configAll: function(configMap) {\n      for (key in configMap) {\n        slate.config(key, configMap[key]);\n      }\n    },\n\n    bind: function(key, callback, repeat) {\n      if (_.isFunction(callback)) {\n        return _controller.bindFunction(key, callback, repeat);\n      } else if (_.isObject(callback)) {\n        return _controller.bindNative(key, callback, repeat);\n      }\n      throw \"bind failed, second parameter must be an operation or a function. was: \"+callback;\n    },\n\n    bindAll: function(bindMap) {\n      for(key in bindMap) {\n        if (_.isArray(bindMap[key]) && _.size(bindMap[key]) >= 2) {\n          slate.bind(key, bindMap[key][0], bindMap[key][1]);\n        } else if (_.isArray(bindMap[key]) && _.size(bindMap[key]) == 1) {\n          slate.bind(key, bindMap[key][0]);\n        } else {\n          slate.bind(key, bindMap[key]);\n        }\n      }\n    },\n\n    operationFromString: function(opString) {\n      if (!_.isString(opString)) {\n        throw \"Operation String must be a string. Was: \"+opString;\n      }\n      return _controller.operationFromString(opString);\n    },\n\n    operation : function(name, opts) {\n      if (!_.isString(name)) {\n        throw \"Operation name must be a string. Was: \"+name;\n      }\n      if (opts !== undefined && !_.isObject(opts)) {\n        throw \"Operation options must be undefined or a hash. Was: \"+opts;\n      }\n      return _controller.operation(name, opts);\n    },\n\n    doOperation : function(name, opts) {\n      if (!_.isString(name)) {\n        throw \"Operation name must be a string. Was: \"+name;\n      }\n      if (opts !== undefined && !_.isObject(opts)) {\n        throw \"Operation options must be undefined or a hash. Was: \"+opts;\n      }\n      return _controller.doOperation(name, opts);\n    },\n\n    source : function(path) {\n      if (!_.isString(path)) {\n        throw \"Source path must be a string. Was: \"+path;\n      }\n      return _controller.source(path);\n    },\n\n    layout : function(name, hash) {\n      if (!_.isString(name)) {\n        throw \"layout name must be a string. Was: \"+path;\n      }\n      if (!_.isObject(hash)) {\n        throw \"layout app hash should be a hash, was: \"+path;\n      }\n      return _controller.layout(name, hash);\n    },\n\n    default : function(screenConfig, thething) {\n      if (!_.isNumber(screenConfig) && !_.isString(screenConfig) && !_.isArray(screenConfig)) {\n        throw \"default screen config should be a number, string, or array, was: \"+screenConfig;\n      }\n      if (thething !== undefined && thething !== null &&\n          (_.isObject(thething) || _.isFunction(thething) || _.isString(thething))) {\n        return _controller.default(screenConfig, thething);\n      }\n      throw \"default action should be a function, operation, or string, was: \"+thething;\n    },\n\n    shell : function(commandAndArgs, wait, path) {\n      if (!_.isString(commandAndArgs)) {\n        throw \"shell command should be a string, was: \"+commandAndArgs;\n      }\n      if (path === null) { path = undefined; }\n      if (path !== undefined && !_.isString(path)) {\n        throw \"path should be undefined or a string, was: \"+path;\n      }\n      if (wait === null || wait === undefined) { wait = false; }\n      if (!_.isBoolean(wait)) {\n        throw \"wait should be a boolean, was: \"+wait;\n      }\n      return _controller.shell(commandAndArgs, wait, path);\n    },\n\n    on : function(what, callback) {\n      if (!_.isString(what)) {\n        throw \"on failed, first parameter must be a string. was: \"+what;\n      }\n      if (!_.isFunction(callback)) {\n        throw \"on failed, second parameter must be a function. was: \"+callback;\n      }\n      return _controller.on(what, callback);\n    }\n  };\n\n  window.S = window.slate;\n  window.S.cfg = window.S.config;\n  window.S.cfga = window.S.configAll;\n  window.S.bnd = window.S.bind;\n  window.S.bnda = window.S.bindAll;\n  window.S.op = window.S.operation;\n  window.S.doop = window.S.doOperation;\n  window.S.opstr = window.S.operationFromString;\n  window.S.src = window.S.source;\n  window.S.lay = window.S.layout;\n  window.S.def = window.S.default;\n  window.S.sh = window.S.shell;\n  window.S.info = _info;\n  var methods = window.S.info.jsMethods();\n  _.each(methods, function(method) {\n    if (window.S[method] !== undefined) {\n      throw \"OMGWTFBBQ!!!\";\n    }\n    window.S[method] = _.bind(_info[method], _info);\n  });\n  window.S.log(\"JS INIT FINISHED\");\n})(window._controller, window._info);\n"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Resources/underscore.js",
    "content": "(function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,v=e.reduce,h=e.reduceRight,g=e.filter,d=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,_=Object.keys,j=i.bind,w=function(n){return n instanceof w?n:this instanceof w?(this._wrapped=n,void 0):new w(n)};\"undefined\"!=typeof exports?(\"undefined\"!=typeof module&&module.exports&&(exports=module.exports=w),exports._=w):n._=w,w.VERSION=\"1.4.3\";var A=w.each=w.forEach=function(n,t,e){if(null!=n)if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a in n)if(w.has(n,a)&&t.call(e,n[a],a,n)===r)return};w.map=w.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e[e.length]=t.call(r,n,u,i)}),e)};var O=\"Reduce of empty array with no initial value\";w.reduce=w.foldl=w.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduce===v)return e&&(t=w.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(O);return r},w.reduceRight=w.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduceRight===h)return e&&(t=w.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=w.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(O);return r},w.find=w.detect=function(n,t,r){var e;return E(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},w.filter=w.select=function(n,t,r){var e=[];return null==n?e:g&&n.filter===g?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&(e[e.length]=n)}),e)},w.reject=function(n,t,r){return w.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},w.every=w.all=function(n,t,e){t||(t=w.identity);var u=!0;return null==n?u:d&&n.every===d?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var E=w.some=w.any=function(n,t,e){t||(t=w.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};w.contains=w.include=function(n,t){return null==n?!1:y&&n.indexOf===y?-1!=n.indexOf(t):E(n,function(n){return n===t})},w.invoke=function(n,t){var r=o.call(arguments,2);return w.map(n,function(n){return(w.isFunction(t)?t:n[t]).apply(n,r)})},w.pluck=function(n,t){return w.map(n,function(n){return n[t]})},w.where=function(n,t){return w.isEmpty(t)?[]:w.filter(n,function(n){for(var r in t)if(t[r]!==n[r])return!1;return!0})},w.max=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.max.apply(Math,n);if(!t&&w.isEmpty(n))return-1/0;var e={computed:-1/0,value:-1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a>=e.computed&&(e={value:n,computed:a})}),e.value},w.min=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.min.apply(Math,n);if(!t&&w.isEmpty(n))return 1/0;var e={computed:1/0,value:1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;e.computed>a&&(e={value:n,computed:a})}),e.value},w.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=w.random(r++),e[r-1]=e[t],e[t]=n}),e};var F=function(n){return w.isFunction(n)?n:function(t){return t[n]}};w.sortBy=function(n,t,r){var e=F(t);return w.pluck(w.map(n,function(n,t,u){return{value:n,index:t,criteria:e.call(r,n,t,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||void 0===r)return 1;if(e>r||void 0===e)return-1}return n.index<t.index?-1:1}),\"value\")};var k=function(n,t,r,e){var u={},i=F(t||w.identity);return A(n,function(t,a){var o=i.call(r,t,a,n);e(u,o,t)}),u};w.groupBy=function(n,t,r){return k(n,t,r,function(n,t,r){(w.has(n,t)?n[t]:n[t]=[]).push(r)})},w.countBy=function(n,t,r){return k(n,t,r,function(n,t){w.has(n,t)||(n[t]=0),n[t]++})},w.sortedIndex=function(n,t,r,e){r=null==r?w.identity:F(r);for(var u=r.call(e,t),i=0,a=n.length;a>i;){var o=i+a>>>1;u>r.call(e,n[o])?i=o+1:a=o}return i},w.toArray=function(n){return n?w.isArray(n)?o.call(n):n.length===+n.length?w.map(n,w.identity):w.values(n):[]},w.size=function(n){return null==n?0:n.length===+n.length?n.length:w.keys(n).length},w.first=w.head=w.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:o.call(n,0,t)},w.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},w.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},w.rest=w.tail=w.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},w.compact=function(n){return w.filter(n,w.identity)};var R=function(n,t,r){return A(n,function(n){w.isArray(n)?t?a.apply(r,n):R(n,t,r):r.push(n)}),r};w.flatten=function(n,t){return R(n,t,[])},w.without=function(n){return w.difference(n,o.call(arguments,1))},w.uniq=w.unique=function(n,t,r,e){w.isFunction(t)&&(e=r,r=t,t=!1);var u=r?w.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:w.contains(a,r))||(a.push(r),i.push(n[e]))}),i},w.union=function(){return w.uniq(c.apply(e,arguments))},w.intersection=function(n){var t=o.call(arguments,1);return w.filter(w.uniq(n),function(n){return w.every(t,function(t){return w.indexOf(t,n)>=0})})},w.difference=function(n){var t=c.apply(e,o.call(arguments,1));return w.filter(n,function(n){return!w.contains(t,n)})},w.zip=function(){for(var n=o.call(arguments),t=w.max(w.pluck(n,\"length\")),r=Array(t),e=0;t>e;e++)r[e]=w.pluck(n,\"\"+e);return r},w.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},w.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if(\"number\"!=typeof r)return e=w.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},w.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},w.range=function(n,t,r){1>=arguments.length&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=Array(e);e>u;)i[u++]=n,n+=r;return i};var I=function(){};w.bind=function(n,t){var r,e;if(n.bind===j&&j)return j.apply(n,o.call(arguments,1));if(!w.isFunction(n))throw new TypeError;return r=o.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(o.call(arguments)));I.prototype=n.prototype;var u=new I;I.prototype=null;var i=n.apply(u,r.concat(o.call(arguments)));return Object(i)===i?i:u}},w.bindAll=function(n){var t=o.call(arguments,1);return 0==t.length&&(t=w.functions(n)),A(t,function(t){n[t]=w.bind(n[t],n)}),n},w.memoize=function(n,t){var r={};return t||(t=w.identity),function(){var e=t.apply(this,arguments);return w.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},w.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},w.defer=function(n){return w.delay.apply(w,[n,1].concat(o.call(arguments,1)))},w.throttle=function(n,t){var r,e,u,i,a=0,o=function(){a=new Date,u=null,i=n.apply(r,e)};return function(){var c=new Date,l=t-(c-a);return r=this,e=arguments,0>=l?(clearTimeout(u),u=null,a=c,i=n.apply(r,e)):u||(u=setTimeout(o,l)),i}},w.debounce=function(n,t,r){var e,u;return function(){var i=this,a=arguments,o=function(){e=null,r||(u=n.apply(i,a))},c=r&&!e;return clearTimeout(e),e=setTimeout(o,t),c&&(u=n.apply(i,a)),u}},w.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},w.wrap=function(n,t){return function(){var r=[n];return a.apply(r,arguments),t.apply(this,r)}},w.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},w.after=function(n,t){return 0>=n?t():function(){return 1>--n?t.apply(this,arguments):void 0}},w.keys=_||function(n){if(n!==Object(n))throw new TypeError(\"Invalid object\");var t=[];for(var r in n)w.has(n,r)&&(t[t.length]=r);return t},w.values=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push(n[r]);return t},w.pairs=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push([r,n[r]]);return t},w.invert=function(n){var t={};for(var r in n)w.has(n,r)&&(t[n[r]]=r);return t},w.functions=w.methods=function(n){var t=[];for(var r in n)w.isFunction(n[r])&&t.push(r);return t.sort()},w.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},w.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},w.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)w.contains(r,u)||(t[u]=n[u]);return t},w.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)null==n[r]&&(n[r]=t[r])}),n},w.clone=function(n){return w.isObject(n)?w.isArray(n)?n.slice():w.extend({},n):n},w.tap=function(n,t){return t(n),n};var S=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof w&&(n=n._wrapped),t instanceof w&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case\"[object String]\":return n==t+\"\";case\"[object Number]\":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case\"[object Date]\":case\"[object Boolean]\":return+n==+t;case\"[object RegExp]\":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if(\"object\"!=typeof n||\"object\"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;r.push(n),e.push(t);var a=0,o=!0;if(\"[object Array]\"==u){if(a=n.length,o=a==t.length)for(;a--&&(o=S(n[a],t[a],r,e)););}else{var c=n.constructor,f=t.constructor;if(c!==f&&!(w.isFunction(c)&&c instanceof c&&w.isFunction(f)&&f instanceof f))return!1;for(var s in n)if(w.has(n,s)&&(a++,!(o=w.has(t,s)&&S(n[s],t[s],r,e))))break;if(o){for(s in t)if(w.has(t,s)&&!a--)break;o=!a}}return r.pop(),e.pop(),o};w.isEqual=function(n,t){return S(n,t,[],[])},w.isEmpty=function(n){if(null==n)return!0;if(w.isArray(n)||w.isString(n))return 0===n.length;for(var t in n)if(w.has(n,t))return!1;return!0},w.isElement=function(n){return!(!n||1!==n.nodeType)},w.isArray=x||function(n){return\"[object Array]\"==l.call(n)},w.isObject=function(n){return n===Object(n)},A([\"Arguments\",\"Function\",\"String\",\"Number\",\"Date\",\"RegExp\"],function(n){w[\"is\"+n]=function(t){return l.call(t)==\"[object \"+n+\"]\"}}),w.isArguments(arguments)||(w.isArguments=function(n){return!(!n||!w.has(n,\"callee\"))}),w.isFunction=function(n){return\"function\"==typeof n},w.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},w.isNaN=function(n){return w.isNumber(n)&&n!=+n},w.isBoolean=function(n){return n===!0||n===!1||\"[object Boolean]\"==l.call(n)},w.isNull=function(n){return null===n},w.isUndefined=function(n){return void 0===n},w.has=function(n,t){return f.call(n,t)},w.noConflict=function(){return n._=t,this},w.identity=function(n){return n},w.times=function(n,t,r){for(var e=Array(n),u=0;n>u;u++)e[u]=t.call(r,u);return e},w.random=function(n,t){return null==t&&(t=n,n=0),n+(0|Math.random()*(t-n+1))};var T={escape:{\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#x27;\",\"/\":\"&#x2F;\"}};T.unescape=w.invert(T.escape);var M={escape:RegExp(\"[\"+w.keys(T.escape).join(\"\")+\"]\",\"g\"),unescape:RegExp(\"(\"+w.keys(T.unescape).join(\"|\")+\")\",\"g\")};w.each([\"escape\",\"unescape\"],function(n){w[n]=function(t){return null==t?\"\":(\"\"+t).replace(M[n],function(t){return T[n][t]})}}),w.result=function(n,t){if(null==n)return null;var r=n[t];return w.isFunction(r)?r.call(n):r},w.mixin=function(n){A(w.functions(n),function(t){var r=w[t]=n[t];w.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),z.call(this,r.apply(w,n))}})};var N=0;w.uniqueId=function(n){var t=\"\"+ ++N;return n?n+t:t},w.templateSettings={evaluate:/<%([\\s\\S]+?)%>/g,interpolate:/<%=([\\s\\S]+?)%>/g,escape:/<%-([\\s\\S]+?)%>/g};var q=/(.)^/,B={\"'\":\"'\",\"\\\\\":\"\\\\\",\"\\r\":\"r\",\"\\n\":\"n\",\"\t\":\"t\",\"\\u2028\":\"u2028\",\"\\u2029\":\"u2029\"},D=/\\\\|'|\\r|\\n|\\t|\\u2028|\\u2029/g;w.template=function(n,t,r){r=w.defaults({},r,w.templateSettings);var e=RegExp([(r.escape||q).source,(r.interpolate||q).source,(r.evaluate||q).source].join(\"|\")+\"|$\",\"g\"),u=0,i=\"__p+='\";n.replace(e,function(t,r,e,a,o){return i+=n.slice(u,o).replace(D,function(n){return\"\\\\\"+B[n]}),r&&(i+=\"'+\\n((__t=(\"+r+\"))==null?'':_.escape(__t))+\\n'\"),e&&(i+=\"'+\\n((__t=(\"+e+\"))==null?'':__t)+\\n'\"),a&&(i+=\"';\\n\"+a+\"\\n__p+='\"),u=o+t.length,t}),i+=\"';\\n\",r.variable||(i=\"with(obj||{}){\\n\"+i+\"}\\n\"),i=\"var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\\n\"+i+\"return __p;\\n\";try{var a=Function(r.variable||\"obj\",\"_\",i)}catch(o){throw o.source=i,o}if(t)return a(t,w);var c=function(n){return a.call(this,n,w)};return c.source=\"function(\"+(r.variable||\"obj\")+\"){\\n\"+i+\"}\",c},w.chain=function(n){return w(n).chain()};var z=function(n){return this._chain?w(n).chain():n};w.mixin(w),A([\"pop\",\"push\",\"reverse\",\"shift\",\"sort\",\"splice\",\"unshift\"],function(n){var t=e[n];w.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),\"shift\"!=n&&\"splice\"!=n||0!==r.length||delete r[0],z.call(this,r)}}),A([\"concat\",\"join\",\"slice\"],function(n){var t=e[n];w.prototype[n]=function(){return z.call(this,t.apply(this._wrapped,arguments))}}),w.extend(w.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this);"
  },
  {
    "path": "build/Debug/Slate.app/Contents/Resources/utils.js",
    "content": "(function(controller) {\n  for (key in _) {\n    window[\"_\"+key+\"_\"] = _[key];\n  }\n\n  var _typeof_ = window._typeof_ = function(obj) {\n    if (_.isString(obj)) { return \"string\"; }\n    if (_.isArray(obj)) { return \"array\"; }\n    if (_.isFunction(obj)) { return \"function\"; }\n    if (_.isObject(obj)) { return \"object\"; }\n    if (_.isNumber(obj)) { return \"number\"; }\n    if (_.isBoolean(obj)) { return \"boolean\"; }\n    return \"unknown\";\n  }\n\n  var _array_ = window._array_ = function() { return []; }\n  var _array_with_ = window._array_with_ = function() { return Array.prototype.slice.call(arguments, 0); }\n  var _hash_ = window._hash_ = function() { return {}; }\n})(window._controller);"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Headers/SUAppcast.h",
    "content": "//\n//  SUAppcast.h\n//  Sparkle\n//\n//  Created by Andy Matuschak on 3/12/06.\n//  Copyright 2006 Andy Matuschak. All rights reserved.\n//\n\n#ifndef SUAPPCAST_H\n#define SUAPPCAST_H\n\n@class SUAppcastItem;\n@interface SUAppcast : NSObject {\n\tNSArray *items;\n\tNSString *userAgentString;\n\tid delegate;\n\tNSMutableData *incrementalData;\n}\n\n- (void)fetchAppcastFromURL:(NSURL *)url;\n- (void)setDelegate:delegate;\n- (void)setUserAgentString:(NSString *)userAgentString;\n\n- (NSArray *)items;\n\n@end\n\n@interface NSObject (SUAppcastDelegate)\n- (void)appcastDidFinishLoading:(SUAppcast *)appcast;\n- (void)appcast:(SUAppcast *)appcast failedToLoadWithError:(NSError *)error;\n@end\n\n#endif\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h",
    "content": "//\n//  SUAppcastItem.h\n//  Sparkle\n//\n//  Created by Andy Matuschak on 3/12/06.\n//  Copyright 2006 Andy Matuschak. All rights reserved.\n//\n\n#ifndef SUAPPCASTITEM_H\n#define SUAPPCASTITEM_H\n\n@interface SUAppcastItem : NSObject {\n\tNSString *title;\n\tNSDate *date;\n\tNSString *itemDescription;\n\t\n\tNSURL *releaseNotesURL;\n\t\n\tNSString *DSASignature;\t\n\tNSString *minimumSystemVersion;\n\t\n\tNSURL *fileURL;\n\tNSString *versionString;\n\tNSString *displayVersionString;\n\t\n\tNSDictionary *propertiesDictionary;\n}\n\n// Initializes with data from a dictionary provided by the RSS class.\n- initWithDictionary:(NSDictionary *)dict;\n\n- (NSString *)title;\n- (NSString *)versionString;\n- (NSString *)displayVersionString;\n- (NSDate *)date;\n- (NSString *)itemDescription;\n- (NSURL *)releaseNotesURL;\n- (NSURL *)fileURL;\n- (NSString *)DSASignature;\n- (NSString *)minimumSystemVersion;\n\n// Returns the dictionary provided in initWithDictionary; this might be useful later for extensions.\n- (NSDictionary *)propertiesDictionary;\n\n@end\n\n#endif\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Headers/SUUpdater.h",
    "content": "//\n//  SUUpdater.h\n//  Sparkle\n//\n//  Created by Andy Matuschak on 1/4/06.\n//  Copyright 2006 Andy Matuschak. All rights reserved.\n//\n\n#ifndef SUUPDATER_H\n#define SUUPDATER_H\n\n#import <Sparkle/SUVersionComparisonProtocol.h>\n\n@class SUUpdateDriver, SUAppcastItem, SUHost, SUAppcast;\n@interface SUUpdater : NSObject {\n\tNSTimer *checkTimer;\n\tSUUpdateDriver *driver;\n\t\n\tSUHost *host;\n\tIBOutlet id delegate;\n}\n\n+ (SUUpdater *)sharedUpdater;\n+ (SUUpdater *)updaterForBundle:(NSBundle *)bundle;\n- (NSBundle *)hostBundle;\n\n- (void)setDelegate:(id)delegate;\n- delegate;\n\n- (void)setAutomaticallyChecksForUpdates:(BOOL)automaticallyChecks;\n- (BOOL)automaticallyChecksForUpdates;\n\n- (void)setUpdateCheckInterval:(NSTimeInterval)interval;\n- (NSTimeInterval)updateCheckInterval;\n\n- (void)setFeedURL:(NSURL *)feedURL;\n- (NSURL *)feedURL;\n\n- (void)setSendsSystemProfile:(BOOL)sendsSystemProfile;\n- (BOOL)sendsSystemProfile;\n\n- (void)setAutomaticallyDownloadsUpdates:(BOOL)automaticallyDownloadsUpdates;\n- (BOOL)automaticallyDownloadsUpdates;\n\n// This IBAction is meant for a main menu item. Hook up any menu item to this action,\n// and Sparkle will check for updates and report back its findings verbosely.\n- (IBAction)checkForUpdates:sender;\n\n// This kicks off an update meant to be programmatically initiated. That is, it will display no UI unless it actually finds an update,\n// in which case it proceeds as usual. If the fully automated updating is turned on, however, this will invoke that behavior, and if an\n// update is found, it will be downloaded and prepped for installation.\n- (void)checkForUpdatesInBackground;\n\n// Date of last update check. Returns null if no check has been performed.\n- (NSDate*)lastUpdateCheckDate;\n\n// This begins a \"probing\" check for updates which will not actually offer to update to that version. The delegate methods, though,\n// (up to updater:didFindValidUpdate: and updaterDidNotFindUpdate:), are called, so you can use that information in your UI.\n- (void)checkForUpdateInformation;\n\n// Call this to appropriately schedule or cancel the update checking timer according to the preferences for time interval and automatic checks. This call does not change the date of the next check, but only the internal NSTimer.\n- (void)resetUpdateCycle;\n\n- (BOOL)updateInProgress;\n@end\n\n@interface NSObject (SUUpdaterDelegateInformalProtocol)\n// This method allows you to add extra parameters to the appcast URL, potentially based on whether or not Sparkle will also be sending along the system profile. This method should return an array of dictionaries with keys: \"key\", \"value\", \"displayKey\", \"displayValue\", the latter two being specifically for display to the user.\n- (NSArray *)feedParametersForUpdater:(SUUpdater *)updater sendingSystemProfile:(BOOL)sendingProfile;\n\n// Use this to override the default behavior for Sparkle prompting the user about automatic update checks.\n- (BOOL)updaterShouldPromptForPermissionToCheckForUpdates:(SUUpdater *)bundle;\n\n// Implement this if you want to do some special handling with the appcast once it finishes loading.\n- (void)updater:(SUUpdater *)updater didFinishLoadingAppcast:(SUAppcast *)appcast;\n\n// If you're using special logic or extensions in your appcast, implement this to use your own logic for finding\n// a valid update, if any, in the given appcast.\n- (SUAppcastItem *)bestValidUpdateInAppcast:(SUAppcast *)appcast forUpdater:(SUUpdater *)bundle;\n\n// Sent when a valid update is found by the update driver.\n- (void)updater:(SUUpdater *)updater didFindValidUpdate:(SUAppcastItem *)update;\n\n// Sent when a valid update is not found.\n- (void)updaterDidNotFindUpdate:(SUUpdater *)update;\n\n// Sent immediately before installing the specified update.\n- (void)updater:(SUUpdater *)updater willInstallUpdate:(SUAppcastItem *)update;\n\n// Return YES to delay the relaunch until you do some processing; invoke the given NSInvocation to continue.\n- (BOOL)updater:(SUUpdater *)updater shouldPostponeRelaunchForUpdate:(SUAppcastItem *)update untilInvoking:(NSInvocation *)invocation;\n\n// Called immediately before relaunching.\n- (void)updaterWillRelaunchApplication:(SUUpdater *)updater;\n\n// This method allows you to provide a custom version comparator.\n// If you don't implement this method or return nil, the standard version comparator will be used.\n- (id <SUVersionComparison>)versionComparatorForUpdater:(SUUpdater *)updater;\n\n// Returns the path which is used to relaunch the client after the update is installed. By default, the path of the host bundle.\n- (NSString *)pathToRelaunchForUpdater:(SUUpdater *)updater;\n\n@end\n\n// Define some minimum intervals to avoid DOS-like checking attacks. These are in seconds.\n#ifdef DEBUG\n#define SU_MIN_CHECK_INTERVAL 60\n#else\n#define SU_MIN_CHECK_INTERVAL 60*60\n#endif\n\n#ifdef DEBUG\n#define SU_DEFAULT_CHECK_INTERVAL 60\n#else\n#define SU_DEFAULT_CHECK_INTERVAL 60*60*24\n#endif\n\n#endif\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h",
    "content": "//\n//  SUVersionComparisonProtocol.h\n//  Sparkle\n//\n//  Created by Andy Matuschak on 12/21/07.\n//  Copyright 2007 Andy Matuschak. All rights reserved.\n//\n\n#ifndef SUVERSIONCOMPARISONPROTOCOL_H\n#define SUVERSIONCOMPARISONPROTOCOL_H\n\n/*!\n    @protocol\n    @abstract    Implement this protocol to provide version comparison facilities for Sparkle.\n*/\n@protocol SUVersionComparison\n\n/*!\n    @method     \n    @abstract   An abstract method to compare two version strings.\n    @discussion Should return NSOrderedAscending if b > a, NSOrderedDescending if b < a, and NSOrderedSame if they are equivalent.\n*/\n- (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB;\n\n@end\n\n#endif\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Headers/Sparkle.h",
    "content": "//\n//  Sparkle.h\n//  Sparkle\n//\n//  Created by Andy Matuschak on 3/16/06. (Modified by CDHW on 23/12/07)\n//  Copyright 2006 Andy Matuschak. All rights reserved.\n//\n\n#ifndef SPARKLE_H\n#define SPARKLE_H\n\n// This list should include the shared headers. It doesn't matter if some of them aren't shared (unless\n// there are name-space collisions) so we can list all of them to start with:\n\n#import <Sparkle/SUUpdater.h>\n\n#import <Sparkle/SUAppcast.h>\n#import <Sparkle/SUAppcastItem.h>\n#import <Sparkle/SUVersionComparisonProtocol.h>\n\n#endif\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>Sparkle</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>org.andymatuschak.Sparkle</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>Sparkle</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.5 Beta 6</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>313</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/License.txt",
    "content": "Copyright (c) 2006 Andy Matuschak\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."
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/SUModelTranslation.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>ADP2,1</key>\n\t<string>Developer Transition Kit</string>\n\t<key>MacBook1,1</key>\n\t<string>MacBook (Core Duo)</string>\n\t<key>MacBook2,1</key>\n\t<string>MacBook (Core 2 Duo)</string>\n\t<key>MacBook4,1</key>\n\t<string>MacBook (Core 2 Duo Feb 2008)</string>\n\t<key>MacBookAir1,1</key>\n\t<string>MacBook Air (January 2008)</string>\n\t<key>MacBookPro1,1</key>\n\t<string>MacBook Pro Core Duo (15-inch)</string>\n\t<key>MacBookPro1,2</key>\n\t<string>MacBook Pro Core Duo (17-inch)</string>\n\t<key>MacBookPro2,1</key>\n\t<string>MacBook Pro Core 2 Duo (17-inch)</string>\n\t<key>MacBookPro2,2</key>\n\t<string>MacBook Pro Core 2 Duo (15-inch)</string>\n\t<key>MacBookPro3,1</key>\n\t<string>MacBook Pro Core 2 Duo (15-inch LED, Core 2 Duo)</string>\n\t<key>MacBookPro3,2</key>\n\t<string>MacBook Pro Core 2 Duo (17-inch HD, Core 2 Duo)</string>\n\t<key>MacBookPro4,1</key>\n\t<string>MacBook Pro (Core 2 Duo Feb 2008)</string>\n\t<key>MacPro1,1</key>\n\t<string>Mac Pro (four-core)</string>\n\t<key>MacPro2,1</key>\n\t<string>Mac Pro (eight-core)</string>\n\t<key>MacPro3,1</key>\n\t<string>Mac Pro (January 2008 4- or 8- core \"Harpertown\")</string>\n\t<key>Macmini1,1</key>\n\t<string>Mac Mini (Core Solo/Duo)</string>\n\t<key>PowerBook1,1</key>\n\t<string>PowerBook G3</string>\n\t<key>PowerBook2,1</key>\n\t<string>iBook G3</string>\n\t<key>PowerBook2,2</key>\n\t<string>iBook G3 (FireWire)</string>\n\t<key>PowerBook2,3</key>\n\t<string>iBook G3</string>\n\t<key>PowerBook2,4</key>\n\t<string>iBook G3</string>\n\t<key>PowerBook3,1</key>\n\t<string>PowerBook G3 (FireWire)</string>\n\t<key>PowerBook3,2</key>\n\t<string>PowerBook G4</string>\n\t<key>PowerBook3,3</key>\n\t<string>PowerBook G4 (Gigabit Ethernet)</string>\n\t<key>PowerBook3,4</key>\n\t<string>PowerBook G4 (DVI)</string>\n\t<key>PowerBook3,5</key>\n\t<string>PowerBook G4 (1GHz / 867MHz)</string>\n\t<key>PowerBook4,1</key>\n\t<string>iBook G3 (Dual USB, Late 2001)</string>\n\t<key>PowerBook4,2</key>\n\t<string>iBook G3 (16MB VRAM)</string>\n\t<key>PowerBook4,3</key>\n\t<string>iBook G3 Opaque 16MB VRAM, 32MB VRAM, Early 2003)</string>\n\t<key>PowerBook5,1</key>\n\t<string>PowerBook G4 (17 inch)</string>\n\t<key>PowerBook5,2</key>\n\t<string>PowerBook G4 (15 inch FW 800)</string>\n\t<key>PowerBook5,3</key>\n\t<string>PowerBook G4 (17-inch 1.33GHz)</string>\n\t<key>PowerBook5,4</key>\n\t<string>PowerBook G4 (15 inch 1.5/1.33GHz)</string>\n\t<key>PowerBook5,5</key>\n\t<string>PowerBook G4 (17-inch 1.5GHz)</string>\n\t<key>PowerBook5,6</key>\n\t<string>PowerBook G4 (15 inch 1.67GHz/1.5GHz)</string>\n\t<key>PowerBook5,7</key>\n\t<string>PowerBook G4 (17-inch 1.67GHz)</string>\n\t<key>PowerBook5,8</key>\n\t<string>PowerBook G4 (Double layer SD, 15 inch)</string>\n\t<key>PowerBook5,9</key>\n\t<string>PowerBook G4 (Double layer SD, 17 inch)</string>\n\t<key>PowerBook6,1</key>\n\t<string>PowerBook G4 (12 inch)</string>\n\t<key>PowerBook6,2</key>\n\t<string>PowerBook G4 (12 inch, DVI)</string>\n\t<key>PowerBook6,3</key>\n\t<string>iBook G4</string>\n\t<key>PowerBook6,4</key>\n\t<string>PowerBook G4 (12 inch 1.33GHz)</string>\n\t<key>PowerBook6,5</key>\n\t<string>iBook G4 (Early-Late 2004)</string>\n\t<key>PowerBook6,7</key>\n\t<string>iBook G4 (Mid 2005)</string>\n\t<key>PowerBook6,8</key>\n\t<string>PowerBook G4 (12 inch 1.5GHz)</string>\n\t<key>PowerMac1,1</key>\n\t<string>Power Macintosh G3 (Blue &amp; White)</string>\n\t<key>PowerMac1,2</key>\n\t<string>Power Macintosh G4 (PCI Graphics)</string>\n\t<key>PowerMac10,1</key>\n\t<string>Mac Mini G4</string>\n\t<key>PowerMac10,2</key>\n\t<string>Mac Mini (Late 2005)</string>\n\t<key>PowerMac11,2</key>\n\t<string>Power Macintosh G5 (Late 2005)</string>\n\t<key>PowerMac12,1</key>\n\t<string>iMac G5 (iSight)</string>\n\t<key>PowerMac2,1</key>\n\t<string>iMac G3 (Slot-loading CD-ROM)</string>\n\t<key>PowerMac2,2</key>\n\t<string>iMac G3 (Summer 2000)</string>\n\t<key>PowerMac3,1</key>\n\t<string>Power Macintosh G4 (AGP Graphics)</string>\n\t<key>PowerMac3,2</key>\n\t<string>Power Macintosh G4 (AGP Graphics)</string>\n\t<key>PowerMac3,3</key>\n\t<string>Power Macintosh G4 (Gigabit Ethernet)</string>\n\t<key>PowerMac3,4</key>\n\t<string>Power Macintosh G4 (Digital Audio)</string>\n\t<key>PowerMac3,5</key>\n\t<string>Power Macintosh G4 (Quick Silver)</string>\n\t<key>PowerMac3,6</key>\n\t<string>Power Macintosh G4 (Mirrored Drive Door)</string>\n\t<key>PowerMac4,1</key>\n\t<string>iMac G3 (Early/Summer 2001)</string>\n\t<key>PowerMac4,2</key>\n\t<string>iMac G4 (Flat Panel)</string>\n\t<key>PowerMac4,4</key>\n\t<string>eMac</string>\n\t<key>PowerMac4,5</key>\n\t<string>iMac G4 (17-inch Flat Panel)</string>\n\t<key>PowerMac5,1</key>\n\t<string>Power Macintosh G4 Cube</string>\n\t<key>PowerMac6,1</key>\n\t<string>iMac G4 (USB 2.0)</string>\n\t<key>PowerMac6,3</key>\n\t<string>iMac G4 (20-inch Flat Panel)</string>\n\t<key>PowerMac6,4</key>\n\t<string>eMac (USB 2.0, 2005)</string>\n\t<key>PowerMac7,2</key>\n\t<string>Power Macintosh G5</string>\n\t<key>PowerMac7,3</key>\n\t<string>Power Macintosh G5</string>\n\t<key>PowerMac8,1</key>\n\t<string>iMac G5</string>\n\t<key>PowerMac8,2</key>\n\t<string>iMac G5 (Ambient Light Sensor)</string>\n\t<key>PowerMac9,1</key>\n\t<string>Power Macintosh G5 (Late 2005)</string>\n\t<key>RackMac1,1</key>\n\t<string>Xserve G4</string>\n\t<key>RackMac1,2</key>\n\t<string>Xserve G4 (slot-loading, cluster node)</string>\n\t<key>RackMac3,1</key>\n\t<string>Xserve G5</string>\n\t<key>Xserve1,1</key>\n\t<string>Xserve (Intel Xeon)</string>\n\t<key>Xserve2,1</key>\n\t<string>Xserve (January 2008 quad-core)</string>\n\t<key>iMac1,1</key>\n\t<string>iMac G3 (Rev A-D)</string>\n\t<key>iMac4,1</key>\n\t<string>iMac (Core Duo)</string>\n\t<key>iMac4,2</key>\n\t<string>iMac for Education (17-inch, Core Duo)</string>\n\t<key>iMac5,1</key>\n\t<string>iMac (Core 2 Duo, 17 or 20 inch, SuperDrive)</string>\n\t<key>iMac5,2</key>\n\t<string>iMac (Core 2 Duo, 17 inch, Combo Drive)</string>\n\t<key>iMac6,1</key>\n\t<string>iMac (Core 2 Duo, 24 inch, SuperDrive)</string>\n\t<key>iMac8,1</key>\n\t<string>iMac (April 2008)</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/SUStatus.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUStatusController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>actionButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>progressBar</key>\n\t\t\t\t<string>NSProgressIndicator</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/SUStatus.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>10A96</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>installUpdate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>remindMeLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>skipThisVersion</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>description</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>releaseNotesView</key>\n\t\t\t\t<string>WebView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>658</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9C7010</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>installUpdate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>remindMeLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>skipThisVersion</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>description</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>releaseNotesView</key>\n\t\t\t\t<string>WebView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>18</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>10A96</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t\t<integer>41</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>10A96</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>installUpdate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>remindMeLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>skipThisVersion</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>description</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>releaseNotesView</key>\n\t\t\t\t<string>WebView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>629</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array/>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>installUpdate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>remindMeLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>skipThisVersion</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>description</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>releaseNotesView</key>\n\t\t\t\t<string>WebView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>629</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array/>\n\t<key>IBSystem Version</key>\n\t<string>9E17</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>629</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array/>\n\t<key>IBSystem Version</key>\n\t<string>9E17</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>installUpdate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>remindMeLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>skipThisVersion</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>description</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>releaseNotesView</key>\n\t\t\t\t<string>WebView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>667</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>5</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>629</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>installUpdate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>remindMeLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>skipThisVersion</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>description</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>releaseNotesView</key>\n\t\t\t\t<string>WebView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>629</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array/>\n\t<key>IBSystem Version</key>\n\t<string>9E17</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>629</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array/>\n\t<key>IBSystem Version</key>\n\t<string>9E17</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9E17</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSApplication</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSResponder</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>installUpdate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>remindMeLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>skipThisVersion</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>description</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>releaseNotesView</key>\n\t\t\t\t<string>WebView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>9E17</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array/>\n\t<key>IBSystem Version</key>\n\t<string>9E17</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>doNotInstall</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installLater</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>installNow</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUAutomaticUpdateAlert</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>10A96</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/classes.nib",
    "content": "{\n    IBClasses =     (\n                {\n            CLASS = FirstResponder;\n            LANGUAGE = ObjC;\n            SUPERCLASS = NSObject;\n        },\n                {\n            CLASS = NSApplication;\n            LANGUAGE = ObjC;\n            SUPERCLASS = NSResponder;\n        },\n                {\n            CLASS = NSObject;\n            LANGUAGE = ObjC;\n        },\n                {\n            ACTIONS =             {\n                installUpdate = id;\n                remindMeLater = id;\n                skipThisVersion = id;\n            };\n            CLASS = SUUpdateAlert;\n            LANGUAGE = ObjC;\n            OUTLETS =             {\n                delegate = id;\n                description = NSTextField;\n                releaseNotesView = WebView;\n            };\n            SUPERCLASS = SUWindowController;\n        },\n                {\n            CLASS = SUWindowController;\n            LANGUAGE = ObjC;\n            SUPERCLASS = NSWindowController;\n        }\n    );\n    IBVersion = 1;\n}"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib/info.nib",
    "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>IBDocumentLocation</key>\n\t<string>69 14 356 240 0 0 1280 778 </string>\n\t<key>IBFramework Version</key>\n\t<string>489.0</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBSystem Version</key>\n\t<string>9D34</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/classes.nib",
    "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>IBClasses</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>ACTIONS</key>\n\t\t\t<dict>\n\t\t\t\t<key>finishPrompt</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>toggleMoreInfo</key>\n\t\t\t\t<string>id</string>\n\t\t\t</dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>SUUpdatePermissionPrompt</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>OUTLETS</key>\n\t\t\t<dict>\n\t\t\t\t<key>delegate</key>\n\t\t\t\t<string>id</string>\n\t\t\t\t<key>descriptionTextField</key>\n\t\t\t\t<string>NSTextField</string>\n\t\t\t\t<key>moreInfoButton</key>\n\t\t\t\t<string>NSButton</string>\n\t\t\t\t<key>moreInfoView</key>\n\t\t\t\t<string>NSView</string>\n\t\t\t</dict>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>SUWindowController</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>FirstResponder</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t\t<key>SUPERCLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>CLASS</key>\n\t\t\t<string>NSObject</string>\n\t\t\t<key>LANGUAGE</key>\n\t\t\t<string>ObjC</string>\n\t\t</dict>\n\t</array>\n\t<key>IBVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib/info.nib",
    "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>IBFramework Version</key>\n\t<string>670</string>\n\t<key>IBLastKnownRelativeProjectPath</key>\n\t<string>../Sparkle.xcodeproj</string>\n\t<key>IBOldestOS</key>\n\t<integer>5</integer>\n\t<key>IBOpenObjects</key>\n\t<array>\n\t\t<integer>6</integer>\n\t</array>\n\t<key>IBSystem Version</key>\n\t<string>10A96</string>\n\t<key>targetFramework</key>\n\t<string>IBCocoaFramework</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/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>BuildMachineOSBuild</key>\n\t<string>11G63</string>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>Slate</string>\n\t<key>CFBundleIconFile</key>\n\t<string>icon.icns</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.slate.Slate</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>Slate</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0.25</string>\n\t<key>DTCompiler</key>\n\t<string>com.apple.compilers.llvm.clang.1_0</string>\n\t<key>DTPlatformBuild</key>\n\t<string>4G1004</string>\n\t<key>DTPlatformVersion</key>\n\t<string>GM</string>\n\t<key>DTSDKBuild</key>\n\t<string>12C37</string>\n\t<key>DTSDKName</key>\n\t<string>macosx10.8</string>\n\t<key>DTXcode</key>\n\t<string>0451</string>\n\t<key>DTXcodeBuild</key>\n\t<string>4G1004</string>\n\t<key>LSApplicationCategoryType</key>\n\t<string>public.app-category.utilities</string>\n\t<key>LSBackgroundOnly</key>\n\t<false/>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>10.6</string>\n\t<key>LSUIElement</key>\n\t<true/>\n\t<key>NSMainNibFile</key>\n\t<string>MainMenu</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n\t<key>SUFeedURL</key>\n\t<string>https://www.ninjamonkeysoftware.com/slate/appcast.xml</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/PkgInfo",
    "content": "APPL????"
  },
  {
    "path": "build/Release/Slate.app/Contents/Resources/ASCIIToCode.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>&apos;</key>\n\t<integer>39</integer>\n\t<key>,</key>\n\t<integer>43</integer>\n\t<key>-</key>\n\t<integer>27</integer>\n\t<key>.</key>\n\t<integer>47</integer>\n\t<key>/</key>\n\t<integer>44</integer>\n\t<key>0</key>\n\t<integer>29</integer>\n\t<key>1</key>\n\t<integer>18</integer>\n\t<key>2</key>\n\t<integer>19</integer>\n\t<key>3</key>\n\t<integer>20</integer>\n\t<key>4</key>\n\t<integer>21</integer>\n\t<key>5</key>\n\t<integer>23</integer>\n\t<key>6</key>\n\t<integer>22</integer>\n\t<key>7</key>\n\t<integer>26</integer>\n\t<key>8</key>\n\t<integer>28</integer>\n\t<key>9</key>\n\t<integer>25</integer>\n\t<key>;</key>\n\t<integer>41</integer>\n\t<key>=</key>\n\t<integer>24</integer>\n\t<key>`</key>\n\t<integer>50</integer>\n\t<key>a</key>\n\t<integer>0</integer>\n\t<key>b</key>\n\t<integer>11</integer>\n\t<key>backslash</key>\n\t<integer>42</integer>\n\t<key>c</key>\n\t<integer>8</integer>\n\t<key>caps</key>\n\t<integer>57</integer>\n\t<key>d</key>\n\t<integer>2</integer>\n\t<key>delete</key>\n\t<integer>51</integer>\n\t<key>down</key>\n\t<integer>125</integer>\n\t<key>e</key>\n\t<integer>14</integer>\n\t<key>end</key>\n\t<integer>119</integer>\n\t<key>esc</key>\n\t<integer>53</integer>\n\t<key>f</key>\n\t<integer>3</integer>\n\t<key>f1</key>\n\t<integer>122</integer>\n\t<key>f10</key>\n\t<integer>109</integer>\n\t<key>f11</key>\n\t<integer>103</integer>\n\t<key>f12</key>\n\t<integer>111</integer>\n\t<key>f13</key>\n\t<integer>105</integer>\n\t<key>f14</key>\n\t<integer>107</integer>\n\t<key>f15</key>\n\t<integer>113</integer>\n\t<key>f16</key>\n\t<integer>106</integer>\n\t<key>f17</key>\n\t<integer>64</integer>\n\t<key>f18</key>\n\t<integer>79</integer>\n\t<key>f19</key>\n\t<integer>80</integer>\n\t<key>f2</key>\n\t<integer>120</integer>\n\t<key>f20</key>\n\t<integer>90</integer>\n\t<key>f3</key>\n\t<integer>99</integer>\n\t<key>f4</key>\n\t<integer>118</integer>\n\t<key>f5</key>\n\t<integer>96</integer>\n\t<key>f6</key>\n\t<integer>97</integer>\n\t<key>f7</key>\n\t<integer>98</integer>\n\t<key>f8</key>\n\t<integer>100</integer>\n\t<key>f9</key>\n\t<integer>101</integer>\n\t<key>g</key>\n\t<integer>5</integer>\n\t<key>h</key>\n\t<integer>4</integer>\n\t<key>help</key>\n\t<integer>114</integer>\n\t<key>home</key>\n\t<integer>115</integer>\n\t<key>i</key>\n\t<integer>34</integer>\n\t<key>j</key>\n\t<integer>38</integer>\n\t<key>k</key>\n\t<integer>40</integer>\n\t<key>l</key>\n\t<integer>37</integer>\n\t<key>left</key>\n\t<integer>123</integer>\n\t<key>m</key>\n\t<integer>46</integer>\n\t<key>mute</key>\n\t<integer>74</integer>\n\t<key>n</key>\n\t<integer>45</integer>\n\t<key>o</key>\n\t<integer>31</integer>\n\t<key>p</key>\n\t<integer>35</integer>\n\t<key>pad*</key>\n\t<integer>67</integer>\n\t<key>pad+</key>\n\t<integer>69</integer>\n\t<key>pad-</key>\n\t<integer>78</integer>\n\t<key>pad.</key>\n\t<integer>65</integer>\n\t<key>pad/</key>\n\t<integer>75</integer>\n\t<key>pad0</key>\n\t<integer>82</integer>\n\t<key>pad1</key>\n\t<integer>83</integer>\n\t<key>pad2</key>\n\t<integer>84</integer>\n\t<key>pad3</key>\n\t<integer>85</integer>\n\t<key>pad4</key>\n\t<integer>86</integer>\n\t<key>pad5</key>\n\t<integer>87</integer>\n\t<key>pad6</key>\n\t<integer>88</integer>\n\t<key>pad7</key>\n\t<integer>89</integer>\n\t<key>pad8</key>\n\t<integer>91</integer>\n\t<key>pad9</key>\n\t<integer>92</integer>\n\t<key>pad=</key>\n\t<integer>81</integer>\n\t<key>padClear</key>\n\t<integer>71</integer>\n\t<key>padEnter</key>\n\t<integer>76</integer>\n\t<key>pageDown</key>\n\t<integer>121</integer>\n\t<key>pageUp</key>\n\t<integer>116</integer>\n\t<key>q</key>\n\t<integer>12</integer>\n\t<key>r</key>\n\t<integer>15</integer>\n\t<key>return</key>\n\t<integer>36</integer>\n\t<key>right</key>\n\t<integer>124</integer>\n\t<key>s</key>\n\t<integer>1</integer>\n\t<key>space</key>\n\t<integer>49</integer>\n\t<key>t</key>\n\t<integer>17</integer>\n\t<key>tab</key>\n\t<integer>48</integer>\n\t<key>u</key>\n\t<integer>32</integer>\n\t<key>up</key>\n\t<integer>126</integer>\n\t<key>v</key>\n\t<integer>9</integer>\n\t<key>w</key>\n\t<integer>13</integer>\n\t<key>x</key>\n\t<integer>7</integer>\n\t<key>y</key>\n\t<integer>16</integer>\n\t<key>z</key>\n\t<integer>6</integer>\n\t<key>[</key>\n\t<integer>33</integer>\n\t<key>]</key>\n\t<integer>30</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Resources/ASCIIToCode_Azerty.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>help</key>\n\t<integer>114</integer>\n\t<key>mute</key>\n\t<integer>74</integer>\n\t<key>pageUp</key>\n\t<integer>116</integer>\n\t<key>f13</key>\n\t<integer>105</integer>\n\t<key>down</key>\n\t<integer>125</integer>\n\t<key>f3</key>\n\t<integer>99</integer>\n\t<key>padClear</key>\n\t<integer>71</integer>\n\t<key>&apos;</key>\n\t<integer>39</integer>\n\t<key>]</key>\n\t<integer>30</integer>\n\t<key>,</key>\n\t<integer>46</integer>\n\t<key>.</key>\n\t<integer>47</integer>\n\t<key>0</key>\n\t<integer>29</integer>\n\t<key>2</key>\n\t<integer>19</integer>\n\t<key>4</key>\n\t<integer>21</integer>\n\t<key>6</key>\n\t<integer>22</integer>\n\t<key>8</key>\n\t<integer>28</integer>\n\t<key>return</key>\n\t<integer>36</integer>\n\t<key>caps</key>\n\t<integer>57</integer>\n\t<key>pageDown</key>\n\t<integer>121</integer>\n\t<key>f19</key>\n\t<integer>80</integer>\n\t<key>`</key>\n\t<integer>50</integer>\n\t<key>b</key>\n\t<integer>11</integer>\n\t<key>d</key>\n\t<integer>2</integer>\n\t<key>f</key>\n\t<integer>3</integer>\n\t<key>h</key>\n\t<integer>4</integer>\n\t<key>j</key>\n\t<integer>38</integer>\n\t<key>l</key>\n\t<integer>37</integer>\n\t<key>n</key>\n\t<integer>45</integer>\n\t<key>p</key>\n\t<integer>35</integer>\n\t<key>f18</key>\n\t<integer>79</integer>\n\t<key>r</key>\n\t<integer>15</integer>\n\t<key>t</key>\n\t<integer>17</integer>\n\t<key>v</key>\n\t<integer>9</integer>\n\t<key>f12</key>\n\t<integer>111</integer>\n\t<key>x</key>\n\t<integer>7</integer>\n\t<key>f10</key>\n\t<integer>109</integer>\n\t<key>z</key>\n\t<integer>13</integer>\n\t<key>f16</key>\n\t<integer>106</integer>\n\t<key>f17</key>\n\t<integer>64</integer>\n\t<key>f14</key>\n\t<integer>107</integer>\n\t<key>delete</key>\n\t<integer>51</integer>\n\t<key>f1</key>\n\t<integer>122</integer>\n\t<key>f2</key>\n\t<integer>120</integer>\n\t<key>right</key>\n\t<integer>124</integer>\n\t<key>f4</key>\n\t<integer>118</integer>\n\t<key>f5</key>\n\t<integer>96</integer>\n\t<key>f6</key>\n\t<integer>97</integer>\n\t<key>f7</key>\n\t<integer>98</integer>\n\t<key>f8</key>\n\t<integer>100</integer>\n\t<key>f9</key>\n\t<integer>101</integer>\n\t<key>backslash</key>\n\t<integer>42</integer>\n\t<key>up</key>\n\t<integer>126</integer>\n\t<key>tab</key>\n\t<integer>48</integer>\n\t<key>home</key>\n\t<integer>115</integer>\n\t<key>5</key>\n\t<integer>23</integer>\n\t<key>end</key>\n\t<integer>119</integer>\n\t<key>space</key>\n\t<integer>49</integer>\n\t<key>-</key>\n\t<integer>27</integer>\n\t<key>/</key>\n\t<integer>44</integer>\n\t<key>1</key>\n\t<integer>18</integer>\n\t<key>3</key>\n\t<integer>20</integer>\n\t<key>f20</key>\n\t<integer>90</integer>\n\t<key>esc</key>\n\t<integer>53</integer>\n\t<key>7</key>\n\t<integer>26</integer>\n\t<key>9</key>\n\t<integer>25</integer>\n\t<key>;</key>\n\t<integer>41</integer>\n\t<key>=</key>\n\t<integer>24</integer>\n\t<key>padEnter</key>\n\t<integer>76</integer>\n\t<key>pad+</key>\n\t<integer>69</integer>\n\t<key>pad*</key>\n\t<integer>67</integer>\n\t<key>pad-</key>\n\t<integer>78</integer>\n\t<key>pad/</key>\n\t<integer>75</integer>\n\t<key>pad.</key>\n\t<integer>65</integer>\n\t<key>pad1</key>\n\t<integer>83</integer>\n\t<key>pad0</key>\n\t<integer>82</integer>\n\t<key>pad3</key>\n\t<integer>85</integer>\n\t<key>pad2</key>\n\t<integer>84</integer>\n\t<key>pad5</key>\n\t<integer>87</integer>\n\t<key>pad4</key>\n\t<integer>86</integer>\n\t<key>pad7</key>\n\t<integer>89</integer>\n\t<key>pad6</key>\n\t<integer>88</integer>\n\t<key>pad9</key>\n\t<integer>92</integer>\n\t<key>pad8</key>\n\t<integer>91</integer>\n\t<key>[</key>\n\t<integer>33</integer>\n\t<key>pad=</key>\n\t<integer>81</integer>\n\t<key>a</key>\n\t<integer>12</integer>\n\t<key>c</key>\n\t<integer>8</integer>\n\t<key>f11</key>\n\t<integer>103</integer>\n\t<key>e</key>\n\t<integer>14</integer>\n\t<key>g</key>\n\t<integer>5</integer>\n\t<key>i</key>\n\t<integer>34</integer>\n\t<key>k</key>\n\t<integer>40</integer>\n\t<key>m</key>\n\t<integer>41</integer>\n\t<key>o</key>\n\t<integer>31</integer>\n\t<key>q</key>\n\t<integer>0</integer>\n\t<key>s</key>\n\t<integer>1</integer>\n\t<key>u</key>\n\t<integer>32</integer>\n\t<key>w</key>\n\t<integer>6</integer>\n\t<key>y</key>\n\t<integer>16</integer>\n\t<key>f15</key>\n\t<integer>113</integer>\n\t<key>left</key>\n\t<integer>123</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Resources/ASCIIToCode_Colemak.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>help</key>\n\t<integer>114</integer>\n\t<key>mute</key>\n\t<integer>74</integer>\n\t<key>pageUp</key>\n\t<integer>116</integer>\n\t<key>f13</key>\n\t<integer>105</integer>\n\t<key>down</key>\n\t<integer>125</integer>\n\t<key>f3</key>\n\t<integer>99</integer>\n\t<key>padClear</key>\n\t<integer>71</integer>\n\t<key>&apos;</key>\n\t<integer>39</integer>\n\t<key>]</key>\n\t<integer>30</integer>\n\t<key>,</key>\n\t<integer>43</integer>\n\t<key>.</key>\n\t<integer>47</integer>\n\t<key>0</key>\n\t<integer>29</integer>\n\t<key>2</key>\n\t<integer>19</integer>\n\t<key>4</key>\n\t<integer>21</integer>\n\t<key>6</key>\n\t<integer>22</integer>\n\t<key>8</key>\n\t<integer>28</integer>\n\t<key>return</key>\n\t<integer>36</integer>\n\t<key>caps</key>\n\t<integer>57</integer>\n\t<key>pageDown</key>\n\t<integer>121</integer>\n\t<key>f19</key>\n\t<integer>80</integer>\n\t<key>`</key>\n\t<integer>50</integer>\n\t<key>b</key>\n\t<integer>11</integer>\n\t<key>d</key>\n\t<integer>5</integer>\n\t<key>f</key>\n\t<integer>14</integer>\n\t<key>h</key>\n\t<integer>4</integer>\n\t<key>j</key>\n\t<integer>16</integer>\n\t<key>l</key>\n\t<integer>32</integer>\n\t<key>n</key>\n\t<integer>38</integer>\n\t<key>p</key>\n\t<integer>15</integer>\n\t<key>f18</key>\n\t<integer>79</integer>\n\t<key>r</key>\n\t<integer>1</integer>\n\t<key>t</key>\n\t<integer>3</integer>\n\t<key>v</key>\n\t<integer>9</integer>\n\t<key>f12</key>\n\t<integer>111</integer>\n\t<key>x</key>\n\t<integer>7</integer>\n\t<key>f10</key>\n\t<integer>109</integer>\n\t<key>z</key>\n\t<integer>6</integer>\n\t<key>f16</key>\n\t<integer>106</integer>\n\t<key>f17</key>\n\t<integer>64</integer>\n\t<key>f14</key>\n\t<integer>107</integer>\n\t<key>delete</key>\n\t<integer>51</integer>\n\t<key>f1</key>\n\t<integer>122</integer>\n\t<key>f2</key>\n\t<integer>120</integer>\n\t<key>right</key>\n\t<integer>124</integer>\n\t<key>f4</key>\n\t<integer>118</integer>\n\t<key>f5</key>\n\t<integer>96</integer>\n\t<key>f6</key>\n\t<integer>97</integer>\n\t<key>f7</key>\n\t<integer>98</integer>\n\t<key>f8</key>\n\t<integer>100</integer>\n\t<key>f9</key>\n\t<integer>101</integer>\n\t<key>backslash</key>\n\t<integer>42</integer>\n\t<key>up</key>\n\t<integer>126</integer>\n\t<key>tab</key>\n\t<integer>48</integer>\n\t<key>home</key>\n\t<integer>115</integer>\n\t<key>5</key>\n\t<integer>23</integer>\n\t<key>end</key>\n\t<integer>119</integer>\n\t<key>space</key>\n\t<integer>49</integer>\n\t<key>-</key>\n\t<integer>27</integer>\n\t<key>/</key>\n\t<integer>44</integer>\n\t<key>1</key>\n\t<integer>18</integer>\n\t<key>3</key>\n\t<integer>20</integer>\n\t<key>f20</key>\n\t<integer>90</integer>\n\t<key>esc</key>\n\t<integer>53</integer>\n\t<key>7</key>\n\t<integer>26</integer>\n\t<key>9</key>\n\t<integer>25</integer>\n\t<key>;</key>\n\t<integer>35</integer>\n\t<key>=</key>\n\t<integer>24</integer>\n\t<key>padEnter</key>\n\t<integer>76</integer>\n\t<key>pad+</key>\n\t<integer>69</integer>\n\t<key>pad*</key>\n\t<integer>67</integer>\n\t<key>pad-</key>\n\t<integer>78</integer>\n\t<key>pad/</key>\n\t<integer>75</integer>\n\t<key>pad.</key>\n\t<integer>65</integer>\n\t<key>pad1</key>\n\t<integer>83</integer>\n\t<key>pad0</key>\n\t<integer>82</integer>\n\t<key>pad3</key>\n\t<integer>85</integer>\n\t<key>pad2</key>\n\t<integer>84</integer>\n\t<key>pad5</key>\n\t<integer>87</integer>\n\t<key>pad4</key>\n\t<integer>86</integer>\n\t<key>pad7</key>\n\t<integer>89</integer>\n\t<key>pad6</key>\n\t<integer>88</integer>\n\t<key>pad9</key>\n\t<integer>92</integer>\n\t<key>pad8</key>\n\t<integer>91</integer>\n\t<key>[</key>\n\t<integer>33</integer>\n\t<key>pad=</key>\n\t<integer>81</integer>\n\t<key>a</key>\n\t<integer>0</integer>\n\t<key>c</key>\n\t<integer>8</integer>\n\t<key>f11</key>\n\t<integer>103</integer>\n\t<key>e</key>\n\t<integer>40</integer>\n\t<key>g</key>\n\t<integer>17</integer>\n\t<key>i</key>\n\t<integer>37</integer>\n\t<key>k</key>\n\t<integer>45</integer>\n\t<key>m</key>\n\t<integer>46</integer>\n\t<key>o</key>\n\t<integer>41</integer>\n\t<key>q</key>\n\t<integer>12</integer>\n\t<key>s</key>\n\t<integer>2</integer>\n\t<key>u</key>\n\t<integer>34</integer>\n\t<key>w</key>\n\t<integer>13</integer>\n\t<key>y</key>\n\t<integer>31</integer>\n\t<key>f15</key>\n\t<integer>113</integer>\n\t<key>left</key>\n\t<integer>123</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Resources/ASCIIToCode_Dvorak.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>-</key>\n\t<integer>39</integer>\n\t<key>w</key>\n\t<integer>43</integer>\n\t<key>[</key>\n\t<integer>27</integer>\n\t<key>v</key>\n\t<integer>47</integer>\n\t<key>z</key>\n\t<integer>44</integer>\n\t<key>0</key>\n\t<integer>29</integer>\n\t<key>1</key>\n\t<integer>18</integer>\n\t<key>2</key>\n\t<integer>19</integer>\n\t<key>3</key>\n\t<integer>20</integer>\n\t<key>4</key>\n\t<integer>21</integer>\n\t<key>5</key>\n\t<integer>23</integer>\n\t<key>6</key>\n\t<integer>22</integer>\n\t<key>7</key>\n\t<integer>26</integer>\n\t<key>8</key>\n\t<integer>28</integer>\n\t<key>9</key>\n\t<integer>25</integer>\n\t<key>s</key>\n\t<integer>41</integer>\n\t<key>]</key>\n\t<integer>24</integer>\n\t<key>`</key>\n\t<integer>50</integer>\n\t<key>a</key>\n\t<integer>0</integer>\n\t<key>x</key>\n\t<integer>11</integer>\n\t<key>backslash</key>\n\t<integer>42</integer>\n\t<key>j</key>\n\t<integer>8</integer>\n\t<key>caps</key>\n\t<integer>57</integer>\n\t<key>e</key>\n\t<integer>2</integer>\n\t<key>delete</key>\n\t<integer>51</integer>\n\t<key>down</key>\n\t<integer>125</integer>\n\t<key>.</key>\n\t<integer>14</integer>\n\t<key>end</key>\n\t<integer>119</integer>\n\t<key>esc</key>\n\t<integer>53</integer>\n\t<key>u</key>\n\t<integer>3</integer>\n\t<key>f1</key>\n\t<integer>122</integer>\n\t<key>f10</key>\n\t<integer>109</integer>\n\t<key>f11</key>\n\t<integer>103</integer>\n\t<key>f12</key>\n\t<integer>111</integer>\n\t<key>f13</key>\n\t<integer>105</integer>\n\t<key>f14</key>\n\t<integer>107</integer>\n\t<key>f15</key>\n\t<integer>113</integer>\n\t<key>f16</key>\n\t<integer>106</integer>\n\t<key>f17</key>\n\t<integer>64</integer>\n\t<key>f18</key>\n\t<integer>79</integer>\n\t<key>f19</key>\n\t<integer>80</integer>\n\t<key>f2</key>\n\t<integer>120</integer>\n\t<key>f20</key>\n\t<integer>90</integer>\n\t<key>f3</key>\n\t<integer>99</integer>\n\t<key>f4</key>\n\t<integer>118</integer>\n\t<key>f5</key>\n\t<integer>96</integer>\n\t<key>f6</key>\n\t<integer>97</integer>\n\t<key>f7</key>\n\t<integer>98</integer>\n\t<key>f8</key>\n\t<integer>100</integer>\n\t<key>f9</key>\n\t<integer>101</integer>\n\t<key>i</key>\n\t<integer>5</integer>\n\t<key>d</key>\n\t<integer>4</integer>\n\t<key>help</key>\n\t<integer>114</integer>\n\t<key>home</key>\n\t<integer>115</integer>\n\t<key>c</key>\n\t<integer>34</integer>\n\t<key>h</key>\n\t<integer>38</integer>\n\t<key>t</key>\n\t<integer>40</integer>\n\t<key>n</key>\n\t<integer>37</integer>\n\t<key>left</key>\n\t<integer>123</integer>\n\t<key>m</key>\n\t<integer>46</integer>\n\t<key>mute</key>\n\t<integer>74</integer>\n\t<key>b</key>\n\t<integer>45</integer>\n\t<key>r</key>\n\t<integer>31</integer>\n\t<key>l</key>\n\t<integer>35</integer>\n\t<key>pad*</key>\n\t<integer>67</integer>\n\t<key>pad+</key>\n\t<integer>69</integer>\n\t<key>pad-</key>\n\t<integer>78</integer>\n\t<key>pad.</key>\n\t<integer>65</integer>\n\t<key>pad/</key>\n\t<integer>75</integer>\n\t<key>pad0</key>\n\t<integer>82</integer>\n\t<key>pad1</key>\n\t<integer>83</integer>\n\t<key>pad2</key>\n\t<integer>84</integer>\n\t<key>pad3</key>\n\t<integer>85</integer>\n\t<key>pad4</key>\n\t<integer>86</integer>\n\t<key>pad5</key>\n\t<integer>87</integer>\n\t<key>pad6</key>\n\t<integer>88</integer>\n\t<key>pad7</key>\n\t<integer>89</integer>\n\t<key>pad8</key>\n\t<integer>91</integer>\n\t<key>pad9</key>\n\t<integer>92</integer>\n\t<key>pad=</key>\n\t<integer>81</integer>\n\t<key>padClear</key>\n\t<integer>71</integer>\n\t<key>padEnter</key>\n\t<integer>76</integer>\n\t<key>pageDown</key>\n\t<integer>121</integer>\n\t<key>pageUp</key>\n\t<integer>116</integer>\n\t<key>&apos;</key>\n\t<integer>12</integer>\n\t<key>p</key>\n\t<integer>15</integer>\n\t<key>return</key>\n\t<integer>36</integer>\n\t<key>right</key>\n\t<integer>124</integer>\n\t<key>o</key>\n\t<integer>1</integer>\n\t<key>space</key>\n\t<integer>49</integer>\n\t<key>y</key>\n\t<integer>17</integer>\n\t<key>tab</key>\n\t<integer>48</integer>\n\t<key>g</key>\n\t<integer>32</integer>\n\t<key>up</key>\n\t<integer>126</integer>\n\t<key>k</key>\n\t<integer>9</integer>\n\t<key>,</key>\n\t<integer>13</integer>\n\t<key>q</key>\n\t<integer>7</integer>\n\t<key>f</key>\n\t<integer>16</integer>\n\t<key>;</key>\n\t<integer>6</integer>\n\t<key>/</key>\n\t<integer>33</integer>\n\t<key>=</key>\n\t<integer>30</integer>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Resources/default.slate",
    "content": "# This is the default .slate file.\n# If no ~/.slate file exists this is the file that will be used.\n\nconfig defaultToCurrentScreen true\nconfig nudgePercentOf screenSize\nconfig resizePercentOf screenSize\n\n# Resize Bindings\nbind right:alt       resize +10% +0\nbind left:alt        resize -10% +0\nbind up:alt          resize +0   -10%\nbind down:alt        resize +0   +10%\nbind right:ctrl;alt  resize -10% +0 bottom-right\nbind left:ctrl;alt   resize +10% +0 bottom-right\nbind up:ctrl;alt     resize +0   +10% bottom-right\nbind down:ctrl;alt   resize +0   -10% bottom-right\n\n# Push Bindings\nbind right:ctrl;cmd  push right bar-resize:screenSizeX/3\nbind left:ctrl;cmd   push left  bar-resize:screenSizeX/3\nbind up:ctrl;cmd     push up    bar-resize:screenSizeY/2\nbind down:ctrl;cmd   push down  bar-resize:screenSizeY/2\n\n# Nudge Bindings\nbind right:shift;alt nudge +10% +0\nbind left:shift;alt  nudge -10% +0\nbind up:shift;alt    nudge +0   -10%\nbind down:shift;alt  nudge +0   +10%\n\n# Throw Bindings\nbind 1:ctrl;alt         throw 0 resize\nbind 2:ctrl;alt         throw 1 resize\nbind 3:ctrl;alt         throw 2 resize\nbind right:ctrl;alt;cmd throw right resize\nbind left:ctrl;alt;cmd  throw left  resize\nbind up:ctrl;alt;cmd    throw up    resize\nbind down:ctrl;alt;cmd  throw down  resize\n\n# Focus Bindings\nbind right:cmd    focus right\nbind left:cmd     focus left\nbind up:cmd       focus up\nbind down:cmd     focus down\nbind up:cmd;alt   focus behind\nbind down:cmd;alt focus behind\n\n# Window Hints\nbind esc:cmd hint"
  },
  {
    "path": "build/Release/Slate.app/Contents/Resources/en.lproj/Credits.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg1252\\cocoartf1138\\cocoasubrtf510\n{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}\n{\\colortbl;\\red255\\green255\\blue255;}\n\\vieww10800\\viewh8400\\viewkind0\n\\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx2800\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\n\n\\f0\\b\\fs24 \\cf0 Links\\\n\\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx2800\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\\pardirnatural\n{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/jigish/slate\"}}{\\fldrslt \n\\b0 \\cf0 Home Page}}\n\\b0 \\\n{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/jigish/slate/wiki/JavaScript-Configs\"}}{\\fldrslt JavaScript Configs}}\n\\b \\\n\\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx2800\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\n\\cf0 \\\nDevelopment\n\\b0 \\\nJigish Patel & {\\field{\\*\\fldinst{HYPERLINK \"https://github.com/jigish/slate/graphs/contributors\"}}{\\fldrslt Contributors\\\n\\\n}}\n\\b Utilising{\\field{\\*\\fldinst{HYPERLINK \"https://github.com/jigish/slate/graphs/contributors\"}}{\\fldrslt \n\\b0 \\\nJSONKit\\\nSparkle}}\n\\b0 \\\n\\\n\n\\b Licensing\n\\b0 \\\nGPLv3 \\'a9 Jigish Patel 2011}"
  },
  {
    "path": "build/Release/Slate.app/Contents/Resources/initialize.js",
    "content": "(function(_controller, _info) {\n  var slate = window.slate = {\n    log: function() {\n      var msg = Array.prototype.slice.call(arguments, 0).join(\" \");\n      return _controller.log(msg);\n    },\n\n    config: function(key, callback) {\n      if (_.isFunction(callback)) {\n        return _controller.configFunction(key, callback);\n      } else if (_.isString(callback) || _.isNumber(callback) || _.isBoolean(callback)) {\n        return _controller.configNative(key, callback);\n      } else if (_.isArray(callback)) {\n        return _controller.configNative(key, callback.join(';'));\n      }\n      throw \"Invalid \"+key+\" \"+callback;\n    },\n\n    configAll: function(configMap) {\n      for (key in configMap) {\n        slate.config(key, configMap[key]);\n      }\n    },\n\n    bind: function(key, callback, repeat) {\n      if (_.isFunction(callback)) {\n        return _controller.bindFunction(key, callback, repeat);\n      } else if (_.isObject(callback)) {\n        return _controller.bindNative(key, callback, repeat);\n      }\n      throw \"bind failed, second parameter must be an operation or a function. was: \"+callback;\n    },\n\n    bindAll: function(bindMap) {\n      for(key in bindMap) {\n        if (_.isArray(bindMap[key]) && _.size(bindMap[key]) >= 2) {\n          slate.bind(key, bindMap[key][0], bindMap[key][1]);\n        } else if (_.isArray(bindMap[key]) && _.size(bindMap[key]) == 1) {\n          slate.bind(key, bindMap[key][0]);\n        } else {\n          slate.bind(key, bindMap[key]);\n        }\n      }\n    },\n\n    operationFromString: function(opString) {\n      if (!_.isString(opString)) {\n        throw \"Operation String must be a string. Was: \"+opString;\n      }\n      return _controller.operationFromString(opString);\n    },\n\n    operation : function(name, opts) {\n      if (!_.isString(name)) {\n        throw \"Operation name must be a string. Was: \"+name;\n      }\n      if (opts !== undefined && !_.isObject(opts)) {\n        throw \"Operation options must be undefined or a hash. Was: \"+opts;\n      }\n      return _controller.operation(name, opts);\n    },\n\n    doOperation : function(name, opts) {\n      if (!_.isString(name)) {\n        throw \"Operation name must be a string. Was: \"+name;\n      }\n      if (opts !== undefined && !_.isObject(opts)) {\n        throw \"Operation options must be undefined or a hash. Was: \"+opts;\n      }\n      return _controller.doOperation(name, opts);\n    },\n\n    source : function(path) {\n      if (!_.isString(path)) {\n        throw \"Source path must be a string. Was: \"+path;\n      }\n      return _controller.source(path);\n    },\n\n    layout : function(name, hash) {\n      if (!_.isString(name)) {\n        throw \"layout name must be a string. Was: \"+path;\n      }\n      if (!_.isObject(hash)) {\n        throw \"layout app hash should be a hash, was: \"+path;\n      }\n      return _controller.layout(name, hash);\n    },\n\n    default : function(screenConfig, thething) {\n      if (!_.isNumber(screenConfig) && !_.isString(screenConfig) && !_.isArray(screenConfig)) {\n        throw \"default screen config should be a number, string, or array, was: \"+screenConfig;\n      }\n      if (thething !== undefined && thething !== null &&\n          (_.isObject(thething) || _.isFunction(thething) || _.isString(thething))) {\n        return _controller.default(screenConfig, thething);\n      }\n      throw \"default action should be a function, operation, or string, was: \"+thething;\n    },\n\n    shell : function(commandAndArgs, wait, path) {\n      if (!_.isString(commandAndArgs)) {\n        throw \"shell command should be a string, was: \"+commandAndArgs;\n      }\n      if (path === null) { path = undefined; }\n      if (path !== undefined && !_.isString(path)) {\n        throw \"path should be undefined or a string, was: \"+path;\n      }\n      if (wait === null || wait === undefined) { wait = false; }\n      if (!_.isBoolean(wait)) {\n        throw \"wait should be a boolean, was: \"+wait;\n      }\n      return _controller.shell(commandAndArgs, wait, path);\n    },\n\n    on : function(what, callback) {\n      if (!_.isString(what)) {\n        throw \"on failed, first parameter must be a string. was: \"+what;\n      }\n      if (!_.isFunction(callback)) {\n        throw \"on failed, second parameter must be a function. was: \"+callback;\n      }\n      return _controller.on(what, callback);\n    }\n  };\n\n  window.S = window.slate;\n  window.S.cfg = window.S.config;\n  window.S.cfga = window.S.configAll;\n  window.S.bnd = window.S.bind;\n  window.S.bnda = window.S.bindAll;\n  window.S.op = window.S.operation;\n  window.S.doop = window.S.doOperation;\n  window.S.opstr = window.S.operationFromString;\n  window.S.src = window.S.source;\n  window.S.lay = window.S.layout;\n  window.S.def = window.S.default;\n  window.S.sh = window.S.shell;\n  window.S.info = _info;\n  var methods = window.S.info.jsMethods();\n  _.each(methods, function(method) {\n    if (window.S[method] !== undefined) {\n      throw \"OMGWTFBBQ!!!\";\n    }\n    window.S[method] = _.bind(_info[method], _info);\n  });\n  window.S.log(\"JS INIT FINISHED\");\n})(window._controller, window._info);\n"
  },
  {
    "path": "build/Release/Slate.app/Contents/Resources/underscore.js",
    "content": "(function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,v=e.reduce,h=e.reduceRight,g=e.filter,d=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,_=Object.keys,j=i.bind,w=function(n){return n instanceof w?n:this instanceof w?(this._wrapped=n,void 0):new w(n)};\"undefined\"!=typeof exports?(\"undefined\"!=typeof module&&module.exports&&(exports=module.exports=w),exports._=w):n._=w,w.VERSION=\"1.4.3\";var A=w.each=w.forEach=function(n,t,e){if(null!=n)if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a in n)if(w.has(n,a)&&t.call(e,n[a],a,n)===r)return};w.map=w.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e[e.length]=t.call(r,n,u,i)}),e)};var O=\"Reduce of empty array with no initial value\";w.reduce=w.foldl=w.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduce===v)return e&&(t=w.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(O);return r},w.reduceRight=w.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduceRight===h)return e&&(t=w.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=w.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(O);return r},w.find=w.detect=function(n,t,r){var e;return E(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},w.filter=w.select=function(n,t,r){var e=[];return null==n?e:g&&n.filter===g?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&(e[e.length]=n)}),e)},w.reject=function(n,t,r){return w.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},w.every=w.all=function(n,t,e){t||(t=w.identity);var u=!0;return null==n?u:d&&n.every===d?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var E=w.some=w.any=function(n,t,e){t||(t=w.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};w.contains=w.include=function(n,t){return null==n?!1:y&&n.indexOf===y?-1!=n.indexOf(t):E(n,function(n){return n===t})},w.invoke=function(n,t){var r=o.call(arguments,2);return w.map(n,function(n){return(w.isFunction(t)?t:n[t]).apply(n,r)})},w.pluck=function(n,t){return w.map(n,function(n){return n[t]})},w.where=function(n,t){return w.isEmpty(t)?[]:w.filter(n,function(n){for(var r in t)if(t[r]!==n[r])return!1;return!0})},w.max=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.max.apply(Math,n);if(!t&&w.isEmpty(n))return-1/0;var e={computed:-1/0,value:-1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a>=e.computed&&(e={value:n,computed:a})}),e.value},w.min=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.min.apply(Math,n);if(!t&&w.isEmpty(n))return 1/0;var e={computed:1/0,value:1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;e.computed>a&&(e={value:n,computed:a})}),e.value},w.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=w.random(r++),e[r-1]=e[t],e[t]=n}),e};var F=function(n){return w.isFunction(n)?n:function(t){return t[n]}};w.sortBy=function(n,t,r){var e=F(t);return w.pluck(w.map(n,function(n,t,u){return{value:n,index:t,criteria:e.call(r,n,t,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||void 0===r)return 1;if(e>r||void 0===e)return-1}return n.index<t.index?-1:1}),\"value\")};var k=function(n,t,r,e){var u={},i=F(t||w.identity);return A(n,function(t,a){var o=i.call(r,t,a,n);e(u,o,t)}),u};w.groupBy=function(n,t,r){return k(n,t,r,function(n,t,r){(w.has(n,t)?n[t]:n[t]=[]).push(r)})},w.countBy=function(n,t,r){return k(n,t,r,function(n,t){w.has(n,t)||(n[t]=0),n[t]++})},w.sortedIndex=function(n,t,r,e){r=null==r?w.identity:F(r);for(var u=r.call(e,t),i=0,a=n.length;a>i;){var o=i+a>>>1;u>r.call(e,n[o])?i=o+1:a=o}return i},w.toArray=function(n){return n?w.isArray(n)?o.call(n):n.length===+n.length?w.map(n,w.identity):w.values(n):[]},w.size=function(n){return null==n?0:n.length===+n.length?n.length:w.keys(n).length},w.first=w.head=w.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:o.call(n,0,t)},w.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},w.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},w.rest=w.tail=w.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},w.compact=function(n){return w.filter(n,w.identity)};var R=function(n,t,r){return A(n,function(n){w.isArray(n)?t?a.apply(r,n):R(n,t,r):r.push(n)}),r};w.flatten=function(n,t){return R(n,t,[])},w.without=function(n){return w.difference(n,o.call(arguments,1))},w.uniq=w.unique=function(n,t,r,e){w.isFunction(t)&&(e=r,r=t,t=!1);var u=r?w.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:w.contains(a,r))||(a.push(r),i.push(n[e]))}),i},w.union=function(){return w.uniq(c.apply(e,arguments))},w.intersection=function(n){var t=o.call(arguments,1);return w.filter(w.uniq(n),function(n){return w.every(t,function(t){return w.indexOf(t,n)>=0})})},w.difference=function(n){var t=c.apply(e,o.call(arguments,1));return w.filter(n,function(n){return!w.contains(t,n)})},w.zip=function(){for(var n=o.call(arguments),t=w.max(w.pluck(n,\"length\")),r=Array(t),e=0;t>e;e++)r[e]=w.pluck(n,\"\"+e);return r},w.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},w.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if(\"number\"!=typeof r)return e=w.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},w.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},w.range=function(n,t,r){1>=arguments.length&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=Array(e);e>u;)i[u++]=n,n+=r;return i};var I=function(){};w.bind=function(n,t){var r,e;if(n.bind===j&&j)return j.apply(n,o.call(arguments,1));if(!w.isFunction(n))throw new TypeError;return r=o.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(o.call(arguments)));I.prototype=n.prototype;var u=new I;I.prototype=null;var i=n.apply(u,r.concat(o.call(arguments)));return Object(i)===i?i:u}},w.bindAll=function(n){var t=o.call(arguments,1);return 0==t.length&&(t=w.functions(n)),A(t,function(t){n[t]=w.bind(n[t],n)}),n},w.memoize=function(n,t){var r={};return t||(t=w.identity),function(){var e=t.apply(this,arguments);return w.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},w.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},w.defer=function(n){return w.delay.apply(w,[n,1].concat(o.call(arguments,1)))},w.throttle=function(n,t){var r,e,u,i,a=0,o=function(){a=new Date,u=null,i=n.apply(r,e)};return function(){var c=new Date,l=t-(c-a);return r=this,e=arguments,0>=l?(clearTimeout(u),u=null,a=c,i=n.apply(r,e)):u||(u=setTimeout(o,l)),i}},w.debounce=function(n,t,r){var e,u;return function(){var i=this,a=arguments,o=function(){e=null,r||(u=n.apply(i,a))},c=r&&!e;return clearTimeout(e),e=setTimeout(o,t),c&&(u=n.apply(i,a)),u}},w.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},w.wrap=function(n,t){return function(){var r=[n];return a.apply(r,arguments),t.apply(this,r)}},w.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},w.after=function(n,t){return 0>=n?t():function(){return 1>--n?t.apply(this,arguments):void 0}},w.keys=_||function(n){if(n!==Object(n))throw new TypeError(\"Invalid object\");var t=[];for(var r in n)w.has(n,r)&&(t[t.length]=r);return t},w.values=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push(n[r]);return t},w.pairs=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push([r,n[r]]);return t},w.invert=function(n){var t={};for(var r in n)w.has(n,r)&&(t[n[r]]=r);return t},w.functions=w.methods=function(n){var t=[];for(var r in n)w.isFunction(n[r])&&t.push(r);return t.sort()},w.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},w.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},w.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)w.contains(r,u)||(t[u]=n[u]);return t},w.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)null==n[r]&&(n[r]=t[r])}),n},w.clone=function(n){return w.isObject(n)?w.isArray(n)?n.slice():w.extend({},n):n},w.tap=function(n,t){return t(n),n};var S=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof w&&(n=n._wrapped),t instanceof w&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case\"[object String]\":return n==t+\"\";case\"[object Number]\":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case\"[object Date]\":case\"[object Boolean]\":return+n==+t;case\"[object RegExp]\":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if(\"object\"!=typeof n||\"object\"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;r.push(n),e.push(t);var a=0,o=!0;if(\"[object Array]\"==u){if(a=n.length,o=a==t.length)for(;a--&&(o=S(n[a],t[a],r,e)););}else{var c=n.constructor,f=t.constructor;if(c!==f&&!(w.isFunction(c)&&c instanceof c&&w.isFunction(f)&&f instanceof f))return!1;for(var s in n)if(w.has(n,s)&&(a++,!(o=w.has(t,s)&&S(n[s],t[s],r,e))))break;if(o){for(s in t)if(w.has(t,s)&&!a--)break;o=!a}}return r.pop(),e.pop(),o};w.isEqual=function(n,t){return S(n,t,[],[])},w.isEmpty=function(n){if(null==n)return!0;if(w.isArray(n)||w.isString(n))return 0===n.length;for(var t in n)if(w.has(n,t))return!1;return!0},w.isElement=function(n){return!(!n||1!==n.nodeType)},w.isArray=x||function(n){return\"[object Array]\"==l.call(n)},w.isObject=function(n){return n===Object(n)},A([\"Arguments\",\"Function\",\"String\",\"Number\",\"Date\",\"RegExp\"],function(n){w[\"is\"+n]=function(t){return l.call(t)==\"[object \"+n+\"]\"}}),w.isArguments(arguments)||(w.isArguments=function(n){return!(!n||!w.has(n,\"callee\"))}),w.isFunction=function(n){return\"function\"==typeof n},w.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},w.isNaN=function(n){return w.isNumber(n)&&n!=+n},w.isBoolean=function(n){return n===!0||n===!1||\"[object Boolean]\"==l.call(n)},w.isNull=function(n){return null===n},w.isUndefined=function(n){return void 0===n},w.has=function(n,t){return f.call(n,t)},w.noConflict=function(){return n._=t,this},w.identity=function(n){return n},w.times=function(n,t,r){for(var e=Array(n),u=0;n>u;u++)e[u]=t.call(r,u);return e},w.random=function(n,t){return null==t&&(t=n,n=0),n+(0|Math.random()*(t-n+1))};var T={escape:{\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#x27;\",\"/\":\"&#x2F;\"}};T.unescape=w.invert(T.escape);var M={escape:RegExp(\"[\"+w.keys(T.escape).join(\"\")+\"]\",\"g\"),unescape:RegExp(\"(\"+w.keys(T.unescape).join(\"|\")+\")\",\"g\")};w.each([\"escape\",\"unescape\"],function(n){w[n]=function(t){return null==t?\"\":(\"\"+t).replace(M[n],function(t){return T[n][t]})}}),w.result=function(n,t){if(null==n)return null;var r=n[t];return w.isFunction(r)?r.call(n):r},w.mixin=function(n){A(w.functions(n),function(t){var r=w[t]=n[t];w.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),z.call(this,r.apply(w,n))}})};var N=0;w.uniqueId=function(n){var t=\"\"+ ++N;return n?n+t:t},w.templateSettings={evaluate:/<%([\\s\\S]+?)%>/g,interpolate:/<%=([\\s\\S]+?)%>/g,escape:/<%-([\\s\\S]+?)%>/g};var q=/(.)^/,B={\"'\":\"'\",\"\\\\\":\"\\\\\",\"\\r\":\"r\",\"\\n\":\"n\",\"\t\":\"t\",\"\\u2028\":\"u2028\",\"\\u2029\":\"u2029\"},D=/\\\\|'|\\r|\\n|\\t|\\u2028|\\u2029/g;w.template=function(n,t,r){r=w.defaults({},r,w.templateSettings);var e=RegExp([(r.escape||q).source,(r.interpolate||q).source,(r.evaluate||q).source].join(\"|\")+\"|$\",\"g\"),u=0,i=\"__p+='\";n.replace(e,function(t,r,e,a,o){return i+=n.slice(u,o).replace(D,function(n){return\"\\\\\"+B[n]}),r&&(i+=\"'+\\n((__t=(\"+r+\"))==null?'':_.escape(__t))+\\n'\"),e&&(i+=\"'+\\n((__t=(\"+e+\"))==null?'':__t)+\\n'\"),a&&(i+=\"';\\n\"+a+\"\\n__p+='\"),u=o+t.length,t}),i+=\"';\\n\",r.variable||(i=\"with(obj||{}){\\n\"+i+\"}\\n\"),i=\"var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\\n\"+i+\"return __p;\\n\";try{var a=Function(r.variable||\"obj\",\"_\",i)}catch(o){throw o.source=i,o}if(t)return a(t,w);var c=function(n){return a.call(this,n,w)};return c.source=\"function(\"+(r.variable||\"obj\")+\"){\\n\"+i+\"}\",c},w.chain=function(n){return w(n).chain()};var z=function(n){return this._chain?w(n).chain():n};w.mixin(w),A([\"pop\",\"push\",\"reverse\",\"shift\",\"sort\",\"splice\",\"unshift\"],function(n){var t=e[n];w.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),\"shift\"!=n&&\"splice\"!=n||0!==r.length||delete r[0],z.call(this,r)}}),A([\"concat\",\"join\",\"slice\"],function(n){var t=e[n];w.prototype[n]=function(){return z.call(this,t.apply(this._wrapped,arguments))}}),w.extend(w.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this);"
  },
  {
    "path": "build/Release/Slate.app/Contents/Resources/utils.js",
    "content": "(function(controller) {\n  for (key in _) {\n    window[\"_\"+key+\"_\"] = _[key];\n  }\n\n  var _typeof_ = window._typeof_ = function(obj) {\n    if (_.isString(obj)) { return \"string\"; }\n    if (_.isArray(obj)) { return \"array\"; }\n    if (_.isFunction(obj)) { return \"function\"; }\n    if (_.isObject(obj)) { return \"object\"; }\n    if (_.isNumber(obj)) { return \"number\"; }\n    if (_.isBoolean(obj)) { return \"boolean\"; }\n    return \"unknown\";\n  }\n\n  var _array_ = window._array_ = function() { return []; }\n  var _array_with_ = window._array_with_ = function() { return Array.prototype.slice.call(arguments, 0); }\n  var _hash_ = window._hash_ = function() { return {}; }\n})(window._controller);"
  },
  {
    "path": "icons/Contact.txt",
    "content": "Gianluca Aiello\n\nemail: gianluca369@gmail.com\nskype: gianluka369\ndribbble: http://dribbble.com/G369"
  },
  {
    "path": "script/slate.rb",
    "content": "#!/usr/bin/env ruby\n\nrequire 'json'\nrequire 'fileutils'\nrequire 'net/ftp'\n\nBEGIN_DIR = Dir.pwd\nSCRIPT_DIR = File.expand_path(File.dirname(__FILE__))\nBASE_DIR = File.join(SCRIPT_DIR, \"..\")\nBUILD_DIR = File.join(BASE_DIR, \"build\")\nRELEASE_DIR = File.join(BUILD_DIR, \"Release\")\nDEBUG_DIR = File.join(BUILD_DIR, \"Debug\")\nOUTPUT_DIR = File.join(BUILD_DIR, \"output\")\nRELEASE_OUTPUT_DIR = File.join(OUTPUT_DIR, \"Release\")\nDEBUG_OUTPUT_DIR = File.join(OUTPUT_DIR, \"Debug\")\nAPP_NAME = \"Slate\"\nAPP_FILE = \"#{APP_NAME}.app\"\nDMG_FILE = \"#{APP_NAME}.dmg\"\nDMG_SIZE_THRESHOLD = 1000000\nDMG_ICON = File.join(BASE_DIR, APP_NAME, 'icon.icns')\nDMG_BACKGROUND = File.join(BUILD_DIR, 'dmg_background.png')\nFTP_HOST = 'www.ninjamonkeysoftware.com'\nFTP_DIR = 'slate'\nWEB_HOST = 'www.ninjamonkeysoftware.com/slate'\nARCHIVE_SIZE_THRESHOLD = 800000\nARCHIVE_MIME_TYPE = 'application/x-gzip'\nAPPCAST_FILENAME = 'appcast.xml'\nAPPCAST_SIZE_THRESHOLD = 800\nRELEASE_NOTES_FILENAME = 'VERSION'\nRELEASE_NOTES_SIZE_THRESHOLD = 5000\nSPARKLE_FRAMEWORK = 'Sparkle.framework'\nRELAUNCH = 'relaunch'\nCREATE_DMG = File.join(SCRIPT_DIR, \"create-dmg\", \"create-dmg\")\nDMG_STAGING_DIR = File.join(BUILD_DIR, \"dmg_staging\")\nREADME_MD_NAME = \"README.md\"\nREADME_MD = File.join(BASE_DIR, README_MD_NAME)\nREADME_TXT_NAME = \"README.txt\"\nREADME_TXT = File.join(DMG_STAGING_DIR, README_TXT_NAME)\nLATEST_FILENAME = 'slate-latest.tar.gz'\n\ndef log(msg)\n  puts msg\nend\n\ndef clean\n  log \"Cleaning ...\"\n  Dir.glob(\"#{BUILD_DIR}/*.json\").each { |f| File.delete(f) }\n  Dir.glob(\"#{RELEASE_DIR}/*.tar.gz\").each { |f| File.delete(f) }\n  Dir.glob(\"#{RELEASE_DIR}/VERSION\").each { |f| File.delete(f) }\n  Dir.glob(\"#{RELEASE_DIR}/*.xml\").each { |f| File.delete(f) }\nend\n\ndef usage\n  log \"./#{File.basename(__FILE__)} <task> <options>\"\n  log \"  tasks:\"\n  log \"    gen : generate the release\"\n  log \"    pub : publish the release (required parameter: <github user>:<github pass>\"\n  log \"    dmg : create the dmg\"\n  Dir.chdir(BEGIN_DIR)\n  exit 1\nend\n\ndef upload_file(from_dir, to_dir, filename, size_threshold, binary = false)\n  curr_dir = Dir.pwd\n\n  Dir.chdir(from_dir)\n  size = File.new(filename).size\n  log \"[#{filename}] uploading #{size} bytes.\"\n  if (!size || size < size_threshold)\n    log \"[#{filename}] ERROR: size is below threshold: #{size} < #{size_threshold}\"\n    Dir.chdir(BEGIN_DIR)\n    return -1\n  end\n  Net::FTP.open(FTP_HOST, FTP_USER, FTP_PASS) do |ftp|\n    ftp.passive = true\n    ftp.chdir(to_dir)\n    if (binary)\n      ftp.putbinaryfile(filename)\n    else\n      ftp.puttextfile(filename)\n    end\n  end\n  size\nend\n\ndef dmgify\n  curr_dir = Dir.pwd\n\n  log \"DMGifying...\"\n  Dir.chdir(BASE_DIR)\n\n  # Copy things to staging dir\n  FileUtils.rm_rf(DMG_STAGING_DIR) if File.directory?(DMG_STAGING_DIR)\n  Dir.mkdir(DMG_STAGING_DIR)\n  FileUtils.cp_r File.join(RELEASE_DIR, APP_FILE), File.join(DMG_STAGING_DIR, APP_FILE)\n  File.new(File.join(DMG_STAGING_DIR, APP_FILE, \"Contents\", \"MacOS\", APP_NAME)).chmod(0755)\n  File.new(File.join(DMG_STAGING_DIR, APP_FILE, \"Contents\", \"Frameworks\", SPARKLE_FRAMEWORK, \"Sparkle\")).chmod(0755)\n  File.new(File.join(DMG_STAGING_DIR, APP_FILE, \"Contents\", \"Frameworks\", SPARKLE_FRAMEWORK, \"Resources\", RELAUNCH)).chmod(0755)\n  File.open(README_TXT, 'w') { |f| f.write(\"Please visit http://github.com/jigish/slate\") }\n\n  FileUtils.rm_rf(File.join(RELEASE_DIR, DMG_FILE));\n  `#{CREATE_DMG} --volname #{APP_NAME} --volicon #{DMG_ICON} --icon #{APP_NAME} 10 0 --icon #{README_TXT_NAME} 360 0 --app-drop-link 185 0 --background #{DMG_BACKGROUND} #{File.join(RELEASE_DIR, DMG_FILE)} #{DMG_STAGING_DIR}`\n\n  FileUtils.rm_rf(DMG_STAGING_DIR)\n\n  log \"DMGified.\"\n\n  Dir.chdir(curr_dir)\nend\n\ndef gen\n  curr_dir = Dir.pwd\n\n  # Cleanup files from previous build\n  clean\n\n  # Build\n  log \"Building ...\"\n  Dir.chdir(BASE_DIR)\n  `rm -rf #{DEBUG_OUTPUT_DIR} && mkdir -p #{DEBUG_OUTPUT_DIR} && CC=\"\" xcodebuild -scheme \"Slate-Debug\" DSTROOT=\"#{DEBUG_OUTPUT_DIR}\" clean install`\n  `rm -rf #{RELEASE_OUTPUT_DIR} && mkdir -p #{RELEASE_OUTPUT_DIR} && CC=\"\" xcodebuild -scheme \"Slate\" DSTROOT=\"#{RELEASE_OUTPUT_DIR}\" clean install`\n\n  # Copy\n  { DEBUG_DIR => File.join(DEBUG_OUTPUT_DIR, \"Applications\", APP_FILE), RELEASE_DIR => File.join(RELEASE_OUTPUT_DIR, \"Applications\", APP_FILE) }.each do |to, from|\n    FileUtils.rm_rf File.join(to, APP_FILE)\n    FileUtils.cp_r from, File.join(to, APP_FILE)\n    File.new(File.join(to, APP_FILE, \"Contents\", \"MacOS\", APP_NAME)).chmod(0755)\n    File.new(File.join(to, APP_FILE, \"Contents\", \"Frameworks\", SPARKLE_FRAMEWORK, \"Sparkle\")).chmod(0755)\n    File.new(File.join(to, APP_FILE, \"Contents\", \"Frameworks\", SPARKLE_FRAMEWORK, \"Resources\", RELAUNCH)).chmod(0755)\n  end\n\n  dmgify\n\n  Dir.chdir(curr_dir)\nend\n\ndef pub\n  curr_dir = Dir.pwd\n\n  gen\n  version = `cat \"#{File.join(RELEASE_DIR, APP_FILE, \"Contents\", \"Info.plist\")}\" | grep -A 1 CFBundleVersion | tail -1 | sed \"s/<string>\\\\([0-9]*\\\\.[0-9]*\\\\.[0-9]*\\\\)<\\\\/string>/\\\\1/\"`.strip\n  log \"Publishing version #{version} ...\"\n  Dir.chdir(RELEASE_DIR)\n  filename = \"slate-#{version}.tar.gz\"\n  `tar -czf #{filename} #{APP_FILE}`\n\n  # app archive\n  size = upload_file(RELEASE_DIR, File.join(FTP_DIR, \"versions\"), filename, ARCHIVE_SIZE_THRESHOLD, true)\n  unless size > ARCHIVE_SIZE_THRESHOLD\n    Dir.chdir(BEGIN_DIR)\n    exit 1\n  end\n  FileUtils.cp File.join(RELEASE_DIR, filename), File.join(RELEASE_DIR, LATEST_FILENAME)\n  size = upload_file(RELEASE_DIR, File.join(FTP_DIR, \"versions\"), LATEST_FILENAME, ARCHIVE_SIZE_THRESHOLD, true)\n  unless size > ARCHIVE_SIZE_THRESHOLD\n    Dir.chdir(BEGIN_DIR)\n    exit 1\n  end\n  FileUtils.rm File.join(RELEASE_DIR, LATEST_FILENAME)\n\n  # release notes\n  FileUtils.cp File.join(BASE_DIR, RELEASE_NOTES_FILENAME), File.join(RELEASE_DIR, RELEASE_NOTES_FILENAME)\n  size = upload_file(RELEASE_DIR, FTP_DIR, RELEASE_NOTES_FILENAME, RELEASE_NOTES_SIZE_THRESHOLD)\n  unless size > RELEASE_NOTES_SIZE_THRESHOLD\n    Dir.chdir(BEGIN_DIR)\n    exit 1\n  end\n\n  # appcast\n  appcast = <<EOS\n<rss xmlns:sparkle=\"http://www.andymatuschak.org/xml-namespaces/sparkle\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" version=\"2.0\">\n  <channel>\n  <title>Slate App Changelog</title>\n  <link>https://#{WEB_HOST}/#{APPCAST_FILENAME}</link>\n  <description>Most recent changes with links to updates for Sparkle.</description>\n  <language>en</language>\n  <item>\n    <title>Version #{version}</title>\n    <sparkle:releaseNotesLink>https://#{WEB_HOST}/#{RELEASE_NOTES_FILENAME}</sparkle:releaseNotesLink>\n    <description>Slate v#{version}</description>\n    <pubDate>#{Time.now.to_s}</pubDate>\n    <enclosure url=\"https://#{WEB_HOST}/versions/#{filename}\"\n               sparkle:version=\"#{version}\"\n               length=\"#{size}\"\n               type=\"#{ARCHIVE_MIME_TYPE}\" />\n  </item>\n  </channel>\n</rss>\nEOS\n  File.open(APPCAST_FILENAME, 'w') {|f| f.write(appcast) }\n  size = upload_file(RELEASE_DIR, FTP_DIR, APPCAST_FILENAME, APPCAST_SIZE_THRESHOLD)\n  unless size > APPCAST_SIZE_THRESHOLD\n    Dir.chdir(BEGIN_DIR)\n    exit 1\n  end\n\n  # DMG\n  size = upload_file(RELEASE_DIR, FTP_DIR, DMG_FILE, DMG_SIZE_THRESHOLD, true)\n  unless size > DMG_SIZE_THRESHOLD\n    Dir.chdir(BEGIN_DIR)\n    exit 1\n  end\n\n  log \"\"\n  log \"Done.\"\n  log \"\"\n\n  Dir.chdir(curr_dir)\nend\n\nif (ARGV.length == 0)\n  usage\nend\n\nif (ARGV[0] == 'gen')\n  gen\nelsif (ARGV[0] == 'pub')\n  if (ARGV.length < 2)\n    usage\n  else\n    FTP_USER, FTP_PASS = ARGV[1].split(':')\n    pub\n  end\nelsif (ARGV[0] == 'dmg')\n  dmgify\nelse\n  usage\nend\n\nDir.chdir(BEGIN_DIR)\n"
  }
]