././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1710711668.4740078 python-stdnum-1.20/0000755000000000000000000000000014575661564013046 5ustar00rootroot././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1710711668.3980079 python-stdnum-1.20/.github/0000755000000000000000000000000014575661564014406 5ustar00rootroot././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1710711668.4060078 python-stdnum-1.20/.github/workflows/0000755000000000000000000000000014575661564016443 5ustar00rootroot././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1701002489.0 python-stdnum-1.20/.github/workflows/test.yml0000644000000000000000000000517714530636371020144 0ustar00rootroot--- name: Test on: push: pull_request: schedule: - cron: '9 0 * * 1' jobs: test_py27: runs-on: ubuntu-20.04 container: image: python:2.7.18-buster strategy: fail-fast: false matrix: python-version: [2.7] steps: - uses: actions/checkout@v3 - name: Install dependencies run: python -m pip install --upgrade pip virtualenv tox - name: Run tox run: tox -e "$(echo py${{ matrix.python-version }} | sed -e 's/[.]//g;s/pypypy/pypy/')" --skip-missing-interpreters false test_legacy: runs-on: ubuntu-20.04 strategy: fail-fast: false matrix: python-version: [3.5, 3.6, pypy2.7] steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: python -m pip install --upgrade pip tox - name: Run tox run: tox -e "$(echo py${{ matrix.python-version }} | sed -e 's/[.]//g;s/pypypy/pypy/')" --skip-missing-interpreters false test: runs-on: ubuntu-latest strategy: fail-fast: false matrix: python-version: [3.7, 3.8, 3.9, '3.10', 3.11, 3.12, pypy3.9] steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: python -m pip install --upgrade pip tox - name: Run tox run: tox -e "$(echo py${{ matrix.python-version }} | sed -e 's/[.]//g;s/pypypy/pypy/')" --skip-missing-interpreters false tox_job: runs-on: ubuntu-latest strategy: fail-fast: false matrix: tox_job: [docs, flake8, headers] steps: - uses: actions/checkout@v3 - name: Set up Python uses: actions/setup-python@v4 with: python-version: 3.x - name: Install dependencies run: python -m pip install --upgrade pip tox - name: Run tox ${{ matrix.tox_job }} run: tox -e ${{ matrix.tox_job }} --skip-missing-interpreters false CodeQL: runs-on: ubuntu-latest permissions: actions: read contents: read security-events: write steps: - name: Checkout repository uses: actions/checkout@v3 - name: Initialize CodeQL uses: github/codeql-action/init@v2 with: languages: python - name: Build uses: github/codeql-action/autobuild@v2 - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v2 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660565015.0 python-stdnum-1.20/.gitignore0000644000000000000000000000017314276433027015024 0ustar00rootroot# global *.pyc *.pyo *~ __pycache__ # / /.coverage /.tox /build /coverage /dist /distribute-*.egg /python_stdnum.egg-info ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1683892766.0 python-stdnum-1.20/CONTRIBUTING.md0000644000000000000000000001536014427425036015270 0ustar00rootrootContributing to python-stdnum ============================= This document describes general guidelines for contributing new formats or other enhancement to python-stdnum. Adding number formats --------------------- Basically any number or code that has some validation mechanism available or some common formatting is eligible for inclusion into this library. If the only specification of the number is "it consists of 6 digits" implementing validation may not be that useful. Contributions of new formats or requests to implement validation for a format should include the following: * The format name and short description. * References to (official) sources that describe the format. * A one or two paragraph description containing more details of the number (e.g. purpose and issuer and possibly format information that might be useful to end users). * If available, a link to an (official) validation service for the number, reference implementations or similar sources that allow validating the correctness of the implementation. * A set of around 20 to 100 "real" valid numbers for testing (more is better during development but only around 100 will be retained for regression testing). * If the validation depends on some (online) list of formats, structures or parts of the identifier (e.g. a list of region codes that are part of the number) a way to easily update the registry information should be available. Code contributions ------------------ Improvements to python-stdnum are most welcome. Integrating contributions will be done on a best-effort basis and can be made easier if the following are considered: * Ideally contributions are made as GitHub pull requests, but contributions by email (privately or through the python-stdnum-users mailing list) can also be considered. * Submitted contributions will often be reformatted and sometimes restructured for consistency with other parts. * Contributions will be acknowledged in the release notes. * Contributions should add or update a copyright statement if you feel the contribution is significant. * All contribution should be made with compatible applicable copyright. * It is not needed to modify the NEWS, README.md or files under docs for new formats; these files will be updated on release. * Marking valid numbers as invalid should be avoided and are much worse than marking invalid numbers as valid. Since the primary use case for python-stdnum is to validate entered data having an implementation that results in "computer says no" should be avoided. * Number format implementations should include links to sources of information: generally useful links (e.g. more details about the number itself) should be in the module docstring, if it relates more to the implementation (e.g. pointer to reference implementation, online API documentation or similar) a comment in the code is better * Country-specific numbers and codes go in a country or region package (e.g. stdnum.eu.vat or stdnum.nl.bsn) while global numbers go in the toplevel name space (e.g. stdnum.isbn). * All code should be well tested and achieve 100% code coverage. * Existing code structure conventions (e.g. see README for interface) should be followed. * Git commit messages should follow the usual 7 rules. * Declarative or functional constructs are preferred over an iterative approach, e.g.:: s = sum(int(c) for c in number) over:: s = 0 for c in number: s += int(c) Testing ------- Tests can be run with `tox`. Some basic code style tests can be run with `tox -e flake8` and most other targets run the test suite with various supported Python interpreters. Module implementations have a couple of smaller test cases that also serve as basic documentation of the happy flow. More extensive tests are available, per module, in the tests directory. These tests (also doctests) cover more corner cases and should include a set of valid numbers that demonstrate that the module works correctly for real numbers. The normal tests should never require online sources for execution. All functions that deal with online lookups (e.g. the EU VIES service for VAT validation) should only be tested using conditional unittests. Finding test numbers -------------------- Some company numbers are commonly published on a company's website contact page (e.g. VAT or other registration numbers, bank account numbers). Doing a web search limited to a country and some key words generally turn up a lot of pages with this information. Another approach is to search for spreadsheet-type documents with some keywords that match the number. This sometimes turns up lists of companies (also occasionally works for personal identifiers). For information that is displayed on ID cards or passports it is sometimes useful to do an image search. For dealing with numbers that point to individuals it is important to: * Only keep the data that is needed to test the implementation. * Ensure that no actual other data relation to a person or other personal information is kept or can be inferred from the kept data. * The presence of a number in the test set should not provide any information about the person (other than that there is a person with the number or information that is present in the number itself). Sometimes numbers are part of a data leak. If this data is used to pick a few sample numbers from the selection should be random and the leak should not be identifiable from the picked numbers. For example, if the leaked numbers pertain only to people with a certain medical condition, membership of some organisation or other specific property the leaked data should not be used. Reverse engineering ------------------- Sometimes a number format clearly has a check digit but the algorithm is not publicly documented. It is sometimes possible to reverse engineer the used check digit algorithm from a large set of numbers. For example, given numbers that, apart from the check digit, only differ in one digit will often expose the weights used. This works reasonably well if the algorithm uses modulo 11 is over a weighted sums over the digits. See https://github.com/arthurdejong/python-stdnum/pull/203#issuecomment-623188812 Registries ---------- Some numbers or parts of numbers use validation base on a registry of known good prefixes, ranges or formats. It is only useful to fully base validation on these registries if the update frequency to these registries is very low. If there is a registry that is used (a list of known values, ranges or otherwise) the downloaded information should be stored in a data file (see the stdnum.numdb module). Only the minimal amount of data should be kept (for validation or identification). The data files should be able to be created and updated using a script in the `update` directory. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/COPYING0000644000000000000000000006350413651061616014073 0ustar00rootroot GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1710709377.0 python-stdnum-1.20/ChangeLog0000644000000000000000000065226314575655201014625 0ustar00rootroot2024-03-17 Arthur de Jong * [b454d3a] stdnum/at/postleitzahl.dat, stdnum/be/banks.dat, stdnum/cn/loc.dat, stdnum/gs1_128.py, stdnum/gs1_ai.dat, stdnum/iban.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/isil.dat, stdnum/nz/banks.dat, stdnum/oui.dat, tests/test_be_iban.doctest, update/gs1_ai.py: Update database files The Belgian bpost bank no longer has a registration and a few bank account numbers in the tests that used that bank were removed. Also updates the update/gs1_ai.py script to handle the new format of the data published by GS1. Also update the GS1-128 module to handle some different date formats. The Pakistan entry was kept in the stdnum/iban.dat file because the PDF version of the IBAN Registry still contains the country. fix db 2024-03-17 Arthur de Jong * [97dbced] tox.ini: Add update-dat tox target for convenient data file updating 2024-03-17 Arthur de Jong * [26fd25b] setup.cfg, update/cfi.py, update/nz_banks.py, update/requirements.txt: Switch to using openpyxl for parsing XLSX files The xlrd has dropped support for parsing XLSX files. We still use xlrd for update/be_banks.py because they use the classic XLS format and openpyxl does not support that format. 2024-03-17 Arthur de Jong * [9230604] stdnum/za/idnr.py: Use HTTPS in URLs where possible 2024-02-27 Atul Deolekar * [7cba469] stdnum/in_/vid.py: Add Indian virtual identity number Closes https://github.com/arthurdejong/python-stdnum/pull/428 2024-03-17 Arthur de Jong * [bb20121] stdnum/ua/edrpou.py, tests/test_ua_edrpou.doctest: Fix Ukrainian EDRPOU check digit calculation This fixes the case where the weighted sum woud be 10 which should result in a check digit of 0. Closes https://github.com/arthurdejong/python-stdnum/issues/429 2023-12-15 Kevin Dagostino * [9c7c669] stdnum/fr/nif.py: Imporve French NIF validation (checksum) The last 3 digits are a checksum. % 511 https://ec.europa.eu/taxation_customs/tin/specs/FS-TIN%20Algorithms-Public.docx Closes https://github.com/arthurdejong/python-stdnum/pull/426 2024-02-03 Arthur de Jong * [1e412ee] stdnum/vatin.py, tests/test_vatin.doctest: Fix vatin number compacting for "EU" VAT numbers Thanks Davide Walder for finding this. Closes https://github.com/arthurdejong/python-stdnum/issues/427 2023-11-19 Daniel Weber * [2535bbf] stdnum/eu/ecnumber.py, tests/test_eu_ecnumber.doctest: Add European Community (EC) Number Closes https://github.com/arthurdejong/python-stdnum/pull/422 2023-10-20 Ömer Boratav * [2478483] stdnum/ca/bc_phn.py: Add British Columbia PHN Closes https://github.com/arthurdejong/python-stdnum/pull/421 2023-11-12 Arthur de Jong * [58d6283] stdnum/ro/cf.py, tests/test_eu_vat.doctest: Ensure EU VAT numbers don't accept duplicate country codes 2023-11-12 Arthur de Jong * [1a5db1f] stdnum/de/vat.py: Fix typo (thanks Александр Кизеев) 2023-10-02 Arthur de Jong * [352bbcb] .github/workflows/test.yml, setup.py, tox.ini: Add support for Python 3.12 2023-08-20 Arthur de Jong * [fa455fc] ChangeLog, NEWS, README.md, docs/index.rst, docs/stdnum.be.bis.rst, docs/stdnum.eg.tn.rst, docs/stdnum.es.postal_code.rst, docs/stdnum.eu.oss.rst, docs/stdnum.gn.nifp.rst, docs/stdnum.si.maticna.rst, stdnum/__init__.py: Get files ready for 1.19 release 2023-08-20 Arthur de Jong * [3191b4c] MANIFEST.in: Ensure all files are included in source archive Fixes b1dc313 Fixes 90044e2 2023-08-20 Arthur de Jong * [3947a54] stdnum/by/portal.nalog.gov.by.crt, stdnum/by/unp.py: Remove obsolete intermediate certificate The portal.nalog.gov.by web no longer has an incomplete certificate chain. 2023-08-20 Arthur de Jong * [7761e42] stdnum/numdb.py: Use importlib.resource in place of deprecated pkg_resources Closes https://github.com/arthurdejong/python-stdnum/issues/412 Closes https://github.com/arthurdejong/python-stdnum/pull/413 2023-08-20 Arthur de Jong * [f6edcc5] tests/test_do_rnc.py: Avoid the deprecated assertRegexpMatches function 2023-08-20 Arthur de Jong * [895f092] setup.cfg: Rename license_file option in setup.cfg It seems the old option wasn't working with all versions of setuptools anyway. See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html 2023-08-20 Arthur de Jong * [3126f96] stdnum/by/unp.py, tests/test_by_unp.py: Update Belarusian UNP online check The API for the online check for Belarusian UNP numbers at https://www.portal.nalog.gov.by/grp/getData has changed some small details of the API. 2023-08-20 Arthur de Jong * [88d1dca] tests/test_de_handelsregisternummer.py: Replace test number for German company registry The number seems to be no longer valid breaking the online tests. 2023-08-20 Arthur de Jong * [6e56f3c] stdnum/at/postleitzahl.dat, stdnum/be/banks.dat, stdnum/cn/loc.dat, stdnum/gs1_ai.dat, stdnum/iban.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/isil.dat, stdnum/nz/banks.dat, stdnum/oui.dat, tests/test_be_iban.doctest, update/oui.py: Update database files This also modifies the OUI update script because the website has changed to HTTPS and is sometimes very slow. The Belgian Commerzbank no longer has a registration and a bank account number in the tests used that bank. 2023-08-20 Arthur de Jong * [0aa0b85] update/eu_nace.py: Remove EU NACE update script The website that publishes the NACE catalogue has changed and a complete re-write of the script would be necessary. The data file hasn't changed since 2017 so is also unlikely to change until it is going to be replaced by NACE rev. 2.1 in 2025. See https://ec.europa.eu/eurostat/web/nace The NACE rev 2 specification can now be found here: https://showvoc.op.europa.eu/#/datasets/ESTAT_Statistical_Classification_of_Economic_Activities_in_the_European_Community_Rev._2/data The NACE rev 2.1 specification can now be found here: https://showvoc.op.europa.eu/#/datasets/ESTAT_Statistical_Classification_of_Economic_Activities_in_the_European_Community_Rev._2.1._%28NACE_2.1%29/data In both cases a ZIP file with RDF metadata can be downloaded (but the web applciation also exposes some simpler JSON APIs). 2023-08-13 Arthur de Jong * [f58e08d] stdnum/eu/oss.py, stdnum/eu/vat.py, tests/test_eu_oss.doctest, tests/test_eu_vat.doctest: Validate European VAT numbers with EU or IM prefix Closes https://github.com/arthurdejong/python-stdnum/pull/417 2023-06-30 Blaž Bregar * [d0f4c1a] stdnum/si/__init__.py, stdnum/si/maticna.py, tests/test_si_maticna.doctest: Add Slovenian Corporate Registration Number Closes https://github.com/arthurdejong/python-stdnum/pull/414 2023-08-06 Arthur de Jong * [b8ee830] .github/workflows/test.yml, scripts/check_headers.py, tox.ini: Extend license check to file header check This also checks that the file name referenced in the file header is correct. 2023-08-06 Arthur de Jong * [ef49f49] stdnum/be/bis.py, stdnum/be/nn.py, stdnum/de/stnr.py, stdnum/dz/nif.py, stdnum/fi/alv.py, stdnum/gb/utr.py, stdnum/hr/oib.py, stdnum/md/idno.py, stdnum/pl/regon.py, stdnum/py/ruc.py, stdnum/sk/dph.py, stdnum/tn/mf.py, stdnum/ua/edrpou.py, stdnum/ua/rntrc.py, stdnum/vn/mst.py, stdnum/za/idnr.py, tests/test_al_nipt.doctest, tests/test_gb_sedol.doctest, tests/test_iso6346.doctest, tests/test_iso7064.doctest, tests/test_th_moa.doctest, tests/test_tn_mf.doctest, tests/test_ve_rif.doctest: Fix file headers This improves consistency across files and fixes some files that had an incorrect file name reference. 2023-07-30 Arthur de Jong * [3848318] stdnum/ca/sin.py: Validate first digit of Canadian SIN See http://www.straightlineinternational.com/docs/vaildating_canadian_sin.pdf See https://lists.arthurdejong.org/python-stdnum-users/2023/msg00000.html 2023-06-20 Jeff Horemans * [be33a80] stdnum/be/bis.py, stdnum/be/nn.py, tests/test_be_bis.doctest, tests/test_be_nn.doctest: Add Belgian BIS Number Closes https://github.com/arthurdejong/python-stdnum/pull/418 2023-06-19 Arthur de Jong * [8ce4a47] .github/workflows/test.yml: Run Python 2.7 tests in a container for GitHub Actions See https://github.com/actions/setup-python/issues/672 2023-06-13 Jeff Horemans * [311fd56] stdnum/be/nn.py, tests/test_be_nn.doctest: Handle (partially) unknown birthdate of Belgian National Number This adds documentation for the special cases regarding birth dates embedded in the number, allows for date parts to be unknown and adds functions for getting the year and month. Closes https://github.com/arthurdejong/python-stdnum/pull/416 2023-06-01 Chales Horn * [7d3ddab] stdnum/isbn.py, stdnum/issn.py: Minor ISSN and ISBN documentation fixes Fix a comment that claimed incorrect ISSN length and use slightly more consistent terminology around check digits in ISSN and ISBN. Closes https://github.com/arthurdejong/python-stdnum/pull/415 2023-05-12 Arthur de Jong * [90044e2] .github/workflows/test.yml, scripts/check_license_headers.py, tox.ini: Add automated checking for correct license header 2023-01-28 Leandro Regueiro * [62d15e9] stdnum/gn/__init__.py, stdnum/gn/nifp.py, tests/test_gn_nifp.doctest: Add support for Guinea TIN Closes https://github.com/arthurdejong/python-stdnum/issues/384 Closes https://github.com/arthurdejong/python-stdnum/pull/386 2023-02-24 Victor * [96abcfe] stdnum/es/postal_code.py: Add Spanish postcode validator Closes https://github.com/arthurdejong/python-stdnum/pull/401 2023-02-13 mjturt * [36858cc] stdnum/fi/hetu.py, tests/test_fi_hetu.doctest: Add support for Finland HETU new century indicating signs More information at https://dvv.fi/en/reform-of-personal-identity-code Cloess https://github.com/arthurdejong/python-stdnum/pull/396 2023-01-05 Jeff Horemans * [42d2792] stdnum/be/nn.py, tests/test_be_nn.doctest: Add functionality to get gender from Belgian National Number This also extends the documentation for the number. Closes https://github.com/arthurdejong/python-stdnum/pull/347/files 2023-03-06 RaduBorzea <101399404+RaduBorzea@users.noreply.github.com> * [cf14a9f] stdnum/ro/cnp.py: Add get_county() function to Romanian CNP This also validates the county part of the number. Closes https://github.com/arthurdejong/python-stdnum/pull/407 2023-03-19 Arthur de Jong * [a8b6573] docs/conf.py, setup.cfg, tox.ini: Ensure flake8 is run on all Python files This also fixes code style fixes in the Sphinx configuration file. 2023-03-18 Arthur de Jong * [7af50b7] .github/workflows/test.yml, setup.py, tox.ini: Add support for Python 3.11 2023-03-18 Arthur de Jong * [8498b37] stdnum/gs1_128.py: Fix date formatting on PyPy 2.7 The original way of calling strftime was likely an artifact of Python 2.6 support. Fixes 7e84c05 2023-03-18 Arthur de Jong * [7e84c05] stdnum/gs1_128.py, stdnum/gs1_ai.dat, tests/test_gs1_128.doctest, update/gs1_ai.py: Extend date parsing in GS1-128 Some new AIs have new date formats or have changed the way optional components of formats are defined. 2023-03-09 Dimitri Papadopoulos <3234522+DimitriPapadopoulos@users.noreply.github.com> * [bf1bdfe] stdnum/iban.dat: Update IBAN database file Closes https://github.com/arthurdejong/python-stdnum/pull/409 2023-03-18 Arthur de Jong * [a09a7ce] stdnum/al/nipt.py, tests/test_al_nipt.doctest: Fix Albanian tax number validation This extends the description of the Albanian NIPT (NUIS) number with information on the structure of the number. The first character was previously limited between J and L but this letter indicates a decade and the number is also used for individuals to where it indicates a birth date. Thanks Julien Launois for pointing this out. Source: https://www.oecd.org/tax/automatic-exchange/crs-implementation-and-assistance/tax-identification-numbers/Albania-TIN.pdf Fixes 3db826c Closes https://github.com/arthurdejong/python-stdnum/pull/402 2023-03-13 Ali-Akber Saifee * [031a249] stdnum/sg/uen.py: Fix typo in UEN docstring 2023-01-02 Arthur de Jong * [cf22705] online_check/stdnum.wsgi, tox.ini: Extend number properties to show in online check This also ensures that flake8 is run on the WSGI script. 2022-10-09 Leandro Regueiro * [6d366e3] stdnum/eg/__init__.py, stdnum/eg/tn.py, tests/test_eg_tn.doctest: Add support for Egypt TIN This also convertis Arabic digits to ASCII digits. Closes https://github.com/arthurdejong/python-stdnum/issues/225 Closes https://github.com/arthurdejong/python-stdnum/pull/334 2022-12-30 Arthur de Jong * [b1dc313] CONTRIBUTING.md, docs/contributing.rst, docs/index.rst: Add initial CONTRIBUTING.md file Initial description of the information needed for adding new number formats and some coding and testing guidelines. 2022-12-05 Dimitri Papadopoulos <3234522+DimitriPapadopoulos@users.noreply.github.com> * [df894c3] stdnum/ch/uid.py, stdnum/gh/tin.py: Fix typos found by codespell Closes https://github.com/arthurdejong/python-stdnum/pull/344 2022-12-12 Arthur de Jong * [4f8155c] .github/workflows/test.yml: Run Python 3.5 and 3.6 GitHub tests on older Ubuntu The ubuntu-latest now points to ubuntu-22.04 instead of ubuntu-20.04 before. This also switches the PyPy version to test with to 3.9. 2022-11-29 valeriko * [74d854f] stdnum/ee/ik.py: Fix a typo Clocses https://github.com/arthurdejong/python-stdnum/pull/341 2022-11-28 Arthur de Jong * [7a91a98] tox.ini: Avoid newer flake8 The new 6.0.0 contains a number of backwards incompatible changes for which plugins need to be updated and configuration needs to be updated. Sadly the maintainer no longer accepts contributions or discussion See https://github.com/PyCQA/flake8/issues/1760 2022-11-13 Arthur de Jong * [60a90ed] ChangeLog, NEWS, README.md, docs/index.rst, docs/stdnum.be.nn.rst, docs/stdnum.cfi.rst, docs/stdnum.cz.bankaccount.rst, docs/stdnum.dz.nif.rst, docs/stdnum.fo.vn.rst, docs/stdnum.gh.tin.rst, docs/stdnum.ke.pin.rst, docs/stdnum.ma.ice.rst, docs/stdnum.me.pib.rst, docs/stdnum.mk.edb.rst, docs/stdnum.pk.cnic.rst, docs/stdnum.si.emso.rst, docs/stdnum.tn.mf.rst, stdnum/__init__.py, stdnum/gh/tin.py, tox.ini: Get files ready for 1.18 release 2022-11-13 Arthur de Jong * [31b2694] stdnum/at/postleitzahl.dat, stdnum/be/banks.dat, stdnum/cn/loc.dat, stdnum/eu/nace.dat, stdnum/gs1_ai.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/nz/banks.dat, stdnum/oui.dat: Update database files 2022-11-13 Arthur de Jong * [f691bf7] stdnum/de/handelsregisternummer.py, tests/test_de_handelsregisternummer.py: Update German OffeneRegister lookup data format It appears that the data structure at OffeneRegister has changed which requires a different query. Data is returned in a different structure. 2022-11-13 Arthur de Jong * [5cdef0d] update/cn_loc.py: Increase timeout for CN Open Data download It seems that raw.githubusercontent.com can be extremely slow. 2022-11-13 Arthur de Jong * [580d6e0] update/my_bp.py: Pick up custom certificate from script path This ensures that the script can be run from any directory. Fixes c4ad714 2022-09-06 Leandro Regueiro * [7348c7a] tests/test_vatin.doctest: vatin: Add a few more tests for is_valid See https://github.com/arthurdejong/python-stdnum/pull/316 2022-11-13 Arthur de Jong * [fa62ea3] stdnum/pk/__init__.py, stdnum/pk/cnic.py, tests/test_pk_cnic.doctest: Add Pakistani ID card number Based on the implementation provided by Quantum Novice (Syed Haseeb Shah). Closes https://github.com/arthurdejong/python-stdnum/pull/306 Closes https://github.com/arthurdejong/python-stdnum/issues/304 2022-10-16 Blaž Bregar * [feccaff] stdnum/si/__init__.py, stdnum/si/emso.py, tests/test_si_emso.doctest: Add support for Slovenian EMŠO (Unique Master Citizen Number) Closes https://github.com/arthurdejong/python-stdnum/pull/338 2022-11-12 Arthur de Jong * [74cc981] stdnum/cz/bankaccount.py, stdnum/nz/bankaccount.py, tox.ini, update/iban.py: Ensure we always run flake8-bugbear This assumes that we no longer use Python 2.7 for running the flake8 tests any more. 2022-11-12 Arthur de Jong * [a03ac04] stdnum/cz/bankaccount.py, stdnum/es/referenciacatastral.py, stdnum/lei.py, stdnum/nl/bsn.py: Use HTTPS in URLs where possible 2022-10-23 Leandro Regueiro * [8e76cd2] stdnum/cr/cpf.py: Pad with zeroes in a more readable manner Closes https://github.com/arthurdejong/python-stdnum/pull/340 2022-11-12 Arthur de Jong * [45f098b] stdnum/exceptions.py: Make all exceptions inherit from ValueError All the validation exceptions (subclasses of ValidationError) are raised when a number is provided with an inappropriate value. 2022-11-12 Arthur de Jong * [a218032] stdnum/ch/uid.py, tests/test_ch_uid.py: Add a check_uid() function to the stdnum.ch.uid module This function can be used to performa a lookup of organisation information by the Swiss Federal Statistical Office web service. Related to https://github.com/arthurdejong/python-stdnum/issues/336 2022-11-12 Arthur de Jong * [1364e19] stdnum/cusip.py, tests/test_cusip.doctest: Support "I" and "O" in CUSIP number It is unclear why these letters were considered invalid at the time of the implementation. This also reduces the test set a bit while still covering most cases. Closes https://github.com/arthurdejong/python-stdnum/issues/337 2022-10-23 Arthur de Jong * [f972894] online_check/stdnum.wsgi: Switch to escape() from html The function was removed from the cgi module in Python 3.8. 2022-10-23 Arthur de Jong * [c5d3bf4] online_check/stdnum.wsgi: Switch to parse_qs() from urllib.parse The function was removed from the cgi module in Python 3.8. 2022-10-19 Arthur de Jong * [8b5b07a] stdnum/casrn.py: Remove unused import Fixes 09d595b 2022-10-19 Arthur de Jong * [09d595b] stdnum/casrn.py: Improve validation of CAS Registry Number This ensures that a leading 0 is treated as invalid. 2022-10-19 Arthur de Jong * [7c2153e] stdnum/cas.py: Remove duplicate CAS Registry Number The recently added stdnum.cas module was already available as teh stdnum.casrn module. Reverts acb6934 2022-10-19 Arthur de Jong * [1003033] tests/test_no_fodselsnummer.doctest: Update Fødselsnummer test case for date in future The future was now. This problem was pushed forwards to October 2039. 2022-10-15 Arthur de Jong * [1636045] tox.ini: Support running tests with PyPy 2.7 This also applies the fix from cfc80c8 from Python 2.7 to PyPy. 2022-09-11 Leandro Regueiro * [7be2291] stdnum/gh/__init__.py, stdnum/gh/tin.py, tests/test_gh_tin.doctest: Add support for Ghana TIN Closes https://github.com/arthurdejong/python-stdnum/pull/326 Closes https://github.com/arthurdejong/python-stdnum/issues/262 2022-10-15 Arthur de Jong * [acb6934] stdnum/cas.py: Add CAS Registry Number 2022-09-18 Leandro Regueiro * [2b6e087] stdnum/me/__init__.py, stdnum/me/pib.py, tests/test_me_pib.doctest: Add support for Montenegro TIN Closes https://github.com/arthurdejong/python-stdnum/pull/331 Closes https://github.com/arthurdejong/python-stdnum/issues/223 2022-09-10 Leandro Regueiro * [fbe094c] stdnum/fo/__init__.py, stdnum/fo/vn.py, tests/test_fo_vn.doctest: Add Faroe Islands V-number Closes https://github.com/arthurdejong/python-stdnum/pull/323 Closes https://github.com/arthurdejong/python-stdnum/issues/219 2022-09-17 Leandro Regueiro * [a261a93] stdnum/mk/__init__.py, stdnum/mk/edb.py, tests/test_mk_edb.doctest: Add North Macedonian ЕДБ Note that this is implementation is mostly based on unofficial sources describing the format, which match the hundreds of examples found online. https://forum.it.mk/threads/modularna-kontrola-na-embg-edb-dbs-itn.15663/?__cf_chl_tk=Op2PaEIauip6Z.ZjvhP897O8gRVAwe5CDAVTpjx1sEo-1663498930-0-gaNycGzNCRE#post-187048 Also note that the algorithm for the check digit was tested on all found examples, and it doesn't work for all of them, despite those failing examples don't seem to be valid according to the official online search. Closes https://github.com/arthurdejong/python-stdnum/pull/330 Closes https://github.com/arthurdejong/python-stdnum/issues/222 2022-09-23 Dimitri Papadopoulos <3234522+DimitriPapadopoulos@users.noreply.github.com> * [eff3f52] stdnum/cn/ric.py, stdnum/ma/ice.py: Fix a couple typos found by codespell Closes https://github.com/arthurdejong/python-stdnum/pull/333 2022-09-04 Leandro Regueiro * [31709fc] stdnum/dz/__init__.py, stdnum/dz/nif.py, tests/test_dz_nif.doctest: Add Algerian NIF number This currently only checks the length and whether it only contains digits because little could be found on the structure of the number of whether there are any check digits. Closes https://github.com/arthurdejong/python-stdnum/pull/313 Closes https://github.com/arthurdejong/python-stdnum/issues/307 2022-09-03 Leandro Regueiro * [2907676] stdnum/ma/__init__.py, stdnum/ma/ice.py, tests/test_ma_ice.doctest: Add support for Morocco TIN Closes https://github.com/arthurdejong/python-stdnum/issues/226 Closes https://github.com/arthurdejong/python-stdnum/pull/312 2022-08-08 Leandro Regueiro * [d70549a] stdnum/ke/__init__.py, stdnum/ke/pin.py, tests/test_ke_pin.doctest: Add Kenyan TIN Closes https://github.com/arthurdejong/python-stdnum/issues/300 Closes https://github.com/arthurdejong/python-stdnum/pull/310 2022-09-06 Leandro Regueiro * [dd70cd5] stdnum/tn/__init__.py, stdnum/tn/mf.py, tests/test_tn_mf.doctest: Add support for Tunisia TIN Closes https://github.com/arthurdejong/python-stdnum/pull/317 Closes https://github.com/arthurdejong/python-stdnum/issues/309 2022-08-15 Arthur de Jong * [e40c827] tests/test_eu_vat.py: Update EU VAT Vies test with new number The number used before was apparently no longer valid. 2022-08-15 Arthur de Jong * [5bcc460] stdnum/de/handelsregisternummer.py: Fix German OffeneRegister company registry URL 2022-08-15 Arthur de Jong * [ee9dfdf] stdnum/at/postleitzahl.dat, stdnum/be/banks.dat, stdnum/cfi.dat, stdnum/cn/loc.dat, stdnum/eu/nace.dat, stdnum/gs1_ai.dat, stdnum/iban.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/isil.dat, stdnum/my/bp.dat, stdnum/nz/banks.dat, stdnum/oui.dat: Update database files 2022-08-15 Arthur de Jong * [6b39c3d] update/nz_banks.py: Do not print trailing space 2022-08-15 Arthur de Jong * [e901ac7] update/my_bp.py: Ignore invalid downloaded country codes The page currently lists a country without a country code (is listed as "-"). This also ensures that lists of country codes are handled consistently. 2022-08-15 Arthur de Jong * [2cf78c2] update/imsi.py: Update names of Wikipedia pages with IMSI codes 2022-08-15 Arthur de Jong * [975d508] update/at_postleitzahl.py, update/be_banks.py, update/cfi.py, update/cn_loc.py, update/cz_banks.py, update/do_whitelists.py, update/eu_nace.py, update/gs1_ai.py, update/iban.py, update/imsi.py, update/isbn.py, update/isil.py, update/my_bp.py, update/nz_banks.py, update/oui.py: Provide a timeout to all download scripts 2022-08-15 Arthur de Jong * [ed37a6a] stdnum/isil.py, update/isil.py: Update ISIL download URL 2022-08-13 Christian Clauss * [8aa6b5e] .github/workflows/test.yml: Remove redundant steps with tox_job This also switches the other Tox jobs to use the latest Python 3.x interpreter. Closes https://github.com/arthurdejong/python-stdnum/pull/305 2022-08-03 Romuald R * [ce9322c] stdnum/de/handelsregisternummer.py, tests/test_de_handelsregisternummer.doctest: Add extra court alias for german Handelsregisternummer Charlottenburg (Berlin) is a valid court representation for Berlin (Charlottenburg). See https://www.northdata.com/VRB+Service+GmbH,+Berlin/Amtsgericht+Charlottenburg+%28Berlin%29+HRB+103587+B Closes https://github.com/arthurdejong/python-stdnum/pull/298 2022-08-15 Arthur de Jong * [eae1dd2] stdnum/ch/esr.py, stdnum/il/idnr.py, stdnum/isin.py, stdnum/nl/bsn.py, stdnum/no/kontonr.py, stdnum/nz/ird.py, stdnum/ro/cui.py: Use str.zfill() for padding leading zeros 2022-06-08 petr.prikryl * [c5595c7] stdnum/cz/bankaccount.py, stdnum/cz/banks.dat, tests/test_cz_bankaccount.doctest, update/cz_banks.py: Add Czech bank account numbers Closes https://github.com/arthurdejong/python-stdnum/issues/295 Closes https://github.com/arthurdejong/python-stdnum/pull/296 2022-08-06 vovavili <64227274+vovavili@users.noreply.github.com> * [4d4a0b3] stdnum/isin.py: Fix small typo Improper inflection of plurals. Closes https://github.com/arthurdejong/python-stdnum/pull/299 2022-08-13 Arthur de Jong * [7ee0563] setup.cfg, stdnum/ad/nrt.py, stdnum/cr/cpj.py, stdnum/eu/nace.py, stdnum/id/npwp.py, stdnum/il/hp.py, stdnum/it/aic.py, stdnum/li/peid.py, stdnum/nz/ird.py, stdnum/sg/uen.py, stdnum/sv/nit.py, stdnum/za/tin.py, update/eu_nace.py: Put long line flake8 ignores in files instead of globally We have some long URLs in the code (mostly in docstrings) and wrapping them does not improve readability (and is difficult in docstrings) so the E501 ignore is now put inside each file instead of globally. Closes https://github.com/arthurdejong/python-stdnum/pull/302 2022-08-13 Arthur de Jong * [351be74] .github/workflows/test.yml, setup.py, tox.ini: Add support for Python 3.10 2022-08-08 Christian Clauss * [b36c0d6] .github/workflows/test.yml: Upgrade GitHub Actions Update checkout to v3 (no relevant changes) and setup-python to v4 (changes the names for pypy versions). 2022-08-12 Arthur de Jong * [9f79691] stdnum/it/iva.py, update/iban.py: Fix flake8 error This stops using not as a function and hopefully also makes the logic clearer. 2022-07-04 Arthur de Jong * [a280d53] .github/workflows/test.yml: Upgrade to CodeQL Action v2 https://github.blog/changelog/2022-04-27-code-scanning-deprecation-of-codeql-action-v1/ 2022-04-09 Arthur de Jong * [8a28e38] setup.cfg, tox.ini: Switch from nose to pytest Nose hasn't seen a release since 2015 and sadly doesn't work with Python 3.10. See https://github.com/nose-devs/nose/issues/1099 2022-05-09 Arthur de Jong * [e831d07] setup.cfg: Ignore flake8 complaining about print statements It seems that flake8 now uses T201 instead of T001 for this check. 2022-04-08 Alexis de Lattre * [7d81eac] stdnum/gs1_128.py, tests/test_gs1_128.doctest: Support parsing dates without a day in GS1-128 Date such as '(17)260400' is now properly interpreted as April 30th 2026. Closes https://github.com/arthurdejong/python-stdnum/pull/294 2022-02-05 Cédric Krier * [bda2a9c] stdnum/be/nn.py, tests/test_be_nn.doctest: Compute birth date from Belgian National Number Closes https://github.com/arthurdejong/python-stdnum/pull/288 2022-03-21 Arthur de Jong * [e2a2774] stdnum/iso7064/mod_97_10.py, tests/test_iso7064.doctest: Return check digits in 02-98 range for ISO 7064 Mod 97, 10 There are some valid ranges for check digits within ISO 7064 Mod 97, 10 that all result in a valid checksum. This changes the calculated check digits to be in the range from 02 to 98 as is specified for use in IBAN. See https://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits Closes https://github.com/arthurdejong/python-stdnum/pull/289 2022-03-07 Cédric Krier * [73f5e3a] stdnum/fr/siret.py, tests/test_fr_siret.doctest: Support special validation of La Post SIRET See https://fr.wikipedia.org/wiki/Système_d'identification_du_répertoire_des_établissements#Exceptions_pour_le_groupe_La_Poste Closes https://github.com/arthurdejong/python-stdnum/pull/293 Closes https://github.com/arthurdejong/python-stdnum/issues/291 2022-02-14 Arthur de Jong * [27c7c74] stdnum/cfi.py, tests/test_cfi.doctest: Fix Python 2.7 compatibility of the tests Fixes a9039c1 2022-02-14 Arthur de Jong * [cfc80c8] tox.ini: Support running tests with Python 2.7 When using recent versions of virtualenv this ensures that older versions of pip and setuptools will be used inside the virtualenvs that are created by tox. 2022-02-13 Arthur de Jong * [a9039c1] stdnum/cfi.dat, stdnum/cfi.py, tests/test_cfi.doctest, update/cfi.py: Add Classification of Financial Instruments This implements parsing of ISO 10962 CFI codes based on the published description of the structure of these numbers. Closes https://github.com/arthurdejong/python-stdnum/issues/283 2022-02-13 Arthur de Jong * [219ff54] stdnum/numdb.py, tests/numdb-test.dat: Fix problem in numdb with missing sub-properties If a numdb data file line contains multiple values or ranges the sub-ranges were only applied to the last value in the range. 2022-02-13 Arthur de Jong * [fd32e61] setup.py: Also ensure that embedded certificates are shipped 2022-01-09 Arthur de Jong * [02dec52] stdnum/mx/curp.py: Fix disabling check digit validation of Mexican CURP The validation functions supported an optional parameter to disable check digit validation in the number that didn't actually affect validation and was most likely accidentally copied from the RFC module. Fixes 50874a9 Closes https://github.com/arthurdejong/python-stdnum/issues/285 2021-11-29 Cédric Krier * [dcf4730] stdnum/be/__init__.py, stdnum/be/nn.py: Add Belgian National Number Closes https://github.com/arthurdejong/python-stdnum/pull/284 2021-10-03 Arthur de Jong * [50650a9] ChangeLog, NEWS, README.md, docs/index.rst, docs/stdnum.in_.epic.rst, docs/stdnum.in_.gstin.rst, docs/stdnum.isrc.rst, docs/stdnum.pt.cc.rst, docs/stdnum.se.postnummer.rst, docs/stdnum.th.moa.rst, docs/stdnum.th.pin.rst, docs/stdnum.th.tin.rst, stdnum/__init__.py: Get files ready for 1.17 release 2021-10-03 Arthur de Jong * [0779d6a] stdnum/kr/brn.py, tests/test_kr_brn.py: Remove South Korean BRN online check The Korea Fair Trade Commission website now requires solving a CAPTCHA before submitting the request so this is no longer possible. 2021-10-03 Arthur de Jong * [61ebc9c] stdnum/no/orgnr.py: Add documentation for Norwegian Organisasjonsnummer 2021-10-03 Arthur de Jong * [9da63a4] tests/test_do_cedula.py: Update Cedula online test value Apparently the previously whitelisted value is no longer recognised as a valid value by the DGII service. 2021-10-03 Arthur de Jong * [25c30d7] stdnum/by/portal.nalog.gov.by.crt: Update Let's Encrypt R3 intermediate certificate The portal.nalog.gov.by web site serves an incomplete certificate chain and the certificate chain was changed. 2021-10-03 Arthur de Jong * [3406c24] MANIFEST.in, README.md, docs/index.rst, setup.py, update/numlist.py: Rename README to README.md Mostly to please GitHub. See https://github.com/arthurdejong/python-stdnum/issues/280 2021-10-03 Arthur de Jong * [d5cba0a] stdnum/at/postleitzahl.dat, stdnum/be/banks.dat, stdnum/cn/loc.dat, stdnum/eu/nace.dat, stdnum/gs1_ai.dat, stdnum/iban.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/isil.dat, stdnum/nz/banks.dat, stdnum/oui.dat, update/gs1_ai.py: Update database files 2021-09-30 Gaurav Chauhan <71322586+vairag22@users.noreply.github.com> * [26a7e7b] stdnum/in_/__init__.py, stdnum/in_/gstin.py: Add Indian GSTIN (VAT number) Closes https://github.com/arthurdejong/python-stdnum/pull/279 2021-09-30 Gaurav Chauhan <71322586+vairag22@users.noreply.github.com> * [ca560cd] stdnum/in_/epic.py: Add Indian EPIC number (Voter ID number) Closes https://github.com/arthurdejong/python-stdnum/pull/279 2021-09-30 Gaurav Chauhan <71322586+vairag22@users.noreply.github.com> * [fc56388] stdnum/in_/aadhaar.py, stdnum/in_/pan.py: Improve validation and docstrings of Indian numbers This ensures that an Aadhaar cannot be a palindrome and checks the serial part of the PAN to not be all zeros. It also updates some descriptions of PAN holder types and renames the card_holder_type to just holder_type. Closes https://github.com/arthurdejong/python-stdnum/pull/279 2021-09-19 Arthur de Jong * [1a0e613] stdnum/ec/ruc.py, tests/test_ec_ruc.doctest: Fix detection of natural RUC values A natural RUC is the CI plus an establishment number. Both the natural RUC and the public RUC can have a third digit with the value 6. Closes https://github.com/arthurdejong/python-stdnum/issues/267 2021-08-20 michele * [8071444] stdnum/se/__init__.py, stdnum/se/postnummer.py, tests/test_se_postnummer.doctest: Add swedish postcode validator Closes https://github.com/arthurdejong/python-stdnum/pull/271 2021-02-21 Piruin Panichphol * [424e408] stdnum/th/__init__.py, stdnum/th/moa.py, stdnum/th/pin.py, stdnum/th/tin.py, tests/test_th_moa.doctest, tests/test_th_pin.doctest, tests/test_th_tin.doctest: Add support for Thai Numbers - TIN Taxpayer Identification Number - PIN Personal Identification Number - MOA Memorandum of Association Number Closes https://github.com/arthurdejong/python-stdnum/issues/118 Closes https://github.com/arthurdejong/python-stdnum/pull/255 2021-03-10 Nuno André * [36d723c] stdnum/isrc.py, tests/test_isrc.doctest: Add ISRC (International Standard Recording Code) Closes https://github.com/arthurdejong/python-stdnum/pull/261 2021-08-07 Dimitri Papadopoulos <3234522+DimitriPapadopoulos@users.noreply.github.com> * [48bfd84] stdnum/ad/nrt.py, stdnum/bitcoin.py, stdnum/do/ncf.py, stdnum/isbn.py, stdnum/util.py, stdnum/vn/mst.py, tests/test_cusip.doctest, tests/test_de_idnr.doctest, update/be_banks.py, update/imsi.py, update/isil.py, update/numlist.py: Fix typos found by codespell Closes https://github.com/arthurdejong/python-stdnum/pull/269 2021-08-07 Dimitri Papadopoulos <3234522+DimitriPapadopoulos@users.noreply.github.com> * [dcdb5c9] stdnum/exceptions.py: Explicilty define exported exceptions LGTM alert: Import pollutes the enclosing namespace See: https://lgtm.com/rules/3980091/ Closes https://github.com/arthurdejong/python-stdnum/pull/270 2021-08-07 Dimitri Papadopoulos <3234522+DimitriPapadopoulos@users.noreply.github.com> * [abda037] stdnum/no/fodselsnummer.py: Simplify range checking in Norwegian birth numbers LGTM alert: Test is always true See: https://lgtm.com/rules/900073/ Closes https://github.com/arthurdejong/python-stdnum/pull/270 2021-08-07 Dimitri Papadopoulos <3234522+DimitriPapadopoulos@users.noreply.github.com> * [c69b4f6] update/be_banks.py: Fix handling of empty worksheet in Belgian bank download LGTM alert: Call to next() in a generator See: https://lgtm.com/rules/11000086/ Closes https://github.com/arthurdejong/python-stdnum/pull/270 2021-06-09 David Vaz * [4516748] stdnum/pt/cc.py, tests/test_pt_cc.doctest: Add CC (Número de Cartão de Cidadão, Portuguese Identity number) Closes https://github.com/arthurdejong/python-stdnum/pull/265 2021-06-10 FRANK ROBERTO CHAVEZ SOSA <1085268@est.intec.edu.do> * [4c51860] stdnum/do/ncf.py: Add new e-CF types to Dominican Republic NCF 2021-01-18 Andres Rodriguez * [48e6502] stdnum/do/ncf.py: Fix parsing of empty fields in DGII checking 2020-12-11 Cristopher Ortega * [2b452b6] stdnum/do/ncf.py, tests/test_do_ncf.py: Add ENCF validation support for Dominican Republic NCF Closes https://github.com/arthurdejong/python-stdnum/pull/248 2021-06-09 Dimitri Papadopoulos <3234522+DimitriPapadopoulos@users.noreply.github.com> * [eeaf665] stdnum/fr/nif.py: Improve French NIF validation Closes https://github.com/arthurdejong/python-stdnum/pull/266 2021-07-12 Arthur de Jong * [e2a95fc] .github/workflows/test.yml: Configure CodeQL code scanning 2021-07-18 Arthur de Jong * [175b1e5] stdnum/exceptions.py: Ignore N818 because our exceptions are not named error 2021-04-11 Arthur de Jong * [38c368d] stdnum/numdb.py, tests/numdb-test.dat: Only process the shortest matches in the numdb module This ensures that matching numbers is done consistently when the numdb database file has conflicting information about the length of numbers. This also refactors the _find() function to be simpler and reduces the number of recursive calls that have to be done. The tests have been re-formatted to use pprint to make it easier to spot differences if any of the tests fail (instead of just saying expected True, got False). Closes https://github.com/arthurdejong/python-stdnum/issues/257 2021-04-11 Arthur de Jong * [b7901d6] update/imsi.py: Stop non-operational MNCs from confusing IMSI dataset This only includes data from non-operational (status "Not operational" according to Wikipedia) Mobile Network Code operators in the generated data file if they would not confuse the lookup of operational numbers. This avoid problems when the "030" to "039" non-operational ranges conflicting with the "03" operational range. This ensures that only the "03" value is kept. For historical completeness we keep the other non-operational values. Closes https://github.com/arthurdejong/python-stdnum/issues/257 2021-03-03 Jakub Wilk * [7e69090] docs/index.rst: Fix typo Closes https://github.com/arthurdejong/python-stdnum/pull/258 2021-03-21 Arthur de Jong * [5785afb] .github/workflows/test.yml, .travis.yml: Replace Travis with GitHub actions 2021-03-21 Arthur de Jong * [7c0bb84] .travis.yml, setup.py, tox.ini: Drop support for Python 2.6 and 3.4 It is increasingly difficult to test with these versions of Python and everybody should have upgraded to a more recent version long ago. 2021-02-06 Arthur de Jong * [075d85e] ChangeLog, NEWS, stdnum/__init__.py: Get files ready for 1.16 release 2021-02-06 Arthur de Jong * [fad3064] stdnum/by/portal.nalog.gov.by.crt: Add Let's Encrypt R3 intermediate certificate The portal.nalog.gov.by web site serves an incomplete certificate chain and the intermediate certificate was changed. 2021-02-06 Arthur de Jong * [8c4ec55] stdnum/be/banks.dat, stdnum/cn/loc.dat, stdnum/eu/nace.dat, stdnum/gs1_ai.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/nz/banks.dat, stdnum/oui.dat: Update database files 2021-02-06 Arthur de Jong * [fe34e15] stdnum/kr/rrn.py, stdnum/pe/ruc.py, stdnum/ua/edrpou.py: Use HTTPS in URLs where possible 2021-01-24 Arthur de Jong * [407a02f] stdnum/at/postleitzahl.dat, update/at_postleitzahl.py: Switch postal code download to Austrian open-data portal This simplifies the process of downloading Austrian postal codes by downloading a JSON blob instead from https://www.data.gv.at/katalog/dataset/f76ed887-00d6-450f-a158-9f8b1cbbeebf This filters the list to only use addressable (adressierbar) postal codes because it matches the previous list. Thanks Bernd Schlapsi for providing the pointer. Closes https://github.com/arthurdejong/python-stdnum/issues/235 2021-01-21 Alexis de Lattre * [53f13b4] stdnum/vatin.py, tests/test_vatin.doctest: Add support for XI VAT numbers in vatin Closes https://github.com/arthurdejong/python-stdnum/pull/251 2021-01-21 Arthur de Jong * [b93d695] stdnum/eu/vat.py, stdnum/gb/vat.py, tests/test_eu_vat.doctest: Support xi country code for Northern Ireland While Great Brittain is no longer an EU member state some GB VAT numbers are still valid if the company meets certain requirements. See https://www.gov.uk/government/publications/accounting-for-vat-on-goods-moving-between-great-britain-and-northern-ireland-from-1-january-2021/check-when-you-are-trading-under-the-northern-ireland-protocol-if-you-are-vat-registered-business Closes https://github.com/arthurdejong/python-stdnum/issues/250 2021-01-11 Arthur de Jong * [6b7f209] ChangeLog, NEWS, README, docs/conf.py, docs/index.rst, docs/stdnum.li.peid.rst, docs/stdnum.ro.cui.rst, docs/stdnum.ua.edrpou.rst, docs/stdnum.ua.rntrc.rst, stdnum/__init__.py, tox.ini: Get files ready for 1.15 release 2021-01-11 Arthur de Jong * [755eee7] .travis.yml: Simplify Travis matrix This also ensures that supported Python interpreters are output in order. 2021-01-10 Arthur de Jong * [a0c62ee] stdnum/at/postleitzahl.dat, stdnum/be/banks.dat, stdnum/cn/loc.dat, stdnum/eu/nace.dat, stdnum/gs1_ai.dat, stdnum/iban.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/my/bp.dat, stdnum/nz/banks.dat, stdnum/oui.dat, update/at_postleitzahl.py, update/my_bp.py, update/nz_banks.py: Update database files 2021-01-10 Arthur de Jong * [df0623b] stdnum/by/unp.py, stdnum/do/ncf.py, stdnum/imsi.py, stdnum/isbn.py, stdnum/meid.py, tox.ini: Drop pinning of isort now flake8-isort has been fixed This changes a few inline imports in the code to pass with the new isort. Reverts 291b831 2021-01-10 Arthur de Jong * [b202eee] stdnum/my/nric.py: Fix typo 2021-01-10 Arthur de Jong * [7e86331] setup.py: Add project URLs for PyPI 2020-10-25 Leandro Regueiro * [126496c] stdnum/ua/rntrc.py, tests/test_ua_rntrc.doctest: Add support for Ukraine РНОКПП number Closes https://github.com/arthurdejong/python-stdnum/pull/242 Closes https://github.com/arthurdejong/python-stdnum/issues/117 2020-10-25 Leandro Regueiro * [b7b2af8] stdnum/ua/__init__.py, stdnum/ua/edrpou.py, tests/test_ua_edrpou.doctest: Add support for Ukraine ЄДРПОУ number Closes https://github.com/arthurdejong/python-stdnum/pull/242 Closes https://github.com/arthurdejong/python-stdnum/issues/117 2021-01-04 Viggo de Vries * [0427b01] stdnum/eu/vat.py, tests/test_eu_vat.doctest, tests/test_gb_vat.doctest: Remove GB from EU member states Closes https://github.com/arthurdejong/python-stdnum/pull/246 2021-01-10 Arthur de Jong * [2f2c742] .travis.yml, setup.py, tox.ini: Add support for Python 3.9 This switches Travis tests to bionic by default. 2021-01-10 Arthur de Jong * [2046f51] stdnum/damm.py, stdnum/eu/at_02.py, stdnum/gs1_128.py, stdnum/iso7064/mod_11_10.py, stdnum/iso7064/mod_11_2.py, stdnum/iso7064/mod_37_2.py, stdnum/iso7064/mod_37_36.py, stdnum/iso7064/mod_97_10.py, stdnum/luhn.py, stdnum/util.py, stdnum/verhoeff.py: Fix flake8 blind except Exception error 2021-01-04 Viggo de Vries * [cc3a970] stdnum/au/__init__.py: Use ABN as Australian VAT number See https://www.ato.gov.au/Business/GST/Tax-invoices/ Closes https://github.com/arthurdejong/python-stdnum/pull/246 2021-01-02 Arthur de Jong * [c74e322] stdnum/vatin.py, tests/test_vatin.doctest: Support VAT numbers that are only valid with country prefix The Swish VAT number has the CH prefix embedded as a required part of the number. This ensures that the international VAT number module also supports that. Closes https://github.com/arthurdejong/python-stdnum/issues/245 Fixes ff188bd 2020-10-27 Matthias Schmid, M.Sc * [5082af4] stdnum/li/__init__.py, stdnum/li/peid.py, tests/test_li_peid.doctest: Add Liechtenstein Personenidentifikationsnummer Closes https://github.com/arthurdejong/python-stdnum/pull/241 Closes https://github.com/arthurdejong/python-stdnum/issues/125 2020-10-02 Jonas Geuens * [3a592e4] stdnum/be/vat.py, tests/test_be_vat.doctest: Expanded validation for BE VAT numbers Specifically invalidated all-zero numbers Closes https://github.com/arthurdejong/python-stdnum/pull/240 2020-11-01 Arthur de Jong * [c5eb2d8] stdnum/eu/vat.py, stdnum/ro/cf.py, tests/test_eu_vat.doctest: Retain RO prefix in Romanian VAT numbers This does not strip the RO prefix from Romanian VAT numbers to be able to keep the distinction between a CUI/CIF that is registered for VAT (which commonly has the RO prefix) and those that don't. Closes https://github.com/arthurdejong/python-stdnum/issues/231 2020-11-01 Arthur de Jong * [1f6c77f] stdnum/ro/cnp.py, stdnum/ro/onrc.py: Minor updates 2020-11-01 Arthur de Jong * [e0417f6] stdnum/ro/cf.py, stdnum/ro/cui.py: Add Romanian CUI/CIF number This module separates the validation of numbers assigned to companies (CUI or CIF) of those assigned to natural persons (CNP). 2020-09-19 Arthur de Jong * [19d3f70] stdnum/eu/vat.py: Make list of EU member states list of public API This provides stdnum.eu.vat.MEMBER_STATES. Note that Greece is listed with a country code of "gr" while the prefix used in VAT numbers is "el". Closes https://github.com/arthurdejong/python-stdnum/issues/238 2020-09-04 Arthur de Jong * [992dc20] online_check/check.js, online_check/jquery-1.7.1.js, online_check/jquery-1.7.1.min.js, online_check/jquery-3.5.1.js, online_check/jquery-3.5.1.min.js, online_check/jquery-3.5.1.min.map, online_check/template.html: Upgrade jQuery to 3.5.1 This also runs eslint over check.js and fixes an issue from the upgrade. 2020-08-09 Arthur de Jong * [3373938] ChangeLog, NEWS, README, docs/index.rst, docs/stdnum.by.unp.rst, docs/stdnum.cn.uscc.rst, docs/stdnum.gb.utr.rst, docs/stdnum.gs1_128.rst, docs/stdnum.id.npwp.rst, docs/stdnum.il.hp.rst, docs/stdnum.it.aic.rst, docs/stdnum.kr.brn.rst, docs/stdnum.ro.onrc.rst, docs/stdnum.sg.uen.rst, docs/stdnum.sv.nit.rst, docs/stdnum.tw.ubn.rst, docs/stdnum.vatin.rst, docs/stdnum.vn.mst.rst, docs/stdnum.za.idnr.rst, stdnum/__init__.py: Get files ready for 1.14 release 2020-08-09 Arthur de Jong * [40fcc24] stdnum/be/banks.dat, stdnum/cn/loc.dat, stdnum/eu/nace.dat, stdnum/gs1_ai.dat, stdnum/iban.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/nz/banks.dat, stdnum/oui.dat, update/imsi.py, update/nz_banks.py: Update database files 2020-03-08 Leandro Regueiro * [ff188bd] stdnum/vatin.py, tests/test_vatin.doctest: Add module to check any VAT number This effectively mimics vatnumber's `check_vat` function, so people can easily replace the outdated vatnumber library with stdnum. Closes https://github.com/arthurdejong/python-stdnum/pull/199 2020-08-08 Arthur de Jong * [b6e43cd] update/gs1_ai.py: Fix Python 3.6 issue in update script Fixes 180788a 2020-08-08 Arthur de Jong * [180788a] stdnum/gs1_128.py, stdnum/gs1_ai.dat, tests/test_gs1_128.doctest, update/gs1_ai.py: Add GS1-128 format This adds validation, parsing and encoding functions for GS1-128. It is based on the lists of formats as published by the GS1 organisation. Based on the implementation provided by Sergi Almacellas Abellana . Closes https://github.com/arthurdejong/python-stdnum/pull/144 2020-08-02 Arthur de Jong * [c2284f3] stdnum/ro/onrc.py, tests/test_ro_onrc.doctest: Add Romanian Trade Register identifier Closes https://github.com/arthurdejong/python-stdnum/issues/229 Closes https://github.com/arthurdejong/python-stdnum/pull/234 2020-06-02 Mohammed Salman * [94e2c63] stdnum/gb/utr.py, tests/test_gb_utr.doctest: Add English Unique Tax Reference Closes https://github.com/arthurdejong/python-stdnum/pull/227 2020-08-02 Arthur de Jong * [505521e] stdnum/ro/cnp.py: Support foreign residents for Romanian CNP This supports 7 or 8 as first digits in the CNP which are apparently used to identify foreign residents. This also changes the exception for an incorrect first digit from InvalidFormat to InvalidComponent which is a little clearer. Closes https://github.com/arthurdejong/python-stdnum/issues/230 2020-08-02 Arthur de Jong * [51a122d] stdnum/kr/GPKIRootCA1.crt, stdnum/kr/brn.py: Remove custom CA certificate for www.ftc.go.kr This certificate is not needed any more because the site now uses a different certificate that is signed by a known CA. 2020-07-31 evaldez89 * [feca1fe] stdnum/do/rnc.py, tests/test_do_rnc.py: Scape new line character Closes https://github.com/arthurdejong/python-stdnum/pull/233 Closes https://github.com/arthurdejong/python-stdnum/issues/232 2020-04-05 Leandro Regueiro * [dab926c] stdnum/tw/__init__.py, stdnum/tw/ubn.py, tests/test_tw_ubn.doctest: Add support for Taiwan TIN number Closes https://github.com/arthurdejong/python-stdnum/pull/214 Closes https://github.com/arthurdejong/python-stdnum/issues/209 2020-07-05 Arthur de Jong * [291b831] tox.ini: Avoid newer isort for flake8 tests Do not install the latest isort because it currently breaks flake8-isort. This pinning should be removed as soon as https://github.com/gforcada/flake8-isort/issues/88 is resolved. 2020-03-08 Leandro Regueiro * [7112874] stdnum/id/__init__.py, stdnum/id/npwp.py, tests/test_id_npwp.doctest: Add support for Indonesian NPWP Closes https://github.com/arthurdejong/python-stdnum/issues/106 Closes https://github.com/arthurdejong/python-stdnum/pull/198 2020-04-18 Leandro Regueiro * [a34a76d] stdnum/vn/__init__.py, stdnum/vn/mst.py, tests/test_vn_mst.doctest: Add support for Vietnam TIN number Closes https://github.com/arthurdejong/python-stdnum/issues/217 Closes https://github.com/arthurdejong/python-stdnum/pull/218 2020-05-16 Arthur de Jong * [1b7e985] stdnum/kr/GPKIRootCA1.crt, stdnum/kr/brn.py, tests/test_kr_brn.py: Add an online check for the South Korean BRN 2020-03-07 Leandro Regueiro * [b3891f1] stdnum/kr/__init__.py, stdnum/kr/brn.py, tests/test_kr_brn.doctest: Add support for South Korea Business Registration Number Closes https://github.com/arthurdejong/python-stdnum/pull/197 Closes https://github.com/arthurdejong/python-stdnum/issues/101 2020-06-06 Christopher Ormaza * [127fff1] stdnum/ec/ci.py: Support 6 as third digit for foreign people in Ecuador Closes https://github.com/arthurdejong/python-stdnum/pull/228 2020-03-18 Leandro Regueiro * [0d5b8b1] stdnum/sg/__init__.py, stdnum/sg/uen.py, tests/test_sg_uen.doctest: Add support for Singapore Unique Entity Number Closes https://github.com/arthurdejong/python-stdnum/issues/111 Closes https://github.com/arthurdejong/python-stdnum/pull/203 2020-03-18 Leandro Regueiro * [4eda3f3] stdnum/nz/__init__.py: Add missing vat alias for New Zealand Closes https://github.com/arthurdejong/python-stdnum/pull/202 2020-04-04 Leandro Regueiro * [f3ce70c] stdnum/cn/__init__.py, stdnum/cn/uscc.py, tests/test_cn_uscc.doctest: Add support for Chinese TIN number Closes https://github.com/arthurdejong/python-stdnum/issues/207 Closes https://github.com/arthurdejong/python-stdnum/pull/210 2020-04-10 Leandro Regueiro * [54e2e8f] stdnum/sv/__init__.py, stdnum/sv/nit.py, tests/test_sv_nit.doctest: Add support for El Salvador TIN number Closes https://github.com/arthurdejong/python-stdnum/issues/133 Closes https://github.com/arthurdejong/python-stdnum/pull/215 2020-03-31 Leandro Regueiro * [356a729] stdnum/il/__init__.py, stdnum/il/hp.py, tests/test_il_hp.doctest: Add Israeli TIN number Closes https://github.com/arthurdejong/python-stdnum/pull/208 Closes https://github.com/arthurdejong/python-stdnum/issues/107 2020-04-25 Arthur de Jong * [e49e0e9] docs/index.rst: Document function return behaviour 2020-04-19 Arthur de Jong * [417b500] setup.cfg, setup.py, tox.ini: Flake 8 fixes 2020-04-18 Arthur de Jong * [ff86618] .travis.yml: Resolve Travis configuration warnings 2020-04-18 Arthur de Jong * [982322a] tox.ini: Avoid newest Sphinx Newer versions of Sphinx treat underscores differently when used in arguments to automodule causing problems in generating documentation for the stdnum.in_.aadhaar, stdnum.in_.pan, stdnum.is_.kennitala and stdnum.is_.vsk modules. 2020-03-20 Arthur de Jong * [91ca4da] stdnum/cu/ni.py, stdnum/do/ncf.py, stdnum/do/rnc.py, stdnum/es/ccc.py, stdnum/es/referenciacatastral.py, stdnum/eu/eic.py, stdnum/eu/nace.py, stdnum/fi/hetu.py, stdnum/fr/nir.py, stdnum/gb/nhs.py, stdnum/gr/amka.py, stdnum/isil.py, stdnum/issn.py, stdnum/kr/rrn.py, stdnum/mu/nid.py, stdnum/mx/curp.py, stdnum/mx/rfc.py, stdnum/pl/regon.py: Use HTTPS in URLs where possible 2020-03-19 grzekru * [273dd54] stdnum/eu/vat.py: Use HTTPS instead of HTTP fox VIES lookups Closes https://github.com/arthurdejong/python-stdnum/issues/204 Closes https://github.com/arthurdejong/python-stdnum/pull/205 2020-03-03 FabrizioMontanari * [8433821] stdnum/it/aic.py, tests/test_it_aic.doctest: Add Italian AIC codes Closes https://github.com/arthurdejong/python-stdnum/pull/193 2020-03-09 Arthur de Jong * [f7b968c] stdnum/by/unp.py: Fix typo Thanks @unho 2020-03-08 Arthur de Jong * [d09ed52] stdnum/lv/pvn.py, stdnum/ru/inn.py: Use zip() for applying weights in check algorithms 2020-03-07 Arthur de Jong * [60139a8] stdnum/by/__init__.py, stdnum/by/portal.nalog.gov.by.crt, stdnum/by/unp.py, tests/test_by_unp.doctest, tests/test_by_unp.py: Add Bellarus УНП number This also adds a function to do an online lookup of the number. Closes https://github.com/arthurdejong/python-stdnum/issues/196 2020-03-07 Leandro Regueiro * [ebe7e10] stdnum/jp/__init__.py: Add missing vat alias for Japan 2020-03-07 Leandro Regueiro * [6429080] stdnum/ca/__init__.py: Add missing vat alias for Canada 2020-03-07 Leandro Regueiro * [84ee720] stdnum/tr/__init__.py: Add missing vat alias for Turkey 2020-03-07 Leandro Regueiro * [fcbe159] stdnum/pe/__init__.py: Add missing vat alias for Peru 2020-03-07 Leandro Regueiro * [9be7dee] stdnum/cr/__init__.py: Add missing vat alias for Costa Rica 2020-03-07 Leandro Regueiro * [69d22e9] stdnum/br/__init__.py: Add missing vat alias for Brazil 2020-01-31 Leon Sandøy * [df9f922] stdnum/no/fodselsnummer.py, tests/test_no_fodselsnummer.doctest: Implement get_birth_date() for no.fodselsnummer This adds a function that allows you to determine a persons birth date from a Norwegian fødselsnummer. This also accounts for D-numbers, H-numbers, and FH-numbers, which contain special exceptions and modifications to the birthdate portion of the number. Most of the information this is based on was found here: https://no.wikipedia.org/wiki/F%C3%B8dselsnummer#H-nummer It also updates the list of valid fødselsnummer in the tests, since this list contained many numbers that are not valid by this new validation that now accounts for dates. Additionally, this updates all tests that were failing under the new validation, and adds a few new tests to bring the coverage to 100%. Closes https://github.com/arthurdejong/python-stdnum/pull/187 2020-01-31 Leon Sandøy * [4500881] stdnum/dk/cpr.py: Improve birth date validation for dk.cpr This adds a check to validate that the birth date information in a personnummer is not set in the future, resolving a TODO from this file. It also improves exception messages for certain validation fail conditions. 2020-01-31 Leon Sandøy * [f5e0456] stdnum/se/personnummer.py: Fix misleading docstring in se.personnummer get_birth_date() The docstring for get_birth_date() in the Swedish personnummer.py warned that the datetime might be 100 years off because of the lack of precision in the personnummer. This was accurate when the docstring was written, but this is no longer accurate after the - and + signs were correctly handled. Fixes 5441ffa 2020-03-01 Arthur de Jong * [8437b8e] .travis.yml: Use bionic for pypy3 tests on Travis This switches the pypy3 tests to bionic which has Python 3.6.9. There were installation issues with 3.5.3 on trusty and coverage issues with 3.6.1 of xenial (now the default on Travis). 2020-02-24 Aleksi Hoffman * [353db92] stdnum/fi/hetu.py, tests/test_fi_hetu.doctest: Support validating temporary Finnish personal identity codes This adds an optional allow_temporary parameter, which defaults to False, to the validate() function. Closes https://github.com/arthurdejong/python-stdnum/pull/191 2020-02-18 Gustavo Valverde * [efa70f1] stdnum/do/ncf.py: Change DGII endpoint to new one The old endpoint has been deprecated. Closes https://github.com/arthurdejong/python-stdnum/pull/190 2020-02-12 Arthur de Jong * [e513888] stdnum/se/personnummer.py, tests/test_se_personnummer.doctest: Fix issue with extra plus or minus in se.personnummer Fixes 5441ffa Closes https://github.com/arthurdejong/python-stdnum/issues/188 2020-01-22 Gustavo Valverde * [77a77ba] stdnum/do/ncf.py: Add missing NCF document types for validation These document types are in the official documentation, but were not being validated: https://dgii.gov.do/cicloContribuyente/facturacion/comprobantesFiscales/Paginas/tiposComprobantes.aspx Closes https://github.com/arthurdejong/python-stdnum/pull/186 2020-01-19 Arthur de Jong * [d5666b8] ChangeLog, NEWS, README, docs/index.rst, docs/stdnum.ch.esr.rst, setup.py, stdnum/__init__.py: Get files ready for 1.13 release 2020-01-19 Arthur de Jong * [334e907] online_check/stdnum.wsgi: Fix online check to be Python 3 compatible 2020-01-18 Arthur de Jong * [53d9934] stdnum/at/postleitzahl.dat, stdnum/be/banks.dat, stdnum/cn/loc.dat, stdnum/eu/nace.dat, stdnum/iban.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/isil.dat, stdnum/nz/banks.dat, stdnum/oui.dat, update/iban.py: Update database files 2020-01-18 Arthur de Jong * [f23c549] stdnum/za/idnr.py, tests/test_za_idnr.doctest: Add South African Identity Document number Closes https://github.com/arthurdejong/python-stdnum/issues/126 2020-01-12 Arthur de Jong * [42e096e] stdnum/isin.py, tests/test_isin.doctest: Add temporary and internal ISIN country codes This adds a few temporary and internal country codes that are used by various agencies so that they can also be validated. This does not mean that all these numbers are globally valid. Closes https://github.com/arthurdejong/python-stdnum/issues/158 2019-12-06 anwarbaroudi * [87c195f] stdnum/isin.py, tests/test_isin.doctest: Add three country codes to ISIN This adds three missing country codes: 'AN' for 'Netherlands Antilles', 'CS' for 'Serbia and Montenegro' and 'XK' for 'Kosovo'. Closes https://github.com/arthurdejong/python-stdnum/issues/173 Closes https://github.com/arthurdejong/python-stdnum/pull/174 Closes https://github.com/arthurdejong/python-stdnum/pull/176 2020-01-09 Emmanuel Arias * [0b30c4b] stdnum/ar/cuit.py, tests/test_ar_cuit.doctest: Test Argentinian CUIT type The first two digits of the CUIT indicate the type of CUIT (personal, company or international) and can only have certain values. Closes https://github.com/arthurdejong/python-stdnum/issues/179 Closes https://github.com/arthurdejong/python-stdnum/pull/181 2020-01-09 Arthur de Jong * [a9b3e90] stdnum/nl/btw.py, tests/test_eu_vat.doctest: Support new btw-identificatienummer The btw-identificatienummer has been introduced on January 1st 2020 in the Netherlands as an alternative to the btw-nummer that contains the BSN personal identifier. The number has the same structure and function but does not contain a BSN and uses a different check digit algorithm. Thanks to Cas Vissers, Jeroen van Heiningen, Jerome Hanke, Nicolas Martinelli, Ronald Portier and Tim Muller for contributing to the fix. More information: * http://kleineondernemer.nl/index.php/nieuw-btw-identificatienummer-vanaf-1-januari-2020-voor-eenmanszaken * https://nl.wikipedia.org/wiki/Btw-nummer_(Nederland) * https://www.belastingdienst.nl/wps/wcm/connect/bldcontenten/belastingdienst/business/vat/new-vat-id/ * https://www.belastingdienst.nl/wps/wcm/connect/bldcontentnl/belastingdienst/zakelijk/btw/administratie_bijhouden/btw_nummers_controleren/uw_btw_nummer Closes https://github.com/arthurdejong/python-stdnum/issues/182 Closes https://github.com/arthurdejong/python-stdnum/pull/183 Closes https://github.com/arthurdejong/python-stdnum/pull/184 Closes https://github.com/arthurdejong/python-stdnum/pull/185 2020-01-04 Arthur de Jong * [9605dbe] stdnum/it/codicefiscale.py, tests/test_it_codicefiscale.doctest: The Italian IVA is also a Codice Fiscale Closes https://github.com/arthurdejong/python-stdnum/issues/180 2019-12-18 Sergi Almacellas Abellana * [087c668] .travis.yml, setup.py, tox.ini: Add support for Python 3.8 Closes https://github.com/arthurdejong/python-stdnum/pull/177 2019-12-27 Arthur de Jong * [922505a] stdnum/eu/nace.py: Broaden noqa docstring exclusion Nowadays flake8 seems to report this as D401 (First line should be in imperative mood) while before it was D402 (First line should not be the function’s signature). 2019-12-27 Arthur de Jong * [de50109] stdnum/do/ncf.py: Switch to using lxml for HTML parsing This avoids an extra dependency on BeautifulSoup and makes the code more consistent. 2019-11-12 Jakub Wilk * [831c669] NEWS, README, stdnum/br/__init__.py, stdnum/br/cnpj.py, stdnum/br/cpf.py: Fix typos Closes https://github.com/arthurdejong/python-stdnum/pull/172 2019-11-04 Kurt Keller * [388bac9] stdnum/iso11649.py: Add format to iso11649 Closes https://github.com/arthurdejong/python-stdnum/pull/171 2019-11-02 Kurt Keller * [a45d4f7] stdnum/ch/esr.py, tests/test_ch_esr.doctest: Add Swiss ESR/ISR/QR-reference Closes https://github.com/arthurdejong/python-stdnum/pull/170 2019-10-27 Arthur de Jong * [41b9c94] ChangeLog, NEWS, README, docs/index.rst, docs/stdnum.ad.nrt.rst, docs/stdnum.cr.cpf.rst, docs/stdnum.cr.cpj.rst, docs/stdnum.cr.cr.rst, docs/stdnum.gt.nit.rst, docs/stdnum.il.idnr.rst, docs/stdnum.jp.cn.rst, docs/stdnum.kr.rrn.rst, docs/stdnum.nz.ird.rst, docs/stdnum.pe.cui.rst, docs/stdnum.pe.ruc.rst, docs/stdnum.py.ruc.rst, docs/stdnum.tr.vkn.rst, docs/stdnum.uy.rut.rst, docs/stdnum.ve.rif.rst, docs/stdnum.za.tin.rst, stdnum/__init__.py: Get files ready for 1.12 release 2019-10-27 Arthur de Jong * [6ca5b53] stdnum/at/postleitzahl.dat, stdnum/be/banks.dat, stdnum/cn/loc.dat, stdnum/eu/nace.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/isil.dat, stdnum/my/bp.dat, stdnum/nz/banks.dat, stdnum/oui.dat, stdnum/us/ein.dat, tests/test_be_iban.doctest: Update database files The BIC for some former Record Bank accounts (now ING Belgium) was changed from HBKABE22 to BBRUBEBB (that of ING). 2019-10-27 Arthur de Jong * [5b835bb] update/imsi.py: Parse multiple Wikipedia pages for full MCC/MNC list 2019-10-27 Arthur de Jong * [29de83e] update/oui.py: Make the IEEE OUI data more compact This groups consecutive assignments into a range to make the dat file a little more readable. 2019-10-27 Arthur de Jong * [67b747b] update/at_postleitzahl.py, update/be_banks.py, update/cn_loc.py, update/do_whitelists.py, update/iban.py, update/imsi.py, update/isil.py, update/my_bp.py, update/numlist.py, update/nz_banks.py, update/oui.py: Switch update scripts to Python 3 2019-10-27 Arthur de Jong * [0915b55] update/at_postleitzahl.py, update/be_banks.py, update/cn_loc.py, update/do_whitelists.py, update/eu_nace.py, update/iban.py, update/imsi.py, update/isbn.py, update/isil.py, update/oui.py: Switch update scripts to use requests This makes the scripts more consistent. 2019-10-27 Arthur de Jong * [40961fc] update/at_postleitzahl.py, update/eu_nace.py, update/isbn.py, update/isil.py, update/my_bp.py, update/requirements.txt: Switch update scripts to lxml This avoids an extra dependency on Beautiful Soup and makes the scripts more consistent. This also includes a fix in the ISIL because of website changes. 2019-10-27 Arthur de Jong * [c4ad714] update/my_bp.crt, update/my_bp.py: Work around incorrect jpn.gov.my certificate chain The intermediate certificate for jpn.gov.my is missing from the certificate chain that is returned by the server since the server switched to HTTPS. 2019-10-27 Arthur de Jong * [c9ad8d3] update/nz_banks.py: Fix New Zealand Bank Branch Register update script There is now a direct URL for the XLS file and there is no longer a need to search the page for a link. 2019-10-16 Gerard Dalmau * [7f3dcf0] stdnum/es/cif.py, stdnum/es/cups.py, stdnum/es/dni.py, stdnum/es/nie.py, stdnum/es/nif.py: Improve descriptions of Spanish codes Closes https://github.com/arthurdejong/python-stdnum/pull/169 2019-10-14 Arthur de Jong * [54218b1] stdnum/kr/rrn.py: Fix rrn documentation This also fixes Python 2.6 compatibility. Fixes 790a052 2019-10-14 Dimitri Papadopoulos <3234522+DimitriPapadopoulos@users.noreply.github.com> * [790a052] stdnum/kr/__init__.py, stdnum/kr/rrn.py, tests/test_kr_rrn.doctest: Add South Korean Resident Registration Numbers 2019-10-13 Andreas Häber * [63a643f] stdnum/au/__init__.py: AU: Provide vat as alias from tfn Closes https://github.com/arthurdejong/python-stdnum/pull/167 2019-10-13 Andreas Häber * [6119590] stdnum/at/__init__.py: AT: Provide personalid as an alias from vnr Closes https://github.com/arthurdejong/python-stdnum/pull/166 2019-10-13 Arthur de Jong * [3aedb1f] tests/test_ar_cbu.doctest, tests/test_ar_cuit.doctest, tests/test_au_abn.doctest, tests/test_bg_vat.doctest: Add various test numbers 2019-09-27 Andreas Häber * [d43ad77] stdnum/is_/__init__.py: IS: Provide personalid as an alias from kennitala 2019-09-27 Andreas Häber * [e5d7d9f] stdnum/dk/__init__.py: DK: Provide personalid as an alias from cpr 2019-09-18 Alan Hettinger * [37e6032] stdnum/jp/__init__.py, stdnum/jp/cn.py, tests/test_jp_cn.doctest: Add Japan Corporate Number Closes https://github.com/arthurdejong/python-stdnum/pull/157 2019-10-09 Amin Solhizadeh * [5441ffa] stdnum/se/personnummer.py, tests/test_se_personnummer.doctest: Handle - and + sign correctly in Swedish Personnummer For people aged 100 and up, the minus/dash in the personnummer is changed to a plus, on new year's eve the year they turn 100. See Folkbokföringslagen (1991:481), §18. This makes the - or + sign part of the number. Closes https://github.com/arthurdejong/python-stdnum/issues/156 Closes https://github.com/arthurdejong/python-stdnum/pull/160 2019-08-29 Jeffry Jesus De La Rosa * [9c18ac5] stdnum/do/ncf.py: Fix broken links to DGII documentation DGII has changed its page, all the link have been broken, so they changed some URL. Closes https://github.com/arthurdejong/python-stdnum/pull/153 2019-10-11 Jeffry Jesus De La Rosa * [ac50afa] stdnum/do/ncf.py: Change DGII form parameters DGII has changed their validation mechanism, so we first exract the __EVENTVALIDATION and __VIEWSTATE from the form and put them in the post request for validation. Closes https://github.com/arthurdejong/python-stdnum/pull/165 2019-10-13 Arthur de Jong * [aadf121] .travis.yml: Avoid skipping missing interpreters on Travis 2019-08-12 Arthur de Jong * [8cb71f2] tox.ini: Drop pinning of pydocstyle now flake8-docstrings has been fixed Reverts 61c762d 2019-08-02 Arthur de Jong * [d9b4818] setup.cfg: Show missing lines in coverage report 2019-08-02 Arthur de Jong * [d5bf6e5] .travis.yml: Fix Travis build to use trusty for some Python versions Python 2.6 is not available xenial which is the default now. The coverage also does not seem to work for pypy3. 2019-06-23 Leandro Regueiro * [2f38aaf] stdnum/gt/__init__.py, stdnum/gt/nit.py, tests/test_gt_nit.doctest: Add Guatemalan NIT Closes https://github.com/arthurdejong/python-stdnum/pull/149 Closes https://github.com/arthurdejong/python-stdnum/issues/132 2019-07-21 Arthur de Jong * [db89d38] stdnum/de/handelsregisternummer.py, tests/test_de_handelsregisternummer.doctest: Fix the Handelsregisternummer number matching This ensures that numbers of 1 digit are also accepted and that trailing characters are not silently discardede in the validation. This also adds a few test cases for this and makes "Paderborn früher Höxter" an alias for "Paderborn". Closes https://github.com/arthurdejong/python-stdnum/issues/143 2019-07-21 Arthur de Jong * [e75b1bf] stdnum/de/handelsregisternummer.py, tests/test_de_handelsregisternummer.py: Lookup German Handelsregisternummer in OffeneRegister.de This supports looking up the German Handelsregisternummer using the online OffeneRegister.de web service. 2019-07-21 Arthur de Jong * [fb72550] tox.ini: Do not require Python 2 for building Sphinx docs This results in tox using Python 3, mostly to work around https://sourceforge.net/p/docutils/bugs/365/ 2019-07-21 Arthur de Jong * [61c762d] tox.ini: Avoid newer pydocstyle Do not install the latest pydocstyle because it currently breaks flake8-docstring. This pinning should be removed as soon as https://gitlab.com/pycqa/flake8-docstrings/issues/36 is resolved. 2019-07-14 Arthur de Jong * [ad96b15] stdnum/util.py: Support normalising quotes See https://github.com/arthurdejong/python-stdnum/issues/150 2019-06-23 Leandro Regueiro * [4ad2d9c] stdnum/ad/__init__.py, stdnum/ad/nrt.py, tests/test_ad_nrt.doctest: Add Andorran TIN Closes https://github.com/arthurdejong/python-stdnum/pull/145 Closes https://github.com/arthurdejong/python-stdnum/issues/119 2019-06-15 Leandro Regueiro * [510a46a] stdnum/cr/cr.py, tests/test_cr_cr.doctest: Add Costa Rica foreigners identification number Part of https://github.com/arthurdejong/python-stdnum/issues/141 Closes https://github.com/arthurdejong/python-stdnum/pull/140 2019-06-15 Leandro Regueiro * [4b10f56] stdnum/cr/cpf.py, tests/test_cr_cpf.doctest: Add Costa Rica Cédula de Identidad Closes https://github.com/arthurdejong/python-stdnum/issues/139 2019-06-15 Leandro Regueiro * [d0da884] stdnum/cr/__init__.py, stdnum/cr/cpj.py, tests/test_cr_cpj.doctest: Add Costa Rica TIN number Closes https://github.com/arthurdejong/python-stdnum/issues/109 2019-06-10 Leandro Regueiro * [1e814ce] stdnum/za/__init__.py, stdnum/za/tin.py, tests/test_za_tin.doctest: Add South Africa TIN number Closes https://github.com/arthurdejong/python-stdnum/pull/129 Closes https://github.com/arthurdejong/python-stdnum/issues/108 2019-06-09 Leandro Regueiro * [8c1015a] stdnum/py/__init__.py, stdnum/py/ruc.py, tests/test_py_ruc.doctest: Add Paraguay RUC number This supports RUC number validation of rphysical persons, non-juridical persons and foreigners. Closes https://github.com/arthurdejong/python-stdnum/issues/122 Closes https://github.com/arthurdejong/python-stdnum/pull/123 2019-06-14 Jeffry Jesus De La Rosa * [e1ea8db] stdnum/do/ncf.py: Update Dominican Republic e-CF documents types The document type values are different from the NCF document types https://dgii.gov.do/contribuyentes/personasFisicas/inicioOperaciones/ComprobantesFiscales/Paginas/comprobantesFiscalesElectronicos.aspx Closes https://github.com/arthurdejong/python-stdnum/pull/138 2019-06-06 Leandro Regueiro * [817c177] stdnum/uy/__init__.py, stdnum/uy/rut.py, tests/test_uy_rut.doctest: Add Uruguay RUT number Closes https://github.com/arthurdejong/python-stdnum/pull/121 Closes https://github.com/arthurdejong/python-stdnum/issues/110 2019-06-14 Arthur de Jong * [51e00da] stdnum/de/handelsregisternummer.py, tests/test_de_handelsregisternummer.doctest: Fix handelsregisternummer to not turn Hamburg into Homburg This changes the minimisation function that is used for comparison and canonicalisation to not reduce Hamburg and Homburg to the same string. This makes the function slightly more strict in which encoding differences to accept. This also adds a few aliases to the court names. Closes https://github.com/arthurdejong/python-stdnum/issues/136 2019-06-10 Jeffry Jesus De La Rosa * [5d0f288] stdnum/do/ncf.py, tests/test_do_ncf.doctest: Support Dominican Republic e-CF within NCF e-CF is the new way of DGII document, is the same as NCF, but the difference one to another, is that e-CF has 13 digit and is electronic invoice, with this change it will validate the correct NCF and e-CF. Closes https://github.com/arthurdejong/python-stdnum/pull/135 2019-06-06 Leandro Regueiro * [7fb390e] .gitignore: .gitignore: Also exclude some editor backup files 2019-06-02 Leandro Regueiro * [7211ccb] stdnum/nz/ird.py, tests/test_nz_ird.doctest: Add New Zealand IRD number Closes https://github.com/arthurdejong/python-stdnum/pull/112 Closes https://github.com/arthurdejong/python-stdnum/issues/104 2019-06-02 Arthur de Jong * [c969fc8] stdnum/eu/nace.py: Ignore wrong docstring detection Fixes 170e599 2019-06-02 Arthur de Jong * [170e599] docs/stdnum.eu.nace.rst, stdnum/eu/nace.py: Rename stdnum.eu.nace.label() to get_label() To be more consistent with other similar functions. This deprecates the old function which now is a wrapper around get_label(). 2019-06-02 Arthur de Jong * [6988d91] stdnum/tr/tckimlik.py, stdnum/tr/vkn.py, tests/test_tr_vkn.doctest: Add Vergi Kimlik Numarası Closes https://github.com/arthurdejong/python-stdnum/issues/99 2019-05-23 Sergi Almacellas Abellana * [8292779] stdnum/ean.py: Add GTIN (EAN-14) validation 2019-05-12 Arthur de Jong * [4ac84c5] stdnum/ve/__init__.py, stdnum/ve/rif.py, tests/test_ve_rif.doctest: Add Venezuelan RIF (VAT number) Closes https://github.com/arthurdejong/python-stdnum/issues/97 2019-05-01 Arthur de Jong * [a6521e6] tests/test_isbn.doctest, tox.ini: Fix remaining issue with encoding This also sets the python 2.6 interpreter explicityly because sometimes tox seems to get the wrong one. Fixes 680a95f 2019-04-29 Arthur de Jong * [b1af986] tests/test_isbn.doctest: Re-add Python 2.6 support Fixes 48ff92e 2019-04-28 Arthur de Jong * [8307b94] setup.cfg: Don't force "" strings to avoid escaping quotes Fixes test failures with recent flake8-quotes. 2019-04-28 Arthur de Jong * [c1fb46a] stdnum/util.py, tests/test_util.doctest: Convert various reasonable unicode digits This converts many of the "reasonable" unicode digits that are just variations on ASCII 0-9 to their ASCII counterparts. 2019-04-28 Arthur de Jong * [48ff92e] stdnum/ar/cbu.py, stdnum/ar/cuit.py, stdnum/ar/dni.py, stdnum/at/businessid.py, stdnum/at/postleitzahl.py, stdnum/at/tin.py, stdnum/at/uid.py, stdnum/at/vnr.py, stdnum/au/abn.py, stdnum/au/acn.py, stdnum/au/tfn.py, stdnum/be/vat.py, stdnum/bg/egn.py, stdnum/bg/pnf.py, stdnum/bg/vat.py, stdnum/br/cnpj.py, stdnum/br/cpf.py, stdnum/ca/bn.py, stdnum/ca/sin.py, stdnum/casrn.py, stdnum/ch/uid.py, stdnum/cl/rut.py, stdnum/cn/ric.py, stdnum/co/nit.py, stdnum/cu/ni.py, stdnum/cy/vat.py, stdnum/cz/dic.py, stdnum/cz/rc.py, stdnum/de/idnr.py, stdnum/de/stnr.py, stdnum/de/vat.py, stdnum/dk/cpr.py, stdnum/dk/cvr.py, stdnum/do/cedula.py, stdnum/do/ncf.py, stdnum/do/rnc.py, stdnum/ean.py, stdnum/ec/ci.py, stdnum/ec/ruc.py, stdnum/ee/ik.py, stdnum/ee/kmkr.py, stdnum/ee/registrikood.py, stdnum/es/ccc.py, stdnum/es/cif.py, stdnum/es/cups.py, stdnum/es/dni.py, stdnum/es/nie.py, stdnum/es/nif.py, stdnum/eu/banknote.py, stdnum/eu/nace.py, stdnum/fi/alv.py, stdnum/fi/associationid.py, stdnum/fi/veronumero.py, stdnum/figi.py, stdnum/fr/nif.py, stdnum/fr/nir.py, stdnum/fr/siren.py, stdnum/fr/siret.py, stdnum/fr/tva.py, stdnum/gb/nhs.py, stdnum/gb/sedol.py, stdnum/gb/upn.py, stdnum/gb/vat.py, stdnum/gr/amka.py, stdnum/gr/vat.py, stdnum/hr/oib.py, stdnum/hu/anum.py, stdnum/ie/vat.py, stdnum/il/idnr.py, stdnum/imei.py, stdnum/imo.py, stdnum/imsi.py, stdnum/in_/pan.py, stdnum/is_/vsk.py, stdnum/isbn.py, stdnum/issn.py, stdnum/it/iva.py, stdnum/lt/asmens.py, stdnum/lt/pvm.py, stdnum/lu/tva.py, stdnum/lv/pvn.py, stdnum/md/idno.py, stdnum/meid.py, stdnum/mt/vat.py, stdnum/mu/nid.py, stdnum/my/nric.py, stdnum/nl/bsn.py, stdnum/nl/btw.py, stdnum/nl/onderwijsnummer.py, stdnum/no/fodselsnummer.py, stdnum/no/kontonr.py, stdnum/no/orgnr.py, stdnum/nz/bankaccount.py, stdnum/pe/cui.py, stdnum/pe/ruc.py, stdnum/pl/nip.py, stdnum/pl/pesel.py, stdnum/pl/regon.py, stdnum/pt/nif.py, stdnum/ro/cf.py, stdnum/ro/cnp.py, stdnum/rs/pib.py, stdnum/ru/inn.py, stdnum/se/orgnr.py, stdnum/se/personnummer.py, stdnum/se/vat.py, stdnum/si/ddv.py, stdnum/sk/dph.py, stdnum/sm/coe.py, stdnum/tr/tckimlik.py, stdnum/us/rtn.py, stdnum/util.py, tests/test_cn_ric.doctest, tests/test_isbn.doctest, tests/test_robustness.doctest, tests/test_util.doctest: Use an internal isdigits() function instead of str.isdigit() The problem with the latter is that it will also accept all kinds of unicode digits that are not the ASCII 0-9 digits causing all kinds of problems in check digit calculations. Some of these unicode characters are also considered digits by int() but some are not (such as the SUPERSCRIPT TWO unicode character). Closes https://github.com/arthurdejong/python-stdnum/issues/96 2019-04-04 Arthur de Jong * [3aeec68] stdnum/il/__init__.py, stdnum/il/idnr.py: Add Israeli identity number 2019-03-24 Arthur de Jong * [e07a0e2] stdnum/pe/cui.py, tests/test_pe_cui.doctest: Add Peruvian CUI (DNI) 2019-03-23 Arthur de Jong * [2e87251] stdnum/pe/__init__.py, stdnum/pe/ruc.py, tests/test_pe_ruc.doctest: Add Peruvian RUC 2019-03-10 Arthur de Jong * [72cbfb8] ChangeLog, NEWS, README, docs/changes.rst, docs/conf.py, docs/index.rst, docs/stdnum.ar.dni.rst, docs/stdnum.at.vnr.rst, docs/stdnum.cu.ni.rst, docs/stdnum.gr.amka.rst, docs/stdnum.lt.asmens.rst, docs/stdnum.mac.rst, docs/stdnum.md.idno.rst, docs/stdnum.mx.curp.rst, docs/stdnum.no.fodselsnummer.rst, docs/stdnum.nz.bankaccount.rst, docs/stdnum.se.personnummer.rst, stdnum/__init__.py: Get files ready for 1.11 release This also adds the release notes to the generated documentation. 2019-03-10 Arthur de Jong * [fdeeb9a] stdnum/at/postleitzahl.dat, stdnum/be/banks.dat, stdnum/cn/loc.dat, stdnum/eu/nace.dat, stdnum/iban.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/isil.dat, stdnum/oui.dat: Update database files 2019-03-10 Arthur de Jong * [fbbb550] update/at_postleitzahl.py, update/isil.py, update/my_bp.py, update/requirements.txt: Switch update scripts to beautifulsoup4 2019-02-27 Arthur de Jong * [61a8a94] stdnum/ee/ik.py: Add documentation 2018-12-27 Arthur de Jong * [151e0d8] stdnum/ar/cbu.py: Remove broken link 2019-03-10 Arthur de Jong * [3f953f3] stdnum/nz/__init__.py, stdnum/nz/bankaccount.py, stdnum/nz/banks.dat, tests/test_nz_bankaccount.doctest, update/nz_banks.py: Add New Zealand bank account number 2019-03-03 Arthur de Jong * [4e25e31] stdnum/md/__init__.py, stdnum/md/idno.py, tests/test_md_idno.doctest: Add Moldavian IDNO 2019-03-03 Arthur de Jong * [d5d812b] tests/test_bg_egn.doctest: Add more tests for Bulgarian EGN 2019-03-03 Arthur de Jong * [60cb887] stdnum/mac.py, tests/test_mac.doctest: Rename MAC check_manufacturer to validate_manufacturer For consistency with the other validation modules that have an extra argument to disable or enable certain parts of the validation. 2019-03-03 Arthur de Jong * [39b8ace] stdnum/lt/asmens.py, tests/test_lt_asmens.doctest: Add Lithuanian Asmens kodas 2019-02-27 Arthur de Jong * [ab91d87] stdnum/gr/amka.py, tests/test_gr_amka.doctest: Add Greek AMKA social security number 2019-02-20 Arthur de Jong * [6eadca1] setup.cfg, setup.py, stdnum/__init__.py, stdnum/bic.py, stdnum/cl/__init__.py, stdnum/co/__init__.py, stdnum/eu/at_02.py, stdnum/iso6346.py, stdnum/iso9362.py, stdnum/numdb.py, stdnum/sk/rc.py, stdnum/us/tin.py, tox.ini, update/at_postleitzahl.py, update/do_whitelists.py, update/my_bp.py, update/numlist.py: Switch from import-order to isort 2019-02-17 Arthur de Jong * [9daa1b0] stdnum/ar/cbu.py, stdnum/at/uid.py, stdnum/iban.py, update/iban.py: Fix typos 2019-02-17 Arthur de Jong * [cc6ffec] stdnum/de/handelsregisternummer.py, stdnum/de/stnr.py, stdnum/do/cedula.py, stdnum/numdb.py: Improvements reported by pylint 2019-02-17 Arthur de Jong * [be8e258] stdnum/cu/__init__.py, stdnum/cu/ni.py: Add Cuban número de identidad 2019-02-11 Andrés R * [0fc0c30] stdnum/do/rnc.py: Return only first response from DGII lookup This fixes an issue when response for check_dgii() comes with 2 records instead of one for same RNC. Closes https://github.com/arthurdejong/python-stdnum/pull/95 2019-02-10 Arthur de Jong * [b4773ae] .travis.yml, setup.py, tox.ini: Add Python 3.7 tests 2019-02-05 Arthur de Jong * [50874a9] stdnum/mx/__init__.py, stdnum/mx/curp.py, tests/test_mx_curp.doctest: Add Mexican CURP 2019-01-29 Arthur de Jong * [4cb44aa] stdnum/bg/egn.py, stdnum/cz/rc.py, stdnum/dk/cpr.py, stdnum/lv/pvn.py, stdnum/ro/cnp.py: Call compact in get_birth_date() functions This ensures that formatting characters are also removed when formatted numbers are passed to the get_birth_date() functions. Closes https://github.com/arthurdejong/python-stdnum/issues/94 2018-12-28 Arthur de Jong * [3f4a08a] stdnum/mac.py, stdnum/oui.dat, tests/test_mac.doctest, update/oui.py: Add MAC address This adds validation of MAC (Ethernet) addresses. It will perform lookups in the IEEE registry for manufacturer names for universally administered addresses. Closes https://github.com/arthurdejong/python-stdnum/issues/93 2018-12-27 Arthur de Jong * [d7f7b8e] stdnum/ar/__init__.py, stdnum/ar/dni.py: Add Argentinian DNI Closes https://github.com/arthurdejong/python-stdnum/issues/90 2018-12-26 Arthur de Jong * [375f63b] stdnum/at/vnr.py: Add Austrian Versicherungsnummer 2018-11-27 Ilya Vihtinsky * [b77c9cd] stdnum/se/__init__.py, stdnum/se/personnummer.py, tests/test_se_personnummer.doctest: Add Swedish Personnummer Closes https://github.com/arthurdejong/python-stdnum/pull/88 2018-11-27 Ilya Vihtinsky * [d11e5c4] stdnum/no/__init__.py, stdnum/no/fodselsnummer.py, tests/test_no_fodselsnummer.doctest: Add Norwegian Fødselsnummer Closes https://github.com/arthurdejong/python-stdnum/pull/88 2018-12-07 Mario Puntin * [bb24c2f] stdnum/ar/cuit.py: Add format for Argentinian CUIT number Closes https://github.com/arthurdejong/python-stdnum/pull/89 2018-11-24 Christopher Ormaza * [069279a] stdnum/ec/ci.py, stdnum/ec/ruc.py: Support Cedula and RUC of foreigners Add the case of Cedulas and RUCs of foreigners in Ecuador, as Venezuelans and Colombians Closes https://github.com/arthurdejong/python-stdnum/pull/87 2018-11-12 Gustavo Valverde * [e31ff95] stdnum/do/ncf.py, stdnum/do/rnc.py: Use HTTPS for WSDL as HTTP was deprecated The regulator changed their site to use HTTPS by default; making this resource unavailable through HTTP. Closes https://github.com/arthurdejong/python-stdnum/pull/85 2018-11-11 Arthur de Jong * [8677d04] setup.cfg: Make the multi-line operator place explicit Recent versions of flake8 changed the defaults of the errors to ignore. 2018-10-14 Arthur de Jong * [a68f3ca] ChangeLog, NEWS, README, docs/index.rst, docs/stdnum.bitcoin.rst, docs/stdnum.iso11649.rst, docs/stdnum.mu.nid.rst, docs/stdnum.no.iban.rst, docs/stdnum.no.kontonr.rst, stdnum/__init__.py, stdnum/at/postleitzahl.dat, stdnum/be/banks.dat, stdnum/cn/loc.dat, stdnum/eu/nace.dat, stdnum/imsi.dat, stdnum/isbn.dat, update/my_bp.py: Get files ready for 1.10 release 2018-10-14 Arthur de Jong * [6b85f91] stdnum/iban.py, tests/test_iban.doctest: Raise InvalidComponent on unknown IBAN country This partially reverts 58ea7b2. Closes https://github.com/arthurdejong/python-stdnum/issues/82 2018-10-09 Arthur de Jong * [58ea7b2] stdnum/iban.py, tests/test_iban.doctest: Fix issue with minimal IBAN This ensures that an IBAN with a missing bban part and unknown country code (while still having a valid MOD 97,10 checksum) is considered valid. Closes https://github.com/arthurdejong/python-stdnum/issues/84 2018-09-30 Arthur de Jong * [54c3650] stdnum/bitcoin.py, tests/test_bitcoin.doctest: Bitcoin address This adds validation of Bitcoin addresses. No check is done that the addresses actually exist but only that they are syntactically correct. Closes https://github.com/arthurdejong/python-stdnum/issues/80 2018-09-21 Levin Rickert * [510ee93] stdnum/ru/__init__.py: Add vat alias for Russia 2018-08-30 Gerard Dalmau * [e58c09a] tests/test_es_cups.doctest, tests/test_es_referenciacatastral.doctest: Fix ES test descriptions 2018-08-30 Gerard Dalmau * [4a76779] stdnum/es/cif.py, stdnum/es/nif.py, tests/test_es_nif.doctest: Improve CIF and NIF validation NIF starting with K, L or M are NIF instead of CIF. This also adds NIF-DNI-CIF-NIE classification tests. Closes https://github.com/arthurdejong/python-stdnum/pull/81 2018-08-22 Arthur de Jong * [5af712b] stdnum/no/iban.py, stdnum/no/kontonr.py, tests/test_iban.doctest: Add Norwegian bank account number This includes validation of Norwegian bank account numbers and conversion to IBAN. Closes https://github.com/arthurdejong/python-stdnum/issues/79 2018-08-08 Arthur de Jong * [ec39d86] stdnum/mu/__init__.py, stdnum/mu/nid.py, tests/test_mu_nid.doctest: Add Mauritian national ID number Thans to Bradley Smith for providing the needed information to implement this. See https://lists.arthurdejong.org/python-stdnum-users/2018/msg00003.html 2018-05-24 Esben Toke Christensen * [676d62c] stdnum/iso11649.py, tests/test_iso11649.doctest: Add iso11649 structured creditor reference Closes https://github.com/arthurdejong/python-stdnum/pull/72 2018-06-18 PanderMusubi * [65b5bfe] README, stdnum/nl/brin.py, stdnum/nl/bsn.py, stdnum/nl/btw.py, stdnum/nl/onderwijsnummer.py, stdnum/nl/postcode.py: Improved texts and added links Closes https://github.com/arthurdejong/python-stdnum/pull/75 2018-05-19 Arthur de Jong * [6e776ae] stdnum/do/ncf.py, tests/test_do_ncf.py: Switch the NCF online check to the new form This tries to screen-scrape the new DGII form that is used to validate the new format of NCF numbers. Closes https://github.com/arthurdejong/python-stdnum/issues/71 2018-05-01 Arthur de Jong * [04f78fb] online_check/stdnum.wsgi: Fix encoding issues in online check This ensures that all text is unicode internally and encoded to UTF-8 on response. 2018-05-01 Arthur de Jong * [bae6f19] stdnum/mx/rfc.py, tests/test_mx_rfc.doctest: Fix an issue with format of Mexican tax numbers Fix an issue where the format accepted a mix of personal and company numberer in validation causing in a raised ValueError exception. 2018-05-01 Arthur de Jong * [08d1053] stdnum/es/referenciacatastral.py, stdnum/mx/rfc.py, stdnum/util.py, tests/test_util.doctest: Make unicode conversion standard A few modules use non-ASCII characters in numbers. This introduces a to_unicode() function in util so that it can be used by multiple modules. 2018-04-14 Arthur de Jong * [d9defc8] ChangeLog, NEWS, README, docs/index.rst, docs/stdnum.at.postleitzahl.rst, docs/stdnum.at.tin.rst, docs/stdnum.be.iban.rst, docs/stdnum.de.handelsregisternummer.rst, docs/stdnum.de.stnr.rst, docs/stdnum.figi.rst, docs/stdnum.me.iban.rst, setup.py, stdnum/__init__.py, stdnum/at/postleitzahl.dat, stdnum/be/banks.dat, stdnum/cn/loc.dat, stdnum/eu/nace.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/isil.dat, stdnum/us/ein.dat, update/isil.py: Get files ready for 1.9 release 2018-04-12 Arthur de Jong * [e200656] stdnum/iban.py, tests/test_be_iban.doctest: Add an extra test for Belgian IBANs A Belgian IBAN should not end with 00. This also fixes a docstring and comment in the IBAN module. 2018-04-10 Arthur de Jong * [e6739be] stdnum/imsi.dat, stdnum/imsi.py, tests/test_imsi.doctest, update/imsi.py: Correctly split IMSI with multi-length MNC Ensures that imsi.split() will correctly split the IMSI into an MCC, MNC and MSIN even if not all MNCs within a single MCC have the same length. This has the downside of not being able to guess the MNC length in some cases. This also omits empty information from the data file and updates the data file from Wikipedia. Closes https://github.com/arthurdejong/python-stdnum/issues/68 2018-04-09 Arthur de Jong * [2541a22] online_check/check.js: Improve online check animation This speeds up the animation, collapsing the list before performing the server request and disable the slide animation on history navigation. 2018-04-09 Arthur de Jong * [147b84b] online_check/stdnum.wsgi: Ensure API requests are cached separately This ensures that requests that browsers make using XMLHttpRequest (they set the X-Requested-With header) are cached separately from normal requests. 2018-04-09 Arthur de Jong * [8204ac6] stdnum/do/ncf.py: Support new style of NCF numbers This adds support for validating Dominican Republic invoice numbers that should be used since from 2018-05-01. http://www.dgii.gov.do/contribuyentes/personasFisicas/inicioOperaciones/ComprobantesFiscales/Paginas/SecuenciaDeNCF.aspx Closes https://github.com/arthurdejong/python-stdnum/issues/69 2018-03-25 Arthur de Jong * [918d483] stdnum/figi.py, tests/test_figi.doctest: Add Financial Instrument Global Identifier 2018-03-23 Arthur de Jong * [ceb3c62] stdnum/de/__init__.py, stdnum/de/handelsregisternummer.py, tests/test_de_handelsregisternummer.doctest: Add German company registry numbers Based on the implementation provided by Markus Törnqvist and Lari Haataja of Holvi Payment Services. 2018-03-19 Arthur de Jong * [fec1685] stdnum/at/tin.py: Also ignore other letters with possible umlaut Fixes 98d11a3 Closes https://github.com/arthurdejong/python-stdnum/pull/67 2018-03-18 Arthur de Jong * [98d11a3] stdnum/at/fa.dat, stdnum/at/tin.py, tests/test_at_tin.doctest: Add Austrian Abgabenkontonummer Based on the implementation provided by Mohammed Salman of Holvi. Closes https://github.com/arthurdejong/python-stdnum/pull/50 2018-03-17 Arthur de Jong * [ab15e20] stdnum/at/__init__.py: Fix import order Fixes ee263a5 2018-03-17 Arthur de Jong * [ee263a5] setup.cfg, stdnum/at/__init__.py, stdnum/at/postleitzahl.dat, stdnum/at/postleitzahl.py, stdnum/nl/__init__.py, update/at_postleitzahl.py: Add Austrian postal code This also fixes the name of the Dutch postal_code alias and tunes the tests. 2018-03-17 Arthur de Jong * [8c29fbf] stdnum/me/__init__.py, stdnum/me/iban.py, tests/test_iban.doctest: Add support for Montenegro IBAN format This adds further checks to the country-specific part of the IBAN for Montenegro IBANs. 2018-03-11 Arthur de Jong * [647dfea] stdnum/de/stnr.py, tests/test_de_stnr.doctest: Add German Steuernummer Based on the implementation provided by Mohammed Salman of Holvi. This is the old tax number that is being replaced by the Steuerliche Identifikationsnummer. The number has a regional form (which is used most often) and a national form. Closes https://github.com/arthurdejong/python-stdnum/pull/49 2018-02-28 Esa Halsti * [6e30cf5] stdnum/fi/hetu.py, tests/test_fi_hetu.doctest: Add validation for "individual" part of hetu The range between 900 and 999 is reserved for temporary identifiers and is not given to any real person. Closes https://github.com/arthurdejong/python-stdnum/pull/66 2018-03-10 Arthur de Jong * [70dc091] setup.cfg: Support building a universal wheel 2018-02-19 Arthur de Jong * [75138a4] stdnum/do/cedula.py, tests/test_do_cedula.py: Add check_dgii() to stdnum.do.cedula module This exposes the stdnum.do.rnc.check_dgii() in the stdnum.do.cedula module with but rename the rnc result entry to cedula. Closes https://github.com/arthurdejong/python-stdnum/issues/63 2018-02-19 Arthur de Jong * [92d751c] stdnum/do/ncf.py, stdnum/do/rnc.py: Fix PySimpleSOAP DGII result parsing issue This strips the wrapper that PySimpleSOAP puts around results from the DGII PySimpleSOAP SOAP call. Closes https://github.com/arthurdejong/python-stdnum/issues/64 Closes https://github.com/arthurdejong/python-stdnum/issues/65 2018-02-19 Arthur de Jong * [81947a2] docs/index.rst: Improve get_cc_module() documentation 2018-02-14 Arthur de Jong * [5cbba25] setup.cfg, stdnum/al/__init__.py, stdnum/ar/__init__.py, stdnum/at/__init__.py, stdnum/be/__init__.py, stdnum/be/iban.py, stdnum/cl/__init__.py, stdnum/co/__init__.py, stdnum/cz/__init__.py, stdnum/dk/__init__.py, stdnum/do/__init__.py, stdnum/ec/__init__.py, stdnum/ee/__init__.py, stdnum/es/__init__.py, stdnum/exceptions.py, stdnum/fi/__init__.py, stdnum/fr/__init__.py, stdnum/hr/__init__.py, stdnum/hu/__init__.py, stdnum/is_/__init__.py, stdnum/it/__init__.py, stdnum/lt/__init__.py, stdnum/lu/__init__.py, stdnum/lv/__init__.py, stdnum/mc/__init__.py, stdnum/mx/__init__.py, stdnum/nl/__init__.py, stdnum/no/__init__.py, stdnum/pl/__init__.py, stdnum/pt/__init__.py, stdnum/ro/__init__.py, stdnum/rs/__init__.py, stdnum/si/__init__.py, stdnum/sk/__init__.py, stdnum/sm/__init__.py, tests/test_do_ncf.py, tests/test_do_rnc.py, update/be_banks.py, update/numlist.py: Update the flake8 ignore list Re-enable the flake8 test for unused imports by explicitly marking imports for namespace purposes. This allows us to remove a few unused imports. A few more cleanups that allow us to reduce the number of ignored flake8 ignored tests. The remaining ignored tests are now documented. Ignore a flake8 warning about print statements because we use print in the update scripts. 2018-02-11 Arthur de Jong * [201960c] stdnum/be/iban.py, stdnum/bic.py, stdnum/iban.py, tests/test_be_iban.doctest: Add test for Belgian IBANs This adds a test for IBANs that were found online together with a BIC code to test the IBAN to swift code mapping. This also supports some extra separators in IBAN and BIC numbers and fixes a check digit calculation issue in the Belgian account number check digits. 2018-02-10 Arthur de Jong * [56002fa] stdnum/be/banks.dat, stdnum/be/iban.py, tests/test_iban.doctest, update/be_banks.py, update/requirements.txt: Add support for Belgian IBAN format This adds further checks to the country-specific part of the IBAN for Belgian IBANs. Closes https://github.com/arthurdejong/python-stdnum/issues/62 2018-02-10 Arthur de Jong * [c611b27] stdnum/bic.py: Support spaces in BIC codes BIC codes are sometimes written in a space-separated form this correctly cleans the spaces for compact representation. 2018-02-06 Arthur de Jong * [5fd1ae0] stdnum/do/ncf.py, stdnum/do/rnc.py, stdnum/eu/vat.py, stdnum/tr/tckimlik.py, stdnum/util.py: Allow configuring SOAP request timeout This adds a timeout parameter to all checks that use a SOAP web service to reduce the blocking time. The default timeout for all checks is 30 seconds. 2018-01-07 Chris Lamb * [c113613] stdnum/eu/vat.py: Exclude EU country codes from documentation Whilst working on the Reproducible Builds effort [0], we noticed that python-stdnum could not be built reproducibly as it relies on a stable set ordering when generating the documentation. This has been filed in Debian as #88652 [0] https://reproducible-builds.org/ [1] https://bugs.debian.org/886522 Closes: https://github.com/arthurdejong/python-stdnum/pull/61 Signed-off-by: Chris Lamb 2018-01-06 Arthur de Jong * [9841bae] ChangeLog, NEWS, stdnum/__init__.py: Get files ready for 1.8.1 release 2018-01-06 Arthur de Jong * [820c233] README: Fix feedback section in README to be valid RST 2018-01-06 Arthur de Jong * [ab8a871] setup.py: Update long description in compatible way This ensures that the README is read correctly on all supported Python interpreters. Fixes 1304122 2018-01-05 5j9 <5j9@users.noreply.github.com> * [1304122] setup.py: setup.py: Open README with utf-8 encoding Fixes #59 2018-01-03 Arthur de Jong * [ae89e82] ChangeLog, MANIFEST.in, NEWS, README, docs/conf.py, docs/index.rst, docs/stdnum.casrn.rst, docs/stdnum.do.ncf.rst, docs/stdnum.eu.banknote.rst, docs/stdnum.in_.aadhaar.rst, docs/stdnum.in_.pan.rst, setup.cfg, stdnum/__init__.py, update/numlist.py: Get files ready for 1.8 release 2018-01-03 Arthur de Jong * [db9b278] tox.ini: Fix Sphinx dependency name 2018-01-03 Arthur de Jong * [fbb9d24] docs/index.rst, stdnum/__init__.py: Move get_cc_module() function to package for public use 2018-01-03 Arthur de Jong * [7bb0e5f] setup.py, stdnum/util.py: Try the non-caching zeep client on older versions This uses the "normal" Client class from zeep if CachingClient is not available (this is the case on older zeep versions). This also records (and documents) the dependencies for SOAP libraries in setup.py. 2018-01-01 Arthur de Jong * [6d7ba46] .travis.yml: Add a Travis configuration file 2018-01-01 Arthur de Jong * [db7be06] stdnum/do/ncf.py, stdnum/do/rnc.py, tox.ini: Fix Python 2.6 compatibility 2018-01-01 Arthur de Jong * [8107f08] stdnum/cn/loc.dat, stdnum/eu/nace.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/us/ein.dat: Update database files Note that the Swift IBAN Registry in txt format is currently unavailable so hasn't been updated. 2018-01-01 Arthur de Jong * [e781eee] MANIFEST.in, tox.ini, update/README, update/cn_loc.py, update/do_whitelists.py, update/eu_nace.py, update/iban.py, update/imsi.py, update/isbn.py, update/isil.py, update/my_bp.py, update/numlist.py, update/requirements.txt: Move update scripts to own directory This moves all the update scripts to their own directory so they don't clutter the toplevel directory. This also ensures that the scripts are passed through flake8 and makes some adjustments for that alongside a few other cleanups. 2017-12-01 srikanthlogic * [442aa82] stdnum/in_/pan.py, tests/test_in_pan.doctest: Add Indian PAN Closes https://github.com/arthurdejong/python-stdnum/pull/57 2017-12-31 Arthur de Jong * [8a34b4e] stdnum/util.py: Correctly quote regular expression Fixes a6ae1d0. 2017-12-31 Arthur de Jong * [271b9e4] docs/stdnum.is_.kennitala.rst, docs/stdnum.is_.vsk.rst, tox.ini: Add Sphinx documentation checks This also fixes an escaping issue in the automatically generated documentation for modules that end with an underscore. 2017-12-06 Arthur de Jong * [be094f8] README, docs/conf.py, docs/index.rst, getnumlist.py, setup.py, stdnum/__init__.py: Use README as package long description This also shortens the stdnum module docstring and updates the Sphinx configuration. 2017-12-01 srikanthlogic * [c576bc4] stdnum/in_/__init__.py, stdnum/in_/aadhaar.py: Add Indian Aadhaar Closes https://github.com/arthurdejong/python-stdnum/pull/56 2017-11-26 Arthur de Jong * [bafdb70] stdnum/casrn.py, tests/test_casrn.doctest: Add CAS Registry Number This adds validation of the Chemical Abstracts Service Registry Number. 2017-11-24 Arthur de Jong * [d5f97e9] online_check/check.js, online_check/stdnum.wsgi: Change output of online lookups This puts the number before the number name to make it a little clearer. 2017-11-24 Arthur de Jong * [f7b4615] online_check/check.js: Store online check numbers in history This updates the browser history with with the numbers that were checked so that you can easily go back and forth between checked number. 2017-11-24 Arthur de Jong * [7cb114b] online_check/stdnum.wsgi: Correctly escape number for use in attribute 2017-11-26 Arthur de Jong * [90067f7] tests/test_eu_banknote.doctest: Fix incorrect banknote test Also add a few verified correct numbers. Fixes b7b812c. 2017-11-22 Arthur de Jong * [b7b812c] stdnum/eu/banknote.py, tests/test_eu_banknote.doctest: Add Euro bank notes serial number This adds validation of serial numbers that appear on Euro bills. 2017-11-02 Arthur de Jong * [a6ae1d0] docs/index.rst, docs/stdnum.bic.rst, docs/stdnum.iso9362.rst, stdnum/bic.py, stdnum/iso9362.py, stdnum/util.py: Rename stdnum.iso9362 to stdnum.bic The new name is more descriptive and easier to remember. This makes stdnum.iso9362 a compatibility module that can be imported with the old name but provides a deprecation warning. 2017-10-22 Arthur de Jong * [6be1754] stdnum/util.py: Support zeep as preferred SOAP library This tries zeep, suds (suds-jurko) and falls back to using pysimplesoap for performing the SOAP requests. From those zeep seems to be the best supported implementation. 2017-10-22 Arthur de Jong * [9ab1d66] stdnum/eu/vat.py, tests/test_eu_vat.py: Add tests for the VIES VAT validation functions These tests are not normally run as part of the normal test suite and have to be explicitly enabled by setting the ONLINE_TESTS environment variable to avoid overloading these online services. 2017-10-18 Arthur de Jong * [ab21159] stdnum/do/ncf.py, tests/test_do_ncf.py: Add stdnum.do.ncf.check_dgii() This adds functions for querying the Dirección General de Impuestos Internos (DGII) API to check if the RNC and NCF combination provided is valid. 2017-10-18 Arthur de Jong * [6b09c5d] stdnum/do/rnc.py, tests/test_do_rnc.py, tox.ini: Add stdnum.do.rnc.check_dgii() and search_dgii() This adds functions for querying the Dirección General de Impuestos Internos (DGII) API to validate the RNC and search the register by keyword. 2017-10-16 Arthur de Jong * [665bf7a] stdnum/do/ncf.py, tests/test_do_ncf.doctest: Add Dominican Republic receipt number (NCF) This number does not have a check digit but uses a distinctive enough format that it should not be too great of a problem. 2017-10-14 Arthur de Jong * [4ab1e3b] stdnum/eu/vat.py, stdnum/tr/tckimlik.py, stdnum/util.py: Cache SOAP client in get_soap_client() This caches the instantiated SOAP client classes in the util module instead of doing the caching in every module that performs requests. 2017-10-18 Arthur de Jong * [cecd35c] getdowhitelists.py: Add a script for updating RNC and Cedula whitelists 2017-10-13 Arthur de Jong * [399321b] stdnum/do/rnc.py, tests/test_do_rnc.doctest: Also add a whitelist for Dominican Republic RNC Some RNCs are apparently valid while having an incorrect check digit (though most appear to be inactive). There also appear to be valid RNCs that do not have 9 digits. 2017-10-13 Arthur de Jong * [58511dc] stdnum/do/cedula.py, tests/test_do_cedula.doctest: Add a few new numbers to the Cedula whitelist These numbers were found to be valid but had an invalid check digit nonetheless (though most appear to be inactive). Also there appear to be a few valid Cedula that do not have 11 digits. 2017-10-13 David Arnold * [74c1721] stdnum/util.py, tests/test_util.doctest: Handle unicode arguments in get_cc_module() Closes https://github.com/arthurdejong/python-stdnum/issues/54 2017-09-15 Arthur de Jong * [12cd072] stdnum/eu/at_02.py: Fix spelling errors 2017-09-12 Arthur de Jong * [4496ffe] ChangeLog, NEWS, README, docs/index.rst, docs/stdnum.ca.bn.rst, docs/stdnum.ca.sin.rst, docs/stdnum.de.idnr.rst, docs/stdnum.ee.registrikood.rst, docs/stdnum.fi.veronumero.rst, docs/stdnum.gb.upn.rst, stdnum/__init__.py: Get files ready for 1.7 release 2017-09-12 Arthur de Jong * [28092b3] stdnum/damm.py: Add example with custom table to Damm 2017-09-11 Arthur de Jong * [24d4a76] stdnum/cn/loc.dat, stdnum/eu/nace.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/isil.dat: Update database files 2017-09-11 Arthur de Jong * [5071636] getisbn.py: Update getisbn to allow TLSv1 The www.isbn-international.org site uses TLSv1 which seems to be blocked by recent Python/OpenSSL combinations unless configured otherwise. 2017-09-11 Arthur de Jong * [edaad05] setup.cfg, tox.ini: Run flake8 from tox 2017-09-10 Arthur de Jong * [0ce5d0b] stdnum/bg/egn.py, stdnum/cz/dic.py, stdnum/dk/cpr.py, stdnum/es/cups.py, stdnum/es/referenciacatastral.py, stdnum/eu/nace.py, stdnum/fr/nir.py, stdnum/fr/siren.py, stdnum/iban.py, stdnum/it/codicefiscale.py, stdnum/lv/pvn.py, stdnum/numdb.py, stdnum/ro/cnp.py, stdnum/util.py: Minor code improvements (mostly PEP8) 2017-09-10 Arthur de Jong * [e468c1b] stdnum/ch/vat.py, stdnum/cn/ric.py, stdnum/do/cedula.py, stdnum/ee/ik.py, stdnum/ee/registrikood.py, stdnum/es/nif.py, stdnum/fi/__init__.py, stdnum/fi/hetu.py, stdnum/gb/nhs.py, stdnum/gb/upn.py, stdnum/gb/vat.py, stdnum/is_/kennitala.py, stdnum/it/codicefiscale.py, stdnum/nl/onderwijsnummer.py, stdnum/numdb.py, stdnum/rs/pib.py, stdnum/sk/rc.py, stdnum/us/tin.py: Make import ordering consistent 2017-09-10 Arthur de Jong * [1c27639] stdnum/al/nipt.py, stdnum/ar/cbu.py, stdnum/ar/cuit.py, stdnum/at/businessid.py, stdnum/at/uid.py, stdnum/au/abn.py, stdnum/au/acn.py, stdnum/au/tfn.py, stdnum/be/vat.py, stdnum/bg/egn.py, stdnum/bg/pnf.py, stdnum/bg/vat.py, stdnum/br/cnpj.py, stdnum/br/cpf.py, stdnum/ca/bn.py, stdnum/ca/sin.py, stdnum/ch/ssn.py, stdnum/ch/uid.py, stdnum/ch/vat.py, stdnum/cl/rut.py, stdnum/cn/ric.py, stdnum/co/nit.py, stdnum/cusip.py, stdnum/cy/vat.py, stdnum/cz/dic.py, stdnum/cz/rc.py, stdnum/damm.py, stdnum/de/idnr.py, stdnum/de/vat.py, stdnum/de/wkn.py, stdnum/dk/cpr.py, stdnum/dk/cvr.py, stdnum/do/cedula.py, stdnum/do/rnc.py, stdnum/ean.py, stdnum/ec/ci.py, stdnum/ec/ruc.py, stdnum/ee/ik.py, stdnum/ee/kmkr.py, stdnum/ee/registrikood.py, stdnum/es/ccc.py, stdnum/es/cif.py, stdnum/es/cups.py, stdnum/es/dni.py, stdnum/es/iban.py, stdnum/es/nie.py, stdnum/es/nif.py, stdnum/es/referenciacatastral.py, stdnum/eu/at_02.py, stdnum/eu/eic.py, stdnum/eu/nace.py, stdnum/eu/vat.py, stdnum/fi/alv.py, stdnum/fi/associationid.py, stdnum/fi/hetu.py, stdnum/fi/veronumero.py, stdnum/fi/ytunnus.py, stdnum/fr/nif.py, stdnum/fr/nir.py, stdnum/fr/siren.py, stdnum/fr/siret.py, stdnum/fr/tva.py, stdnum/gb/nhs.py, stdnum/gb/sedol.py, stdnum/gb/upn.py, stdnum/gb/vat.py, stdnum/gr/vat.py, stdnum/grid.py, stdnum/hr/oib.py, stdnum/hu/anum.py, stdnum/iban.py, stdnum/ie/pps.py, stdnum/ie/vat.py, stdnum/imei.py, stdnum/imo.py, stdnum/imsi.py, stdnum/is_/kennitala.py, stdnum/is_/vsk.py, stdnum/isan.py, stdnum/isbn.py, stdnum/isil.py, stdnum/isin.py, stdnum/ismn.py, stdnum/iso6346.py, stdnum/iso7064/mod_11_10.py, stdnum/iso7064/mod_11_2.py, stdnum/iso7064/mod_37_2.py, stdnum/iso7064/mod_37_36.py, stdnum/iso7064/mod_97_10.py, stdnum/iso9362.py, stdnum/issn.py, stdnum/it/codicefiscale.py, stdnum/it/iva.py, stdnum/lei.py, stdnum/lt/pvm.py, stdnum/lu/tva.py, stdnum/luhn.py, stdnum/lv/pvn.py, stdnum/mc/tva.py, stdnum/meid.py, stdnum/mt/vat.py, stdnum/mx/rfc.py, stdnum/my/nric.py, stdnum/nl/brin.py, stdnum/nl/bsn.py, stdnum/nl/btw.py, stdnum/nl/onderwijsnummer.py, stdnum/nl/postcode.py, stdnum/no/mva.py, stdnum/no/orgnr.py, stdnum/numdb.py, stdnum/pl/nip.py, stdnum/pl/pesel.py, stdnum/pl/regon.py, stdnum/pt/nif.py, stdnum/ro/cf.py, stdnum/ro/cnp.py, stdnum/rs/pib.py, stdnum/ru/inn.py, stdnum/se/orgnr.py, stdnum/se/vat.py, stdnum/si/ddv.py, stdnum/sk/dph.py, stdnum/sm/coe.py, stdnum/tr/__init__.py, stdnum/tr/tckimlik.py, stdnum/us/atin.py, stdnum/us/ein.py, stdnum/us/itin.py, stdnum/us/ptin.py, stdnum/us/rtn.py, stdnum/us/ssn.py, stdnum/us/tin.py, stdnum/verhoeff.py: Docstring improvements 2017-09-08 Arthur de Jong * [2cc39ea] stdnum/cz/dic.py, tests/test_eu_vat.doctest: Fix Czech DIČ check digit calculation This fixes a bug in the check digit calculation for the 9-digit numbers that start with a 6 for individuals without a RČ. This also adds a few tests for Czech VAT numbers. See https://github.com/arthurdejong/python-stdnum/issues/51 2017-09-04 Arthur de Jong * [d24a439] stdnum/ee/registrikood.py, tests/test_ee_registrikood.doctest: Add Estonian Registrikood This is based on what was done by Mohammed Salman of Holvi. This adds more tests and validates the check digit. This uses the check digit algorithm from Isikukood which seems to work with all tested numbers although there is no confirmation that this is the correct algorithm. 2017-08-25 Mohammed Salman * [53cc0dc] stdnum/de/idnr.py, tests/test_de_idnr.doctest: Add support for German tax id number 2017-08-30 Arthur de Jong * [a71a1ac] stdnum/isbn.py, tests/test_isbn.doctest: Check bookland code in ISBN This ensures that an InvalidComponent() exception is raised when an unknown EAN bookland code is found. It will also raise this exception when using to_isbn10() when not using the 978 code. 2017-08-28 Arthur de Jong * [8f6fa7d] setup.cfg, stdnum/iban.py, stdnum/ismn.py, stdnum/meid.py, stdnum/numdb.py, stdnum/util.py, tests/numdb-test.dat, tests/test_util.doctest: Ensure 100% branch coverage This ensures that the tests fail if 100% branch coverage is not achieved. It also adds some pragma statements for code that cannot be covered or is Python version dependent. Furthermore, the get_module_list() function was removed from stdnum.util and more tests were made from stdnum.util and stdnum.numdb. The functionality to call format() in a country-specific IBAN implementation was also dropped because it was not used. 2017-08-27 Arthur de Jong * [fbc92f8] stdnum/gb/upn.py: Add English Unique Pupil Number (UPN) 2017-08-26 Arthur de Jong * [b8389eb] stdnum/ca/bn.py, tests/test_ca_bn.doctest: Add Canadian Business Number (BN) 2017-08-26 Arthur de Jong * [efd2eb9] stdnum/ca/__init__.py, stdnum/ca/sin.py: Add Canadian Social Insurance Number (SIN) 2017-08-24 Arthur de Jong * [b8e12d6] setup.cfg: Ensure all Python files are in coverage report 2017-08-17 Mohammed Salman * [0c91b43] stdnum/fi/veronumero.py: Implement Finnish individual tax number validation 2017-07-11 Arthur de Jong * [bd0c7c7] online_check/check.js, online_check/stdnum.wsgi, online_check/template.html: Include search term in online form This also makes the Javascript regular expression used for highlighting links the same as the Python equivalent. 2017-06-02 Arthur de Jong * [81446fd] stdnum/iso7064/mod_97_10.py: Use slightly more compact code This changes the alphanumeric to numeric translation to be slightly more compact and slightly faster. 2017-04-16 Arthur de Jong * [ed9ac5b] tests/test_isbn.doctest: Add a few ISBNs found online This adds a number of ISBNs found online from various sources to the test suite. 2017-04-15 Arthur de Jong * [57c12d8] stdnum/ismn.py, tests/test_ismn.doctest: An ISMN can only be 10 or 13 digits This also adds the test that an ISMN should start with 9790. 2017-04-15 Arthur de Jong * [6fb2e89] stdnum/isbn.py, tests/test_isbn.doctest: Fix conversion of 9 digit ISBN to ISBN13 2017-04-13 Arthur de Jong * [5604d91] docs/index.rst, setup.py, stdnum/fr/nir.py, stdnum/fr/siren.py, stdnum/gb/nhs.py, stdnum/isil.py, stdnum/iso6346.py, stdnum/lv/pvn.py, stdnum/nl/brin.py, stdnum/us/ein.dat, tests/test_al_nipt.doctest: Switch to HTTPS URLs 2017-04-13 Arthur de Jong * [d14ea3b] online_check/README, online_check/check.js, online_check/stdnum.wsgi: Show possible conversions in online check This shows possible converted values. For example it will show ISBN13 conversions for ISBN10 values. 2017-04-13 Arthur de Jong * [6b588d1] stdnum/damm.py: Fix bug in damm.is_valid() function 2017-04-11 Arthur de Jong * [35542c1] ChangeLog, MANIFEST.in, NEWS, README, docs/index.rst, docs/stdnum.ar.cbu.rst, docs/stdnum.eu.eic.rst, docs/stdnum.eu.nace.rst, docs/stdnum.lei.rst, docs/stdnum.mc.tva.rst, docs/stdnum.rs.pib.rst, stdnum/__init__.py: Get files ready for 1.6 release 2017-04-10 Arthur de Jong * [93459d3] stdnum/cn/loc.dat, stdnum/eu/nace.dat, stdnum/iban.dat, stdnum/imsi.dat, stdnum/isbn.dat: Update database files 2017-04-10 Arthur de Jong * [bb1712d] online_check/README, online_check/check.js, online_check/jquery-1.7.1.js, online_check/jquery-1.7.1.min.js, online_check/stdnum.wsgi, online_check/template.html: Add simple online check example This adds the code that is used to find formats for which a supplied number is valid. This is the code that is used on https://arthurdejong.org/python-stdnum/check/ 2017-04-10 Arthur de Jong * [5398247] stdnum/lei.py, tests/test_lei.doctest: Add Legal Entity Identifier 2017-04-10 Arthur de Jong * [e844b52] stdnum/iban.py, stdnum/iso7064/mod_97_10.py: Integrate base10 conversion into Mod 97, 10 This moves the conversion of an alphanumeric string to a numeric representation for modulo 97 calculation to the mod_97_10 module because this mechanism seems to be used by multiple formats. 2017-04-10 Arthur de Jong * [1b3d16e] stdnum/es/nie.py: Add missing export (__all__) 2017-04-10 Arthur de Jong * [72f5c6c] stdnum/rs/__init__.py, stdnum/rs/pib.py, tests/test_rs_pib.doctest: Add Serbian Poreski Identifikacioni Broj 2017-04-10 Arthur de Jong * [800205c] tox.ini: Print warnings during tox run 2017-04-07 Arthur de Jong * [7493eca] stdnum/cusip.py, stdnum/ean.py, stdnum/ec/ci.py, stdnum/isin.py, stdnum/tr/tckimlik.py: Use a slightly more readable weight alternation Switch to a slightly more readable syntax for alternating between two weights in checksums calculations. 2017-04-01 Arthur de Jong * [23b2150] stdnum/eu/eic.py, tests/test_eu_eic.doctest: Add European EIC (Energy Identification Code) 2017-03-26 Arthur de Jong * [194f025] stdnum/meid.py, tests/test_robustness.doctest: Add unicode robustness tests This tests a few unicode strings and fixes a bug in the MEID module. 2017-03-26 Arthur de Jong * [d43c394] stdnum/es/referenciacatastral.py, tests/test_es_referenciacatastral.doctest: Add test for Ñ in Referencia Catastral This supports the Referencia Catastral with an Ñ in it for both byte strings (Python 2) and unicode strings (Python 2 and 3). Support for literal unicode strings in Python 2 doctests is flaky so the test is a bit ugly. This also adds a few numbers that were found online. Sadly no real numbers with an Ñ in it have been found so the one in the test was constructed. 2017-03-26 Arthur de Jong * [61d73c1] getnace.py, stdnum/eu/nace.dat, stdnum/eu/nace.py, tests/test_robustness.doctest: Add European NACE classification This number is used to classify business. Validation is done based on a downloaded registry. 2017-03-26 Arthur de Jong * [649f073] stdnum/mc/tva.py: Remove unused import 2017-03-19 Arthur de Jong * [c957318] stdnum/fr/tva.py, stdnum/mc/__init__.py, stdnum/mc/tva.py, tests/test_eu_vat.doctest: Add support for Monaco VAT number The number uses the French TVA number but, unlike normal French VAT numbers, they are not valid French SIREN numbers. See https://github.com/arthurdejong/python-stdnum/issues/46 2016-12-11 Arthur de Jong * [5b43857] stdnum/au/tfn.py: Remove unused import 2016-12-01 Greg Kuwaye * [7d16ea5] stdnum/us/ein.dat: Add new 47 EIN prefix; fix duplicate 46; move 81 47 appears to be a new Internet campus code. Prefix 46 was listed twice, once under the Philadelphia campus and again under the Internet campus. This error may be seen on the IRS website itself. The Wikipedia article on EIN (https://en.wikipedia.org/wiki/Employer_Identification_Number) does not have 46 listed twice. 81 has moved from the Philadelphia campus to the Internet campus. 2016-11-14 Luciano Rossi * [dcde8f4] stdnum/ar/cbu.py, tests/test_ar_cbu.doctest: Implement CBU (unique bank code) of Argentina See https://github.com/arthurdejong/python-stdnum/issues/43 2016-11-14 Arthur de Jong * [da18e3b] setup.py, stdnum/fi/associationid.py, stdnum/meid.py, tests/test_mx_rfc.doctest, tox.ini: Add Python 2.6 support This also brings the list of Python versions in setup.py in line with tox.ini. 2016-11-13 Arthur de Jong * [62ebbce] ChangeLog, NEWS, README, docs/index.rst, docs/stdnum.au.abn.rst, docs/stdnum.au.acn.rst, docs/stdnum.au.tfn.rst, docs/stdnum.es.ccc.rst, docs/stdnum.es.cups.rst, docs/stdnum.es.iban.rst, docs/stdnum.es.referenciacatastral.rst, stdnum/__init__.py: Get files ready for 1.5 release 2016-11-13 Arthur de Jong * [c9beb00] stdnum/cn/loc.dat, stdnum/iban.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/isil.dat, tests/test_iban.doctest: Update database files This removes the Costa Rica IBAN test because the format of the IBAN seems to have been changed. The old length still seems to be in use so a more permanent solution is probably required. 2016-11-13 Arthur de Jong * [ac560a7] getisbn.py: Update getisbn to Python3 There were some SSL-related issues with the urllib module. This was the easiest solution. 2016-11-13 Arthur de Jong * [458c310] getiban.py: Update gettin IBAN registry The format of the registry file has changed. Before it was a straightforward CSV file with countries in rows but countries are now in columns. 2016-11-09 Sergi Almacellas Abellana * [45faa7c] .gitignore, tox.ini: Add tox.ini file 2016-11-08 Sergi Almacellas Abellana * [a9e5405] stdnum/eu/at_02.py: Implement calc_check_digits in SEPA Identifier of the Creditor (AT-02) 2016-10-14 Arthur de Jong * [8ea76ba] stdnum/au/tfn.py, tests/test_au_tfn.doctest: Add Australian Tax File Number Based on the implementation provided by Vincent Bastos See https://github.com/arthurdejong/python-stdnum/pull/40 2016-10-14 Arthur de Jong * [8028c3a] stdnum/au/acn.py, tests/test_au_acn.doctest: Add Australian Company Number Based on the implementation provided by Vincent Bastos See https://github.com/arthurdejong/python-stdnum/pull/40 2016-10-14 Arthur de Jong * [70b94ee] stdnum/au/__init__.py, stdnum/au/abn.py, tests/test_au_abn.doctest: Add Australian Business Number Based on the implementation provided by Vincent Bastos See https://github.com/arthurdejong/python-stdnum/pull/40 2016-10-14 Arthur de Jong * [d7cff5d] stdnum/be/__init__.py, stdnum/be/vat.py: Provide businessid as an alias The Belgian company number or enterprise number (ondernemingsnummer) is the new name for what was previously the VAT number. 2016-09-10 Arthur de Jong * [352aa8a] stdnum/es/referenciacatastral.py: Add reference to Referencia Catastral implementation 2016-09-03 Arthur de Jong * [49db553] tests/test_es_referenciacatastral.doctest: Add more tests for Referencia Catastral This adds a number of extra tests for the Spanish Referencia Catastral (stdnum.es.referenciacatastral) module, mostly based on numbers found online. This commit includes some of the documentation on the structure of Referencia Catastral that was in the original pull request. See https://github.com/arthurdejong/python-stdnum/pull/38 2016-08-31 David García Garzón * [2c557a0] stdnum/es/referenciacatastral.py: Add Spansih Referencia Catastral The control digit check algorithm is based on Javascript implementation by Vicente Sancho that can be found at http://trellat.es/validar-la-referencia-catastral-en-javascript/ See https://github.com/arthurdejong/python-stdnum/pull/38 2016-09-10 Arthur de Jong * [b128c8d] tests/test_iban.doctest: Test a few Spanish IBANs found online 2016-09-10 Arthur de Jong * [878e036] stdnum/numdb.py: Avoid leaving open file descriptor in test 2016-09-08 Arthur de Jong * [be24790] stdnum/es/iban.py, tests/test_iban.doctest: Add Spanish IBAN number module This validates the country-specific part of the IBAN. 2016-09-08 Arthur de Jong * [2510932] stdnum/iban.py: Validate country-specific part of IBAN This adds the possible of validating the country-specific part of the IBAN. If the country has an IBAN module, checking is also delegated to that module. 2016-09-06 Arthur de Jong * [d8cca82] stdnum/eu/vat.py, stdnum/util.py: Introduce get_cc_module() utility function This changes the get_vat_module() function to a more generic get_cc_module() function so that it can also be used for other things like IBAN checking. 2016-09-06 Arthur de Jong * [1622873] stdnum/es/ccc.py: Add to_iban() function to Spanish CCC 2016-09-08 Arthur de Jong * [7d969be] stdnum/iban.py: Implement calc_check_digits() in IBAN Introduce a function to calculate the two check digits of an IBAN. Since the check digits are the third and fourth characters in the number, placeholders need to be provided when calling this function. 2016-08-31 David García Garzón * [294f872] stdnum/es/ccc.py: Add Spanish Código Cuenta Corriente (CCC) 2016-08-28 David García Garzón * [466cec8] stdnum/es/cups.py, tests/test_es_cups.doctest: Add Spanish CUPS code 2016-08-28 Arthur de Jong * [d95382f] stdnum/exceptions.py: Properly print error message of exceptions This ensures that the message passed to the constructor is shown in the traceback while falling back to the class default. 2016-07-26 Arthur de Jong * [01a7f34] ChangeLog, NEWS, README, docs/index.rst, docs/stdnum.damm.rst, docs/stdnum.fr.nif.rst, docs/stdnum.fr.nir.rst, docs/stdnum.fr.siret.rst, docs/stdnum.gb.nhs.rst, docs/stdnum.tr.tckimlik.rst, stdnum/__init__.py: Get files ready for 1.4 release 2016-07-26 Arthur de Jong * [3e4e9e2] getmybp.py, stdnum/cn/loc.dat, stdnum/iban.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/isil.dat: Update database files This also updates the getmybp script to support the new layout. 2016-07-26 Arthur de Jong * [3e344d1] stdnum/iso6346.py: Add formatting of ISO 6346 container codes 2016-07-26 Arthur de Jong * [aa1c298] getnumlist.py, stdnum/damm.py, tests/test_damm.doctest: Implement Damm algorithm This is a generic check digit algorithm. 2016-07-26 Arthur de Jong * [411d038] stdnum/fr/nif.py: Fix French NIF format test Fixes 2409ee9. 2016-07-26 Arthur de Jong * [06e4165] stdnum/ch/ssn.py: Improve validation to Swiss SSN number The EAN-13 number should start with 756. 2016-07-26 Arthur de Jong * [1907c67] stdnum/br/cpf.py: Add documentation to Brazillian CPF 2016-07-26 Arthur de Jong * [cf428ac] stdnum/iso6346.py: Add pointer to ISO 6346 information 2016-07-26 Arthur de Jong * [011c0f0] stdnum/gb/nhs.py: Fix copyright notice 2016-05-22 Dimitri Papadopoulos * [2409ee9] stdnum/fr/nif.py: Add NIF - French tax identification number Add module for NIF also known as SPI number. 2016-07-26 Arthur de Jong * [43b58d3] stdnum/fr/nir.py: Move NIR check digit calculation to function This also fixes a number of formatting issues, improves the module description and adds tests for the 2A and 2B departments. 2016-05-29 Dimitri Papadopoulos * [879f2d3] stdnum/fr/nir.py: Improve French NIR validation Please note that the 7th character of the NIR might be 'A' or 'B'. Other than that the NIR contains digits only. 2016-07-25 Arthur de Jong * [fd9f953] stdnum/fr/siren.py, stdnum/fr/siret.py, tests/test_fr_siren.doctest, tests/test_fr_siret.doctest: Add extra tests for SIREN and SIRET This adds tests for a few numbers that have been found online and allows the dot as a seprator because those numbers were found. It also ensures that the SIREN validation is also called for SIRET and adds a SIRET formatting function. 2016-05-27 Yoann Aubineau * [5ba3a87] stdnum/fr/siret.py: Add French SIRET number Add a SIRET (Système d'Identification du Répertoire des ETablissements, a French company etablishment identification number) module. 2016-05-29 Arthur de Jong * [dc708f0] stdnum/isil.py, tests/test_isil.doctest: Add more ISIL tests This moves a few of the tests from the module to a dedicated test file and adds tests for a number of ISIL numbers found online. 2016-05-29 Arthur de Jong * [4a57d84] stdnum/us/tin.py: Fix formatting of bulleted list 2016-05-28 Arthur de Jong * [9b74840] stdnum/ch/ssn.py, tests/test_ch_ssn.doctest: Fix bug in Swiss SSN validation The validation was delegated to the EAN module but the number is supposed to be an EAN-13 only and and EAN-8 was also accepted. This also reformats the docstring. 2016-05-28 Arthur de Jong * [f3c2491] stdnum/ie/vat.py, tests/test_ie_vat.doctest: Fix bug in Irish VAT number validation The last digits of the number that should be letters were not tested to be letters which could result in ValueError being raised for certain validations. This also clarifies the documentation and adds a convert() function to convert numbers from the old format (where the second character would be a letter or symbol) to the new format (7 digits followed by 1 or 2 letters). 2016-05-28 Arthur de Jong * [b5397ed] tests/test_robustness.doctest: Small improvements to tests This includes a formatting fix and removes an unused variable from a test. 2016-05-28 Arthur de Jong * [d85b27f] stdnum/util.py: Fix get_module_description() This fixes the initial implementation in 3f6d52a. 2016-05-22 Dimitri Papadopoulos * [a1afa76] stdnum/fr/nir.py: Add French NIR Add module for NIR also known as social security number. 2016-05-09 Arthur de Jong * [0a2f39e] stdnum/gb/nhs.py: Add United Kingdom NHS number Add module for United Kingdom National Health Service patient identifier. 2016-05-09 Arthur de Jong * [2126947] stdnum/numdb.py: Read numdb files in context manager This ensures that the file is explicitly closed in the function to avoid "unclosed file" warnings. See: https://github.com/arthurdejong/python-stdnum/issues/33 2016-04-11 Arthur de Jong * [e28b5e1] stdnum/ch/uid.py, stdnum/ch/vat.py, stdnum/cusip.py, stdnum/dk/cpr.py, stdnum/iban.py, stdnum/imei.py, stdnum/isbn.py, stdnum/isil.py, stdnum/isin.py, stdnum/issn.py, stdnum/mx/rfc.py, stdnum/nl/bsn.py, stdnum/nl/onderwijsnummer.py, stdnum/pl/regon.py, stdnum/tr/tckimlik.py, stdnum/us/ssn.py, stdnum/verhoeff.py: Make more information links consistent Also fix a docstring in stdnum.nl.bsn and add a pointer to stdnum.nl.onderwijsnummer. 2016-04-09 Arthur de Jong * [feab917] stdnum/eu/vat.py, stdnum/tr/tckimlik.py, stdnum/util.py: Implement online TC Kimlik check This refactors out the SOAP client function that was implemented for VIES to the stdnum.utils module. 2016-04-09 Arthur de Jong * [619b097] stdnum/tr/__init__.py, stdnum/tr/tckimlik.py, tests/test_tr_tckimlik.doctest: Add Turkish personal identification number 2016-04-01 Arthur de Jong * [095dcbb] stdnum/mx/rfc.py, tests/test_mx_rfc.doctest: Document accuracy of RFC check digit test There is an online service that allows validating RFC numbers. It seems there are a lot of numbers that do not match the check digit algorithm which confirms disabling the check digit test by default is a good idea. Also see https://github.com/arthurdejong/python-stdnum/issues/32 2016-03-05 Arthur de Jong * [41cecb5] ChangeLog, NEWS, getnumlist.py, setup.py, stdnum/__init__.py: Get files ready for 1.3 release 2016-03-03 Arthur de Jong * [6457734] getcnloc.py, getiban.py, stdnum/cn/loc.dat, stdnum/iban.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/isil.dat: Update database files This also updates the getcnloc and getiban scripts to use new URLs. 2015-10-30 Arthur de Jong * [0061564] stdnum/dk/cpr.py, stdnum/iban.py, stdnum/imei.py, stdnum/isbn.py, stdnum/isil.py, stdnum/issn.py, stdnum/nl/bsn.py, stdnum/us/ssn.py, stdnum/verhoeff.py: Integrate information from the wiki This adds the information that was previously in the Trac wiki into the source docstrings because the Trac instance is being phased out. This also includes small updates to the ISIL module. 2015-10-28 Arthur de Jong * [96c8151] stdnum/eu/vat.py: Fix SOAP client re-use This fixes a bug when checking re-use of the global SOAP client object. The object could not be evaluated in boolean context so is no explicitly compared to None. For suds a MethodNotFound exception would be raised for __nonzero__() (which Python uses for boolean comparison). 2015-10-28 Lionel Elie Mamane * [2881b86] stdnum/eu/vat.py: Fix problem with check_vies_approx() 2015-10-15 Ronald Paloschi * [fb0efe0] stdnum/iso6346.py, tests/test_iso6346.doctest: Fix for when ISO 6346 checksum is 10 Bug fix for when the checksum is 10, it was compared to 0 and failed. New doctest exposing the bug that passes after the fix is applied. See: https://github.com/arthurdejong/python-stdnum/pull/30 2015-10-11 Arthur de Jong * [1361817] ChangeLog, MANIFEST.in, NEWS, README, docs/index.rst, docs/stdnum.at.businessid.rst, docs/stdnum.br.cnpj.rst, docs/stdnum.ch.uid.rst, docs/stdnum.ch.vat.rst, docs/stdnum.cusip.rst, docs/stdnum.de.wkn.rst, docs/stdnum.ee.ik.rst, docs/stdnum.fi.associationid.rst, docs/stdnum.fi.ytunnus.rst, docs/stdnum.gb.sedol.rst, docs/stdnum.imo.rst, docs/stdnum.isin.rst, docs/stdnum.mx.rfc.rst, docs/stdnum.pl.pesel.rst, docs/stdnum.pl.regon.rst, docs/stdnum.ru.inn.rst, setup.py, stdnum/__init__.py: Get files ready for 1.2 release 2015-10-11 Arthur de Jong * [1327045] getcnloc.py, stdnum/cn/loc.dat, stdnum/iban.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/isil.dat: Update database files This also updates the script to download updated Chinese location names. 2015-10-11 Arthur de Jong * [a891c60] stdnum/al/nipt.py, stdnum/co/nit.py, stdnum/iban.py, stdnum/ie/pps.py, stdnum/imei.py, stdnum/isan.py, stdnum/iso6346.py, stdnum/it/codicefiscale.py, stdnum/meid.py, stdnum/nl/postcode.py, stdnum/numdb.py, stdnum/pt/nif.py, stdnum/us/atin.py, stdnum/us/ein.py, stdnum/us/itin.py, stdnum/us/ptin.py, stdnum/us/ssn.py, stdnum/util.py: Code style improvements Ensure that regular expressions are r'' strings, avoid too long lines and fix line wrapping. Also avoid catching toplevel Exception when possible and use binascii for hex to binary conversion which is available in both Python 2 and 3. 2015-10-11 Arthur de Jong * [3c7a302] stdnum/cusip.py, stdnum/de/wkn.py, stdnum/gb/sedol.py, stdnum/isin.py: Convert security ids to ISIN Allow conversion from national securities identifiers to the international ISIN. 2015-10-11 Arthur de Jong * [c565517] stdnum/de/wkn.py, tests/test_de_wkn.doctest: Add German Wertpapierkennnummer The format itself is pretty simple (no check digit) but this module is more for completeness sake. 2015-10-10 Arthur de Jong * [961815f] stdnum/gb/sedol.py, tests/test_gb_sedol.doctest: Add SEDOL number 2015-10-10 Arthur de Jong * [fb91775] stdnum/ru/__init__.py: Add information to Russian package 2015-10-10 Arthur de Jong * [ebb5c07] MANIFEST.in, stdnum/numdb.py, tests/numdb-test.dat: Move numdb test file This places the test database file in the tests directory. 2015-10-10 Arthur de Jong * [fa8099e] stdnum/imo.py: Add int. maritime org. number (IMO) This adds checks for the International Maritime Organization number used to identify ships. However, there seem to be a lot of ships with an IMO number that does not follow these rules (different check digits or even length). 2015-10-10 Arthur de Jong * [111b4fd] stdnum/isan.py, tests/test_isan.doctest: Fix handling of strip_check_digits in ISAN This fixes the compact() function to honor the strip_check_digits argument and does not validate the check digits if they are passed to validate together with strip_check_digits. 2015-10-10 Arthur de Jong * [9f9d13c] stdnum/isin.py, tests/test_isin.doctest: Add international securities id (ISIN) This adds support for handling ISINs (International Securities Identification Number). The can contain a CUSIP but performing this additional validation is currently not performed. 2015-10-09 Arthur de Jong * [522611c] stdnum/cusip.py, tests/test_cusip.doctest: Add CUSIP number 2015-10-08 Arthur de Jong * [320ecea] stdnum/ch/uid.py, stdnum/ch/vat.py, tests/test_ch_uid.doctest, tests/test_ch_vat.doctest: Add Swiss UID and VAT numbers The Swiss VAT number (MWST, TVA, IVA, TPV) is the UID (Unternehmens-Identifikationsnummer) followed by one of the VAT abbreviations. 2015-10-05 Arthur de Jong * [ec9bcb0] stdnum/mx/__init__.py, stdnum/mx/rfc.py, tests/test_mx_rfc.doctest: Add Mexican RFC number This adds support for the Mexican tax number RFC (Registro Federal de Contribuyentes). This module includes a number of checks on the number but the validation of the last check digit is disabled by default because a large number of numbers were found that were otherwise valid but had an invalid check digit. 2015-10-04 Arthur de Jong * [fd0cfd9] stdnum/eu/vat.py, stdnum/util.py: Move finding VAT module to util This moves the finding of a VAT module to the util module so that it can be more easily re-used for non-EU countries. 2015-10-04 Arthur de Jong * [38ed9c0] stdnum/co/nit.py, tests/test_co_nit.doctest: Update Colombian NIT checks This adds a number of tests for numbers found online. The length check has also been revisited because both shorter numbers and longer number have been found. This also updates the format() function to handle arbitrary length numbers. 2015-10-02 Arthur de Jong * [d413f95] stdnum/isbn.py: Fix comment 2015-10-02 Arthur de Jong * [3d1dbbb] stdnum/ar/cuit.py, stdnum/bg/egn.py, stdnum/bg/pnf.py, stdnum/bg/vat.py, stdnum/co/nit.py, stdnum/dk/cpr.py, stdnum/dk/cvr.py, stdnum/do/rnc.py, stdnum/ec/ruc.py, stdnum/ee/kmkr.py, stdnum/fi/alv.py, stdnum/gb/vat.py, stdnum/hu/anum.py, stdnum/is_/kennitala.py, stdnum/lv/pvn.py, stdnum/mt/vat.py, stdnum/no/orgnr.py, stdnum/pl/nip.py, stdnum/pl/pesel.py, stdnum/pl/regon.py, stdnum/ro/cf.py, stdnum/ro/cnp.py: Use zip() instead of enumerate() Makes the code slightly simpler and more compact. 2015-10-01 Sergio Isidoro * [222a87e] stdnum/fi/__init__.py: Add alias to hetu in for finnish personal id code 2015-09-27 Arthur de Jong * [e045c71] tests/test_eu_vat.doctest: Add more numbers found online 2015-09-07 Dariusz Choruzy * [36217ac] stdnum/pl/regon.py, tests/test_pl_regon.doctest: Add Polish REGON number 2015-09-06 Dariusz Choruzy * [a0cb61f] stdnum/pl/pesel.py: Add Polish PESEL number 2015-08-16 Arthur de Jong * [5ab8d24] stdnum/ru/__init__.py, stdnum/ru/inn.py, tests/test_ru_inn.doctest: Add Russioan ИНН (INN) tax ID This adds a basic implementation of the Russian Идентификационный номер налогоплательщика (tax identification number). This currently only checks the format, length and check digits but not whether each of the parts of the number are valid (e.g. valid region specified). 2015-08-16 Arthur de Jong * [714fa60] stdnum/br/cnpj.py, tests/test_br_cnpj.doctest: Add Brazillian CNPJ business identifier Add module for Cadastro Nacional da Pessoa Jurídica, the Brazillian company identifier. 2015-08-16 Arthur de Jong * [b939099] getiban.py, stdnum/iban.dat, tests/test_iban.doctest: Update IBAN tests This updates the iban.dat file from the IBAN registry, includes a fix for handling spaces in the BBAN and adds some more IBAN examples from the IBAN registry. 2015-08-16 Arthur de Jong * [7714db7] stdnum/iso9362.py: Make uppercase in compact() This changes the compact() function of the ISO 9362 module to make all the letters uppercase. 2015-08-16 Arthur de Jong * [6afa875] setup.cfg, stdnum/imei.py, stdnum/isbn.py, stdnum/isil.py, stdnum/ismn.py, stdnum/meid.py, stdnum/us/atin.py, stdnum/us/ein.py, stdnum/us/itin.py: Turn on and improve branch coverage 2015-08-16 Arthur de Jong * [e88ba0b] stdnum/dk/cpr.py, stdnum/is_/kennitala.py, stdnum/it/codicefiscale.py: Small typo and code style fixes 2015-08-03 Tomas Karasek * [243e50f] stdnum/ee/ik.py, tests/test_ee_ik.doctest: Add validation of Estonian personal ID 2015-06-12 Lari Haataja * [7f9c94f] stdnum/at/businessid.py: Add company register number validation for Austria 2015-07-12 Arthur de Jong * [0cbba6e] : Merge Finnish numbers provided by Holvi This merges the Finnish numbers provided by Holvi Payment Services Oy as found here: https://github.com/holvi/python-stdnum 2015-07-12 Arthur de Jong * [320326e] stdnum/fi/ytunnus.py: Split out format() function This uses the stdnum.fi.alv module more extensively and ensures that validate() returns a compact representation and a separate format() function is available. 2015-06-23 Lari Haataja * [37f7fa6] stdnum/fi/__init__.py, stdnum/fi/ytunnus.py: Add validation for Finnish y-tunnus (business identifier) 2015-07-12 Arthur de Jong * [db24746] stdnum/fi/associationid.py: Add a whitelist for short numbers and fix API This implements separate functions compact() and format() and fixes the doctests. This also implements a whitelist of registered short numbers to avoid accidentally validating just any number. 2015-06-16 Lari Haataja * [8d30992] stdnum/fi/associationid.py: Validation for Finnish association identifier 2015-07-12 Arthur de Jong * [e107457] : Merge changes to use CN Open Data 2015-07-12 Arthur de Jong * [a1a134e] stdnum/eu/vat.py: Fall back to pysimplesoap if suds is unavailable Initial testing seems to suggest that proxy-support is not complete with pysimplesoap (at least httplib2 and PySocks seem to be required). 2015-04-28 Lionel Elie Mamane * [8fe44f9] stdnum/eu/vat.py: Implement alternate VIES check Add a function to stdnum.eu.vat so that when one does a VIES VAT number check, one gets a proof (certificate) that one did the check, as defence against the VAT administration later putting this in doubt. This certificate is provided by the VIES service, if one provides one's own VAT number. 2015-06-08 Jiangge Zhang * [6308261] stdnum/cn/loc.dat: Download and generate latest Chinese location data. 2015-06-08 Jiangge Zhang * [12ba352] getcnloc.py: Download GB2260 data from github.com/cn. 2015-04-27 Arthur de Jong * [8925ae2] tests/test_iso6346.doctest: Fix copyright header 2015-04-27 Arthur de Jong * [58775d9] ChangeLog, NEWS, README, docs/index.rst, docs/stdnum.al.nipt.rst, docs/stdnum.ar.cuit.rst, docs/stdnum.cl.rut.rst, docs/stdnum.co.nit.rst, docs/stdnum.do.cedula.rst, docs/stdnum.do.rnc.rst, docs/stdnum.is_.kennitala.rst, docs/stdnum.is_.vsk.rst, docs/stdnum.iso9362.rst, docs/stdnum.no.mva.rst, docs/stdnum.no.orgnr.rst, docs/stdnum.se.orgnr.rst, docs/stdnum.sm.coe.rst, setup.py, stdnum/__init__.py: Get files ready for 1.1 release 2015-04-27 Arthur de Jong * [583b066] getcnloc.py, stdnum/cn/loc.dat, stdnum/iban.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/isil.dat: Update database files This also updates the script to download updated Chinese location names. 2014-10-24 Tomas Thor Jonsson * [dd309e4] stdnum/se/orgnr.py, stdnum/se/vat.py: Add support for SE orgnr This also delegates some of the validation for the Swedish VAT module to the orgnr module. 2015-04-27 Arthur de Jong * [23882e2] tests/test_ec_ruc.doctest: Add extra tests for the stdnum.ec.ruc module These numbers were found in various online sources. 2015-04-25 Arthur de Jong * [eac4d63] stdnum/fr/tva.py: Add extra test for French TVA 2014-10-14 P. Christeas * [9934f76] stdnum/gr/vat.py: Change description of Greek FPA number In Greece, our VAT number is used as a generic "tax registration" num. Update the docstring to reflect that name. 2015-04-22 Arthur de Jong * [4d7163c] stdnum/ar/__init__.py, stdnum/ar/cuit.py, tests/test_ar_cuit.doctest: Add Argentinian CUIT (VAT) number Based partially on the implementation in the vatnumber module. 2015-04-18 Arthur de Jong * [ba894d7] stdnum/sm/__init__.py, stdnum/sm/coe.py: Add San Marino COE (VAT) number Based partially on the implementation in the vatnumber module. 2015-04-18 Arthur de Jong * [144e1a4] stdnum/co/__init__.py, stdnum/co/nit.py: Add Colombian NIT/RUT (VAT) code Based on the implementation in the vatnumber module. 2015-04-18 Arthur de Jong * [c69c8f0] stdnum/cl/__init__.py, stdnum/cl/rut.py, tests/test_cl_rut.doctest: Add Chilean national tax number (RUT) Based on the implementation in the vatnumber module. 2015-04-18 Arthur de Jong * [3db826c] stdnum/al/__init__.py, stdnum/al/nipt.py, tests/test_al_nipt.doctest: Add Albanian NIPT (VAT) number Partially based on the implementation in the vatnumber module. Some valid numbers appear to start with an L so those are allowed as well. 2015-04-23 Arthur de Jong * [88d1af3] stdnum/do/cedula.py: Extend the list of valid Cedula This is based on the list of Cedula found at http://prd.org.do/2013/07/30/lista-del-cen-del-prd-actualizada-y-registrada-en-la-junta-central-electoral/ (link provided by José Arturo García) 2015-04-17 Arthur de Jong * [49d1e69] stdnum/do/cedula.py, tests/test_do_cedula.doctest: Add Dominican Republic Cedula number The Cedule is a Dominican Republic national identification number for persons. The number uses the Luhn checksum but apparently there are a lof of valid numbers in use that do not match the checksum. For this a whitelist is used. 2015-04-17 Arthur de Jong * [d003ac3] stdnum/do/__init__.py, stdnum/do/rnc.py, tests/test_do_rnc.doctest: Add Dominican Republic RNC number The RNC (Registro Nacional del Contribuyente) is the Dominican Republic taxpayer registration number for companies. 2015-04-19 Arthur de Jong * [9e94ab8] tests/test_no_mva.doctest: Add more stdnum.no.mva tests 2015-04-18 Arthur de Jong * [c334bcf] stdnum/is_/kennitala.py, tests/test_is_kennitala.doctest: Add more tests for Kennitala 2015-04-11 Tuomas Toivonen * [84620f8] stdnum/is_/__init__.py, stdnum/is_/kennitala.py, stdnum/is_/vsk.py: Support Icelandic personal, organisation and VAT identifiers The package is named "is_" because "is" is a reserved word. 2015-04-11 Tuomas Toivonen * [699b340] stdnum/no/__init__.py, stdnum/no/mva.py, stdnum/no/orgnr.py: Add support for Norwegian organisation and VAT numbers This commit also includes changes from Tomas Thor Jonsson . 2015-02-09 Tony Bajan * [75bcef0] stdnum/iso9362.py: Add ISO 9362 (BIC) support 2015-04-17 Arthur de Jong * [2574f89] stdnum/imsi.py: Raise InvalidComponent for unregistered IMSI 2014-12-23 Emiliano Castro * [9883c72] stdnum/eu/vat.py, stdnum/hr/__init__.py: Adding HR (Croatia) to the list of available countries 2014-11-01 Arthur de Jong * [3a7c9f7] stdnum/bg/vat.py, stdnum/eu/at_02.py, stdnum/iban.py, stdnum/isan.py, stdnum/meid.py, stdnum/numdb.py: Fix common spelling mistake 2014-10-31 Matt McDonald * [6e332b1] stdnum/meid.py, tests/test_meid.doctest: Fix for invalidating MEIDs with invalid decimal bit length See: http://arthurdejong.org/trac/python-stdnum/ticket/10 2014-10-20 Arthur de Jong * [3fa795d] getnumlist.py: Restore section for on homepage 2014-10-19 Arthur de Jong * [147eeb1] ChangeLog, NEWS, README, docs/index.rst, docs/stdnum.ch.ssn.rst, docs/stdnum.cn.ric.rst, docs/stdnum.ec.ci.rst, docs/stdnum.ec.ruc.rst, docs/stdnum.eu.at_02.rst, docs/stdnum.iso6346.rst, docs/stdnum.it.codicefiscale.rst, docs/stdnum.us.rtn.rst, getnumlist.py, setup.py, stdnum/__init__.py: Get files ready for 1.0 release 2014-10-19 Arthur de Jong * [72c0ff1] stdnum/iso6346.py: Remove unused import 2014-10-19 Arthur de Jong * [e713cc7] stdnum/iban.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/isil.dat: Update database files 2014-10-13 Denis Krienbühl * [256aa49] stdnum/ch/__init__.py, stdnum/ch/ssn.py: Adds the Swiss social security number Also known as "Sozialversicherungsnummer" / "Neue AHV Nummer". 2014-10-18 Arthur de Jong * [2cc50e2] stdnum/eu/at_02.py, stdnum/iban.py, stdnum/imei.py, stdnum/iso7064/mod_11_10.py, stdnum/iso7064/mod_11_2.py, stdnum/iso7064/mod_37_2.py, stdnum/iso7064/mod_37_36.py, stdnum/iso7064/mod_97_10.py, stdnum/luhn.py, stdnum/util.py, stdnum/verhoeff.py: Only catch Exception 2014-10-17 Arthur de Jong * [e2948bb] : Add Ecuadorian CI and RUC numbers Add modules for Ecuadorian Identification Card (CI - Cédula de identidad) and Fiscal Numbers (RUC - Registro Único de Contribuyentes) See: https://github.com/arthurdejong/python-stdnum/pull/12 2014-10-17 Arthur de Jong * [e5250be] stdnum/ec/ci.py, stdnum/ec/ruc.py, tests/test_ec_ci.doctest, tests/test_ec_ruc.doctest: Validate parts of numbers This raises exceptions when the provice or establishment number part of the number contains invalid values. 2014-10-17 Arthur de Jong * [10a044f] stdnum/ec/ci.py, stdnum/ec/ruc.py: Refactor checksum functions Use the CI checks from within the RUC module for natural RUC numbers (thereby eliminating a bug in the RUC checksum calculation) and simplify the checksum functions. 2014-10-17 Arthur de Jong * [f61b855] stdnum/ec/ci.py, stdnum/ec/ruc.py, tests/test_ec_ci.doctest, tests/test_ec_ruc.doctest: Use dedicated doctests This moves a number of the existing test cases to dedicated doctest files and extend the tests with more numbers and corner cases. This also fixes a few docstrings. 2014-10-12 Jonathan Finlay * [e8f1ca6] stdnum/ec/__init__.py, stdnum/ec/ci.py, stdnum/ec/ruc.py: Add Ecuadorian CI and RUC numbers Add modules for Ecuadorian Identification Card (CI - Cédula de identidad) and Fiscal Numbers (RUC - Registro Único de Contribuyentes) 2014-10-06 Arthur de Jong * [2700b7a] : Add Chinese Resident Identity Card Number 2014-10-06 Jiangge Zhang * [141d576] stdnum/cn/ric.py, tests/test_cn_ric.doctest: Support the Resident Identity Card Number of People's Republic China 2014-10-05 Jiangge Zhang * [10ae548] getcnloc.py, stdnum/cn/loc.dat: Download locations from the China (PRC) government site 2014-10-05 Jiangge Zhang * [e9eb546] stdnum/cn/__init__.py: Add stdnum.cn package for Chinese (PRC) numbers 2014-10-05 Arthur de Jong * [97ac94d] stdnum/my/nric.py, tests/test_my_nric.doctest: Update NRIC tests 2014-10-05 Arthur de Jong * [123e9cb] getmybp.py, stdnum/my/bp.dat: Update URLs for Malaysian code lists This updates the URLs for the state and country codes as published by the National Registration Department of Malaysia and changes the parsing to the new page layout. This also updates the data file. https://github.com/arthurdejong/python-stdnum/issues/14 2014-09-01 Tony Bajan * [86f60a2] stdnum/us/rtn.py: Add US bank routing transit numbers 2014-07-05 Arthur de Jong * [fbb0316] getisbn.py: Use ElementTree for simpler XML parsing 2014-07-05 Arthur de Jong * [03e4f97] getisbn.py, stdnum/isbn.dat: Fix getisbn script and update ISBN data file 2014-04-11 Arthur de Jong * [26517fe] getnumlist.py, stdnum/__init__.py: Improve package docstring formatting and show example 2014-03-18 Sharoon Thomas * [85dd6f2] stdnum/iso6346.py, tests/test_iso6346.doctest: Add support for ISO6346 Add validation and creation of check digit for ISO6346 codes. See: https://github.com/arthurdejong/python-stdnum/pull/9 2014-03-05 Jussi Räsänen * [2405c89] stdnum/eu/vat.py: Added a simple backwards compability check 2014-02-17 Arthur de Jong * [a4012f5] stdnum/ie/pps.py, stdnum/ie/vat.py, tests/test_eu_vat.doctest: Add support for 2013 extension of Irish PPS Numbers References: - https://www.welfare.ie/en/Pages/PPSN.aspx - http://www.citizensinformation.ie/en/social_welfare/irish_social_welfare_system/personal_public_service_number.html 2014-02-06 Arthur de Jong * [71d9837] stdnum/eu/at_02.py: Rename AT-02 module to stdnum.eu.at_02 2014-02-05 Sergi Almacellas Abellana * [099078e] stdnum/at_02.py: Add SEPA Creditor identifier (AT-02) 2014-02-02 Arthur de Jong * [1ac00a0] stdnum/it/codicefiscale.py, tests/test_it_codicefiscale.doctest: Add an Italian Codice Fiscale module This module validates 16 digit Italian tax codes for individuals. https://en.wikipedia.org/wiki/Italian_fiscal_code_card It is based on the pycodicefiscale module that can be found here: https://github.com/baxeico/pycodicefiscale Functions have been renamed to follow the stdnum naming scheme: isvalid() -> is_valid(), control_code -> calc_check_digit(), get_birthday() -> get_birth_date(), get_sex() -> get_gender(). The build() function for generating tax codes (based on name, birth place and date) has been left out because this number cannot be uniquely constructed with this information alone (numbers are issued by the Italian tax office with a mechanism handle duplicates). Addresses trac ticket #9. 2014-01-01 Arthur de Jong * [c3d669c] setup.py: Remove requirement on distribute This accidentally slipped into 907e410. 2013-12-31 Arthur de Jong * [d933aab] .gitignore, ChangeLog, NEWS, README, docs/index.rst, docs/stdnum.my.nric.rst, docs/stdnum.nl.brin.rst, docs/stdnum.nl.postcode.rst, docs/stdnum.us.atin.rst, docs/stdnum.us.ein.rst, docs/stdnum.us.itin.rst, docs/stdnum.us.ptin.rst, docs/stdnum.us.tin.rst, getiban.py, getimsi.py, stdnum/__init__.py: Get files ready for 0.9 release 2013-12-31 Arthur de Jong * [5c1765e] stdnum/iban.dat, stdnum/isbn.dat: Update database files 2013-12-31 Arthur de Jong * [4217c35] stdnum/isan.py, stdnum/meid.py, stdnum/util.py: Add pragma: no cover for Python 3 Some statements are not covered in Python 3 tests. 2013-12-31 Arthur de Jong * [6c49ca8] getiban.py: Update getiban script This switches to use the csv module to support multi-line column values. This also handles some problems in the BBAN structure column that would contain an IBAN structure. 2013-12-31 Arthur de Jong * [0ee74e5] ChangeLog: Generate Changelog with different formatter git log --date=short --name-only \ --format="%x0c%ad %aN <%aE>%n%n%x09* [%h]%x00%s%n%x00%+b%x00" | \ awk 'BEGIN { RS="\f"; FS="\0" } { if ($1) { gsub(/\n*$/, "", $4); gsub(/^\n*/, "", $4); gsub(/\n/, ", ", $4); gsub(/\ngit-svn-id.*/, "", $3); gsub(/\n/, "\n\t ", $3); print $1 " " $4 ": "; print "\t " $2 $3 }}' | \ fmt --width=78 -c > ChangeLog 2013-12-30 Cédric Krier * [a148835] stdnum/gb/vat.py, tests/test_gb_vat.doctest: Add some new VAT numbers for GB Add support for restarting from November 2009 using 9755. Add support for EU format of health authorities See: https://github.com/arthurdejong/python-stdnum/pull/4 2013-12-12 eneq123 * [4609a22] getimsi.py, stdnum/imsi.dat: Update parsing in getimsi script This updates the regexes and includes seom optimizations. See: https://github.com/arthurdejong/python-stdnum/issues/1 2013-12-30 Cédric Krier * [9ec3cb0] stdnum/eu/vat.py: Add support for proxy 2013-12-04 Arthur de Jong * [7f30979] getimsi.py, stdnum/imsi.dat: Update getimsi script This updates the script due to the Wikipedia article change and removes the code for getting the data from ITU for now. See: https://github.com/arthurdejong/python-stdnum/issues/1 2013-11-09 Arthur de Jong * [b0c47d5] stdnum/nl/__init__.py, stdnum/nl/postcode.py: Add a Dutch postal code module The Dutch postal code (postcode) consists of four digits followed by two characters and together with the house number should uniquely identify any address. Addresses trac ticket #7. 2013-11-09 Arthur de Jong * [73d05b0] stdnum/nl/brin.py: Add a Dutch Brin number module The Brin (Basis Registratie Instellingen) is a number to identify schools and related institutions. Addresses trac ticket #6. 2013-11-09 Arthur de Jong * [73330a1] stdnum/nl/onderwijsnummer.py: Clarify onderwijsnummer description 2013-11-09 Arthur de Jong * [188d3ea] : Add various United States Tax number modules This adds modules for the Individual Taxpayer Identification Number (ITIN), the Employer Identification Number (EIN), Adoption Taxpayer Identification Number (ATIN) and Preparer Tax Identification Number (PTIN) that together with the Social Security Number (SSN) are valid Taxpayer Identification Numbers (TIN) 2013-10-12 Arthur de Jong * [9530635] stdnum/us/tin.py: Add a United States TIN module The Taxpayer Identification Number is used used for tax purposes in the United States. This module uses the SSN, ITIN, EIN, PTIN and ATIN modules to determine validitiy of the TIN. 2013-10-11 Arthur de Jong * [316e3f2] stdnum/us/ptin.py: Add a United States PTIN module A Preparer Tax Identification Number (PTIN) is United States identification number for tax return preparers. It is an eight-digit number prefixed with a capital P. 2013-10-11 Arthur de Jong * [47ea6ea] stdnum/us/atin.py: Add a United States ATIN module An Adoption Taxpayer Identification Number (ATIN) is a temporary nine-digit number issued by the United States IRS for a child for whom the adopting parents cannot obtain a Social Security Number. 2013-10-11 Arthur de Jong * [b1c9ba5] stdnum/us/ein.dat, stdnum/us/ein.py: Add a United States EIN module The Employer Identification Number (EIN), also known as Federal Employer Identification Number (FEIN), is used to identify a business entity in the United States. It is issued to anyone that has to pay withholding taxes on employees. 2013-10-11 Arthur de Jong * [19039f7] stdnum/us/itin.py: Add a United States ITIN module The ITIN (Individual Taxpayer Identification Number) is issued by the United States IRS to individuals who are required to have a taxpayer identification number but who are not eligible to obtain a Social Security Number. 2013-10-11 Arthur de Jong * [70b974b] stdnum/meid.py: Remove unused import 2013-11-08 Arthur de Jong * [f122c88] stdnum/util.py: Try to replace Unicode characters with ASCII This changes the stdnum.util.clean() method that is used by all modules to replace alternative Unicode dashes, dots, etc. by their ASCII equivalent so the numbers will be automatically converted and validated. Inspiration for this change came from https://github.com/JNRowe/pyisbn/pull/6 2013-06-14 Arthur de Jong * [c042f02] ChangeLog, NEWS, stdnum/__init__.py: Get files ready for 0.8.1 release 2013-06-14 Arthur de Jong * [31e5e81] MANIFEST.in, setup.py: Ensure that all used files are included in the sdist 2013-06-09 Arthur de Jong * [7fa9822] ChangeLog, NEWS, README, docs/index.rst, getnumlist.py, setup.py, stdnum/__init__.py: Get files ready for 0.8 release 2013-06-09 Arthur de Jong * [9597010] stdnum/iban.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/isil.dat: Update database files We manually tweak the Finland IBAN entry. We should probably change the parsing so that it uses the IBAN structure instead of the BBAN structure. 2013-06-09 Arthur de Jong * [19cbb3c] stdnum/my/nric.py: Fix NRIC module description 2013-06-08 Arthur de Jong * [46a7996] getmybp.py, stdnum/my/__init__.py, stdnum/my/bp.dat, stdnum/my/nric.py, tests/test_my_nric.doctest: Add a Malaysian NRIC No. module NRIC No. (National Registration Identity Card Number) is the unique identifier for issued to Malaysian citizens and permanent residents. 2013-06-08 Arthur de Jong * [999f2c3] : Provide a validate() function in all modules This provides an additional means of doing number validation that allows applications calling this library to get more information about why the validation failed and present more informative messages to the user. This introduces a collection of exceptions which will be raised by the validate() function in each module. All modules have been updated to provide this new function. 2013-05-22 Arthur de Jong * [cb69921] README, docs/index.rst, docs/stdnum.exceptions.rst: Document the validate() function and exceptions 2013-05-18 Arthur de Jong * [e00744c] stdnum/util.py: Use validate() in stdnum.util 2013-05-17 Arthur de Jong * [3d3a97d] stdnum/us/ssn.py: Implement validate() for U.S. Social Security Number 2013-05-17 Arthur de Jong * [4bfce3f] stdnum/eu/vat.py, tests/test_eu_vat.doctest: Implement validate() for European VAT numbers 2013-05-17 Arthur de Jong * [1aaf902] stdnum/sk/dph.py, stdnum/sk/rc.py: Implement validate() for Slovak numbers 2013-05-17 Arthur de Jong * [8982d1e] stdnum/si/ddv.py: Implement validate() for Slovenian VAT numbers 2013-05-17 Arthur de Jong * [522a599] stdnum/se/vat.py: Implement validate() for Swedish VAT numbers 2013-05-17 Arthur de Jong * [8e7d807] stdnum/pt/nif.py: Implement validate() for Portuguese VAT numbers 2013-05-17 Arthur de Jong * [7e865db] stdnum/pl/nip.py: Implement validate() for Polish numbers 2013-05-17 Arthur de Jong * [96c5080] stdnum/mt/vat.py: Implement validate() for Maltese numbers 2013-05-17 Arthur de Jong * [2ff4950] stdnum/lv/pvn.py: Implement validate() for Latvian numbers 2013-05-17 Arthur de Jong * [9845b0a] stdnum/lu/tva.py: Implement validate() for Luxembourgian numbers 2013-05-17 Arthur de Jong * [04cfb84] stdnum/lt/pvm.py: Implement validate() for Lithuanian numbers 2013-05-17 Arthur de Jong * [b1d5a72] stdnum/it/iva.py: Implement validate() for Italian numbers 2013-05-17 Arthur de Jong * [083993b] stdnum/ie/pps.py, stdnum/ie/vat.py: Implement validate() for Irish numbers 2013-05-17 Arthur de Jong * [301ba25] stdnum/hu/anum.py: Implement validate() for Hungarian numbers 2013-05-17 Arthur de Jong * [31f2684] stdnum/hr/oib.py: Implement validate() for Croatian numbers 2013-05-17 Arthur de Jong * [1932f69] stdnum/gr/vat.py: Implement validate() for Greek numbers 2013-05-17 Arthur de Jong * [10710dc] stdnum/gb/vat.py, tests/test_gb_vat.doctest: Implement validate() for United Kingdom numbers 2013-05-17 Arthur de Jong * [4753c09] stdnum/fi/alv.py, stdnum/fi/hetu.py, tests/test_fi_hetu.doctest: Implement validate() for Finnish numbers 2013-05-17 Arthur de Jong * [2259cbb] stdnum/es/cif.py, stdnum/es/dni.py, stdnum/es/nie.py, stdnum/es/nif.py: Implement validate() for Spanish numbers 2013-05-17 Arthur de Jong * [07c66e1] stdnum/ee/kmkr.py: Implement validate() for Estonian numbers 2013-05-17 Arthur de Jong * [8caecc5] stdnum/dk/cpr.py, stdnum/dk/cvr.py: Implement validate() for Danish numbers 2013-05-17 Arthur de Jong * [360480b] stdnum/de/vat.py: Implement validate() for German numbers 2013-05-17 Arthur de Jong * [fce6196] stdnum/cy/vat.py: Implement validate() for Cypriot numbers 2013-05-17 Arthur de Jong * [14e382f] stdnum/cz/dic.py, stdnum/cz/rc.py: Implement validate() for Czech numbers 2013-05-17 Arthur de Jong * [54ce2d7] stdnum/br/cpf.py: Implement validate() for Brazillian numbers 2013-05-17 Arthur de Jong * [6080907] stdnum/bg/egn.py, stdnum/bg/pnf.py, stdnum/bg/vat.py, tests/test_bg_vat.doctest: Implement validate() for Bulgarian numbers 2013-05-17 Arthur de Jong * [33ce4e9] stdnum/be/vat.py: Implement validate() for Belgian numbers 2013-05-17 Arthur de Jong * [66d6259] stdnum/at/uid.py: Implement validate() for Austrian numbers 2013-05-11 Arthur de Jong * [05547a4] stdnum/ro/cf.py, stdnum/ro/cnp.py: Implement validate() for Romanian numbers 2013-05-17 Arthur de Jong * [fc1432c] stdnum/fr/siren.py, stdnum/fr/tva.py: Implement validate() for French numbers 2013-05-05 Arthur de Jong * [62cafb4] stdnum/nl/bsn.py, stdnum/nl/btw.py, stdnum/nl/onderwijsnummer.py: Implement validate() for Dutch numbers 2013-05-04 Arthur de Jong * [cf88e23] stdnum/meid.py, tests/test_meid.doctest: Implement validate() for MEID 2013-05-04 Arthur de Jong * [c6f41f6] stdnum/issn.py: Implement validate() for ISSN 2013-05-04 Arthur de Jong * [21f07b3] stdnum/ismn.py, tests/test_ismn.doctest: Implement validate() for ISMN 2013-05-04 Arthur de Jong * [c07609f] stdnum/isil.py: Implement validate() for ISIL 2013-05-04 Arthur de Jong * [a18f1ac] stdnum/isan.py, tests/test_isan.doctest: Implement validate() for ISAN 2013-05-01 Arthur de Jong * [3ac8164] stdnum/iban.py: Implement validate() for IBAN 2013-05-03 Arthur de Jong * [12bd684] stdnum/grid.py: Implement validate() for GRid numbers 2013-05-04 Arthur de Jong * [9cee495] stdnum/imsi.py: Implement validate() for IMSI 2013-05-04 Arthur de Jong * [6e4bb71] stdnum/imei.py, tests/test_imei.doctest: Implement validate() for IMEI numbers 2013-05-04 Arthur de Jong * [efa2550] stdnum/iso7064/mod_11_10.py, stdnum/iso7064/mod_11_2.py, stdnum/iso7064/mod_37_2.py, stdnum/iso7064/mod_37_36.py, stdnum/iso7064/mod_97_10.py, tests/test_iso7064.doctest: Implement validate() for ISO 7064 algorithms 2013-05-03 Arthur de Jong * [5c9090b] stdnum/verhoeff.py, tests/test_verhoeff.doctest: Implement validate() for the Verhoeff checksum 2013-05-03 Arthur de Jong * [9ad5139] stdnum/luhn.py, tests/test_luhn.doctest: Implement validate() for the Luhn algorithms 2013-05-03 Arthur de Jong * [9580046] stdnum/isbn.py, tests/test_isbn.doctest: Implement validate() for ISBN 2013-05-03 Arthur de Jong * [fa1864f] stdnum/ean.py, tests/test_ean.doctest: Implement validate() for EAN 2013-06-07 Arthur de Jong * [8b9ef8f] stdnum/util.py: Raise a proper exception if cleaning fails 2013-06-07 Arthur de Jong * [1ac5437] setup.cfg, stdnum/exceptions.py: Provide a module with validation exceptions This introduces a new module for switching the validation scheme. Instead of using the is_valid() function that returns a boolean a validate() function either returns the sanitised number or raises an exception that should indicate the kind of validation failure. This should make it easier for applications calling this library to present more informative messages to the user. 2013-06-07 Arthur de Jong * [99586c9] stdnum/__init__.py, stdnum/de/vat.py, stdnum/nl/bsn.py, stdnum/util.py: Revert generating stdnum docstring dynamically Generating the docstring dynamically results in all stdnum modules being imported for every import from any stdnum module which is a performance hit. So we switch back to a manually generated list, using: from stdnum.util import get_module_list print '\n'.join(get_module_list()) This also shortens a few short descriptions to attempt to fit things on one line. 2013-06-07 Arthur de Jong * [a655e82] docs/conf.py, docs/index.rst: Documentation consistency improvements 2013-06-07 Arthur de Jong * [37a2afd] tests/test_iso7064.doctest: The robustness test were moved to the general tests 2013-06-07 Arthur de Jong * [90b7c4a] stdnum/numdb.py: Remove empty line 2013-06-07 Arthur de Jong * [bcb0a0b] stdnum/grid.py: GRid's format() function shouldn't have add_check_digit parameter 2013-04-26 Arthur de Jong * [2d956eb] stdnum/util.py: Use a cleaner way to get all stdnum modules This mechanism should work from Python 2.6 up to and including Python 3.3. 2013-04-26 Arthur de Jong * [30c832f] stdnum/numdb.py: Fix doctest to not be dependant on dict ordering 2013-04-26 Arthur de Jong * [51a55be] .gitignore: Add a .gitignore file 2012-09-22 Arthur de Jong * [3f6d52a] stdnum/__init__.py, stdnum/util.py: generate part of the stdnum docstring based on introspection of the modules 2012-06-16 Arthur de Jong * [af7e837] : set svn:ignore properly 2012-02-26 Arthur de Jong * [8f2e44c] stdnum/bg/egn.py, stdnum/cz/rc.py, stdnum/dk/cpr.py, stdnum/fi/hetu.py, stdnum/isan.py, stdnum/lv/pvn.py, stdnum/meid.py, stdnum/ro/cnp.py, tests/test_isan.doctest, tests/test_ismn.doctest, tests/test_robustness.doctest: re-add Python3 support 2012-02-26 Arthur de Jong * [3325052] ChangeLog, NEWS, stdnum/__init__.py: get files ready for 0.7 release 2012-02-26 Arthur de Jong * [a3ba206] stdnum/iban.dat, stdnum/imsi.dat, stdnum/isbn.dat, stdnum/isil.dat: update data files 2012-02-26 Arthur de Jong * [c240eff] getnumlist.py: also generate a list of modules for use in the Spinx documentation 2012-02-26 Arthur de Jong * [54b0f47] README, getnumlist.py, stdnum/__init__.py: use a script to generate the list of number formats in stdnum 2012-02-26 Arthur de Jong * [dada6a4] stdnum/eu/vat.py, stdnum/gb/vat.py, stdnum/gr/vat.py, stdnum/grid.py, stdnum/hr/oib.py, stdnum/hu/anum.py, stdnum/iban.py, stdnum/ie/pps.py, stdnum/ie/vat.py, stdnum/imei.py, stdnum/isan.py, stdnum/iso7064/__init__.py, stdnum/iso7064/mod_11_10.py, stdnum/iso7064/mod_11_2.py, stdnum/iso7064/mod_37_2.py, stdnum/iso7064/mod_37_36.py, stdnum/iso7064/mod_97_10.py, stdnum/lt/pvm.py, stdnum/luhn.py, stdnum/meid.py, stdnum/verhoeff.py: some more documentation improvements 2012-02-26 Arthur de Jong * [13218a0] setup.py: make script executable 2012-02-26 Arthur de Jong * [c2f0ea2] stdnum/fr/siren.py: add a to_vta() function to the stdnum.fr.siren module 2012-02-26 Arthur de Jong * [902a656] stdnum/__init__.py, stdnum/at/uid.py, stdnum/be/vat.py, stdnum/bg/egn.py, stdnum/bg/pnf.py, stdnum/bg/vat.py, stdnum/br/cpf.py, stdnum/cy/vat.py, stdnum/cz/dic.py, stdnum/cz/rc.py, stdnum/de/vat.py, stdnum/dk/cpr.py, stdnum/dk/cvr.py, stdnum/ean.py, stdnum/ee/kmkr.py, stdnum/es/cif.py, stdnum/es/dni.py, stdnum/es/nie.py, stdnum/es/nif.py, stdnum/eu/vat.py, stdnum/fi/alv.py, stdnum/fi/hetu.py, stdnum/fr/siren.py, stdnum/fr/tva.py, stdnum/gb/vat.py, stdnum/gr/vat.py, stdnum/grid.py, stdnum/hr/oib.py, stdnum/hu/anum.py, stdnum/iban.py, stdnum/ie/pps.py, stdnum/ie/vat.py, stdnum/imei.py, stdnum/imsi.py, stdnum/isan.py, stdnum/isbn.py, stdnum/isil.py, stdnum/ismn.py, stdnum/iso7064/__init__.py, stdnum/iso7064/mod_11_10.py, stdnum/iso7064/mod_11_2.py, stdnum/iso7064/mod_37_2.py, stdnum/iso7064/mod_37_36.py, stdnum/iso7064/mod_97_10.py, stdnum/issn.py, stdnum/it/iva.py, stdnum/lt/pvm.py, stdnum/lu/tva.py, stdnum/luhn.py, stdnum/lv/pvn.py, stdnum/meid.py, stdnum/mt/vat.py, stdnum/nl/bsn.py, stdnum/nl/btw.py, stdnum/nl/onderwijsnummer.py, stdnum/numdb.py, stdnum/pl/nip.py, stdnum/pt/nif.py, stdnum/ro/cf.py, stdnum/ro/cnp.py, stdnum/se/vat.py, stdnum/si/ddv.py, stdnum/sk/dph.py, stdnum/sk/rc.py, stdnum/us/ssn.py, stdnum/util.py, stdnum/verhoeff.py: ensure that the module docstrings are in a somewhat more usable format 2012-02-25 Arthur de Jong * [907e410] setup.py: add the optional dependency on suds for the stdnum.eu.vat.check_vies() function 2012-02-24 Arthur de Jong * [ae9268b] stdnum/cz/rc.py: make the get_birth_date() function publically available 2012-02-24 Arthur de Jong * [4dfc8d7] docs/_templates/autosummary/module.rst, docs/conf.py, docs/index.rst, docs/stdnum.at.uid.rst, docs/stdnum.be.vat.rst, docs/stdnum.bg.egn.rst, docs/stdnum.bg.pnf.rst, docs/stdnum.bg.vat.rst, docs/stdnum.br.cpf.rst, docs/stdnum.cy.vat.rst, docs/stdnum.cz.dic.rst, docs/stdnum.cz.rc.rst, docs/stdnum.de.vat.rst, docs/stdnum.dk.cpr.rst, docs/stdnum.dk.cvr.rst, docs/stdnum.ean.rst, docs/stdnum.ee.kmkr.rst, docs/stdnum.es.cif.rst, docs/stdnum.es.dni.rst, docs/stdnum.es.nie.rst, docs/stdnum.es.nif.rst, docs/stdnum.eu.vat.rst, docs/stdnum.fi.alv.rst, docs/stdnum.fi.hetu.rst, docs/stdnum.fr.siren.rst, docs/stdnum.fr.tva.rst, docs/stdnum.gb.vat.rst, docs/stdnum.gr.vat.rst, docs/stdnum.grid.rst, docs/stdnum.hr.oib.rst, docs/stdnum.hu.anum.rst, docs/stdnum.iban.rst, docs/stdnum.ie.pps.rst, docs/stdnum.ie.vat.rst, docs/stdnum.imei.rst, docs/stdnum.imsi.rst, docs/stdnum.isan.rst, docs/stdnum.isbn.rst, docs/stdnum.isil.rst, docs/stdnum.ismn.rst, docs/stdnum.iso7064.rst, docs/stdnum.issn.rst, docs/stdnum.it.iva.rst, docs/stdnum.lt.pvm.rst, docs/stdnum.lu.tva.rst, docs/stdnum.luhn.rst, docs/stdnum.lv.pvn.rst, docs/stdnum.meid.rst, docs/stdnum.mt.vat.rst, docs/stdnum.nl.bsn.rst, docs/stdnum.nl.btw.rst, docs/stdnum.nl.onderwijsnummer.rst, docs/stdnum.pl.nip.rst, docs/stdnum.pt.nif.rst, docs/stdnum.ro.cf.rst, docs/stdnum.ro.cnp.rst, docs/stdnum.se.vat.rst, docs/stdnum.si.ddv.rst, docs/stdnum.sk.dph.rst, docs/stdnum.sk.rc.rst, docs/stdnum.us.ssn.rst, docs/stdnum.verhoeff.rst, setup.cfg: generate documentation using Sphinx 2012-02-23 Arthur de Jong * [093b1a1] README, stdnum/__init__.py, stdnum/dk/cpr.py: add a CPR (personnummer, the Danish citizen number) module 2012-02-23 Arthur de Jong * [89e4d78] README, stdnum/__init__.py, stdnum/ie/pps.py: add a PPS No (Personal Public Service Number, Irish personal number) module 2012-02-22 Arthur de Jong * [3a9c407] README, stdnum/__init__.py, stdnum/hr/__init__.py, stdnum/hr/oib.py: add an OIB (Osobni identifikacijski broj, Croatian personal identification number) module 2012-02-20 Arthur de Jong * [680b7d1] numdb-test.dat, stdnum/numdb.py: rename numdb test file 2012-02-20 Arthur de Jong * [68f62bf] stdnum/eu/vat.py: add a stdnum.eu.vat.check_vies() function to do an on-line check of the VAT number 2012-02-19 Arthur de Jong * [e640e3b] stdnum/iban.py, stdnum/numdb.py: add "pragma: no cover" statements to code that isn't expected to be covered 2012-02-19 Arthur de Jong * [b561d59] README, stdnum/__init__.py, stdnum/eu/__init__.py, stdnum/eu/vat.py, tests/test_eu_vat.doctest: add a VAT (European Union VAT number) module 2012-02-19 Arthur de Jong * [61af19d] README, stdnum/__init__.py: make number description consistent 2012-02-19 Arthur de Jong * [eeb5c61] stdnum/at/__init__.py, stdnum/cz/__init__.py, stdnum/dk/__init__.py, stdnum/ee/__init__.py, stdnum/es/__init__.py, stdnum/fi/__init__.py, stdnum/fr/__init__.py, stdnum/hu/__init__.py, stdnum/it/__init__.py, stdnum/lt/__init__.py, stdnum/lu/__init__.py, stdnum/lv/__init__.py, stdnum/nl/__init__.py, stdnum/pl/__init__.py, stdnum/pt/__init__.py, stdnum/ro/__init__.py, stdnum/si/__init__.py, stdnum/sk/__init__.py: for all countries, provide vat as an alias for the local vat identifier 2012-02-19 Arthur de Jong * [6755b94] stdnum/at/__init__.py, stdnum/be/__init__.py, stdnum/bg/__init__.py, stdnum/br/__init__.py, stdnum/cy/__init__.py, stdnum/cz/__init__.py, stdnum/de/__init__.py, stdnum/dk/__init__.py, stdnum/ee/__init__.py, stdnum/es/__init__.py, stdnum/fi/__init__.py, stdnum/fr/__init__.py, stdnum/gb/__init__.py, stdnum/gr/__init__.py, stdnum/hu/__init__.py, stdnum/ie/__init__.py, stdnum/it/__init__.py, stdnum/lt/__init__.py, stdnum/lu/__init__.py, stdnum/lv/__init__.py, stdnum/mt/__init__.py, stdnum/nl/__init__.py, stdnum/pl/__init__.py, stdnum/pt/__init__.py, stdnum/ro/__init__.py, stdnum/se/__init__.py, stdnum/si/__init__.py, stdnum/sk/__init__.py, stdnum/us/__init__.py: give all packages a description 2012-02-19 Arthur de Jong * [6d74fe9] stdnum/nl/vat.py: remove stdnum.nl.vat alias module 2012-02-19 Arthur de Jong * [528901d] stdnum/util.py, tests/test_robustness.doctest: use introspection to find number modules and test them 2012-02-18 Arthur de Jong * [2d80a24] README, stdnum/__init__.py, stdnum/bg/vat.py, tests/test_bg_vat.doctest, tests/test_robustness.doctest: add a VAT (Идентификационен номер по ДДС, Bulgarian VAT numbers) module 2012-02-18 Arthur de Jong * [1384488] README, stdnum/__init__.py, stdnum/bg/pnf.py, tests/test_robustness.doctest: add a PNF (ЛНЧ, Личен номер на чужденец, Bulgarian personal number of a foreigner) module 2012-02-18 Arthur de Jong * [a24e98e] README, stdnum/__init__.py, stdnum/bg/__init__.py, stdnum/bg/egn.py, tests/test_robustness.doctest: add an EGN (ЕГН, Единен граждански номер, Bulgarian personal identity codes) module 2012-02-18 Arthur de Jong * [4ac3fe7] tests/test_robustness.doctest: explicitly test for False 2012-02-18 Arthur de Jong * [0c78d90] stdnum/lt/pvm.py: explicitly return False if no rule matches 2012-02-18 Arthur de Jong * [cddb5f9] README, stdnum/__init__.py, stdnum/gb/__init__.py, stdnum/gb/vat.py, tests/test_gb_vat.doctest, tests/test_robustness.doctest: add a VAT (United Kingdom (and Isle of Man) VAT registration number) module 2012-02-18 Arthur de Jong * [6c436ec] tests/test_fi_hetu.doctest: fix typo 2012-02-18 Arthur de Jong * [aa39c92] README, stdnum/__init__.py, stdnum/se/__init__.py, stdnum/se/vat.py, tests/test_robustness.doctest: add a VAT (Moms, Mervärdesskatt, Swedish VAT number) module 2012-02-18 Arthur de Jong * [3a7a91c] README, stdnum/__init__.py, stdnum/si/__init__.py, stdnum/si/ddv.py, tests/test_robustness.doctest: add a ID za DDV (Davčna številka, Slovenian VAT number) module 2012-02-18 Arthur de Jong * [ebbd1af] README, stdnum/__init__.py, stdnum/pl/__init__.py, stdnum/pl/nip.py, tests/test_robustness.doctest: add a NIP (Numer Identyfikacji Podatkowej, Polish VAT number) module 2012-02-18 Arthur de Jong * [c75f072] README, stdnum/__init__.py, stdnum/mt/__init__.py, stdnum/mt/vat.py, tests/test_robustness.doctest: add a VAT (Maltese VAT number) module 2012-02-17 Arthur de Jong * [0922f3c] stdnum/it/iva.py: strip a few more separators 2012-02-17 Arthur de Jong * [b708920] README, stdnum/__init__.py, stdnum/fr/tva.py, tests/test_robustness.doctest: add a TVA (Numéro d'identification à la taxe sur la valeur ajoutée, French VAT number) module 2012-02-17 Arthur de Jong * [dc8e9a3] README, stdnum/__init__.py, stdnum/lt/__init__.py, stdnum/lt/pvm.py, tests/test_robustness.doctest: add a PVM (Pridėtinės vertės mokestis mokėtojo kodas, Lithuanian VAT number) module 2012-02-17 Arthur de Jong * [20296ef] README, stdnum/__init__.py, stdnum/ee/__init__.py, stdnum/ee/kmkr.py, tests/test_robustness.doctest: add a KMKR (Käibemaksukohuslase, Estonian VAT number) module 2012-02-17 Arthur de Jong * [2100c28] README, stdnum/__init__.py, stdnum/ie/__init__.py, stdnum/ie/vat.py, tests/test_robustness.doctest: add a VAT (Irish VAT number) module 2012-02-17 Arthur de Jong * [d2f1348] README, stdnum/__init__.py, stdnum/hu/__init__.py, stdnum/hu/anum.py, tests/test_robustness.doctest: add an ANUM (Közösségi adószám, Hungarian VAT number) module 2012-02-17 Arthur de Jong * [d803443] README, stdnum/__init__.py, stdnum/cz/dic.py, tests/test_robustness.doctest: add a DIČ (Daňové identifikační číslo, Czech VAT number) module 2012-02-17 Arthur de Jong * [0d2e4cc] README, stdnum/__init__.py, stdnum/fi/alv.py, tests/test_robustness.doctest: add an ALV nro (Arvonlisäveronumero, Finnish VAT number) module 2012-02-17 Arthur de Jong * [03eccc4] README, stdnum/__init__.py, stdnum/sk/dph.py, tests/test_robustness.doctest: add IČ DPH (Identifikačné číslo pre daň z pridanej hodnoty, Slovak VAT number) module 2012-02-16 Arthur de Jong * [389c306] README, stdnum/__init__.py, stdnum/pt/__init__.py, stdnum/pt/nif.py, tests/test_robustness.doctest: add a NIF (Número de identificação fiscal, Portuguese VAT number) module 2012-02-13 Arthur de Jong * [cdc7f96] README, stdnum/__init__.py, stdnum/at/__init__.py, stdnum/at/uid.py, tests/test_robustness.doctest: add a UID (Umsatzsteuer-Identifikationsnummer, Austrian VAT number) module 2012-02-13 Arthur de Jong * [e0bb4e8] README, stdnum/__init__.py, stdnum/cy/__init__.py, stdnum/cy/vat.py, tests/test_robustness.doctest: add a Αριθμός Εγγραφής Φ.Π.Α. (Cypriot VAT number) module 2012-02-12 Arthur de Jong * [402a0d5] stdnum/es/cif.py, stdnum/it/iva.py, stdnum/util.py: use the luhn module where possible 2012-02-12 Arthur de Jong * [1c2b4c3] tests/test_robustness.doctest: fix typo in header 2012-02-12 Arthur de Jong * [09ef54d] README, stdnum/__init__.py, stdnum/it/__init__.py, stdnum/it/iva.py, tests/test_robustness.doctest: add a Partita IVA (Italian VAT number) module 2012-02-12 Arthur de Jong * [ffc824b] README, stdnum/__init__.py, stdnum/ro/cf.py, tests/test_robustness.doctest: add a CF (Cod de înregistrare în scopuri de TVA, Romanian VAT number) module 2012-02-12 Arthur de Jong * [9d65f6a] README, stdnum/__init__.py, stdnum/ro/__init__.py, stdnum/ro/cnp.py, tests/test_robustness.doctest: add a CNP (Cod Numeric Personal, Romanian Numerical Personal Code) module 2012-02-12 Arthur de Jong * [60533cd] stdnum/gr/vat.py: also strip : as seen in some numbers 2012-02-11 Arthur de Jong * [74c4c71] README, stdnum/__init__.py, stdnum/lu/__init__.py, stdnum/lu/tva.py, tests/test_robustness.doctest: add a TVA (Numéro d'identification à la taxe sur la valeur ajoutée, Luxembourgian VAT number) module 2012-02-11 Arthur de Jong * [74f4e2a] README, stdnum/__init__.py, stdnum/dk/__init__.py, stdnum/dk/cvr.py, tests/test_robustness.doctest: add a CVR (Momsregistreringsnummer, Danish VAT number) module 2012-02-11 Arthur de Jong * [3c64f1e] stdnum/be/vat.py: add missing test 2012-02-11 Arthur de Jong * [b8c3ba6] stdnum/be/vat.py: clean up numbers starting with (0) 2012-02-11 Arthur de Jong * [8a10861] README, stdnum/__init__.py, stdnum/lv/__init__.py, stdnum/lv/pvn.py, tests/test_robustness.doctest: add a PVN (Pievienotās vērtības nodokļa, Latvian VAT number) module 2012-02-11 Arthur de Jong * [a3610a3] README, stdnum/__init__.py, stdnum/es/nif.py, tests/test_robustness.doctest: add a NIF (Número de Identificación Fiscal, Spanish VAT number) module 2012-02-11 Arthur de Jong * [aa90c4f] README, stdnum/__init__.py, stdnum/es/cif.py, tests/test_robustness.doctest: add a CIF (Certificado de Identificación Fiscal, Spanish tax identification number) module 2012-02-11 Arthur de Jong * [a574e6c] stdnum/util.py: implement a digitsum() function to find the sub of all digits in a number 2012-02-11 Arthur de Jong * [84d1ee7] stdnum/es/nie.py: fix description and remove unnecessary import 2012-02-10 Arthur de Jong * [fa2d398] README, stdnum/__init__.py, stdnum/es/nie.py, tests/test_robustness.doctest: add a NIE (Número de Identificación de Extranjeros, Spanish identification number for foreigners) module 2012-02-10 Arthur de Jong * [fe3210f] README, stdnum/__init__.py, stdnum/es/__init__.py, stdnum/es/dni.py, tests/test_robustness.doctest: add a DNI (Documento nacional de identidad, Spanish personal identity codes) module 2012-02-10 Arthur de Jong * [4439f47] README, stdnum/__init__.py, stdnum/be/__init__.py, stdnum/be/vat.py, tests/test_robustness.doctest: add a BTW, TVA, NWSt (Belgian VAT number) module 2012-02-10 Arthur de Jong * [1ab602c] README, stdnum/__init__.py, stdnum/sk/__init__.py, stdnum/sk/rc.py: also make the stdnum.cz.rc module available as stdnum.sk.rc 2012-02-10 Arthur de Jong * [e9e5861] stdnum/nl/vat.py: also make the stdnum.nl.btw module available as stdnum.nl.vat 2012-02-10 Arthur de Jong * [c795b3c] stdnum/nl/btw.py: fix number in test and ensure that number is not all zeroes 2012-02-10 Arthur de Jong * [2bb9231] stdnum/cz/rc.py: add some info to description 2012-02-10 Arthur de Jong * [1aeeaf4] README, stdnum/__init__.py, stdnum/de/__init__.py, stdnum/de/vat.py, tests/test_robustness.doctest: add an Ust ID Nr. (Umsatzsteur Identifikationnummer, the German VAT number) module 2012-02-10 Arthur de Jong * [473b3ca] README, stdnum/__init__.py, stdnum/gr/__init__.py, stdnum/gr/vat.py, tests/test_robustness.doctest: add a FPA, ΦΠΑ (Foros Prostithemenis Aksias, the Greek VAT number) module 2012-02-05 Arthur de Jong * [9f1d47b] README, stdnum/__init__.py, stdnum/fr/__init__.py, stdnum/fr/siren.py, tests/test_robustness.doctest: add a SIREN (Système d'Identification du Répertoire des Entreprises, a French company identification number) module 2012-02-05 Arthur de Jong * [575fc75] README, stdnum/__init__.py, stdnum/cz/__init__.py, stdnum/cz/rc.py, tests/test_robustness.doctest: add a RČ (Rodné číslo, the Czech birth numbers) module 2012-02-04 Arthur de Jong * [41dd815] stdnum/br/cpf.py, stdnum/ean.py, stdnum/grid.py, stdnum/iban.py, stdnum/imei.py, stdnum/imsi.py, stdnum/isan.py, stdnum/isbn.py, stdnum/ismn.py, stdnum/issn.py, stdnum/meid.py, stdnum/nl/bsn.py, stdnum/nl/btw.py, stdnum/nl/onderwijsnummer.py, stdnum/us/ssn.py, stdnum/util.py: implement a stdnum.util module for holding utility functions (for now clean()) 2012-02-04 Arthur de Jong * [54cc207] tests/test_robustness.doctest: some extra rubustness checks 2012-02-04 Arthur de Jong * [b43817c] stdnum/nl/bsn.py, stdnum/nl/onderwijsnummer.py: rename calc_checksum() to checksum() for consistency 2012-02-04 Arthur de Jong * [548f129] stdnum/iso7064/mod_37_36.py: use integer division 2012-02-02 Arthur de Jong * [9efde4f] README, stdnum/__init__.py, stdnum/nl/btw.py, tests/test_robustness.doctest: add a BTW (the Dutch VAT number) module 2012-02-02 Arthur de Jong * [086e509] README, stdnum/__init__.py, stdnum/nl/bsn.py, stdnum/nl/onderwijsnummer.py, tests/test_robustness.doctest: add an onderwijsnummer (Dutch school number) module 2011-12-31 Arthur de Jong * [587c538] setup.py: revert switching to distutils part of r93, keep restructuring part 2011-12-31 Arthur de Jong * [6756d79] setup.cfg, setup.py: switch to distutils 2011-11-07 Arthur de Jong * [e6020b9] README, stdnum/__init__.py, stdnum/fi/__init__.py, stdnum/fi/hetu.py, tests/test_fi_hetu.doctest, tests/test_robustness.doctest: add a HETU (Finnish personal identity code) module as provided by Jussi Judin (#5) 2011-09-30 Arthur de Jong * [77ac8d4] setup.py: fix version number use (fix r86) 2011-09-30 Arthur de Jong * [6cdfb6b] ChangeLog, NEWS, stdnum/__init__.py: get files ready for 0.6 release 2011-09-30 Arthur de Jong * [1451b47] stdnum/imsi.dat, stdnum/isbn.dat, stdnum/isil.dat: update data files 2011-09-30 Arthur de Jong * [6ec6c7e] setup.py, stdnum/__init__.py: move the version number definition to the stdnum package 2011-09-25 Arthur de Jong * [ae2013d] stdnum/ismn.py: implement an ismn_type() function 2011-09-23 Arthur de Jong * [14b97f9] : ignore __pycache__ directories 2011-09-23 Arthur de Jong * [cbd114e] README, getimsi.py, stdnum/__init__.py, stdnum/imsi.dat, stdnum/imsi.py, tests/test_robustness.doctest: add an IMSI (International Mobile Subscriber Identity) module 2011-09-23 Arthur de Jong * [68c98f0] stdnum/imei.py: implement an imei.split() function that splits the number into a TAC, serial number and checksum or software version 2011-09-23 Arthur de Jong * [e6cd768] getiban.py: remove unneeded import 2011-09-20 Arthur de Jong * [4e8d7e4] stdnum/isbn.py, tests/test_isbn.doctest: implement a conversion function from ISBN13 to ISBN10 2011-09-20 Arthur de Jong * [d6f9ba2] tests/test_imei.doctest, tests/test_isan.doctest, tests/test_isbn.doctest, tests/test_ismn.doctest: fix space before inline comments 2011-09-20 Arthur de Jong * [c4ad099] stdnum/isbn.py, tests/test_isbn.doctest: fix a problem with an ISBN13 with a valid check digit but with an unknown bookland prefix 2011-09-04 Arthur de Jong * [1c7c198] setup.py: fix homepage URL 2011-08-19 Arthur de Jong * [881e8a6] getiban.py, getisbn.py, getisil.py, setup.py, stdnum/br/cpf.py, stdnum/ean.py, stdnum/grid.py, stdnum/iban.py, stdnum/imei.py, stdnum/isan.py, stdnum/isbn.py, stdnum/isil.py, stdnum/ismn.py, stdnum/iso7064/mod_11_10.py, stdnum/iso7064/mod_11_2.py, stdnum/iso7064/mod_37_2.py, stdnum/iso7064/mod_37_36.py, stdnum/iso7064/mod_97_10.py, stdnum/issn.py, stdnum/luhn.py, stdnum/meid.py, stdnum/nl/bsn.py, stdnum/numdb.py, stdnum/us/ssn.py, stdnum/verhoeff.py: make source code layout follow PEP8 more 2011-07-09 Arthur de Jong * [8dbcedd] ChangeLog, NEWS, setup.py: get files ready for 0.5 release 2011-07-09 Arthur de Jong * [596c7a1] stdnum/iban.dat, stdnum/isbn.dat, stdnum/isil.dat: update data files 2011-06-20 Arthur de Jong * [63b2b0a] stdnum/issn.py: implement a conversion function from ISSN to EAN 2011-06-20 Arthur de Jong * [d101acf] stdnum/isbn.py, stdnum/ismn.py: use the ean module for calculating the check digit 2011-06-20 Arthur de Jong * [f5747bc] README, stdnum/__init__.py, stdnum/ean.py, tests/test_robustness.doctest: add an EAN (International Article Number) module 2011-03-06 Arthur de Jong * [1b904ba] setup.py, stdnum/numdb.py: also support Python3 with the same codebase (see #3) 2011-03-06 Arthur de Jong * [a45079f] setup.py: ensure that data files are always included 2011-03-02 Arthur de Jong * [c17920a] stdnum/verhoeff.py: Python 2.5 compatibility improvement 2011-02-06 Arthur de Jong * [e6ba399] ChangeLog, NEWS, setup.py: get files ready for 0.4 release 2011-02-06 Arthur de Jong * [060dfce] stdnum/isbn.dat: include an updated version 2011-02-06 Arthur de Jong * [8806d2a] README, stdnum/__init__.py, stdnum/us/__init__.py, stdnum/us/ssn.py, tests/test_robustness.doctest: add an SSN (U.S. Social Security Number) module 2011-02-05 Arthur de Jong * [c260626] README, stdnum/__init__.py: add ISIL to the documentation 2011-02-05 Arthur de Jong * [e517903] getisil.py, stdnum/isil.dat, stdnum/isil.py, tests/test_robustness.doctest: add an ISIL (International Standard Identifier for Libraries and Related Organizations) module 2011-02-05 Arthur de Jong * [96f4f7c] stdnum/numdb.py: allow most kind of characters in number ranges 2011-02-05 Arthur de Jong * [33611d1] stdnum/iban.py: move more validation into try/except (specifically the _convert() call) 2011-02-05 Arthur de Jong * [62aa496] tests/test_iban.doctest, tests/test_imei.doctest, tests/test_isan.doctest, tests/test_isbn.doctest, tests/test_ismn.doctest, tests/test_issn.doctest, tests/test_luhn.doctest, tests/test_meid.doctest, tests/test_nl_bsn.doctest, tests/test_robustness.doctest, tests/test_verhoeff.doctest: move all robustness tests into one test file 2011-02-05 Arthur de Jong * [9081e90] tests/test_iso7064.doctest: fix imports of iso7064.mod_*_* modules 2011-02-05 Arthur de Jong * [e5678ca] stdnum/isbn.py: fix typo in r53 2011-02-05 Arthur de Jong * [ea737ff] stdnum/__init__.py: add encoding header 2011-01-31 Arthur de Jong * [cc7a6d8] README, stdnum/__init__.py: get README and package docstring in sync 2011-01-21 Arthur de Jong * [6724e50] stdnum/isbn.py, tests/test_isbn.doctest: add a convert parameter to most isbn functions to automatically convert to ISBN-13 2011-01-17 Arthur de Jong * [411874e] README: add note about CPF and update copyright year 2011-01-16 Arthur de Jong * [db2238c] README, getiban.py, stdnum/iban.dat, stdnum/iban.py, tests/test_iban.doctest: add an IBAN (International Bank Account Number) module 2011-01-16 Arthur de Jong * [2b4aff6] setup.py, stdnum/numdb.py: revert r49 because it wasn't needed after all 2011-01-16 Arthur de Jong * [0bf31c9] setup.py, stdnum/numdb.py: introduce a full parameter that can be used to only return the part that is in the database 2011-01-16 Arthur de Jong * [4fe17ba] stdnum/grid.py, stdnum/isan.py: fix import of iso7064 modules 2011-01-16 Arthur de Jong * [c1f03c2] stdnum/numdb.py, test.dat: add test for partial match 2011-01-15 Arthur de Jong * [81a99d3] tests/test_nl_bsn.doctest: fix comments to refer to the new path of the module 2011-01-15 Arthur de Jong * [fda67ac] stdnum/br/__init__.py, stdnum/br/cpf.py, tests/test_br_cpf.doctest: add a CPF (Cadastro de Pessoas Físicas) module 2011-01-15 Arthur de Jong * [8d3a92c] stdnum/nl/__init__.py, stdnum/nl/bsn.py, tests/test_nl_bsn.doctest: move bsn module inside nl package 2010-11-26 Arthur de Jong * [6ed480c] setup.py, stdnum/__init__.py: move general description to package __init__.py file 2010-11-24 Arthur de Jong * [124c16d] getisbn.py, stdnum/isbn.dat, stdnum/isbn.py, stdnum/isbn/ranges.py, stdnum/numdb.py, test.dat, tests/test_isbn.doctest: implement a new numdb module to hold information on hierarchically organised numbers and switch the isbn module to use this format instead 2010-09-11 Arthur de Jong * [72a0b96] ChangeLog, NEWS, README, setup.py: get files ready for 0.3 release 2010-09-05 Arthur de Jong * [cd844b5] setup.py: have sdist target create a tarball with reasonable permissions 2010-08-29 Arthur de Jong * [2e64eb8] stdnum/bsn.py, stdnum/isan.py, stdnum/iso7064/mod_37_2.py, stdnum/iso7064/mod_37_36.py, stdnum/meid.py, stdnum/verhoeff.py, tests/test_bsn.doctest, tests/test_ismn.doctest: spelling check 2010-08-28 Arthur de Jong * [2a7afff] README, stdnum/grid.py: add a GRid (Global Release Identifier) module 2010-08-27 Arthur de Jong * [9970652] README, stdnum/isan.py, tests/test_isan.doctest: add ISAN (International Standard Audiovisual Number) module 2010-08-27 Arthur de Jong * [fda9552] README, stdnum/iso7064/__init__.py, stdnum/iso7064/mod_11_10.py, stdnum/iso7064/mod_11_2.py, stdnum/iso7064/mod_37_2.py, stdnum/iso7064/mod_37_36.py, stdnum/iso7064/mod_97_10.py, tests/test_iso7064.doctest: implement some ISO/IEC 7064 check digit schemes 2010-08-26 Arthur de Jong * [4017d83] stdnum/isbn/__init__.py, stdnum/ismn.py, stdnum/issn.py, stdnum/verhoeff.py: switch to using enumerate() for looping over numbers where needed 2010-08-21 Arthur de Jong * [8bdb6ef] README, stdnum/ismn.py, tests/test_ismn.doctest: add an ISMN (International Standard Music Number) module 2010-08-21 Arthur de Jong * [97d5280] tests/test_isbn.doctest: simplify ranges tests a bit 2010-08-21 Arthur de Jong * [f3b025b] stdnum/isbn/ranges.py: update ranges from newly downloaded file 2010-08-20 Arthur de Jong * [8748830] README, stdnum/meid.py, tests/test_meid.doctest: add a MEID (Mobile Equipment Identifier) module 2010-08-20 Arthur de Jong * [f125f3e] setup.cfg, tests/test_isbn.doctest, tests/test_issn.doctest: write some more tests (some of which are a bit of a hack) to get coverage to 100% 2010-08-20 Arthur de Jong * [d622d92] stdnum/imei.py, tests/test_imei.doctest: add an add_check_digit option to the format() function to add a check digit if needed and possible 2010-08-20 Arthur de Jong * [a74a6f7] stdnum/luhn.py: make checksum calculation a little more readable 2010-08-20 Arthur de Jong * [6bb04af] README, stdnum/imei.py, tests/test_imei.doctest: add an IMEI (International Mobile Equipment Identity) module 2010-08-20 Arthur de Jong * [ca08995] README, stdnum/luhn.py, tests/test_luhn.doctest: add functions for handling the Luhn and Luhn mod N algorithms 2010-08-20 Arthur de Jong * [7e800c3] stdnum/issn.py: fix typo 2010-08-20 Arthur de Jong * [571dc83] README, stdnum/verhoeff.py, tests/test_verhoeff.doctest: add functions for handling the Verhoeff algorithm 2010-08-16 Arthur de Jong * [9ffa9fd] ChangeLog, NEWS, setup.py: get files ready for 0.2 release 2010-08-16 Arthur de Jong * [19b7d2d] debian/changelog, debian/compat, debian/control, debian/copyright, debian/docs, debian/rules, debian/source/format, debian/watch: debian package configuration is now available at http://svn.debian.org/viewsvn/python-modules/packages/python-stdnum/trunk/ 2010-08-14 Arthur de Jong * [85e9e3b] setup.cfg, tests/test_bsn.doctest, tests/test_isbn.doctest: add more doctests that are not part of the module documentation 2010-07-27 Arthur de Jong * [c536356] README, stdnum/bsn.py, stdnum/isbn/__init__.py, stdnum/issn.py: rename validate() function to is_valid() 2010-07-27 Arthur de Jong * [85a5fc8] stdnum/isbn/ranges.py: fix typo in output() function 2010-07-27 Arthur de Jong * [1071603] stdnum/isbn/ranges.py: fix range detection to handle lookup errors more gracefully 2010-07-27 Arthur de Jong * [a86c4cc] stdnum/bsn.py, stdnum/isbn/__init__.py, stdnum/issn.py: handle wrong types passed to validate() more gracefully 2010-07-26 Arthur de Jong * [9495116] debian/changelog, debian/source/format, debian/watch: make release 0.1-1 2010-07-25 Arthur de Jong * [55a97d4] ChangeLog: get files ready for 0.1 release 2010-07-25 Arthur de Jong * [1e02d5a] debian/changelog, debian/compat, debian/control, debian/copyright, debian/docs, debian/rules, debian/source/format: add Debian packaging 2010-07-25 Arthur de Jong * [14bd2fe] COPYING, ChangeLog, MANIFEST.in, NEWS: include some more files in the source distribution 2010-07-25 Arthur de Jong * [9940cf3] setup.cfg: use nose for testing and ignore generated files and directories 2010-07-25 Arthur de Jong * [967f2ae] setup.py: add a setup.py script for use of setuptools 2010-07-25 Arthur de Jong * [ca5f850] README: add documentation to the README 2010-07-25 Arthur de Jong * [40aff16] stdnum/bsn.py, stdnum/isbn/__init__.py, stdnum/isbn/ranges.py, stdnum/issn.py: spelling check an extra doctest and a simplification 2010-07-23 Arthur de Jong * [6eabbc3] stdnum/bsn.py: add BSN (Burgerservicenummer, the Ducth national identification number) module 2010-07-23 Arthur de Jong * [92e18aa] stdnum/issn.py: add an ISSN (International Standard Serial Number) module 2010-07-23 Arthur de Jong * [31ce783] stdnum/isbn/__init__.py: fix example and fix ISBN13 conversion 2010-07-23 Arthur de Jong * [4b8c10e] stdnum/isbn/__init__.py: get rid of remainders of old code that used exceptions 2010-07-23 Arthur de Jong * [7d2f15a] README, stdnum/__init__.py, stdnum/isbn/__init__.py, stdnum/isbn/ranges.py: make a initial repository layout with an implementation of the isbn module ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1692544543.0 python-stdnum-1.20/MANIFEST.in0000644000000000000000000000041314470427037014567 0ustar00rootrootinclude README.md CONTRIBUTING.md NEWS ChangeLog COPYING *.py tox.ini recursive-include tests *.doctest *.dat *.py recursive-include docs *.rst *.py recursive-include online_check * recursive-include update README requirements.txt *.py recursive-include scripts *.py ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1710711522.0 python-stdnum-1.20/NEWS0000644000000000000000000007137314575661342013552 0ustar00rootrootchanges from 1.19 to 1.20 ------------------------- * Add modules for the following number formats: - BC PHN (British Columbia Personal Health Number) (thanks Ömer Boratav) - EC Number (European Community number) (thanks Daniel Weber) - VID (Indian personal virtual identity number) (thanks Atul Deolekar) * Fix typo in German Umsatzsteur Identifikationnummer (thanks Александр Кизеев) * Ensure EU VAT numbers don't accept duplicate country codes * Fix vatin number compacting for "EU" VAT numbers (thanks Davide Walder) * Add check digit validation to French NIF (thanks Kevin Dagostino) * Fix Ukrainian EDRPOU check digit calculation (thanks sector119) changes from 1.18 to 1.19 ------------------------- * Add modules for the following number formats: - Tax Registration Number (الرقم الضريبي, Egypt tax number) (thanks Leandro Regueiro) - Postcode (the Spanish postal code) (thanks Víctor) - NIFp (Numéro d'Identification Fiscale Permanent, Guinea tax number) (thanks Leandro Regueiro) - BIS (Belgian BIS number) (thanks Jeff Horemans) - Matična številka poslovnega registra (Corporate Registration Number) (thanks Blaž Bregar) - OSS (European VAT on e-Commerce - One Stop Shop) (thanks Sergi Almacellas Abellana) * Extend the validation of the Albanian NIPT (NUIS) number (thanks Julien Launois) * Support different date formats in parsing GS1-128 application identifiers * Add get_county() function to Romanian CNP (thanks RaduBorzea) * Add functionality to get gender from Belgian National Number (thanks Jeff Horemans) * Add support for Finland HETU new century indicating signs (thanks Maks Turtiainen) * Add functionality to get (partial) birth date from Belgian National Number (thanks Jeff Horemans) * Extend validation of Canadian SIN (thanks Marcel Lecker) * Fix Belarusian UNP online validation * Various typo and documentation fixes (thanks valeriko, Dimitri Papadopoulos, Ali-Akber Saifee and Chales Horn) * Add contribution information to documentation * Test suite improvements (including checking file headers) changes from 1.17 to 1.18 ------------------------- * Add modules for the following number formats: - NN, NISS (Belgian national number) (thanks Cédric Krier) - CFI (ISO 10962 Classification of Financial Instruments) - Czech bank account number (thanks Petr Přikryl) - NIF, sometimes N.I.F. (Numéro d'Identification Fiscale, Algeria tax number) (thanks Leandro Regueiro) - V-number (Vinnutal, Faroe Islands tax number) (thanks Leandro Regueiro) - TIN (Taxpayer Identification Number, Ghana tax number) (thanks Leandro Regueiro) - PIN (Personal Identification Number, Kenya tax number) (thanks Leandro Regueiro) - ICE (Identifiant Commun de l’Entreprise, التعريف الموحد للمقاولة, Morocco tax number) (thanks Leandro Regueiro) - PIB (Poreski Identifikacioni Broj, Montenegro tax number) (thanks Leandro Regueiro) - ЕДБ (Едниствен Даночен Број, North Macedonia tax number) (thanks Leandro Regueiro) - CNIC number (Pakistani Computerised National Identity Card number) (thanks Syed Haseeb Shah) - Enotna matična številka občana (Unique Master Citizen Number) (thanks Blaž Bregar) - MF (Matricule Fiscal, Tunisia tax number) (thanks Leandro Regueiro) * Fix disabling check digit validation of Mexican CURP (thanks guyskk) * Support special validation of La Post SIRET (thanks BIGBen99 and Cédric Krier) * Fix support for "I" and "O" in CUSIP number (thanks Thomas Kavanagh) * Calculate ISO 7064 Mod 97, 10 check digits in the range 02-98 for IBAN (thanks David Svenson) * Fix German OffeneRegister lookups (change of URL and of data structure) * Add extra court alias for Berlin in German Handelsregisternummer (thanks Romuald R) * Ensure certificate for the Belarus VAT number check_nalog() lookup is included * Support parsing incomplete dates in GS1-128 (thanks Alexis de Lattre) * Improve validation of CAS Registry Number * Typo fixes (thanks Vladimir and Dimitri Papadopoulos) * Add a check_uid() function to the stdnum.ch.uid module * All validation exceptions should now inherit from ValueError * Switch from nose to pytest as test runner changes from 1.16 to 1.17 ------------------------- * Add modules for the following number formats: - EPIC (Electoral Photo Identity Card, Indian Voter ID) (thanks Gaurav Chauhan) - GSTIN (Goods and Services Tax identification number, Indian VAT number) (thanks Gaurav Chauhan) - ISRC (International Standard Recording Code) (thanks Nuno André) - CC (Número de Cartão de Cidadão, Portuguese Identity number) (thanks David Vaz) - Postcode (the Swedish postal code) (thanks Michele Ciccozzi) - MOA (Thailand Memorandum of Association Number) (thanks Piruin Panichphol) - PIN (Thailand Personal Identification Number) (thanks Piruin Panichphol) - TIN (Thailand Taxpayer Identification Number) (thanks Piruin Panichphol) * Add ENCF validation support for Dominican Republic NCF (thanks Cristopher Ortega) * Add new e-CF types to Dominican Republic NCF (thanks Frank Roberto Chavez Sosa) * Improve French NIF validation (thanks Dimitri Papadopoulos) * Drop support for Python 2.6 and 3.4 * Fix parsing of empty fields in Dominican Republic DGII checking (thanks Andres Rodriguez) * Fix handling of empty worksheet in Belgian bank download (thanks Dimitri Papadopoulos) * Fix detection of natural RUC values (thanks Victor Rodriguez) * Fix Belarus VAT number online lookup again * Fixes for problems with loading IMSI data from Wikipedia and dealing with inconsistencies * Remove South Korean BRN Fair Trade Commission website check due to CAPTCHA * Various code and documentation improvements (thanks Dimitri Papadopoulos and Gaurav Chauhan) changes from 1.15 to 1.16 ------------------------- * Support XI country code for Northern Ireland VAT numbers (thanks Alexis de Lattre) * Switch data source for Austrian postal codes (thanks Bernd Schlapsi) * Fix Belarus VAT number online lookup changes from 1.14 to 1.15 ------------------------- * Add modules for the following number formats: - CUI or CIF (Codul Unic de Înregistrare, Romanian company identifier) - PEID (Liechtenstein tax code for individuals and entities) (thanks Matthias Schmid) - ЄДРПОУ, EDRPOU (Identifier for enterprises and organizations in Ukraine) (thanks Leandro Regueiro) - РНОКПП, RNTRC (Individual taxpayer registration number in Ukraine) (thanks Leandro Regueiro) * Make list of EU member states part of public API * Retain RO prefix in Romanian VAT numbers * Support international VAT numbers that are only valid with country prefix * Expanded validation for Belgian VAT numbers * Use ABN as Australian VAT number * Remove GB from EU member states changes from 1.13 to 1.14 ------------------------- * Add modules for the following number formats: - УНП, UNP (Учетный номер плательщика, the Belarus VAT number) - AIC (Italian code for identification of drugs) (thanks Fabrizio Montanari) - Company Number (מספר חברה, or short ח.פ. Israeli company number) (thanks Leandro Regueiro) - NIT (Número de Identificación Tributaria, El Salvador tax number) (thanks Leandro Regueiro) - USCC (Unified Social Credit Code, 统一社会信用代码, China tax number) (thanks Leandro Regueiro) - UEN (Singapore's Unique Entity Number) (thanks Leandro Regueiro) - BRN (사업자 등록 번호, South Korea Business Registration Number) (thanks Leandro Regueiro) - MST (Mã số thuế, Vietnam tax number) (thanks Leandro Regueiro) - NPWP (Nomor Pokok Wajib Pajak, Indonesian VAT Number) (thanks Leandro Regueiro) - UBN (Unified Business Number, 統一編號, Taiwanese tax number) (thanks Leandro Regueiro) - UTR (United Kingdom Unique Taxpayer Reference) (thanks Mohammed Salman) - ONRC (Ordine din Registrul Comerţului, Romanian Trade Register identifier) (thanks dotbit1) - GS1-128 (Standard to encode product information in Code 128 barcodes) (thanks Sergi Almacellas Abellana) - VATIN (International value added tax identification number) (thanks Leandro Regueiro) * Fix missing Dominican Republic NCF document types (thanks Gustavo Valverde) * Fix issue with extra plus or minus in Swedish Personnummer (thanks balderman) * Update Dominican Republic DGII endpoint (thanks Gustavo Valverde) * Support validating temporary Finnish personal identity codes (thanks Aleksi Hoffman) * Fix misleading docstring in se.personnummer.get_birth_date() (thanks Leon Sandøy) * Improve birth date validation in Danish CPR (thanks Leon Sandøy) * Add birth date validating in Norwegian Fødselsnummer (thanks Leon Sandøy) * Add missing vat aliases for a number of countries (thanks Leandro Regueiro) * Use HTTPS instead of HTTP fox VIES lookups (thanks grzekru) * Switch to HTTPS URLs where possible * Support 6 as third digit in Ecuadorian CI (thanks Christopher Ormaza) * Add an online check for South Korean BRN * Fix unescaping in Dominican Republic RNC online check (thanks evaldez89) * Support foreign residents for Romanian CNP (thanks dotbit1) changes from 1.12 to 1.13 ------------------------- * Add modules for the following number formats: - ESR, ISR, QR-reference (reference number on Swiss payment slips) (thanks Kurt Keller) - ID number (South African Identity Document number) * Add format function for ISO 11649 numbers (thanks Kurt Keller) * Add support for Python 3.8 (thanks Sergi Almacellas Abellana) * Clarify that the Italian Codice Fiscale can also be the IVA for companies (thanks Nicholas Fiorentini) * Support the new Dutch btw-identificatienummer (thanks Cas Vissers, Jeroen van Heiningen, Jerome Hanke, Nicolas Martinelli, Ronald Portier and Tim Muller) * Extend test for Argentinian CUIT to check first two digits * Add more country codes to ISIN (thanks nocluebutalotofit, Anwar Baroudi and alexbond73) changes from 1.11 to 1.12 ------------------------- * Add modules for the following number formats: - NRT (Número de Registre Tributari, Andorra tax number) (thanks Leandro Regueiro) - CPF (Cédula de Persona Física, Costa Rica physical person ID number) (thanks Leandro Regueiro) - CPJ (Cédula de Persona Jurídica, Costa Rica tax number) (thanks Leandro Regueiro) - CR (Cédula de Residencia, Costa Rica foreigners ID number) (thanks Leandro Regueiro) - NIT (Número de Identificación Tributaria, Guatemala tax number) (thanks Leandro Regueiro) - Identity Number (Mispar Zehut, מספר זהות, Israeli identity number) - CN (法人番号, hōjin bangō, Japanese Corporate Number) (thanks Alan Hettinger) - RRN (South Korean resident registration number) (thanks Dimitri Papadopoulos) - IRD number (New Zealand Inland Revenue Department (Te Tari Tāke) number) (thanks Leandro Regueiro) - CUI (Cédula Única de Identidad, Peruvian identity number) - RUC (Registro Único de Contribuyentes, Peruvian company tax number) - RUC number (Registro Único de Contribuyentes, Paraguay tax number) (thanks Leandro Regueiro) - VKN (Vergi Kimlik Numarası, Turkish tax identification number) (thanks Leandro Regueiro) - RUT (Registro Único Tributario, Uruguay tax number) (Leandro Regueiro) - RIF (Registro de Identificación Fiscal, Venezuelan VAT number) (thanks Kevin Kaiser) - TIN (South African Tax Identification Number) (thanks Leandro Regueiro) * Support GTIN (EAN-14) validation as part of EAN (thanks Sergi Almacellas Abellana) * Support Dominican Republic e-CF within NCF (thanks Jeffry Jesus De La Rosa) * Fix Dominican Republic DGII lookups of NCF (thanks Jeffry Jesus De La Rosa) * Fix German Handelsregisternummer to not confuse Hamburg with Homburg and to accept shorter numbers (thanks Kevin Kaiser) * Support lookups of German Handelsregisternummer in OffeneRegister.de web service * Handle - and + sign correctly in Swedish Personnummer (thanks Amin Solhizadeh) * Provide various personalid and vat aliases for existing numbers (thanks Andreas Häber) * Improve descriptions of Spanish codes (thanks Gerard Dalmau) * Fix handling and normalisation of various Unicode digit representations (thanks Helge Munk Jacobsen) changes from 1.10 to 1.11 ------------------------- * Add modules for the following number formats: - DNI (Documento Nacional de Identidad, Argentinian national identity nr.) - VNR, SVNR, VSNR (Versicherungsnummer, Austrian social security number) - NI (Número de identidad, Cuban identity card numbers) - AMKA (Αριθμός Μητρώου Κοινωνικής Ασφάλισης, Greek social security number) - Asmens kodas (Lithuanian, personal numbers) - MAC address (Media Access Control address) - IDNO (Moldavian company identification number) - CURP (Clave Única de Registro de Población, Mexican personal ID) - Fødselsnummer (Norwegian birth number, the national identity number) (thanks Ilya Vihtinsky) - New Zealand bank account number - Personnummer (Swedish personal identity number) (thanks Ilya Vihtinsky) * Code style improvements * Change Dominican Republic DGII check URL to HTTPS (thanks Gustavo Valverde) * Support Ecuadorian Cedula and RUC of foreigners (thanks Christopher Ormaza) * Add format() function for Argentinian CUIT number (thanks Mario Puntin) * Support passing formatted numbers to all get_birth_date() and similar functions * Handle Dominican Republic DGII lookup returning multiple entities (thanks Andrés R) changes from 1.9 to 1.10 ------------------------ * Add modules for the following number formats: - Bitcoin address - ISO 11649 (Structured Creditor Reference) - ID number (Mauritian national identifier) - Norwegian IBAN (International Bank Account Number) - Konto nr. (Norwegian bank account number) * Fix a bug in handling of Mexican tax numbers * Improve Spanish CIF and NIF validation * Update Dominican Republic NCF numbers online check * Improve Unicode conversion for bytestrings * Improvements to some corner cases in IBAN validation * Documentation improvements * Add stdnum.ru.vat as an alias for stdnum.ru.inn changes from 1.8.1 to 1.9 ------------------------- * Add modules for the following number formats: - Postleitzahl (Austrian postal code) - Abgabenkontonummer (Austrian tax identification number) - Belgian IBAN (International Bank Account Number) - Handelsregisternummer (German company register number) - St.-Nr. (Steuernummer, German tax number) - FIGI (Financial Instrument Global Identifier) - Montenegro IBAN (International Bank Account Number) * Have documentation rebuilt reproducibly (thanks Chris Lamb) * Allow configuring the SOAP request timeout * Support spaces in ISO 9362 (SWIFT) BIC codes * Add check_dgii() to stdnum.do.cedula module * Add validation for "individual" part of hetu (thanks Esa Halsti) * Support new style of Dominican Republic NCF numbers * Fix issue when using PySimpleSOAP for DGII lookups * Fix an issue in splitting certain IMSI values * Support building a universal wheel * Documentation and code style improvements changes from 1.8 to 1.8.1 ------------------------- * Fix a packaging issue in the long description changes from 1.7 to 1.8 ----------------------- * Add modules for the following number formats: - NCF (Números de Comprobante Fiscal, Dominican Republic receipt number) - Euro banknote serial numbers - CAS RN (Chemical Abstracts Service Registry Number) - Aadhaar (Indian digital resident personal identity number) (thanks Srikanth Lakshmanan) - PAN (Permanent Account Number, Indian income tax identifier) (thanks Srikanth Lakshmanan) * Add functions for using the Dominican Republic DGII web service to validate and search for RNC and NCF numbers * Add/update whitelists for Dominican Republic RNC and Cedula * Support zeep as preferred SOAP library (suds and pysimplesoap are tried as fallback) * Rename stdnum.iso9362 to stdnum.bic (iso9362 is deprecated but still available for compatibility) * Add tests for web services (not normally run to avoid unnecessary load) * Fixes and improvement to the sample online validation service Development of the NCF format validation and DGII web service validation was funded by iterativo | http://iterativo.do changes from 1.6 to 1.7 ----------------------- * Add modules for the following number formats: - BN (Canadian Business Number) - SIN (Canadian Social Insurance Number) - IdNr (Steuerliche Identifikationsnummer, German personal tax number) (thanks Mohammed Salman of Holvi) - Registrikood (Estonian organisation registration code) (thanks Mohammed Salman of Holvi) - Veronumero (Finnish individual tax number) (thanks Mohammed Salman of Holvi) - UPN (English Unique Pupil Number) * Fix a bug in the Czech DIČ check digit calculation * Fix conversion of 9 digit ISBN to ISBN13 * Fix a bug in the Damm is_valid() function * More validation of 13-digit ISBN values * More validation of ISMN values * Various code and test improvements (100% branch coverage now) * Documentation improvements changes from 1.5 to 1.6 ----------------------- * Add modules for the following number formats: - CBU (Clave Bancaria Uniforme, Argentine bank account number) (thanks Luciano Rossi) - EIC (European Energy Identification Code) - NACE (classification for businesses in the European Union) - LEI (Legal Entity Identifier) - n° TVA (taxe sur la valeur ajoutée, Monacan VAT number) - PIB (Poreski Identifikacioni Broj, Serbian tax identification number) * Add online check example that finds valid formats for a given number * Fix support for Ñ in Spanish Referencia Catastral * Updates to U.S. Employer Identification Number (thanks Greg Kuwaye) * Various minor improvements changes from 1.4 to 1.5 ----------------------- * Add modules for the following number formats: - ABN (Australian Business Number) - ACN (Australian Company Number) - TFN (Australian Tax File Number) - CCC (Código Cuenta Corriente, Spanish Bank Account Code) - CUPS (Código Unificado de Punto de Suministro, Supply Point Unified Code) - Spanish IBAN (International Bank Account Number) - Referencia Catastral (Spanish real estate property id) * The IBAN module now support validating the country-specific part * The Belgian VAT number is now also referenced as businessid * Add a Tox configuration file changes from 1.3 to 1.4 ----------------------- * Add modules for the following number formats: - NIF (Numéro d'Immatriculation Fiscale, French tax identification number) provided by Dimitri Papadopoulos - NIR (French personal identification number) provided by Dimitri Papadopoulos - SIRET (a French company establishment identification number) provided by Yoann Aubineau - NHS (United Kingdom National Health Service patient identifier) - T.C. Kimlik No. (Turkish personal identification number) * Add an implementation of the Damm algorithm * Ensure data files are properly closed * Documentation improvements * Extend test suite * A number of minor bug fixes and improvements changes from 1.2 to 1.3 ----------------------- * Fix ISO 6346 check digit calculation (thanks Ronald Paloschi) * Fix problem with check_vies_approx() (thanks Lionel Elie Mamane) * Fix problem with SOAP client when using suds * Include documentation that was previously on the Trac wiki changes from 1.1 to 1.2 ----------------------- * Add modules for the following number formats: - Austrian Company Register Numbers - CNPJ (Cadastro Nacional da Pessoa Jurídica, Brazilian company identifier) - UID (Unternehmens-Identifikationsnummer, Swiss business identifier) - VAT, MWST, TVA, IVA, TPV (Mehrwertsteuernummer, the Swiss VAT number) - CUSIP number (financial security identification number) - Wertpapierkennnummer (German securities identification code) - Isikukood (Estonian Personcal ID number) - Finnish Association Identifier - Y-tunnus (Finnish business identifier) - SEDOL number (Stock Exchange Daily Official List number) - IMO number (International Maritime Organization number) - ISIN (International Securities Identification Number) - RFC (Registro Federal de Contribuyentes, Mexican tax number) - PESEL (Polish national identification number) - REGON (Rejestr Gospodarki Narodowej, Polish register of economic units) - ИНН (Идентификационный номер налогоплательщика, Russian tax identifier) * Add an alternate VIES check (check_vies_approx()) that includes a proof (certificate) that the check was performed * Fall back to pysimplesoap if suds is unavailable * Test and code quality improvements changes from 1.0 to 1.1 ----------------------- * Add number formats based on the implementation in the vatnumber module: - NIPT (Numri i Identifikimit për Personin e Tatueshëm, Albanian VAT number) - CUIT (Código Único de Identificación Tributaria, Argentinian tax number) - RUT (Rol Único Tributario, Chilean national tax number) - NIT (Número De Identificación Tributaria, Colombian identity code) - COE (Codice operatore economico, San Marino national tax number) * Add modules for the following number formats: - Cedula (Dominican Republic national identification number) - RNC (Registro Nacional del Contribuyente, Dominican Republic tax number) - Kennitala (Icelandic personal and organisation identity code, provided by Tuomas Toivonen) - VSK number (Virðisaukaskattsnúmer, Icelandic VAT number, provided by Tuomas Toivonen) - ISO 9362 (Business identifier codes, provided by Tony Bajan) - MVA (Merverdiavgift, Norwegian VAT number, provided by Tuomas Toivonen) - Orgnr (Organisasjonsnummer, Norwegian organisation number, provided by Tuomas Toivonen) - Orgnr (Organisationsnummer, Swedish company number, provided by Tomas Thor Jonsson) * Add Croatia to list of EU VAT numbers * Update getcnloc script * Various small fixes and additional tests for existing modules changes from 0.9 to 1.0 ----------------------- * Add modules for the following number formats: - Swiss social security number ("Sozialversicherungsnummer") - RIC No. (Chinese Resident Identity Card Number) - CI (Cédula de identidad, Ecuadorian personal identity code) - RUC (Registro Único de Contribuyentes, Ecuadorian company tax number) - SEPA Identifier of the Creditor (AT-02) - ISO 6346 (International standard for container identification) - Codice Fiscale (Italian tax code for individuals) - RTN (Routing transport number) * Add support for 2013 extension of Irish PPS Numbers * Update getisbn script * Update getmybp URLs for Malaysian code lists * Various other minor improvements changes from 0.8.1 to 0.9 ------------------------- * Add modules for the following number formats: - Brin number (Dutch number for schools) - Postcode (Dutch postal code) - ATIN (U.S. Adoption Taxpayer Identification Number) - EIN (U.S. Employer Identification Number) - ITIN (U.S. Individual Taxpayer Identification Number) - PTIN (U.S. Preparer Tax Identification Number) - TIN (U.S. Taxpayer Identification Number) * Try to replace Unicode characters with similar-looking ASCII characters * Update getimsi script (thanks eneq123) * Update getiban script * Add proxy support to the stdnum.eu.vat.check_vies() function (thanks Cédric Krier) * Support newer United Kingdom VAT numbers changes from 0.8 to 0.8.1 ------------------------- * Include some files that were missing from the source tarball changes from 0.7 to 0.8 ----------------------- * Add modules for the following number formats: - NRIC No. (Malaysian National Registration Identity Card Number) * All modules now provide a validate() function that throws an exception that contains more information on the failure reason * Documentation improvements * Remove add_check_digit parameter from GRid's format() function * Improvements to the tests * Re-add Python3 support (now tested with Python 2.7, 3.2 and 3.3) changes from 0.6 to 0.7 ----------------------- * Add modules for the following number formats: - Onderwijsnummer (Dutch school number) - BTW-nummer (Omzetbelastingnummer, the Dutch VAT number) - HETU (Finnish personal identity code) as provided by Jussi Judin (#5) - RČ (Rodné číslo, the Czech and Slovak birth numbers) - SIREN (a French company identification number) - FPA, ΦΠΑ (Foros Prostithemenis Aksias, the Greek VAT number) - Ust ID Nr. (Umsatzsteur Identifikationnummer, the German VAT number) - BTW, TVA, NWSt (Belgian VAT number) - DNI (Documento nacional de identidad, Spanish personal identity codes) - NIE (Número de Identificación de Extranjeros, Spanish foreigner number) - CIF (Certificado de Identificación Fiscal, Spanish company tax number) - NIF (Número de Identificación Fiscal, Spanish VAT number) - PVN (Pievienotās vērtības nodokļa, Latvian VAT number) - CVR (Momsregistreringsnummer, Danish VAT number) - TVA (taxe sur la valeur ajoutée, Luxembourgian VAT number) - CNP (Cod Numeric Personal, Romanian Numerical Personal Code) - CF (Cod de înregistrare în scopuri de TVA, Romanian VAT number) - Partita IVA (Italian VAT number) - Αριθμός Εγγραφής Φ.Π.Α. (Cypriot VAT number) - UID (Umsatzsteuer-Identifikationsnummer, Austrian VAT number) - NIF (Número de identificação fiscal, Portuguese VAT number) - IČ DPH (IČ pre daň z pridanej hodnoty, Slovak VAT number) - ALV nro (Arvonlisäveronumero, Finnish VAT number) - DIČ (Daňové identifikační číslo, Czech VAT number) - ANUM (Közösségi adószám, Hungarian VAT number) - VAT (Irish VAT number) - KMKR (Käibemaksukohuslase, Estonian VAT number) - PVM (Pridėtinės vertės mokestis mokėtojo kodas, Lithuanian VAT number) - n° TVA (taxe sur la valeur ajoutée, French VAT number) - VAT (Maltese VAT number) - NIP (Numer Identyfikacji Podatkowej, Polish VAT number) - ID za DDV (Davčna številka, Slovenian VAT number) - VAT (Moms, Mervärdesskatt, Swedish VAT number) - VAT (United Kingdom (and Isle of Man) VAT registration number) - EGN (ЕГН, Единен граждански номер, Bulgarian personal identity codes) - PNF (ЛНЧ, Личен номер на чужденец, Bulgarian number of a foreigner) - VAT (Идентификационен номер по ДДС, Bulgarian VAT number) - VAT (European Union VAT number) - OIB (Osobni identifikacijski broj, Croatian identification number) - PPS No (Personal Public Service Number, Irish personal number) - CPR (personnummer, the Danish citizen number) * Additional tests for robustness and use introspection to test all modules * Some code refactoring with the introduction of an internal utility module * Improvements to the docstring documentation * Generate API documentation using Sphinx changes from 0.5 to 0.6 ----------------------- * Fix a problem with handling an ISBN13 with a valid check digit but with an unknown bookland prefix * Add an IMSI (International Mobile Subscriber Identity) module * Implement a conversion function from ISBN13 to ISBN10 * Implement an ismn.ismn_type() function * Implement an imei.split() function that splits the number into a TAC, serial number and checksum or software version * Source code layout changes to better follow PEP8 changes from 0.4 to 0.5 ----------------------- * Add modules for the following number formats: - EAN (International Article Number) * Refactoring to use the EAN check digit code for ISBN and ISMN checks * Implement a conversion function from ISSN to EAN * Support Python3 with the same codebase * Python 2.5 compatibility improvement changes from 0.3 to 0.4 ----------------------- * Add modules for the following number formats: - CPF (Cadastro de Pessoas Físicas, the Brazilian national identification number) - IBAN (International Bank Account Number) - ISIL (International Standard Identifier for Libraries and Related Organizations) - SSN (U.S. Social Security Number) * Implement an internal module to store and handle hierarchically organised data structures efficiently * Regional-specific numbers are now in ISO 3166 packages (the BSN module is now in stdnum.nl.bsn) * ISBN module functions now have a convert flag to convert to ISBN-13 on the fly changes from 0.2 to 0.3 ----------------------- * Add modules for the following number formats: - ISMN (International Standard Music Number) - ISAN (International Standard Audiovisual Number) - IMEI (International Mobile Equipment Identity) - MEID (Mobile Equipment Identifier) - GRid (Global Release Identifier) * Add modules for handling the following check digit algorithms: - the Verhoeff algorithm - the Luhn and Luhn mod N algorithms - some algorithms described in ISO/IEC 7064: Mod 11, 2, Mod 37, 2, Mod 97, 10, Mod 11, 10 and Mod 37, 36 * Added more unit tests changes from 0.1 to 0.2 ----------------------- * Rename validate() function to is_valid() for all modules * Handle wrong types passed to is_valid() more gracefully * Add more tests and fix some minor bugs ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1710711668.4740078 python-stdnum-1.20/PKG-INFO0000644000000000000000000004310714575661564014150 0ustar00rootrootMetadata-Version: 2.1 Name: python-stdnum Version: 1.20 Summary: Python module to handle standardized numbers and codes Home-page: https://arthurdejong.org/python-stdnum/ Author: Arthur de Jong Author-email: arthur@arthurdejong.org License: LGPL Project-URL: Documentation, https://arthurdejong.org/python-stdnum/doc/ Project-URL: GitHub, https://github.com/arthurdejong/python-stdnum/ Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Financial and Insurance Industry Classifier: Intended Audience :: Information Technology Classifier: Intended Audience :: Telecommunications Industry Classifier: License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+) Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Office/Business :: Financial Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Topic :: Text Processing :: General Description-Content-Type: text/markdown Provides-Extra: SOAP Provides-Extra: SOAP-ALT Provides-Extra: SOAP-FALLBACK License-File: COPYING python-stdnum ============= A Python module to parse, validate and reformat standard numbers and codes in different formats. It contains a large collection of number formats. Basically any number or code that has some validation mechanism available or some common formatting is eligible for inclusion in this library. https://arthurdejong.org/python-stdnum/ Available formats ----------------- Currently this package supports the following formats: * NRT (Número de Registre Tributari, Andorra tax number) * NIPT, NUIS (Numri i Identifikimit për Personin e Tatueshëm, Albanian tax number) * CBU (Clave Bancaria Uniforme, Argentine bank account number) * CUIT (Código Único de Identificación Tributaria, Argentinian tax number) * DNI (Documento Nacional de Identidad, Argentinian national identity nr.) * Austrian Company Register Numbers * Postleitzahl (Austrian postal code) * Abgabenkontonummer (Austrian tax identification number) * UID (Umsatzsteuer-Identifikationsnummer, Austrian VAT number) * VNR, SVNR, VSNR (Versicherungsnummer, Austrian social security number) * ABN (Australian Business Number) * ACN (Australian Company Number) * TFN (Australian Tax File Number) * BIS (Belgian BIS number) * Belgian IBAN (International Bank Account Number) * NN, NISS, RRN (Belgian national number) * BTW, TVA, NWSt, ondernemingsnummer (Belgian enterprise number) * EGN (ЕГН, Единен граждански номер, Bulgarian personal identity codes) * PNF (ЛНЧ, Личен номер на чужденец, Bulgarian number of a foreigner) * VAT (Идентификационен номер по ДДС, Bulgarian VAT number) * BIC (ISO 9362 Business identifier codes) * Bitcoin address * CNPJ (Cadastro Nacional da Pessoa Jurídica, Brazilian company identifier) * CPF (Cadastro de Pessoas Físicas, Brazilian national identifier) * УНП, UNP (Учетный номер плательщика, the Belarus VAT number) * BC PHN (British Columbia Personal Health Number) * BN (Canadian Business Number) * SIN (Canadian Social Insurance Number) * CAS RN (Chemical Abstracts Service Registry Number) * CFI (ISO 10962 Classification of Financial Instruments) * ESR, ISR, QR-reference (reference number on Swiss payment slips) * Swiss social security number ("Sozialversicherungsnummer") * UID (Unternehmens-Identifikationsnummer, Swiss business identifier) * VAT, MWST, TVA, IVA, TPV (Mehrwertsteuernummer, the Swiss VAT number) * RUT (Rol Único Tributario, Chilean national tax number) * RIC No. (Chinese Resident Identity Card Number) * USCC (Unified Social Credit Code, 统一社会信用代码, China tax number) * NIT (Número De Identificación Tributaria, Colombian identity code) * CPF (Cédula de Persona Física, Costa Rica physical person ID number) * CPJ (Cédula de Persona Jurídica, Costa Rica tax number) * CR (Cédula de Residencia, Costa Rica foreigners ID number) * NI (Número de identidad, Cuban identity card numbers) * CUSIP number (financial security identification number) * Αριθμός Εγγραφής Φ.Π.Α. (Cypriot VAT number) * Czech bank account number * DIČ (Daňové identifikační číslo, Czech VAT number) * RČ (Rodné číslo, the Czech birth number) * Handelsregisternummer (German company register number) * IdNr (Steuerliche Identifikationsnummer, German personal tax number) * St.-Nr. (Steuernummer, German tax number) * Ust ID Nr. (Umsatzsteur Identifikationnummer, German VAT number) * Wertpapierkennnummer (German securities identification code) * CPR (personnummer, the Danish citizen number) * CVR (Momsregistreringsnummer, Danish VAT number) * Cedula (Dominican Republic national identification number) * NCF (Números de Comprobante Fiscal, Dominican Republic receipt number) * RNC (Registro Nacional del Contribuyente, Dominican Republic tax number) * NIF, sometimes N.I.F. (Numéro d'Identification Fiscale, Algeria tax number) * EAN (International Article Number) * CI (Cédula de identidad, Ecuadorian personal identity code) * RUC (Registro Único de Contribuyentes, Ecuadorian company tax number) * Isikukood (Estonian Personal ID number) * KMKR (Käibemaksukohuslase, Estonian VAT number) * Registrikood (Estonian organisation registration code) * Tax Registration Number (الرقم الضريبي, Egypt tax number) * CCC (Código Cuenta Corriente, Spanish Bank Account Code) * CIF (Código de Identificación Fiscal, Spanish company tax number) * CUPS (Código Unificado de Punto de Suministro, Spanish meter point number) * DNI (Documento Nacional de Identidad, Spanish personal identity codes) * Spanish IBAN (International Bank Account Number) * NIE (Número de Identificación de Extranjero, Spanish foreigner number) * NIF (Número de Identificación Fiscal, Spanish VAT number) * Postcode (the Spanish postal code) * Referencia Catastral (Spanish real estate property id) * SEPA Identifier of the Creditor (AT-02) * Euro banknote serial numbers * EC Number (European Community number) * EIC (European Energy Identification Code) * NACE (classification for businesses in the European Union) * OSS (European VAT on e-Commerce - One Stop Shop) * VAT (European Union VAT number) * ALV nro (Arvonlisäveronumero, Finnish VAT number) * Finnish Association Identifier * HETU (Henkilötunnus, Finnish personal identity code) * Veronumero (Finnish individual tax number) * Y-tunnus (Finnish business identifier) * FIGI (Financial Instrument Global Identifier) * V-number (Vinnutal, Faroe Islands tax number) * NIF (Numéro d'Immatriculation Fiscale, French tax identification number) * NIR (French personal identification number) * SIREN (a French company identification number) * SIRET (a French company establishment identification number) * n° TVA (taxe sur la valeur ajoutée, French VAT number) * NHS (United Kingdom National Health Service patient identifier) * SEDOL number (Stock Exchange Daily Official List number) * UPN (English Unique Pupil Number) * UTR (United Kingdom Unique Taxpayer Reference) * VAT (United Kingdom (and Isle of Man) VAT registration number) * TIN (Taxpayer Identification Number, Ghana tax number) * NIFp (Numéro d'Identification Fiscale Permanent, Guinea tax number) * AMKA (Αριθμός Μητρώου Κοινωνικής Ασφάλισης, Greek social security number) * FPA, ΦΠΑ, ΑΦΜ (Αριθμός Φορολογικού Μητρώου, the Greek VAT number) * GRid (Global Release Identifier) * GS1-128 (Standard to encode product information in Code 128 barcodes) * NIT (Número de Identificación Tributaria, Guatemala tax number) * OIB (Osobni identifikacijski broj, Croatian identification number) * ANUM (Közösségi adószám, Hungarian VAT number) * IBAN (International Bank Account Number) * NPWP (Nomor Pokok Wajib Pajak, Indonesian VAT Number) * PPS No (Personal Public Service Number, Irish personal number) * VAT (Irish tax reference number) * Company Number (מספר חברה, or short ח.פ. Israeli company number) * Identity Number (Mispar Zehut, מספר זהות, Israeli identity number) * IMEI (International Mobile Equipment Identity) * IMO number (International Maritime Organization number) * IMSI (International Mobile Subscriber Identity) * Aadhaar (Indian personal identity number) * EPIC (Electoral Photo Identity Card, Indian Voter ID) * GSTIN (Goods and Services Tax identification number, Indian VAT number) * PAN (Permanent Account Number, Indian income tax identifier) * VID (Indian personal virtual identity number) * Kennitala (Icelandic personal and organisation identity code) * VSK number (Virðisaukaskattsnúmer, Icelandic VAT number) * ISAN (International Standard Audiovisual Number) * ISBN (International Standard Book Number) * ISIL (International Standard Identifier for Libraries) * ISIN (International Securities Identification Number) * ISMN (International Standard Music Number) * ISO 11649 (Structured Creditor Reference) * ISO 6346 (International standard for container identification) * ISRC (International Standard Recording Code) * ISSN (International Standard Serial Number) * AIC (Italian code for identification of drugs) * Codice Fiscale (Italian tax code for individuals) * Partita IVA (Italian VAT number) * CN (法人番号, hōjin bangō, Japanese Corporate Number) * PIN (Personal Identification Number, Kenya tax number) * BRN (사업자 등록 번호, South Korea Business Registration Number) * RRN (South Korean resident registration number) * LEI (Legal Entity Identifier) * PEID (Liechtenstein tax code for individuals and entities) * Asmens kodas (Lithuanian, personal numbers) * PVM (Pridėtinės vertės mokestis mokėtojo kodas, Lithuanian VAT number) * TVA (taxe sur la valeur ajoutée, Luxembourgian VAT number) * PVN (Pievienotās vērtības nodokļa, Latvian VAT number) * ICE (Identifiant Commun de l’Entreprise, التعريف الموحد للمقاولة, Morocco tax number) * MAC address (Media Access Control address) * n° TVA (taxe sur la valeur ajoutée, Monacan VAT number) * IDNO (Moldavian company identification number) * Montenegro IBAN (International Bank Account Number) * PIB (Poreski Identifikacioni Broj, Montenegro tax number) * MEID (Mobile Equipment Identifier) * ЕДБ (Едниствен Даночен Број, North Macedonia tax number) * VAT (Maltese VAT number) * ID number (Mauritian national identifier) * CURP (Clave Única de Registro de Población, Mexican personal ID) * RFC (Registro Federal de Contribuyentes, Mexican tax number) * NRIC No. (Malaysian National Registration Identity Card Number) * BRIN number (the Dutch school identification number) * BSN (Burgerservicenummer, the Dutch citizen identification number) * Btw-identificatienummer (Omzetbelastingnummer, the Dutch VAT number) * Onderwijsnummer (the Dutch student identification number) * Postcode (the Dutch postal code) * Fødselsnummer (Norwegian birth number, the national identity number) * Norwegian IBAN (International Bank Account Number) * Konto nr. (Norwegian bank account number) * MVA (Merverdiavgift, Norwegian VAT number) * Orgnr (Organisasjonsnummer, Norwegian organisation number) * New Zealand bank account number * IRD number (New Zealand Inland Revenue Department (Te Tari Tāke) number) * CUI (Cédula Única de Identidad, Peruvian identity number) * RUC (Registro Único de Contribuyentes, Peruvian company tax number) * CNIC number (Pakistani Computerised National Identity Card number) * NIP (Numer Identyfikacji Podatkowej, Polish VAT number) * PESEL (Polish national identification number) * REGON (Rejestr Gospodarki Narodowej, Polish register of economic units) * CC (Número de Cartão de Cidadão, Portuguese Identity number) * NIF (Número de identificação fiscal, Portuguese VAT number) * RUC number (Registro Único de Contribuyentes, Paraguay tax number) * CF (Cod de înregistrare în scopuri de TVA, Romanian VAT number) * CNP (Cod Numeric Personal, Romanian Numerical Personal Code) * CUI or CIF (Codul Unic de Înregistrare, Romanian company identifier) * ONRC (Ordine din Registrul Comerţului, Romanian Trade Register identifier) * PIB (Poreski Identifikacioni Broj, Serbian tax identification number) * ИНН (Идентификационный номер налогоплательщика, Russian tax identifier) * Orgnr (Organisationsnummer, Swedish company number) * Personnummer (Swedish personal identity number) * Postcode (the Swedish postal code) * VAT (Moms, Mervärdesskatt, Swedish VAT number) * UEN (Singapore's Unique Entity Number) * ID za DDV (Davčna številka, Slovenian VAT number) * Enotna matična številka občana (Unique Master Citizen Number) * Matična številka poslovnega registra (Corporate Registration Number) * IČ DPH (IČ pre daň z pridanej hodnoty, Slovak VAT number) * RČ (Rodné číslo, the Slovak birth number) * COE (Codice operatore economico, San Marino national tax number) * NIT (Número de Identificación Tributaria, El Salvador tax number) * MOA (Thailand Memorandum of Association Number) * PIN (Thailand Personal Identification Number) * TIN (Thailand Taxpayer Identification Number) * MF (Matricule Fiscal, Tunisia tax number) * T.C. Kimlik No. (Turkish personal identification number) * VKN (Vergi Kimlik Numarası, Turkish tax identification number) * UBN (Unified Business Number, 統一編號, Taiwanese tax number) * ЄДРПОУ, EDRPOU (Identifier for enterprises and organizations in Ukraine) * РНОКПП, RNTRC (Individual taxpayer registration number in Ukraine) * ATIN (U.S. Adoption Taxpayer Identification Number) * EIN (U.S. Employer Identification Number) * ITIN (U.S. Individual Taxpayer Identification Number) * PTIN (U.S. Preparer Tax Identification Number) * RTN (Routing transport number) * SSN (U.S. Social Security Number) * TIN (U.S. Taxpayer Identification Number) * RUT (Registro Único Tributario, Uruguay tax number) * VATIN (International value added tax identification number) * RIF (Registro de Identificación Fiscal, Venezuelan VAT number) * MST (Mã số thuế, Vietnam tax number) * ID number (South African Identity Document number) * TIN (South African Tax Identification Number) Furthermore a number of generic check digit algorithms are available: * the Verhoeff algorithm * the Damm algorithm * the Luhn and Luhn mod N algorithms * some algorithms described in ISO/IEC 7064: Mod 11, 2, Mod 37, 2, Mod 97, 10, Mod 11, 10 and Mod 37, 36 Basically any number or code that has some validation mechanism available or some common formatting is eligible for inclusion into this library. These modules generally do not provide background information on the meaning and use of the specified numbers, only parsing and handling functions. Interface --------- All modules implement a common interface. For example for ISBN validation: >>> from stdnum import isbn >>> isbn.validate('978-9024538270') '9789024538270' >>> isbn.validate('978-9024538271') Traceback (most recent call last): ... InvalidChecksum: ... Most of these modules implement the following functions: * `validate()` validate the correctness of the passed number and return a compact representation of the number invalid numbers are rejected with one of the exceptions from the stdnum.exceptions module * `compact()` return a compact representation of the number or code this function generally does not do validation but may raise exceptions for wildly incorrect numbers * `format()` return a formatted version of the number in the preferred format this function generally expects to be passed a valid number or code Apart from the above, the module may add extra parsing, validation or conversion functions. Requirements ------------ The modules should not require any external Python modules and should be pure Python. The modules are developed and tested with Python 2.7 and 3.6 but may also work with older versions of Python. Copyright --------- Copyright (C) 2010-2024 Arthur de Jong and others This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Feedback and bug reports ------------------------ If you have any questions regarding python-stdnum, would like to report a bug or request addition of a format please send an email to Patches and code contributions are more than welcome. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1710709377.0 python-stdnum-1.20/README.md0000644000000000000000000003752114575655201014324 0ustar00rootrootpython-stdnum ============= A Python module to parse, validate and reformat standard numbers and codes in different formats. It contains a large collection of number formats. Basically any number or code that has some validation mechanism available or some common formatting is eligible for inclusion in this library. https://arthurdejong.org/python-stdnum/ Available formats ----------------- Currently this package supports the following formats: * NRT (Número de Registre Tributari, Andorra tax number) * NIPT, NUIS (Numri i Identifikimit për Personin e Tatueshëm, Albanian tax number) * CBU (Clave Bancaria Uniforme, Argentine bank account number) * CUIT (Código Único de Identificación Tributaria, Argentinian tax number) * DNI (Documento Nacional de Identidad, Argentinian national identity nr.) * Austrian Company Register Numbers * Postleitzahl (Austrian postal code) * Abgabenkontonummer (Austrian tax identification number) * UID (Umsatzsteuer-Identifikationsnummer, Austrian VAT number) * VNR, SVNR, VSNR (Versicherungsnummer, Austrian social security number) * ABN (Australian Business Number) * ACN (Australian Company Number) * TFN (Australian Tax File Number) * BIS (Belgian BIS number) * Belgian IBAN (International Bank Account Number) * NN, NISS, RRN (Belgian national number) * BTW, TVA, NWSt, ondernemingsnummer (Belgian enterprise number) * EGN (ЕГН, Единен граждански номер, Bulgarian personal identity codes) * PNF (ЛНЧ, Личен номер на чужденец, Bulgarian number of a foreigner) * VAT (Идентификационен номер по ДДС, Bulgarian VAT number) * BIC (ISO 9362 Business identifier codes) * Bitcoin address * CNPJ (Cadastro Nacional da Pessoa Jurídica, Brazilian company identifier) * CPF (Cadastro de Pessoas Físicas, Brazilian national identifier) * УНП, UNP (Учетный номер плательщика, the Belarus VAT number) * BC PHN (British Columbia Personal Health Number) * BN (Canadian Business Number) * SIN (Canadian Social Insurance Number) * CAS RN (Chemical Abstracts Service Registry Number) * CFI (ISO 10962 Classification of Financial Instruments) * ESR, ISR, QR-reference (reference number on Swiss payment slips) * Swiss social security number ("Sozialversicherungsnummer") * UID (Unternehmens-Identifikationsnummer, Swiss business identifier) * VAT, MWST, TVA, IVA, TPV (Mehrwertsteuernummer, the Swiss VAT number) * RUT (Rol Único Tributario, Chilean national tax number) * RIC No. (Chinese Resident Identity Card Number) * USCC (Unified Social Credit Code, 统一社会信用代码, China tax number) * NIT (Número De Identificación Tributaria, Colombian identity code) * CPF (Cédula de Persona Física, Costa Rica physical person ID number) * CPJ (Cédula de Persona Jurídica, Costa Rica tax number) * CR (Cédula de Residencia, Costa Rica foreigners ID number) * NI (Número de identidad, Cuban identity card numbers) * CUSIP number (financial security identification number) * Αριθμός Εγγραφής Φ.Π.Α. (Cypriot VAT number) * Czech bank account number * DIČ (Daňové identifikační číslo, Czech VAT number) * RČ (Rodné číslo, the Czech birth number) * Handelsregisternummer (German company register number) * IdNr (Steuerliche Identifikationsnummer, German personal tax number) * St.-Nr. (Steuernummer, German tax number) * Ust ID Nr. (Umsatzsteur Identifikationnummer, German VAT number) * Wertpapierkennnummer (German securities identification code) * CPR (personnummer, the Danish citizen number) * CVR (Momsregistreringsnummer, Danish VAT number) * Cedula (Dominican Republic national identification number) * NCF (Números de Comprobante Fiscal, Dominican Republic receipt number) * RNC (Registro Nacional del Contribuyente, Dominican Republic tax number) * NIF, sometimes N.I.F. (Numéro d'Identification Fiscale, Algeria tax number) * EAN (International Article Number) * CI (Cédula de identidad, Ecuadorian personal identity code) * RUC (Registro Único de Contribuyentes, Ecuadorian company tax number) * Isikukood (Estonian Personal ID number) * KMKR (Käibemaksukohuslase, Estonian VAT number) * Registrikood (Estonian organisation registration code) * Tax Registration Number (الرقم الضريبي, Egypt tax number) * CCC (Código Cuenta Corriente, Spanish Bank Account Code) * CIF (Código de Identificación Fiscal, Spanish company tax number) * CUPS (Código Unificado de Punto de Suministro, Spanish meter point number) * DNI (Documento Nacional de Identidad, Spanish personal identity codes) * Spanish IBAN (International Bank Account Number) * NIE (Número de Identificación de Extranjero, Spanish foreigner number) * NIF (Número de Identificación Fiscal, Spanish VAT number) * Postcode (the Spanish postal code) * Referencia Catastral (Spanish real estate property id) * SEPA Identifier of the Creditor (AT-02) * Euro banknote serial numbers * EC Number (European Community number) * EIC (European Energy Identification Code) * NACE (classification for businesses in the European Union) * OSS (European VAT on e-Commerce - One Stop Shop) * VAT (European Union VAT number) * ALV nro (Arvonlisäveronumero, Finnish VAT number) * Finnish Association Identifier * HETU (Henkilötunnus, Finnish personal identity code) * Veronumero (Finnish individual tax number) * Y-tunnus (Finnish business identifier) * FIGI (Financial Instrument Global Identifier) * V-number (Vinnutal, Faroe Islands tax number) * NIF (Numéro d'Immatriculation Fiscale, French tax identification number) * NIR (French personal identification number) * SIREN (a French company identification number) * SIRET (a French company establishment identification number) * n° TVA (taxe sur la valeur ajoutée, French VAT number) * NHS (United Kingdom National Health Service patient identifier) * SEDOL number (Stock Exchange Daily Official List number) * UPN (English Unique Pupil Number) * UTR (United Kingdom Unique Taxpayer Reference) * VAT (United Kingdom (and Isle of Man) VAT registration number) * TIN (Taxpayer Identification Number, Ghana tax number) * NIFp (Numéro d'Identification Fiscale Permanent, Guinea tax number) * AMKA (Αριθμός Μητρώου Κοινωνικής Ασφάλισης, Greek social security number) * FPA, ΦΠΑ, ΑΦΜ (Αριθμός Φορολογικού Μητρώου, the Greek VAT number) * GRid (Global Release Identifier) * GS1-128 (Standard to encode product information in Code 128 barcodes) * NIT (Número de Identificación Tributaria, Guatemala tax number) * OIB (Osobni identifikacijski broj, Croatian identification number) * ANUM (Közösségi adószám, Hungarian VAT number) * IBAN (International Bank Account Number) * NPWP (Nomor Pokok Wajib Pajak, Indonesian VAT Number) * PPS No (Personal Public Service Number, Irish personal number) * VAT (Irish tax reference number) * Company Number (מספר חברה, or short ח.פ. Israeli company number) * Identity Number (Mispar Zehut, מספר זהות, Israeli identity number) * IMEI (International Mobile Equipment Identity) * IMO number (International Maritime Organization number) * IMSI (International Mobile Subscriber Identity) * Aadhaar (Indian personal identity number) * EPIC (Electoral Photo Identity Card, Indian Voter ID) * GSTIN (Goods and Services Tax identification number, Indian VAT number) * PAN (Permanent Account Number, Indian income tax identifier) * VID (Indian personal virtual identity number) * Kennitala (Icelandic personal and organisation identity code) * VSK number (Virðisaukaskattsnúmer, Icelandic VAT number) * ISAN (International Standard Audiovisual Number) * ISBN (International Standard Book Number) * ISIL (International Standard Identifier for Libraries) * ISIN (International Securities Identification Number) * ISMN (International Standard Music Number) * ISO 11649 (Structured Creditor Reference) * ISO 6346 (International standard for container identification) * ISRC (International Standard Recording Code) * ISSN (International Standard Serial Number) * AIC (Italian code for identification of drugs) * Codice Fiscale (Italian tax code for individuals) * Partita IVA (Italian VAT number) * CN (法人番号, hōjin bangō, Japanese Corporate Number) * PIN (Personal Identification Number, Kenya tax number) * BRN (사업자 등록 번호, South Korea Business Registration Number) * RRN (South Korean resident registration number) * LEI (Legal Entity Identifier) * PEID (Liechtenstein tax code for individuals and entities) * Asmens kodas (Lithuanian, personal numbers) * PVM (Pridėtinės vertės mokestis mokėtojo kodas, Lithuanian VAT number) * TVA (taxe sur la valeur ajoutée, Luxembourgian VAT number) * PVN (Pievienotās vērtības nodokļa, Latvian VAT number) * ICE (Identifiant Commun de l’Entreprise, التعريف الموحد للمقاولة, Morocco tax number) * MAC address (Media Access Control address) * n° TVA (taxe sur la valeur ajoutée, Monacan VAT number) * IDNO (Moldavian company identification number) * Montenegro IBAN (International Bank Account Number) * PIB (Poreski Identifikacioni Broj, Montenegro tax number) * MEID (Mobile Equipment Identifier) * ЕДБ (Едниствен Даночен Број, North Macedonia tax number) * VAT (Maltese VAT number) * ID number (Mauritian national identifier) * CURP (Clave Única de Registro de Población, Mexican personal ID) * RFC (Registro Federal de Contribuyentes, Mexican tax number) * NRIC No. (Malaysian National Registration Identity Card Number) * BRIN number (the Dutch school identification number) * BSN (Burgerservicenummer, the Dutch citizen identification number) * Btw-identificatienummer (Omzetbelastingnummer, the Dutch VAT number) * Onderwijsnummer (the Dutch student identification number) * Postcode (the Dutch postal code) * Fødselsnummer (Norwegian birth number, the national identity number) * Norwegian IBAN (International Bank Account Number) * Konto nr. (Norwegian bank account number) * MVA (Merverdiavgift, Norwegian VAT number) * Orgnr (Organisasjonsnummer, Norwegian organisation number) * New Zealand bank account number * IRD number (New Zealand Inland Revenue Department (Te Tari Tāke) number) * CUI (Cédula Única de Identidad, Peruvian identity number) * RUC (Registro Único de Contribuyentes, Peruvian company tax number) * CNIC number (Pakistani Computerised National Identity Card number) * NIP (Numer Identyfikacji Podatkowej, Polish VAT number) * PESEL (Polish national identification number) * REGON (Rejestr Gospodarki Narodowej, Polish register of economic units) * CC (Número de Cartão de Cidadão, Portuguese Identity number) * NIF (Número de identificação fiscal, Portuguese VAT number) * RUC number (Registro Único de Contribuyentes, Paraguay tax number) * CF (Cod de înregistrare în scopuri de TVA, Romanian VAT number) * CNP (Cod Numeric Personal, Romanian Numerical Personal Code) * CUI or CIF (Codul Unic de Înregistrare, Romanian company identifier) * ONRC (Ordine din Registrul Comerţului, Romanian Trade Register identifier) * PIB (Poreski Identifikacioni Broj, Serbian tax identification number) * ИНН (Идентификационный номер налогоплательщика, Russian tax identifier) * Orgnr (Organisationsnummer, Swedish company number) * Personnummer (Swedish personal identity number) * Postcode (the Swedish postal code) * VAT (Moms, Mervärdesskatt, Swedish VAT number) * UEN (Singapore's Unique Entity Number) * ID za DDV (Davčna številka, Slovenian VAT number) * Enotna matična številka občana (Unique Master Citizen Number) * Matična številka poslovnega registra (Corporate Registration Number) * IČ DPH (IČ pre daň z pridanej hodnoty, Slovak VAT number) * RČ (Rodné číslo, the Slovak birth number) * COE (Codice operatore economico, San Marino national tax number) * NIT (Número de Identificación Tributaria, El Salvador tax number) * MOA (Thailand Memorandum of Association Number) * PIN (Thailand Personal Identification Number) * TIN (Thailand Taxpayer Identification Number) * MF (Matricule Fiscal, Tunisia tax number) * T.C. Kimlik No. (Turkish personal identification number) * VKN (Vergi Kimlik Numarası, Turkish tax identification number) * UBN (Unified Business Number, 統一編號, Taiwanese tax number) * ЄДРПОУ, EDRPOU (Identifier for enterprises and organizations in Ukraine) * РНОКПП, RNTRC (Individual taxpayer registration number in Ukraine) * ATIN (U.S. Adoption Taxpayer Identification Number) * EIN (U.S. Employer Identification Number) * ITIN (U.S. Individual Taxpayer Identification Number) * PTIN (U.S. Preparer Tax Identification Number) * RTN (Routing transport number) * SSN (U.S. Social Security Number) * TIN (U.S. Taxpayer Identification Number) * RUT (Registro Único Tributario, Uruguay tax number) * VATIN (International value added tax identification number) * RIF (Registro de Identificación Fiscal, Venezuelan VAT number) * MST (Mã số thuế, Vietnam tax number) * ID number (South African Identity Document number) * TIN (South African Tax Identification Number) Furthermore a number of generic check digit algorithms are available: * the Verhoeff algorithm * the Damm algorithm * the Luhn and Luhn mod N algorithms * some algorithms described in ISO/IEC 7064: Mod 11, 2, Mod 37, 2, Mod 97, 10, Mod 11, 10 and Mod 37, 36 Basically any number or code that has some validation mechanism available or some common formatting is eligible for inclusion into this library. These modules generally do not provide background information on the meaning and use of the specified numbers, only parsing and handling functions. Interface --------- All modules implement a common interface. For example for ISBN validation: >>> from stdnum import isbn >>> isbn.validate('978-9024538270') '9789024538270' >>> isbn.validate('978-9024538271') Traceback (most recent call last): ... InvalidChecksum: ... Most of these modules implement the following functions: * `validate()` validate the correctness of the passed number and return a compact representation of the number invalid numbers are rejected with one of the exceptions from the stdnum.exceptions module * `compact()` return a compact representation of the number or code this function generally does not do validation but may raise exceptions for wildly incorrect numbers * `format()` return a formatted version of the number in the preferred format this function generally expects to be passed a valid number or code Apart from the above, the module may add extra parsing, validation or conversion functions. Requirements ------------ The modules should not require any external Python modules and should be pure Python. The modules are developed and tested with Python 2.7 and 3.6 but may also work with older versions of Python. Copyright --------- Copyright (C) 2010-2024 Arthur de Jong and others This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Feedback and bug reports ------------------------ If you have any questions regarding python-stdnum, would like to report a bug or request addition of a format please send an email to Patches and code contributions are more than welcome. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1710711668.4260077 python-stdnum-1.20/docs/0000755000000000000000000000000014575661564013776 5ustar00rootroot././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1710711668.3980079 python-stdnum-1.20/docs/_templates/0000755000000000000000000000000014575661564016133 5ustar00rootroot././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1710711668.4260077 python-stdnum-1.20/docs/_templates/autosummary/0000755000000000000000000000000014575661564020521 5ustar00rootroot././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/_templates/autosummary/module.rst0000644000000000000000000000011413651061616022516 0ustar00rootroot{{ fullname }} {{ underline }} .. automodule:: {{ fullname }} :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/changes.rst0000644000000000000000000000011013651061616016112 0ustar00rootrootChanges in python-stdnum ======================== .. include:: ../NEWS ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1710709377.0 python-stdnum-1.20/docs/conf.py0000644000000000000000000000564014575655201015271 0ustar00rootroot# -*- coding: utf-8 -*- # # python-stdnum documentation build configuration file, created by # sphinx-quickstart # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. """python-stdnum documentation build configuration.""" import stdnum # -- General configuration ----------------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.autosummary', ] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. source_encoding = 'utf-8' # The master toctree document. master_doc = 'index' # General information about the project. project = u'python-stdnum' copyright = u'2013-2024, Arthur de Jong' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = stdnum.__version__ # The full version, including alpha/beta/rc tags. release = version # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['_*', '.svn', '.git'] # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. modindex_common_prefix = ['stdnum.'] # Automatically generate stub pages for autosummary entries. autosummary_generate = True # Autosummary overwrites existing files by generated stub pages. autosummary_generate_overwrite = False # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'default' # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. html_last_updated_fmt = '%Y-%m-%d' # If true, links to the reST sources are added to the pages. html_show_sourcelink = False # Output file base name for HTML help builder. htmlhelp_basename = 'python-stdnumdoc' # -- Options for manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'python-stdnum', u'python-stdnum Documentation', [u'Arthur de Jong'], 1), ] intersphinx_mapping = {'python': ('https://docs.python.org/3', None)} ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1683892766.0 python-stdnum-1.20/docs/contributing.rst0000644000000000000000000000004014427425036017215 0ustar00rootroot.. include:: ../CONTRIBUTING.md ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1710709377.0 python-stdnum-1.20/docs/index.rst0000644000000000000000000001322314575655201015627 0ustar00rootroot.. module:: stdnum .. include:: ../README.md :end-before: Available formats Common Interface ---------------- Most of the number format modules implement the following functions: .. function:: module.validate(number) Validate the number and return a compact, consistent representation of the number or code. If the validation fails, :mod:`an exception <.exceptions>` is raised that indicates the type of error. :raises ValidationError: When the specified number is invalid :returns: str -- A compact (canonical) representation of the number .. function:: module.is_valid(number) Return either ``True`` or ``False`` depending on whether the passed number is in any supported and valid form and passes all embedded checks of the number. This function should never raise an exception. :returns: bool -- ``True`` if validated, ``False`` otherwise .. function:: module.compact(number) Return a compact representation of the number or code. This function generally does not do validation but may raise exceptions for wildly invalid numbers. :returns: str -- The compacted number .. function:: module.format(number) Return a formatted version of the number in the preferred format. This function generally expects to be passed a valid number or code and may raise exceptions for invalid numbers. :returns: str -- A formatted number The check digit modules generally also provide the following functions: .. function:: module.checksum(number) Calculate the checksum over the provided number. This is generally a number that can be used to determine whether the provided number is valid. It depends on the algorithm which checksum is considered valid. :returns: int -- A numeric checksum over the number .. function:: module.calc_check_digit(number) Calculate the check digit that should be added to the number to make it valid. :returns: str -- A check digit that can be appended Apart from the above, the modules may add extra parsing, validation or conversion functions. Helper functions and modules ---------------------------- .. autosummary:: :toctree: exceptions .. autofunction:: get_cc_module Searches the stdnum collection of modules for a number format for a particular country. `name` may be an aliased name. For example: >>> from stdnum import get_cc_module >>> mod = get_cc_module('nl', 'vat') >>> mod >>> mod.validate('004495445B01') '004495445B01' Will return ``None`` if no module could be found. The generic names that are currently in use: * ``'vat'`` for value added tax numbers * ``'businessid'`` for generic business identifiers (although some countries may have multiple) * ``'personalid'`` for generic personal identifiers (some countries may have multiple, especially for tax purposes) * ``'postal_code'`` for address postal codes Generic check digit algorithms ------------------------------ .. autosummary:: :toctree: damm iso7064 luhn verhoeff Available formats ----------------- .. autosummary:: :toctree: ad.nrt al.nipt ar.cbu ar.cuit ar.dni at.businessid at.postleitzahl at.tin at.uid at.vnr au.abn au.acn au.tfn be.bis be.iban be.nn be.vat bg.egn bg.pnf bg.vat bic bitcoin br.cnpj br.cpf by.unp ca.bc_phn ca.bn ca.sin casrn cfi ch.esr ch.ssn ch.uid ch.vat cl.rut cn.ric cn.uscc co.nit cr.cpf cr.cpj cr.cr cu.ni cusip cy.vat cz.bankaccount cz.dic cz.rc de.handelsregisternummer de.idnr de.stnr de.vat de.wkn dk.cpr dk.cvr do.cedula do.ncf do.rnc dz.nif ean ec.ci ec.ruc ee.ik ee.kmkr ee.registrikood eg.tn es.ccc es.cif es.cups es.dni es.iban es.nie es.nif es.postal_code es.referenciacatastral eu.at_02 eu.banknote eu.ecnumber eu.eic eu.nace eu.oss eu.vat fi.alv fi.associationid fi.hetu fi.veronumero fi.ytunnus figi fo.vn fr.nif fr.nir fr.siren fr.siret fr.tva gb.nhs gb.sedol gb.upn gb.utr gb.vat gh.tin gn.nifp gr.amka gr.vat grid gs1_128 gt.nit hr.oib hu.anum iban id.npwp ie.pps ie.vat il.hp il.idnr imei imo imsi in_.aadhaar in_.epic in_.gstin in_.pan in_.vid is_.kennitala is_.vsk isan isbn isil isin ismn iso11649 iso6346 isrc issn it.aic it.codicefiscale it.iva jp.cn ke.pin kr.brn kr.rrn lei li.peid lt.asmens lt.pvm lu.tva lv.pvn ma.ice mac mc.tva md.idno me.iban me.pib meid mk.edb mt.vat mu.nid mx.curp mx.rfc my.nric nl.brin nl.bsn nl.btw nl.onderwijsnummer nl.postcode no.fodselsnummer no.iban no.kontonr no.mva no.orgnr nz.bankaccount nz.ird pe.cui pe.ruc pk.cnic pl.nip pl.pesel pl.regon pt.cc pt.nif py.ruc ro.cf ro.cnp ro.cui ro.onrc rs.pib ru.inn se.orgnr se.personnummer se.postnummer se.vat sg.uen si.ddv si.emso si.maticna sk.dph sk.rc sm.coe sv.nit th.moa th.pin th.tin tn.mf tr.tckimlik tr.vkn tw.ubn ua.edrpou ua.rntrc us.atin us.ein us.itin us.ptin us.rtn us.ssn us.tin uy.rut vatin ve.rif vn.mst za.idnr za.tin Changes in python-stdnum ------------------------ .. toctree:: :maxdepth: 2 changes Contributing to python-stdnum ----------------------------- .. toctree:: :maxdepth: 2 contributing ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1594561976.0 python-stdnum-1.20/docs/stdnum.ad.nrt.rst0000644000000000000000000000010713702612670017206 0ustar00rootrootstdnum.ad.nrt ============= .. automodule:: stdnum.ad.nrt :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.al.nipt.rst0000644000000000000000000000011213651061616017362 0ustar00rootrootstdnum.al.nipt ============== .. automodule:: stdnum.al.nipt :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.ar.cbu.rst0000644000000000000000000000010713651061616017173 0ustar00rootrootstdnum.ar.cbu ============= .. automodule:: stdnum.ar.cbu :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.ar.cuit.rst0000644000000000000000000000011213651061616017362 0ustar00rootrootstdnum.ar.cuit ============== .. automodule:: stdnum.ar.cuit :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.ar.dni.rst0000644000000000000000000000010713651061616017174 0ustar00rootrootstdnum.ar.dni ============= .. automodule:: stdnum.ar.dni :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.at.businessid.rst0000644000000000000000000000013413651061616020574 0ustar00rootrootstdnum.at.businessid ==================== .. automodule:: stdnum.at.businessid :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.at.postleitzahl.rst0000644000000000000000000000014213651061616021145 0ustar00rootrootstdnum.at.postleitzahl ====================== .. automodule:: stdnum.at.postleitzahl :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.at.tin.rst0000644000000000000000000000010713651061616017216 0ustar00rootrootstdnum.at.tin ============= .. automodule:: stdnum.at.tin :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321370.0 python-stdnum-1.20/docs/stdnum.at.uid.rst0000644000000000000000000000011013776706732017214 0ustar00rootrootstdnum.at.uid ============= .. automodule:: stdnum.at.uid :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.at.vnr.rst0000644000000000000000000000010713651061616017231 0ustar00rootrootstdnum.at.vnr ============= .. automodule:: stdnum.at.vnr :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.au.abn.rst0000644000000000000000000000010713651061616017165 0ustar00rootrootstdnum.au.abn ============= .. automodule:: stdnum.au.abn :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.au.acn.rst0000644000000000000000000000010713651061616017166 0ustar00rootrootstdnum.au.acn ============= .. automodule:: stdnum.au.acn :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.au.tfn.rst0000644000000000000000000000010713651061616017214 0ustar00rootrootstdnum.au.tfn ============= .. automodule:: stdnum.au.tfn :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1692544543.0 python-stdnum-1.20/docs/stdnum.be.bis.rst0000644000000000000000000000010714470427037017166 0ustar00rootrootstdnum.be.bis ============= .. automodule:: stdnum.be.bis :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.be.iban.rst0000644000000000000000000000011213651061616017313 0ustar00rootrootstdnum.be.iban ============== .. automodule:: stdnum.be.iban :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1683892766.0 python-stdnum-1.20/docs/stdnum.be.nn.rst0000644000000000000000000000010414427425036017020 0ustar00rootrootstdnum.be.nn ============ .. automodule:: stdnum.be.nn :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321370.0 python-stdnum-1.20/docs/stdnum.be.vat.rst0000644000000000000000000000011013776706732017207 0ustar00rootrootstdnum.be.vat ============= .. automodule:: stdnum.be.vat :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321370.0 python-stdnum-1.20/docs/stdnum.bg.egn.rst0000644000000000000000000000011013776706732017170 0ustar00rootrootstdnum.bg.egn ============= .. automodule:: stdnum.bg.egn :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321370.0 python-stdnum-1.20/docs/stdnum.bg.pnf.rst0000644000000000000000000000011013776706732017202 0ustar00rootrootstdnum.bg.pnf ============= .. automodule:: stdnum.bg.pnf :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321370.0 python-stdnum-1.20/docs/stdnum.bg.vat.rst0000644000000000000000000000011013776706732017211 0ustar00rootrootstdnum.bg.vat ============= .. automodule:: stdnum.bg.vat :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.bic.rst0000644000000000000000000000007613651061616016563 0ustar00rootrootstdnum.bic ========== .. automodule:: stdnum.bic :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.bitcoin.rst0000644000000000000000000000011213651061616017444 0ustar00rootrootstdnum.bitcoin ============== .. automodule:: stdnum.bitcoin :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.br.cnpj.rst0000644000000000000000000000011213651061616017351 0ustar00rootrootstdnum.br.cnpj ============== .. automodule:: stdnum.br.cnpj :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321370.0 python-stdnum-1.20/docs/stdnum.br.cpf.rst0000644000000000000000000000011013776706732017202 0ustar00rootrootstdnum.br.cpf ============= .. automodule:: stdnum.br.cpf :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.by.unp.rst0000644000000000000000000000010714405357103017231 0ustar00rootrootstdnum.by.unp ============= .. automodule:: stdnum.by.unp :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1710709377.0 python-stdnum-1.20/docs/stdnum.ca.bc_phn.rst0000644000000000000000000000012014575655201017634 0ustar00rootrootstdnum.ca.bc_phn ================ .. automodule:: stdnum.ca.bc_phn :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.ca.bn.rst0000644000000000000000000000010413651061616016777 0ustar00rootrootstdnum.ca.bn ============ .. automodule:: stdnum.ca.bn :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.ca.sin.rst0000644000000000000000000000010713651061616017174 0ustar00rootrootstdnum.ca.sin ============= .. automodule:: stdnum.ca.sin :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.casrn.rst0000644000000000000000000000010413651061616017124 0ustar00rootrootstdnum.casrn ============ .. automodule:: stdnum.casrn :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1683892766.0 python-stdnum-1.20/docs/stdnum.cfi.rst0000644000000000000000000000007614427425036016571 0ustar00rootrootstdnum.cfi ========== .. automodule:: stdnum.cfi :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1596894777.0 python-stdnum-1.20/docs/stdnum.ch.esr.rst0000644000000000000000000000010713713527071017204 0ustar00rootrootstdnum.ch.esr ============= .. automodule:: stdnum.ch.esr :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321380.0 python-stdnum-1.20/docs/stdnum.ch.ssn.rst0000644000000000000000000000011013776706744017227 0ustar00rootrootstdnum.ch.ssn ============= .. automodule:: stdnum.ch.ssn :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.ch.uid.rst0000644000000000000000000000010713651061616017173 0ustar00rootrootstdnum.ch.uid ============= .. automodule:: stdnum.ch.uid :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.ch.vat.rst0000644000000000000000000000010713651061616017204 0ustar00rootrootstdnum.ch.vat ============= .. automodule:: stdnum.ch.vat :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.cl.rut.rst0000644000000000000000000000010713651061616017230 0ustar00rootrootstdnum.cl.rut ============= .. automodule:: stdnum.cl.rut :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321380.0 python-stdnum-1.20/docs/stdnum.cn.ric.rst0000644000000000000000000000011013776706744017207 0ustar00rootrootstdnum.cn.ric ============= .. automodule:: stdnum.cn.ric :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.cn.uscc.rst0000644000000000000000000000011214405357103017346 0ustar00rootrootstdnum.cn.uscc ============== .. automodule:: stdnum.cn.uscc :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.co.nit.rst0000644000000000000000000000010713651061616017213 0ustar00rootrootstdnum.co.nit ============= .. automodule:: stdnum.co.nit :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1594561976.0 python-stdnum-1.20/docs/stdnum.cr.cpf.rst0000644000000000000000000000010713702612670017173 0ustar00rootrootstdnum.cr.cpf ============= .. automodule:: stdnum.cr.cpf :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1594561976.0 python-stdnum-1.20/docs/stdnum.cr.cpj.rst0000644000000000000000000000010713702612670017177 0ustar00rootrootstdnum.cr.cpj ============= .. automodule:: stdnum.cr.cpj :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1594561976.0 python-stdnum-1.20/docs/stdnum.cr.cr.rst0000644000000000000000000000010413702612670017024 0ustar00rootrootstdnum.cr.cr ============ .. automodule:: stdnum.cr.cr :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.cu.ni.rst0000644000000000000000000000010413651061616017032 0ustar00rootrootstdnum.cu.ni ============ .. automodule:: stdnum.cu.ni :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.cusip.rst0000644000000000000000000000010413651061616017141 0ustar00rootrootstdnum.cusip ============ .. automodule:: stdnum.cusip :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321380.0 python-stdnum-1.20/docs/stdnum.cy.vat.rst0000644000000000000000000000011013776706744017237 0ustar00rootrootstdnum.cy.vat ============= .. automodule:: stdnum.cy.vat :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1683892766.0 python-stdnum-1.20/docs/stdnum.cz.bankaccount.rst0000644000000000000000000000013714427425036020731 0ustar00rootrootstdnum.cz.bankaccount ===================== .. automodule:: stdnum.cz.bankaccount :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321380.0 python-stdnum-1.20/docs/stdnum.cz.dic.rst0000644000000000000000000000011013776706744017205 0ustar00rootrootstdnum.cz.dic ============= .. automodule:: stdnum.cz.dic :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321380.0 python-stdnum-1.20/docs/stdnum.cz.rc.rst0000644000000000000000000000010513776706744017056 0ustar00rootrootstdnum.cz.rc ============ .. automodule:: stdnum.cz.rc :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.damm.rst0000644000000000000000000000010113651061616016731 0ustar00rootrootstdnum.damm =========== .. automodule:: stdnum.damm :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.de.handelsregisternummer.rst0000644000000000000000000000017513651061616023024 0ustar00rootrootstdnum.de.handelsregisternummer =============================== .. automodule:: stdnum.de.handelsregisternummer :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.de.idnr.rst0000644000000000000000000000011213651061616017340 0ustar00rootrootstdnum.de.idnr ============== .. automodule:: stdnum.de.idnr :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.de.stnr.rst0000644000000000000000000000011213651061616017372 0ustar00rootrootstdnum.de.stnr ============== .. automodule:: stdnum.de.stnr :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321380.0 python-stdnum-1.20/docs/stdnum.de.vat.rst0000644000000000000000000000011013776706744017214 0ustar00rootrootstdnum.de.vat ============= .. automodule:: stdnum.de.vat :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.de.wkn.rst0000644000000000000000000000010713651061616017207 0ustar00rootrootstdnum.de.wkn ============= .. automodule:: stdnum.de.wkn :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321380.0 python-stdnum-1.20/docs/stdnum.dk.cpr.rst0000644000000000000000000000011013776706744017214 0ustar00rootrootstdnum.dk.cpr ============= .. automodule:: stdnum.dk.cpr :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321380.0 python-stdnum-1.20/docs/stdnum.dk.cvr.rst0000644000000000000000000000011013776706744017222 0ustar00rootrootstdnum.dk.cvr ============= .. automodule:: stdnum.dk.cvr :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.do.cedula.rst0000644000000000000000000000012013651061616017652 0ustar00rootrootstdnum.do.cedula ================ .. automodule:: stdnum.do.cedula :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.do.ncf.rst0000644000000000000000000000010713651061616017170 0ustar00rootrootstdnum.do.ncf ============= .. automodule:: stdnum.do.ncf :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.do.rnc.rst0000644000000000000000000000010713651061616017204 0ustar00rootrootstdnum.do.rnc ============= .. automodule:: stdnum.do.rnc :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1683892766.0 python-stdnum-1.20/docs/stdnum.dz.nif.rst0000644000000000000000000000010714427425036017213 0ustar00rootrootstdnum.dz.nif ============= .. automodule:: stdnum.dz.nif :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321380.0 python-stdnum-1.20/docs/stdnum.ean.rst0000644000000000000000000000007713776706744016612 0ustar00rootrootstdnum.ean ========== .. automodule:: stdnum.ean :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321380.0 python-stdnum-1.20/docs/stdnum.ec.ci.rst0000644000000000000000000000010513776706744017020 0ustar00rootrootstdnum.ec.ci ============ .. automodule:: stdnum.ec.ci :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321387.0 python-stdnum-1.20/docs/stdnum.ec.ruc.rst0000644000000000000000000000011013776706753017212 0ustar00rootrootstdnum.ec.ruc ============= .. automodule:: stdnum.ec.ruc :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.ee.ik.rst0000644000000000000000000000010413651061616017011 0ustar00rootrootstdnum.ee.ik ============ .. automodule:: stdnum.ee.ik :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321387.0 python-stdnum-1.20/docs/stdnum.ee.kmkr.rst0000644000000000000000000000011313776706753017372 0ustar00rootrootstdnum.ee.kmkr ============== .. automodule:: stdnum.ee.kmkr :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.ee.registrikood.rst0000644000000000000000000000014213651061616021115 0ustar00rootrootstdnum.ee.registrikood ====================== .. automodule:: stdnum.ee.registrikood :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1692544543.0 python-stdnum-1.20/docs/stdnum.eg.tn.rst0000644000000000000000000000010414470427037017034 0ustar00rootrootstdnum.eg.tn ============ .. automodule:: stdnum.eg.tn :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.es.ccc.rst0000644000000000000000000000010713651061616017157 0ustar00rootrootstdnum.es.ccc ============= .. automodule:: stdnum.es.ccc :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321387.0 python-stdnum-1.20/docs/stdnum.es.cif.rst0000644000000000000000000000011013776706753017202 0ustar00rootrootstdnum.es.cif ============= .. automodule:: stdnum.es.cif :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.es.cups.rst0000644000000000000000000000011213651061616017375 0ustar00rootrootstdnum.es.cups ============== .. automodule:: stdnum.es.cups :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321387.0 python-stdnum-1.20/docs/stdnum.es.dni.rst0000644000000000000000000000011013776706753017213 0ustar00rootrootstdnum.es.dni ============= .. automodule:: stdnum.es.dni :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.es.iban.rst0000644000000000000000000000011213651061616017334 0ustar00rootrootstdnum.es.iban ============== .. automodule:: stdnum.es.iban :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321387.0 python-stdnum-1.20/docs/stdnum.es.nie.rst0000644000000000000000000000011013776706753017214 0ustar00rootrootstdnum.es.nie ============= .. automodule:: stdnum.es.nie :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321387.0 python-stdnum-1.20/docs/stdnum.es.nif.rst0000644000000000000000000000011013776706753017215 0ustar00rootrootstdnum.es.nif ============= .. automodule:: stdnum.es.nif :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1692544543.0 python-stdnum-1.20/docs/stdnum.es.postal_code.rst0000644000000000000000000000013714470427037020731 0ustar00rootrootstdnum.es.postal_code ===================== .. automodule:: stdnum.es.postal_code :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.es.referenciacatastral.rst0000644000000000000000000000016713651061616022437 0ustar00rootrootstdnum.es.referenciacatastral ============================= .. automodule:: stdnum.es.referenciacatastral :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321387.0 python-stdnum-1.20/docs/stdnum.eu.at_02.rst0000644000000000000000000000011613776706753017356 0ustar00rootrootstdnum.eu.at_02 =============== .. automodule:: stdnum.eu.at_02 :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.eu.banknote.rst0000644000000000000000000000012613651061616020233 0ustar00rootrootstdnum.eu.banknote ================== .. automodule:: stdnum.eu.banknote :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1710709377.0 python-stdnum-1.20/docs/stdnum.eu.ecnumber.rst0000644000000000000000000000012614575655201020237 0ustar00rootrootstdnum.eu.ecnumber ================== .. automodule:: stdnum.eu.ecnumber :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.eu.eic.rst0000644000000000000000000000010713651061616017171 0ustar00rootrootstdnum.eu.eic ============= .. automodule:: stdnum.eu.eic :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321073.0 python-stdnum-1.20/docs/stdnum.eu.nace.rst0000644000000000000000000000014613776706261017354 0ustar00rootrootstdnum.eu.nace ============== .. automodule:: stdnum.eu.nace :members: :exclude-members: label ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1692544543.0 python-stdnum-1.20/docs/stdnum.eu.oss.rst0000644000000000000000000000010714470427037017240 0ustar00rootrootstdnum.eu.oss ============= .. automodule:: stdnum.eu.oss :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321408.0 python-stdnum-1.20/docs/stdnum.eu.vat.rst0000644000000000000000000000011013776707000017217 0ustar00rootrootstdnum.eu.vat ============= .. automodule:: stdnum.eu.vat :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321405.0 python-stdnum-1.20/docs/stdnum.exceptions.rst0000644000000000000000000000143213776706775020230 0ustar00rootrootstdnum.exceptions ================= .. automodule:: stdnum.exceptions :show-inheritance: :member-order: bysource :members: The exceptions are organised hierarchically in the following structure: :: ValidationError +-- InvalidFormat | +-- InvalidLength +-- InvalidChecksum +-- InvalidComponent It is possible to change the exception messages by setting the `message` class property. This allows localisation and application-specific error messages. >>> raise InvalidFormat() Traceback (most recent call last): ... InvalidChecksum: The number has an invalid format. >>> InvalidFormat.message = 'UNKNOWN' >>> raise InvalidFormat() Traceback (most recent call last): ... InvalidChecksum: UNKNOWN ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321416.0 python-stdnum-1.20/docs/stdnum.fi.alv.rst0000644000000000000000000000011013776707010017175 0ustar00rootrootstdnum.fi.alv ============= .. automodule:: stdnum.fi.alv :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.fi.associationid.rst0000644000000000000000000000014513651061616021251 0ustar00rootrootstdnum.fi.associationid ======================= .. automodule:: stdnum.fi.associationid :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321416.0 python-stdnum-1.20/docs/stdnum.fi.hetu.rst0000644000000000000000000000011313776707010017363 0ustar00rootrootstdnum.fi.hetu ============== .. automodule:: stdnum.fi.hetu :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.fi.veronumero.rst0000644000000000000000000000013413651061616020617 0ustar00rootrootstdnum.fi.veronumero ==================== .. automodule:: stdnum.fi.veronumero :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.fi.ytunnus.rst0000644000000000000000000000012313651061616020141 0ustar00rootrootstdnum.fi.ytunnus ================= .. automodule:: stdnum.fi.ytunnus :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.figi.rst0000644000000000000000000000010113651061616016731 0ustar00rootrootstdnum.figi =========== .. automodule:: stdnum.figi :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1683892766.0 python-stdnum-1.20/docs/stdnum.fo.vn.rst0000644000000000000000000000010414427425036017046 0ustar00rootrootstdnum.fo.vn ============ .. automodule:: stdnum.fo.vn :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.fr.nif.rst0000644000000000000000000000010713651061616017203 0ustar00rootrootstdnum.fr.nif ============= .. automodule:: stdnum.fr.nif :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.fr.nir.rst0000644000000000000000000000010713651061616017217 0ustar00rootrootstdnum.fr.nir ============= .. automodule:: stdnum.fr.nir :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321416.0 python-stdnum-1.20/docs/stdnum.fr.siren.rst0000644000000000000000000000011613776707010017552 0ustar00rootrootstdnum.fr.siren =============== .. automodule:: stdnum.fr.siren :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.fr.siret.rst0000644000000000000000000000011513651061616017554 0ustar00rootrootstdnum.fr.siret =============== .. automodule:: stdnum.fr.siret :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321416.0 python-stdnum-1.20/docs/stdnum.fr.tva.rst0000644000000000000000000000011013776707010017216 0ustar00rootrootstdnum.fr.tva ============= .. automodule:: stdnum.fr.tva :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.gb.nhs.rst0000644000000000000000000000010713651061616017200 0ustar00rootrootstdnum.gb.nhs ============= .. automodule:: stdnum.gb.nhs :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.gb.sedol.rst0000644000000000000000000000011513651061616017515 0ustar00rootrootstdnum.gb.sedol =============== .. automodule:: stdnum.gb.sedol :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.gb.upn.rst0000644000000000000000000000010713651061616017212 0ustar00rootrootstdnum.gb.upn ============= .. automodule:: stdnum.gb.upn :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.gb.utr.rst0000644000000000000000000000010714405357103017217 0ustar00rootrootstdnum.gb.utr ============= .. automodule:: stdnum.gb.utr :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321416.0 python-stdnum-1.20/docs/stdnum.gb.vat.rst0000644000000000000000000000011013776707010017177 0ustar00rootrootstdnum.gb.vat ============= .. automodule:: stdnum.gb.vat :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1683892766.0 python-stdnum-1.20/docs/stdnum.gh.tin.rst0000644000000000000000000000010714427425036017212 0ustar00rootrootstdnum.gh.tin ============= .. automodule:: stdnum.gh.tin :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1692544543.0 python-stdnum-1.20/docs/stdnum.gn.nifp.rst0000644000000000000000000000011214470427037017357 0ustar00rootrootstdnum.gn.nifp ============== .. automodule:: stdnum.gn.nifp :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.gr.amka.rst0000644000000000000000000000011213651061616017335 0ustar00rootrootstdnum.gr.amka ============== .. automodule:: stdnum.gr.amka :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321416.0 python-stdnum-1.20/docs/stdnum.gr.vat.rst0000644000000000000000000000011013776707010017217 0ustar00rootrootstdnum.gr.vat ============= .. automodule:: stdnum.gr.vat :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321416.0 python-stdnum-1.20/docs/stdnum.grid.rst0000644000000000000000000000010213776707010016744 0ustar00rootrootstdnum.grid =========== .. automodule:: stdnum.grid :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.gs1_128.rst0000644000000000000000000000011214405357103017076 0ustar00rootrootstdnum.gs1_128 ============== .. automodule:: stdnum.gs1_128 :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1594561976.0 python-stdnum-1.20/docs/stdnum.gt.nit.rst0000644000000000000000000000010713702612670017223 0ustar00rootrootstdnum.gt.nit ============= .. automodule:: stdnum.gt.nit :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321416.0 python-stdnum-1.20/docs/stdnum.hr.oib.rst0000644000000000000000000000011013776707010017177 0ustar00rootrootstdnum.hr.oib ============= .. automodule:: stdnum.hr.oib :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321430.0 python-stdnum-1.20/docs/stdnum.hu.anum.rst0000644000000000000000000000011313776707026017403 0ustar00rootrootstdnum.hu.anum ============== .. automodule:: stdnum.hu.anum :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321430.0 python-stdnum-1.20/docs/stdnum.iban.rst0000644000000000000000000000010213776707026016737 0ustar00rootrootstdnum.iban =========== .. automodule:: stdnum.iban :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.id.npwp.rst0000644000000000000000000000011214405357103017371 0ustar00rootrootstdnum.id.npwp ============== .. automodule:: stdnum.id.npwp :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321430.0 python-stdnum-1.20/docs/stdnum.ie.pps.rst0000644000000000000000000000011013776707026017223 0ustar00rootrootstdnum.ie.pps ============= .. automodule:: stdnum.ie.pps :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321430.0 python-stdnum-1.20/docs/stdnum.ie.vat.rst0000644000000000000000000000011013776707026017213 0ustar00rootrootstdnum.ie.vat ============= .. automodule:: stdnum.ie.vat :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.il.hp.rst0000644000000000000000000000010414405357103017025 0ustar00rootrootstdnum.il.hp ============ .. automodule:: stdnum.il.hp :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1594561976.0 python-stdnum-1.20/docs/stdnum.il.idnr.rst0000644000000000000000000000011213702612670017353 0ustar00rootrootstdnum.il.idnr ============== .. automodule:: stdnum.il.idnr :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321430.0 python-stdnum-1.20/docs/stdnum.imei.rst0000644000000000000000000000010213776707026016751 0ustar00rootrootstdnum.imei =========== .. automodule:: stdnum.imei :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.imo.rst0000644000000000000000000000007613651061616016612 0ustar00rootrootstdnum.imo ========== .. automodule:: stdnum.imo :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321430.0 python-stdnum-1.20/docs/stdnum.imsi.rst0000644000000000000000000000010213776707026016767 0ustar00rootrootstdnum.imsi =========== .. automodule:: stdnum.imsi :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321437.0 python-stdnum-1.20/docs/stdnum.in_.aadhaar.rst0000644000000000000000000000013013776707035020154 0ustar00rootrootstdnum.in\_.aadhaar =================== .. automodule:: stdnum.in_.aadhaar :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.in_.epic.rst0000644000000000000000000000011714405357103017503 0ustar00rootrootstdnum.in\_.epic ================ .. automodule:: stdnum.in_.epic :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.in_.gstin.rst0000644000000000000000000000012214405357103017703 0ustar00rootrootstdnum.in\_.gstin ================= .. automodule:: stdnum.in_.gstin :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321477.0 python-stdnum-1.20/docs/stdnum.in_.pan.rst0000644000000000000000000000011413776707105017351 0ustar00rootrootstdnum.in\_.pan =============== .. automodule:: stdnum.in_.pan :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1710709377.0 python-stdnum-1.20/docs/stdnum.in_.vid.rst0000644000000000000000000000011414575655201017352 0ustar00rootrootstdnum.in\_.vid =============== .. automodule:: stdnum.in_.vid :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321477.0 python-stdnum-1.20/docs/stdnum.is_.kennitala.rst0000644000000000000000000000013613776707105020552 0ustar00rootrootstdnum.is\_.kennitala ===================== .. automodule:: stdnum.is_.kennitala :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321477.0 python-stdnum-1.20/docs/stdnum.is_.vsk.rst0000644000000000000000000000011413776707105017403 0ustar00rootrootstdnum.is\_.vsk =============== .. automodule:: stdnum.is_.vsk :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321477.0 python-stdnum-1.20/docs/stdnum.isan.rst0000644000000000000000000000010213776707105016756 0ustar00rootrootstdnum.isan =========== .. automodule:: stdnum.isan :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321477.0 python-stdnum-1.20/docs/stdnum.isbn.rst0000644000000000000000000000010213776707105016757 0ustar00rootrootstdnum.isbn =========== .. automodule:: stdnum.isbn :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321477.0 python-stdnum-1.20/docs/stdnum.isil.rst0000644000000000000000000000010213776707105016764 0ustar00rootrootstdnum.isil =========== .. automodule:: stdnum.isil :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.isin.rst0000644000000000000000000000010113651061616016755 0ustar00rootrootstdnum.isin =========== .. automodule:: stdnum.isin :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321477.0 python-stdnum-1.20/docs/stdnum.ismn.rst0000644000000000000000000000010213776707105016772 0ustar00rootrootstdnum.ismn =========== .. automodule:: stdnum.ismn :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.iso11649.rst0000644000000000000000000000011513651061616017217 0ustar00rootrootstdnum.iso11649 =============== .. automodule:: stdnum.iso11649 :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321477.0 python-stdnum-1.20/docs/stdnum.iso6346.rst0000644000000000000000000000011313776707105017143 0ustar00rootrootstdnum.iso6346 ============== .. automodule:: stdnum.iso6346 :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321477.0 python-stdnum-1.20/docs/stdnum.iso7064.rst0000644000000000000000000000123113776707105017143 0ustar00rootrootstdnum.iso7064 ============== .. automodule:: stdnum.iso7064 :members: Mod 11, 10 ---------- :mod:`stdnum.iso7064.mod_11_10` .. automodule:: stdnum.iso7064.mod_11_10 :members: Mod 11, 2 --------- :mod:`stdnum.iso7064.mod_11_2` .. automodule:: stdnum.iso7064.mod_11_2 :members: Mod 37, 2 (Mod x, 2) -------------------- :mod:`stdnum.iso7064.mod_37_2` .. automodule:: stdnum.iso7064.mod_37_2 :members: Mod 37, 36 (Mod x+1, x) ----------------------- :mod:`stdnum.iso7064.mod_37_36` .. automodule:: stdnum.iso7064.mod_37_36 :members: Mod 97, 10 ---------- :mod:`stdnum.iso7064.mod_97_10` .. automodule:: stdnum.iso7064.mod_97_10 :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.isrc.rst0000644000000000000000000000010114405357103016750 0ustar00rootrootstdnum.isrc =========== .. automodule:: stdnum.isrc :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321477.0 python-stdnum-1.20/docs/stdnum.issn.rst0000644000000000000000000000010213776707105017000 0ustar00rootrootstdnum.issn =========== .. automodule:: stdnum.issn :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.it.aic.rst0000644000000000000000000000010714405357103017165 0ustar00rootrootstdnum.it.aic ============= .. automodule:: stdnum.it.aic :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321487.0 python-stdnum-1.20/docs/stdnum.it.codicefiscale.rst0000644000000000000000000000014613776707117021227 0ustar00rootrootstdnum.it.codicefiscale ======================= .. automodule:: stdnum.it.codicefiscale :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321487.0 python-stdnum-1.20/docs/stdnum.it.iva.rst0000644000000000000000000000011013776707117017220 0ustar00rootrootstdnum.it.iva ============= .. automodule:: stdnum.it.iva :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1594561976.0 python-stdnum-1.20/docs/stdnum.jp.cn.rst0000644000000000000000000000010413702612670017025 0ustar00rootrootstdnum.jp.cn ============ .. automodule:: stdnum.jp.cn :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1683892766.0 python-stdnum-1.20/docs/stdnum.ke.pin.rst0000644000000000000000000000010714427425036017207 0ustar00rootrootstdnum.ke.pin ============= .. automodule:: stdnum.ke.pin :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.kr.brn.rst0000644000000000000000000000010714405357103017212 0ustar00rootrootstdnum.kr.brn ============= .. automodule:: stdnum.kr.brn :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1594561976.0 python-stdnum-1.20/docs/stdnum.kr.rrn.rst0000644000000000000000000000010713702612670017234 0ustar00rootrootstdnum.kr.rrn ============= .. automodule:: stdnum.kr.rrn :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.lei.rst0000644000000000000000000000007613651061616016577 0ustar00rootrootstdnum.lei ========== .. automodule:: stdnum.lei :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.li.peid.rst0000644000000000000000000000011314405357103017337 0ustar00rootrootstdnum.li.peid ============== .. automodule:: stdnum.li.peid :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.lt.asmens.rst0000644000000000000000000000012013651061616017720 0ustar00rootrootstdnum.lt.asmens ================ .. automodule:: stdnum.lt.asmens :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321487.0 python-stdnum-1.20/docs/stdnum.lt.pvm.rst0000644000000000000000000000011013776707117017246 0ustar00rootrootstdnum.lt.pvm ============= .. automodule:: stdnum.lt.pvm :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321487.0 python-stdnum-1.20/docs/stdnum.lu.tva.rst0000644000000000000000000000011013776707117017237 0ustar00rootrootstdnum.lu.tva ============= .. automodule:: stdnum.lu.tva :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321487.0 python-stdnum-1.20/docs/stdnum.luhn.rst0000644000000000000000000000010213776707117016775 0ustar00rootrootstdnum.luhn =========== .. automodule:: stdnum.luhn :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321487.0 python-stdnum-1.20/docs/stdnum.lv.pvn.rst0000644000000000000000000000011013776707117017251 0ustar00rootrootstdnum.lv.pvn ============= .. automodule:: stdnum.lv.pvn :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1683892766.0 python-stdnum-1.20/docs/stdnum.ma.ice.rst0000644000000000000000000000010714427425036017157 0ustar00rootrootstdnum.ma.ice ============= .. automodule:: stdnum.ma.ice :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.mac.rst0000644000000000000000000000007613651061616016566 0ustar00rootrootstdnum.mac ========== .. automodule:: stdnum.mac :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.mc.tva.rst0000644000000000000000000000010713651061616017211 0ustar00rootrootstdnum.mc.tva ============= .. automodule:: stdnum.mc.tva :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.md.idno.rst0000644000000000000000000000011213651061616017345 0ustar00rootrootstdnum.md.idno ============== .. automodule:: stdnum.md.idno :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.me.iban.rst0000644000000000000000000000011213651061616017326 0ustar00rootrootstdnum.me.iban ============== .. automodule:: stdnum.me.iban :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1683892766.0 python-stdnum-1.20/docs/stdnum.me.pib.rst0000644000000000000000000000010714427425036017175 0ustar00rootrootstdnum.me.pib ============= .. automodule:: stdnum.me.pib :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321487.0 python-stdnum-1.20/docs/stdnum.meid.rst0000644000000000000000000000010213776707117016745 0ustar00rootrootstdnum.meid =========== .. automodule:: stdnum.meid :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1683892766.0 python-stdnum-1.20/docs/stdnum.mk.edb.rst0000644000000000000000000000010714427425036017163 0ustar00rootrootstdnum.mk.edb ============= .. automodule:: stdnum.mk.edb :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321487.0 python-stdnum-1.20/docs/stdnum.mt.vat.rst0000644000000000000000000000011013776707117017237 0ustar00rootrootstdnum.mt.vat ============= .. automodule:: stdnum.mt.vat :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.mu.nid.rst0000644000000000000000000000010713651061616017213 0ustar00rootrootstdnum.mu.nid ============= .. automodule:: stdnum.mu.nid :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.mx.curp.rst0000644000000000000000000000011213651061616017411 0ustar00rootrootstdnum.mx.curp ============== .. automodule:: stdnum.mx.curp :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.mx.rfc.rst0000644000000000000000000000010713651061616017216 0ustar00rootrootstdnum.mx.rfc ============= .. automodule:: stdnum.mx.rfc :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321487.0 python-stdnum-1.20/docs/stdnum.my.nric.rst0000644000000000000000000000011313776707117017410 0ustar00rootrootstdnum.my.nric ============== .. automodule:: stdnum.my.nric :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321487.0 python-stdnum-1.20/docs/stdnum.nl.brin.rst0000644000000000000000000000011313776707117017373 0ustar00rootrootstdnum.nl.brin ============== .. automodule:: stdnum.nl.brin :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321487.0 python-stdnum-1.20/docs/stdnum.nl.bsn.rst0000644000000000000000000000011013776707117017220 0ustar00rootrootstdnum.nl.bsn ============= .. automodule:: stdnum.nl.bsn :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321487.0 python-stdnum-1.20/docs/stdnum.nl.btw.rst0000644000000000000000000000011013776707117017232 0ustar00rootrootstdnum.nl.btw ============= .. automodule:: stdnum.nl.btw :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321487.0 python-stdnum-1.20/docs/stdnum.nl.onderwijsnummer.rst0000644000000000000000000000015413776707117021676 0ustar00rootrootstdnum.nl.onderwijsnummer ========================= .. automodule:: stdnum.nl.onderwijsnummer :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321497.0 python-stdnum-1.20/docs/stdnum.nl.postcode.rst0000644000000000000000000000012713776707131020262 0ustar00rootrootstdnum.nl.postcode ================== .. automodule:: stdnum.nl.postcode :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.no.fodselsnummer.rst0000644000000000000000000000014513651061616021321 0ustar00rootrootstdnum.no.fodselsnummer ======================= .. automodule:: stdnum.no.fodselsnummer :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.no.iban.rst0000644000000000000000000000011213651061616017341 0ustar00rootrootstdnum.no.iban ============== .. automodule:: stdnum.no.iban :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.no.kontonr.rst0000644000000000000000000000012313651061616020124 0ustar00rootrootstdnum.no.kontonr ================= .. automodule:: stdnum.no.kontonr :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.no.mva.rst0000644000000000000000000000010713651061616017217 0ustar00rootrootstdnum.no.mva ============= .. automodule:: stdnum.no.mva :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.no.orgnr.rst0000644000000000000000000000011513651061616017562 0ustar00rootrootstdnum.no.orgnr =============== .. automodule:: stdnum.no.orgnr :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.nz.bankaccount.rst0000644000000000000000000000013713651061616020742 0ustar00rootrootstdnum.nz.bankaccount ===================== .. automodule:: stdnum.nz.bankaccount :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1594561976.0 python-stdnum-1.20/docs/stdnum.nz.ird.rst0000644000000000000000000000010713702612670017224 0ustar00rootrootstdnum.nz.ird ============= .. automodule:: stdnum.nz.ird :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1594561976.0 python-stdnum-1.20/docs/stdnum.pe.cui.rst0000644000000000000000000000010713702612670017203 0ustar00rootrootstdnum.pe.cui ============= .. automodule:: stdnum.pe.cui :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1594561976.0 python-stdnum-1.20/docs/stdnum.pe.ruc.rst0000644000000000000000000000010713702612670017214 0ustar00rootrootstdnum.pe.ruc ============= .. automodule:: stdnum.pe.ruc :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1683892766.0 python-stdnum-1.20/docs/stdnum.pk.cnic.rst0000644000000000000000000000011214427425036017344 0ustar00rootrootstdnum.pk.cnic ============== .. automodule:: stdnum.pk.cnic :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321497.0 python-stdnum-1.20/docs/stdnum.pl.nip.rst0000644000000000000000000000011013776707131017222 0ustar00rootrootstdnum.pl.nip ============= .. automodule:: stdnum.pl.nip :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.pl.pesel.rst0000644000000000000000000000011513651061616017542 0ustar00rootrootstdnum.pl.pesel =============== .. automodule:: stdnum.pl.pesel :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.pl.regon.rst0000644000000000000000000000011513651061616017544 0ustar00rootrootstdnum.pl.regon =============== .. automodule:: stdnum.pl.regon :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.pt.cc.rst0000644000000000000000000000010414405357103017022 0ustar00rootrootstdnum.pt.cc ============ .. automodule:: stdnum.pt.cc :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321497.0 python-stdnum-1.20/docs/stdnum.pt.nif.rst0000644000000000000000000000011013776707131017220 0ustar00rootrootstdnum.pt.nif ============= .. automodule:: stdnum.pt.nif :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1594561976.0 python-stdnum-1.20/docs/stdnum.py.ruc.rst0000644000000000000000000000010713702612670017240 0ustar00rootrootstdnum.py.ruc ============= .. automodule:: stdnum.py.ruc :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321497.0 python-stdnum-1.20/docs/stdnum.ro.cf.rst0000644000000000000000000000010513776707131017035 0ustar00rootrootstdnum.ro.cf ============ .. automodule:: stdnum.ro.cf :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321497.0 python-stdnum-1.20/docs/stdnum.ro.cnp.rst0000644000000000000000000000011013776707131017221 0ustar00rootrootstdnum.ro.cnp ============= .. automodule:: stdnum.ro.cnp :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.ro.cui.rst0000644000000000000000000000011014405357103017207 0ustar00rootrootstdnum.ro.cui ============= .. automodule:: stdnum.ro.cui :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.ro.onrc.rst0000644000000000000000000000011214405357103017372 0ustar00rootrootstdnum.ro.onrc ============== .. automodule:: stdnum.ro.onrc :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.rs.pib.rst0000644000000000000000000000010713651061616017216 0ustar00rootrootstdnum.rs.pib ============= .. automodule:: stdnum.rs.pib :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.ru.inn.rst0000644000000000000000000000010713651061616017232 0ustar00rootrootstdnum.ru.inn ============= .. automodule:: stdnum.ru.inn :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.se.orgnr.rst0000644000000000000000000000011513651061616017555 0ustar00rootrootstdnum.se.orgnr =============== .. automodule:: stdnum.se.orgnr :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.se.personnummer.rst0000644000000000000000000000014213651061616021160 0ustar00rootrootstdnum.se.personnummer ====================== .. automodule:: stdnum.se.personnummer :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.se.postnummer.rst0000644000000000000000000000013414405357103020635 0ustar00rootrootstdnum.se.postnummer ==================== .. automodule:: stdnum.se.postnummer :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321497.0 python-stdnum-1.20/docs/stdnum.se.vat.rst0000644000000000000000000000011013776707131017222 0ustar00rootrootstdnum.se.vat ============= .. automodule:: stdnum.se.vat :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.sg.uen.rst0000644000000000000000000000010714405357103017215 0ustar00rootrootstdnum.sg.uen ============= .. automodule:: stdnum.sg.uen :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321497.0 python-stdnum-1.20/docs/stdnum.si.ddv.rst0000644000000000000000000000011013776707131017211 0ustar00rootrootstdnum.si.ddv ============= .. automodule:: stdnum.si.ddv :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1683892766.0 python-stdnum-1.20/docs/stdnum.si.emso.rst0000644000000000000000000000011214427425036017374 0ustar00rootrootstdnum.si.emso ============== .. automodule:: stdnum.si.emso :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1692544543.0 python-stdnum-1.20/docs/stdnum.si.maticna.rst0000644000000000000000000000012314470427037020050 0ustar00rootrootstdnum.si.maticna ================= .. automodule:: stdnum.si.maticna :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321497.0 python-stdnum-1.20/docs/stdnum.sk.dph.rst0000644000000000000000000000011013776707131017211 0ustar00rootrootstdnum.sk.dph ============= .. automodule:: stdnum.sk.dph :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321497.0 python-stdnum-1.20/docs/stdnum.sk.rc.rst0000644000000000000000000000010513776707131017046 0ustar00rootrootstdnum.sk.rc ============ .. automodule:: stdnum.sk.rc :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.sm.coe.rst0000644000000000000000000000010713651061616017205 0ustar00rootrootstdnum.sm.coe ============= .. automodule:: stdnum.sm.coe :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.sv.nit.rst0000644000000000000000000000010714405357103017237 0ustar00rootrootstdnum.sv.nit ============= .. automodule:: stdnum.sv.nit :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.th.moa.rst0000644000000000000000000000010714405357103017204 0ustar00rootrootstdnum.th.moa ============= .. automodule:: stdnum.th.moa :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.th.pin.rst0000644000000000000000000000010714405357103017216 0ustar00rootrootstdnum.th.pin ============= .. automodule:: stdnum.th.pin :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.th.tin.rst0000644000000000000000000000010714405357103017222 0ustar00rootrootstdnum.th.tin ============= .. automodule:: stdnum.th.tin :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1683892766.0 python-stdnum-1.20/docs/stdnum.tn.mf.rst0000644000000000000000000000010414427425036017042 0ustar00rootrootstdnum.tn.mf ============ .. automodule:: stdnum.tn.mf :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/docs/stdnum.tr.tckimlik.rst0000644000000000000000000000012613651061616020255 0ustar00rootrootstdnum.tr.tckimlik ================== .. automodule:: stdnum.tr.tckimlik :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1594561976.0 python-stdnum-1.20/docs/stdnum.tr.vkn.rst0000644000000000000000000000010713702612670017242 0ustar00rootrootstdnum.tr.vkn ============= .. automodule:: stdnum.tr.vkn :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.tw.ubn.rst0000644000000000000000000000010714405357103017233 0ustar00rootrootstdnum.tw.ubn ============= .. automodule:: stdnum.tw.ubn :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.ua.edrpou.rst0000644000000000000000000000012114405357103017714 0ustar00rootrootstdnum.ua.edrpou ================ .. automodule:: stdnum.ua.edrpou :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.ua.rntrc.rst0000644000000000000000000000011614405357103017552 0ustar00rootrootstdnum.ua.rntrc =============== .. automodule:: stdnum.ua.rntrc :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321497.0 python-stdnum-1.20/docs/stdnum.us.atin.rst0000644000000000000000000000011313776707131017406 0ustar00rootrootstdnum.us.atin ============== .. automodule:: stdnum.us.atin :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321497.0 python-stdnum-1.20/docs/stdnum.us.ein.rst0000644000000000000000000000011013776707131017223 0ustar00rootrootstdnum.us.ein ============= .. automodule:: stdnum.us.ein :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321497.0 python-stdnum-1.20/docs/stdnum.us.itin.rst0000644000000000000000000000011313776707131017416 0ustar00rootrootstdnum.us.itin ============== .. automodule:: stdnum.us.itin :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321497.0 python-stdnum-1.20/docs/stdnum.us.ptin.rst0000644000000000000000000000011313776707131017425 0ustar00rootrootstdnum.us.ptin ============== .. automodule:: stdnum.us.ptin :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321497.0 python-stdnum-1.20/docs/stdnum.us.rtn.rst0000644000000000000000000000011013776707131017253 0ustar00rootrootstdnum.us.rtn ============= .. automodule:: stdnum.us.rtn :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321504.0 python-stdnum-1.20/docs/stdnum.us.ssn.rst0000644000000000000000000000011013776707140017253 0ustar00rootrootstdnum.us.ssn ============= .. automodule:: stdnum.us.ssn :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321504.0 python-stdnum-1.20/docs/stdnum.us.tin.rst0000644000000000000000000000011013776707140017242 0ustar00rootrootstdnum.us.tin ============= .. automodule:: stdnum.us.tin :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1594561976.0 python-stdnum-1.20/docs/stdnum.uy.rut.rst0000644000000000000000000000010713702612670017266 0ustar00rootrootstdnum.uy.rut ============= .. automodule:: stdnum.uy.rut :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.vatin.rst0000644000000000000000000000010414405357103017134 0ustar00rootrootstdnum.vatin ============ .. automodule:: stdnum.vatin :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1594561976.0 python-stdnum-1.20/docs/stdnum.ve.rif.rst0000644000000000000000000000010713702612670017211 0ustar00rootrootstdnum.ve.rif ============= .. automodule:: stdnum.ve.rif :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1610321504.0 python-stdnum-1.20/docs/stdnum.verhoeff.rst0000644000000000000000000000011613776707140017634 0ustar00rootrootstdnum.verhoeff =============== .. automodule:: stdnum.verhoeff :members: ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.vn.mst.rst0000644000000000000000000000010714405357103017243 0ustar00rootrootstdnum.vn.mst ============= .. automodule:: stdnum.vn.mst :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/docs/stdnum.za.idnr.rst0000644000000000000000000000011214405357103017357 0ustar00rootrootstdnum.za.idnr ============== .. automodule:: stdnum.za.idnr :members:././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1594561976.0 python-stdnum-1.20/docs/stdnum.za.tin.rst0000644000000000000000000000010713702612670017223 0ustar00rootrootstdnum.za.tin ============= .. automodule:: stdnum.za.tin :members:././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1710711668.4300077 python-stdnum-1.20/online_check/0000755000000000000000000000000014575661564015467 5ustar00rootroot././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1587831694.0 python-stdnum-1.20/online_check/README0000644000000000000000000000137613651061616016340 0ustar00rootrootThis is a sample application that uses python-stdnum to see which number formats are valid for a supplied number as can be seen online at: https://arthurdejong.org/python-stdnum/check/ Configuring the WSGI application in Apache. - /path/to/wsgi is the directory containing the WSGI scripts - /path/to/html is the directory containing the static files The python-stdnum checkout is expected to be available in /path/to/wsgi/python-stdnum. WSGIDaemonProcess stdnum threads=5 maximum-requests=100 display-name=%{GROUP} WSGIProcessGroup stdnum Alias /check /path/to/html WSGIScriptAlias /check/stdnum.wsgi /path/to/wsgi/stdnum.wsgi RewriteRule ^/check/$ /check/stdnum.wsgi/$1 [QSA,PT,L] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/online_check/check.js0000644000000000000000000000770414405357103017071 0ustar00rootroot/* # check.js - simple application to check numbers # # Copyright (C) 2017-2020 Arthur de Jong. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA */ $(document).ready(function () { function format(value) { return $('
').text(value).html().replace( /\n\n/g, '
\n' ).replace( /^[*] (.*)$/gm, '
  • $1
' ).replace( /(\b(https?|ftp):\/\/[^\s<]*[-\w+&@#/%=~_|])/ig, "$1" ) } function updateresults(field, results) { // build HTML to present var h = ['
    '] $.each(results, function (index, result) { h.push( '
  • ', $('
    ').text(result.number).html(), ': ', $('
    ').text(result.name).html(), '', '

    ', format(result.description), $.map(result.conversions, function (value, key) { return [ '
    ', $('

    ').text(key).html(), ': ', $('
    ').text(value).html()].join('') }).join(''), '

  • ') }) h.push('
') // replace the results div $('#' + $(field).attr('id') + '_results').html(h.join('')) } function checkfield(field) { var value = field.val() // only trigger update if value changed from previous validation if (value !== field.data('oldvalue')) { field.data('oldvalue', value) $('#' + $(field).attr('id') + '_results').slideUp(200, function () { $.get('.', {number: value}, function (data) { window.history.pushState({value: value, data: data}, $(document).find('title').text(), '?number=' + encodeURIComponent(value)) updateresults(field, data) }) $(this).slideDown(300) }) } } // update results based on history navigation window.onpopstate = function (e) { var field = $('.stdnum_check') if (e.state) { var value = e.state.value var data = e.state.data field.val(value) field.data('oldvalue', value) updateresults(field, data) } else { field.val('') field.data('oldvalue', '') updateresults(field, []) } } // trigger a check when user stopped typing $('.stdnum_check').on('input propertychange', function (event) { if (window.event && event.type === 'propertychange' && event.propertyName !== 'value') { return } var field = $(this) window.clearTimeout($(this).data('timeout')) $(this).data('timeout', setTimeout(function () { checkfield(field) }, 2000)) }) // trigger a check when losing focus $('.stdnum_check').on('blur', function () { window.clearTimeout($(this).data('timeout')) checkfield($(this)) }) // prevent enter from submitting the form $('.stdnum_check').keydown(function (event) { if (event.keyCode === 13) { event.preventDefault() checkfield($(this)) return false } }) // hide the submit button $('.stdnum_hide').hide() // focus the text field $('.stdnum_check').focus() // save current state var value = $('.stdnum_check').val() $('.stdnum_check').data('oldvalue', value) $.get('', {number: value}, function (data) { window.history.replaceState({value: value, data: data}, $(document).find('title').text(), '?number=' + encodeURIComponent(value)) }) }) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1679154755.0 python-stdnum-1.20/online_check/jquery-3.5.1.js0000644000000000000000000106161614405357103020000 0ustar00rootroot/*! * jQuery JavaScript Library v3.5.1 * https://jquery.com/ * * Includes Sizzle.js * https://sizzlejs.com/ * * Copyright JS Foundation and other contributors * Released under the MIT license * https://jquery.org/license * * Date: 2020-05-04T22:49Z */ ( function( global, factory ) { "use strict"; if ( typeof module === "object" && typeof module.exports === "object" ) { // For CommonJS and CommonJS-like environments where a proper `window` // is present, execute the factory and get jQuery. // For environments that do not have a `window` with a `document` // (such as Node.js), expose a factory as module.exports. // This accentuates the need for the creation of a real `window`. // e.g. var jQuery = require("jquery")(window); // See ticket #14549 for more info. module.exports = global.document ? factory( global, true ) : function( w ) { if ( !w.document ) { throw new Error( "jQuery requires a window with a document" ); } return factory( w ); }; } else { factory( global ); } // Pass this if window is not defined yet } )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { // Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 // throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode // arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common // enough that all such attempts are guarded in a try block. "use strict"; var arr = []; var getProto = Object.getPrototypeOf; var slice = arr.slice; var flat = arr.flat ? function( array ) { return arr.flat.call( array ); } : function( array ) { return arr.concat.apply( [], array ); }; var push = arr.push; var indexOf = arr.indexOf; var class2type = {}; var toString = class2type.toString; var hasOwn = class2type.hasOwnProperty; var fnToString = hasOwn.toString; var ObjectFunctionString = fnToString.call( Object ); var support = {}; var isFunction = function isFunction( obj ) { // Support: Chrome <=57, Firefox <=52 // In some browsers, typeof returns "function" for HTML elements // (i.e., `typeof document.createElement( "object" ) === "function"`). // We don't want to classify *any* DOM node as a function. return typeof obj === "function" && typeof obj.nodeType !== "number"; }; var isWindow = function isWindow( obj ) { return obj != null && obj === obj.window; }; var document = window.document; var preservedScriptAttributes = { type: true, src: true, nonce: true, noModule: true }; function DOMEval( code, node, doc ) { doc = doc || document; var i, val, script = doc.createElement( "script" ); script.text = code; if ( node ) { for ( i in preservedScriptAttributes ) { // Support: Firefox 64+, Edge 18+ // Some browsers don't support the "nonce" property on scripts. // On the other hand, just using `getAttribute` is not enough as // the `nonce` attribute is reset to an empty string whenever it // becomes browsing-context connected. // See https://github.com/whatwg/html/issues/2369 // See https://html.spec.whatwg.org/#nonce-attributes // The `node.getAttribute` check was added for the sake of // `jQuery.globalEval` so that it can fake a nonce-containing node // via an object. val = node[ i ] || node.getAttribute && node.getAttribute( i ); if ( val ) { script.setAttribute( i, val ); } } } doc.head.appendChild( script ).parentNode.removeChild( script ); } function toType( obj ) { if ( obj == null ) { return obj + ""; } // Support: Android <=2.3 only (functionish RegExp) return typeof obj === "object" || typeof obj === "function" ? class2type[ toString.call( obj ) ] || "object" : typeof obj; } /* global Symbol */ // Defining this global in .eslintrc.json would create a danger of using the global // unguarded in another place, it seems safer to define global only for this module var version = "3.5.1", // Define a local copy of jQuery jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' // Need init if jQuery is called (just allow error to be thrown if not included) return new jQuery.fn.init( selector, context ); }; jQuery.fn = jQuery.prototype = { // The current version of jQuery being used jquery: version, constructor: jQuery, // The default length of a jQuery object is 0 length: 0, toArray: function() { return slice.call( this ); }, // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { // Return all the elements in a clean array if ( num == null ) { return slice.call( this ); } // Return just the one element from the set return num < 0 ? this[ num + this.length ] : this[ num ]; }, // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems ) { // Build a new jQuery matched element set var ret = jQuery.merge( this.constructor(), elems ); // Add the old object onto the stack (as a reference) ret.prevObject = this; // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. each: function( callback ) { return jQuery.each( this, callback ); }, map: function( callback ) { return this.pushStack( jQuery.map( this, function( elem, i ) { return callback.call( elem, i, elem ); } ) ); }, slice: function() { return this.pushStack( slice.apply( this, arguments ) ); }, first: function() { return this.eq( 0 ); }, last: function() { return this.eq( -1 ); }, even: function() { return this.pushStack( jQuery.grep( this, function( _elem, i ) { return ( i + 1 ) % 2; } ) ); }, odd: function() { return this.pushStack( jQuery.grep( this, function( _elem, i ) { return i % 2; } ) ); }, eq: function( i ) { var len = this.length, j = +i + ( i < 0 ? len : 0 ); return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); }, end: function() { return this.prevObject || this.constructor(); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: arr.sort, splice: arr.splice }; jQuery.extend = jQuery.fn.extend = function() { var options, name, src, copy, copyIsArray, clone, target = arguments[ 0 ] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; // Skip the boolean and the target target = arguments[ i ] || {}; i++; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !isFunction( target ) ) { target = {}; } // Extend jQuery itself if only one argument is passed if ( i === length ) { target = this; i--; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( ( options = arguments[ i ] ) != null ) { // Extend the base object for ( name in options ) { copy = options[ name ]; // Prevent Object.prototype pollution // Prevent never-ending loop if ( name === "__proto__" || target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject( copy ) || ( copyIsArray = Array.isArray( copy ) ) ) ) { src = target[ name ]; // Ensure proper type for the source value if ( copyIsArray && !Array.isArray( src ) ) { clone = []; } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { clone = {}; } else { clone = src; } copyIsArray = false; // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; jQuery.extend( { // Unique for each copy of jQuery on the page expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), // Assume jQuery is ready without the ready module isReady: true, error: function( msg ) { throw new Error( msg ); }, noop: function() {}, isPlainObject: function( obj ) { var proto, Ctor; // Detect obvious negatives // Use toString instead of jQuery.type to catch host objects if ( !obj || toString.call( obj ) !== "[object Object]" ) { return false; } proto = getProto( obj ); // Objects with no prototype (e.g., `Object.create( null )`) are plain if ( !proto ) { return true; } // Objects with prototype are plain iff they were constructed by a global Object function Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; }, isEmptyObject: function( obj ) { var name; for ( name in obj ) { return false; } return true; }, // Evaluates a script in a provided context; falls back to the global one // if not specified. globalEval: function( code, options, doc ) { DOMEval( code, { nonce: options && options.nonce }, doc ); }, each: function( obj, callback ) { var length, i = 0; if ( isArrayLike( obj ) ) { length = obj.length; for ( ; i < length; i++ ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } else { for ( i in obj ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } return obj; }, // results is for internal usage only makeArray: function( arr, results ) { var ret = results || []; if ( arr != null ) { if ( isArrayLike( Object( arr ) ) ) { jQuery.merge( ret, typeof arr === "string" ? [ arr ] : arr ); } else { push.call( ret, arr ); } } return ret; }, inArray: function( elem, arr, i ) { return arr == null ? -1 : indexOf.call( arr, elem, i ); }, // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit merge: function( first, second ) { var len = +second.length, j = 0, i = first.length; for ( ; j < len; j++ ) { first[ i++ ] = second[ j ]; } first.length = i; return first; }, grep: function( elems, callback, invert ) { var callbackInverse, matches = [], i = 0, length = elems.length, callbackExpect = !invert; // Go through the array, only saving the items // that pass the validator function for ( ; i < length; i++ ) { callbackInverse = !callback( elems[ i ], i ); if ( callbackInverse !== callbackExpect ) { matches.push( elems[ i ] ); } } return matches; }, // arg is for internal usage only map: function( elems, callback, arg ) { var length, value, i = 0, ret = []; // Go through the array, translating each of the items to their new values if ( isArrayLike( elems ) ) { length = elems.length; for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } // Go through every key on the object, } else { for ( i in elems ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } } // Flatten any nested arrays return flat( ret ); }, // A global GUID counter for objects guid: 1, // jQuery.support is not used in Core but other projects attach their // properties to it so it needs to exist. support: support } ); if ( typeof Symbol === "function" ) { jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; } // Populate the class2type map jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), function( _i, name ) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); } ); function isArrayLike( obj ) { // Support: real iOS 8.2 only (not reproducible in simulator) // `in` check used to prevent JIT error (gh-2145) // hasOwn isn't used here due to false negatives // regarding Nodelist length in IE var length = !!obj && "length" in obj && obj.length, type = toType( obj ); if ( isFunction( obj ) || isWindow( obj ) ) { return false; } return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj; } var Sizzle = /*! * Sizzle CSS Selector Engine v2.3.5 * https://sizzlejs.com/ * * Copyright JS Foundation and other contributors * Released under the MIT license * https://js.foundation/ * * Date: 2020-03-14 */ ( function( window ) { var i, support, Expr, getText, isXML, tokenize, compile, select, outermostContext, sortInput, hasDuplicate, // Local document vars setDocument, document, docElem, documentIsHTML, rbuggyQSA, rbuggyMatches, matches, contains, // Instance-specific data expando = "sizzle" + 1 * new Date(), preferredDoc = window.document, dirruns = 0, done = 0, classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), nonnativeSelectorCache = createCache(), sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; } return 0; }, // Instance methods hasOwn = ( {} ).hasOwnProperty, arr = [], pop = arr.pop, pushNative = arr.push, push = arr.push, slice = arr.slice, // Use a stripped-down indexOf as it's faster than native // https://jsperf.com/thor-indexof-vs-for/5 indexOf = function( list, elem ) { var i = 0, len = list.length; for ( ; i < len; i++ ) { if ( list[ i ] === elem ) { return i; } } return -1; }, booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + "ismap|loop|multiple|open|readonly|required|scoped", // Regular expressions // http://www.w3.org/TR/css3-selectors/#whitespace whitespace = "[\\x20\\t\\r\\n\\f]", // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + // Operator (capture 2) "*([*^$|!~]?=)" + whitespace + // "Attribute values must be CSS identifiers [capture 5] // or strings [capture 3 or capture 4]" "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", pseudos = ":(" + identifier + ")(?:\\((" + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: // 1. quoted (capture 3; capture 4 or capture 5) "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + // 2. simple (capture 6) "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + // 3. anything else (capture 2) ".*" + ")\\)|)", // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter rwhitespace = new RegExp( whitespace + "+", "g" ), rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), rdescend = new RegExp( whitespace + "|>" ), rpseudo = new RegExp( pseudos ), ridentifier = new RegExp( "^" + identifier + "$" ), matchExpr = { "ID": new RegExp( "^#(" + identifier + ")" ), "CLASS": new RegExp( "^\\.(" + identifier + ")" ), "TAG": new RegExp( "^(" + identifier + "|[*])" ), "ATTR": new RegExp( "^" + attributes ), "PSEUDO": new RegExp( "^" + pseudos ), "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), // For use in libraries implementing .is() // We use this for POS matching in `select` "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) }, rhtml = /HTML$/i, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, rnative = /^[^{]+\{\s*\[native \w/, // Easily-parseable/retrievable ID or TAG or CLASS selectors rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, // CSS escapes // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), funescape = function( escape, nonHex ) { var high = "0x" + escape.slice( 1 ) - 0x10000; return nonHex ? // Strip the backslash prefix from a non-hex escape sequence nonHex : // Replace a hexadecimal escape sequence with the encoded Unicode code point // Support: IE <=11+ // For values outside the Basic Multilingual Plane (BMP), manually construct a // surrogate pair high < 0 ? String.fromCharCode( high + 0x10000 ) : String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); }, // CSS string/identifier serialization // https://drafts.csswg.org/cssom/#common-serializing-idioms rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, fcssescape = function( ch, asCodePoint ) { if ( asCodePoint ) { // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER if ( ch === "\0" ) { return "\uFFFD"; } // Control characters and (dependent upon position) numbers get escaped as code points return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; } // Other potentially-special ASCII characters get backslash-escaped return "\\" + ch; }, // Used for iframes // See setDocument() // Removing the function wrapper causes a "Permission Denied" // error in IE unloadHandler = function() { setDocument(); }, inDisabledFieldset = addCombinator( function( elem ) { return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; }, { dir: "parentNode", next: "legend" } ); // Optimize for push.apply( _, NodeList ) try { push.apply( ( arr = slice.call( preferredDoc.childNodes ) ), preferredDoc.childNodes ); // Support: Android<4.0 // Detect silently failing push.apply // eslint-disable-next-line no-unused-expressions arr[ preferredDoc.childNodes.length ].nodeType; } catch ( e ) { push = { apply: arr.length ? // Leverage slice if possible function( target, els ) { pushNative.apply( target, slice.call( els ) ); } : // Support: IE<9 // Otherwise append directly function( target, els ) { var j = target.length, i = 0; // Can't trust NodeList.length while ( ( target[ j++ ] = els[ i++ ] ) ) {} target.length = j - 1; } }; } function Sizzle( selector, context, results, seed ) { var m, i, elem, nid, match, groups, newSelector, newContext = context && context.ownerDocument, // nodeType defaults to 9, since context defaults to document nodeType = context ? context.nodeType : 9; results = results || []; // Return early from calls with invalid selector or context if ( typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { return results; } // Try to shortcut find operations (as opposed to filters) in HTML documents if ( !seed ) { setDocument( context ); context = context || document; if ( documentIsHTML ) { // If the selector is sufficiently simple, try using a "get*By*" DOM method // (excepting DocumentFragment context, where the methods don't exist) if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { // ID selector if ( ( m = match[ 1 ] ) ) { // Document context if ( nodeType === 9 ) { if ( ( elem = context.getElementById( m ) ) ) { // Support: IE, Opera, Webkit // TODO: identify versions // getElementById can match elements by name instead of ID if ( elem.id === m ) { results.push( elem ); return results; } } else { return results; } // Element context } else { // Support: IE, Opera, Webkit // TODO: identify versions // getElementById can match elements by name instead of ID if ( newContext && ( elem = newContext.getElementById( m ) ) && contains( context, elem ) && elem.id === m ) { results.push( elem ); return results; } } // Type selector } else if ( match[ 2 ] ) { push.apply( results, context.getElementsByTagName( selector ) ); return results; // Class selector } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && context.getElementsByClassName ) { push.apply( results, context.getElementsByClassName( m ) ); return results; } } // Take advantage of querySelectorAll if ( support.qsa && !nonnativeSelectorCache[ selector + " " ] && ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && // Support: IE 8 only // Exclude object elements ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { newSelector = selector; newContext = context; // qSA considers elements outside a scoping root when evaluating child or // descendant combinators, which is not what we want. // In such cases, we work around the behavior by prefixing every selector in the // list with an ID selector referencing the scope context. // The technique has to be used as well when a leading combinator is used // as such selectors are not recognized by querySelectorAll. // Thanks to Andrew Dupont for this technique. if ( nodeType === 1 && ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { // Expand context for sibling selectors newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; // We can use :scope instead of the ID hack if the browser // supports it & if we're not changing the context. if ( newContext !== context || !support.scope ) { // Capture the context ID, setting it first if necessary if ( ( nid = context.getAttribute( "id" ) ) ) { nid = nid.replace( rcssescape, fcssescape ); } else { context.setAttribute( "id", ( nid = expando ) ); } } // Prefix every selector in the list groups = tokenize( selector ); i = groups.length; while ( i-- ) { groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + toSelector( groups[ i ] ); } newSelector = groups.join( "," ); } try { push.apply( results, newContext.querySelectorAll( newSelector ) ); return results; } catch ( qsaError ) { nonnativeSelectorCache( selector, true ); } finally { if ( nid === expando ) { context.removeAttribute( "id" ); } } } } } // All others return select( selector.replace( rtrim, "$1" ), context, results, seed ); } /** * Create key-value caches of limited size * @returns {function(string, object)} Returns the Object data after storing it on itself with * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) * deleting the oldest entry */ function createCache() { var keys = []; function cache( key, value ) { // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) if ( keys.push( key + " " ) > Expr.cacheLength ) { // Only keep the most recent entries delete cache[ keys.shift() ]; } return ( cache[ key + " " ] = value ); } return cache; } /** * Mark a function for special use by Sizzle * @param {Function} fn The function to mark */ function markFunction( fn ) { fn[ expando ] = true; return fn; } /** * Support testing using an element * @param {Function} fn Passed the created element and returns a boolean result */ function assert( fn ) { var el = document.createElement( "fieldset" ); try { return !!fn( el ); } catch ( e ) { return false; } finally { // Remove from its parent by default if ( el.parentNode ) { el.parentNode.removeChild( el ); } // release memory in IE el = null; } } /** * Adds the same handler for all of the specified attrs * @param {String} attrs Pipe-separated list of attributes * @param {Function} handler The method that will be applied */ function addHandle( attrs, handler ) { var arr = attrs.split( "|" ), i = arr.length; while ( i-- ) { Expr.attrHandle[ arr[ i ] ] = handler; } } /** * Checks document order of two siblings * @param {Element} a * @param {Element} b * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b */ function siblingCheck( a, b ) { var cur = b && a, diff = cur && a.nodeType === 1 && b.nodeType === 1 && a.sourceIndex - b.sourceIndex; // Use IE sourceIndex if available on both nodes if ( diff ) { return diff; } // Check if b follows a if ( cur ) { while ( ( cur = cur.nextSibling ) ) { if ( cur === b ) { return -1; } } } return a ? 1 : -1; } /** * Returns a function to use in pseudos for input types * @param {String} type */ function createInputPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === type; }; } /** * Returns a function to use in pseudos for buttons * @param {String} type */ function createButtonPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return ( name === "input" || name === "button" ) && elem.type === type; }; } /** * Returns a function to use in pseudos for :enabled/:disabled * @param {Boolean} disabled true for :disabled; false for :enabled */ function createDisabledPseudo( disabled ) { // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable return function( elem ) { // Only certain elements can match :enabled or :disabled // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled if ( "form" in elem ) { // Check for inherited disabledness on relevant non-disabled elements: // * listed form-associated elements in a disabled fieldset // https://html.spec.whatwg.org/multipage/forms.html#category-listed // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled // * option elements in a disabled optgroup // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled // All such elements have a "form" property. if ( elem.parentNode && elem.disabled === false ) { // Option elements defer to a parent optgroup if present if ( "label" in elem ) { if ( "label" in elem.parentNode ) { return elem.parentNode.disabled === disabled; } else { return elem.disabled === disabled; } } // Support: IE 6 - 11 // Use the isDisabled shortcut property to check for disabled fieldset ancestors return elem.isDisabled === disabled || // Where there is no isDisabled, check manually /* jshint -W018 */ elem.isDisabled !== !disabled && inDisabledFieldset( elem ) === disabled; } return elem.disabled === disabled; // Try to winnow out elements that can't be disabled before trusting the disabled property. // Some victims get caught in our net (label, legend, menu, track), but it shouldn't // even exist on them, let alone have a boolean value. } else if ( "label" in elem ) { return elem.disabled === disabled; } // Remaining elements are neither :enabled nor :disabled return false; }; } /** * Returns a function to use in pseudos for positionals * @param {Function} fn */ function createPositionalPseudo( fn ) { return markFunction( function( argument ) { argument = +argument; return markFunction( function( seed, matches ) { var j, matchIndexes = fn( [], seed.length, argument ), i = matchIndexes.length; // Match elements found at the specified indexes while ( i-- ) { if ( seed[ ( j = matchIndexes[ i ] ) ] ) { seed[ j ] = !( matches[ j ] = seed[ j ] ); } } } ); } ); } /** * Checks a node for validity as a Sizzle context * @param {Element|Object=} context * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value */ function testContext( context ) { return context && typeof context.getElementsByTagName !== "undefined" && context; } // Expose support vars for convenience support = Sizzle.support = {}; /** * Detects XML nodes * @param {Element|Object} elem An element or a document * @returns {Boolean} True iff elem is a non-HTML XML node */ isXML = Sizzle.isXML = function( elem ) { var namespace = elem.namespaceURI, docElem = ( elem.ownerDocument || elem ).documentElement; // Support: IE <=8 // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes // https://bugs.jquery.com/ticket/4833 return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); }; /** * Sets document-related variables once based on the current document * @param {Element|Object} [doc] An element or document object to use to set the document * @returns {Object} Returns the current document */ setDocument = Sizzle.setDocument = function( node ) { var hasCompare, subWindow, doc = node ? node.ownerDocument || node : preferredDoc; // Return early if doc is invalid or already selected // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { return document; } // Update global variables document = doc; docElem = document.documentElement; documentIsHTML = !isXML( document ); // Support: IE 9 - 11+, Edge 12 - 18+ // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( preferredDoc != document && ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { // Support: IE 11, Edge if ( subWindow.addEventListener ) { subWindow.addEventListener( "unload", unloadHandler, false ); // Support: IE 9 - 10 only } else if ( subWindow.attachEvent ) { subWindow.attachEvent( "onunload", unloadHandler ); } } // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, // Safari 4 - 5 only, Opera <=11.6 - 12.x only // IE/Edge & older browsers don't support the :scope pseudo-class. // Support: Safari 6.0 only // Safari 6.0 supports :scope but it's an alias of :root there. support.scope = assert( function( el ) { docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); return typeof el.querySelectorAll !== "undefined" && !el.querySelectorAll( ":scope fieldset div" ).length; } ); /* Attributes ---------------------------------------------------------------------- */ // Support: IE<8 // Verify that getAttribute really returns attributes and not properties // (excepting IE8 booleans) support.attributes = assert( function( el ) { el.className = "i"; return !el.getAttribute( "className" ); } ); /* getElement(s)By* ---------------------------------------------------------------------- */ // Check if getElementsByTagName("*") returns only elements support.getElementsByTagName = assert( function( el ) { el.appendChild( document.createComment( "" ) ); return !el.getElementsByTagName( "*" ).length; } ); // Support: IE<9 support.getElementsByClassName = rnative.test( document.getElementsByClassName ); // Support: IE<10 // Check if getElementById returns elements by name // The broken getElementById methods don't pick up programmatically-set names, // so use a roundabout getElementsByName test support.getById = assert( function( el ) { docElem.appendChild( el ).id = expando; return !document.getElementsByName || !document.getElementsByName( expando ).length; } ); // ID filter and find if ( support.getById ) { Expr.filter[ "ID" ] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { return elem.getAttribute( "id" ) === attrId; }; }; Expr.find[ "ID" ] = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var elem = context.getElementById( id ); return elem ? [ elem ] : []; } }; } else { Expr.filter[ "ID" ] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode( "id" ); return node && node.value === attrId; }; }; // Support: IE 6 - 7 only // getElementById is not reliable as a find shortcut Expr.find[ "ID" ] = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var node, i, elems, elem = context.getElementById( id ); if ( elem ) { // Verify the id attribute node = elem.getAttributeNode( "id" ); if ( node && node.value === id ) { return [ elem ]; } // Fall back on getElementsByName elems = context.getElementsByName( id ); i = 0; while ( ( elem = elems[ i++ ] ) ) { node = elem.getAttributeNode( "id" ); if ( node && node.value === id ) { return [ elem ]; } } } return []; } }; } // Tag Expr.find[ "TAG" ] = support.getElementsByTagName ? function( tag, context ) { if ( typeof context.getElementsByTagName !== "undefined" ) { return context.getElementsByTagName( tag ); // DocumentFragment nodes don't have gEBTN } else if ( support.qsa ) { return context.querySelectorAll( tag ); } } : function( tag, context ) { var elem, tmp = [], i = 0, // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too results = context.getElementsByTagName( tag ); // Filter out possible comments if ( tag === "*" ) { while ( ( elem = results[ i++ ] ) ) { if ( elem.nodeType === 1 ) { tmp.push( elem ); } } return tmp; } return results; }; // Class Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { return context.getElementsByClassName( className ); } }; /* QSA/matchesSelector ---------------------------------------------------------------------- */ // QSA and matchesSelector support // matchesSelector(:active) reports false when true (IE9/Opera 11.5) rbuggyMatches = []; // qSa(:focus) reports false when true (Chrome 21) // We allow this because of a bug in IE8/9 that throws an error // whenever `document.activeElement` is accessed on an iframe // So, we allow :focus to pass through QSA all the time to avoid the IE error // See https://bugs.jquery.com/ticket/13378 rbuggyQSA = []; if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { // Build QSA regex // Regex strategy adopted from Diego Perini assert( function( el ) { var input; // Select is set to empty string on purpose // This is to test IE's treatment of not explicitly // setting a boolean content attribute, // since its presence should be enough // https://bugs.jquery.com/ticket/12359 docElem.appendChild( el ).innerHTML = "" + ""; // Support: IE8, Opera 11-12.16 // Nothing should be selected when empty strings follow ^= or $= or *= // The test attribute must be unknown in Opera but "safe" for WinRT // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); } // Support: IE8 // Boolean attributes and "value" are not treated correctly if ( !el.querySelectorAll( "[selected]" ).length ) { rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); } // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { rbuggyQSA.push( "~=" ); } // Support: IE 11+, Edge 15 - 18+ // IE 11/Edge don't find elements on a `[name='']` query in some cases. // Adding a temporary attribute to the document before the selection works // around the issue. // Interestingly, IE 10 & older don't seem to have the issue. input = document.createElement( "input" ); input.setAttribute( "name", "" ); el.appendChild( input ); if ( !el.querySelectorAll( "[name='']" ).length ) { rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + whitespace + "*(?:''|\"\")" ); } // Webkit/Opera - :checked should return selected option elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked // IE8 throws error here and will not see later tests if ( !el.querySelectorAll( ":checked" ).length ) { rbuggyQSA.push( ":checked" ); } // Support: Safari 8+, iOS 8+ // https://bugs.webkit.org/show_bug.cgi?id=136851 // In-page `selector#id sibling-combinator selector` fails if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { rbuggyQSA.push( ".#.+[+~]" ); } // Support: Firefox <=3.6 - 5 only // Old Firefox doesn't throw on a badly-escaped identifier. el.querySelectorAll( "\\\f" ); rbuggyQSA.push( "[\\r\\n\\f]" ); } ); assert( function( el ) { el.innerHTML = "" + ""; // Support: Windows 8 Native Apps // The type and name attributes are restricted during .innerHTML assignment var input = document.createElement( "input" ); input.setAttribute( "type", "hidden" ); el.appendChild( input ).setAttribute( "name", "D" ); // Support: IE8 // Enforce case-sensitivity of name attribute if ( el.querySelectorAll( "[name=d]" ).length ) { rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); } // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) // IE8 throws error here and will not see later tests if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { rbuggyQSA.push( ":enabled", ":disabled" ); } // Support: IE9-11+ // IE's :disabled selector does not pick up the children of disabled fieldsets docElem.appendChild( el ).disabled = true; if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { rbuggyQSA.push( ":enabled", ":disabled" ); } // Support: Opera 10 - 11 only // Opera 10-11 does not throw on post-comma invalid pseudos el.querySelectorAll( "*,:x" ); rbuggyQSA.push( ",.*:" ); } ); } if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector ) ) ) ) { assert( function( el ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9) support.disconnectedMatch = matches.call( el, "*" ); // This should fail with an exception // Gecko does not error, returns false instead matches.call( el, "[s!='']:x" ); rbuggyMatches.push( "!=", pseudos ); } ); } rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); /* Contains ---------------------------------------------------------------------- */ hasCompare = rnative.test( docElem.compareDocumentPosition ); // Element contains another // Purposefully self-exclusive // As in, an element does not contain itself contains = hasCompare || rnative.test( docElem.contains ) ? function( a, b ) { var adown = a.nodeType === 9 ? a.documentElement : a, bup = b && b.parentNode; return a === bup || !!( bup && bup.nodeType === 1 && ( adown.contains ? adown.contains( bup ) : a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 ) ); } : function( a, b ) { if ( b ) { while ( ( b = b.parentNode ) ) { if ( b === a ) { return true; } } } return false; }; /* Sorting ---------------------------------------------------------------------- */ // Document order sorting sortOrder = hasCompare ? function( a, b ) { // Flag for duplicate removal if ( a === b ) { hasDuplicate = true; return 0; } // Sort on method existence if only one input has compareDocumentPosition var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; if ( compare ) { return compare; } // Calculate position if both inputs belong to the same document // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? a.compareDocumentPosition( b ) : // Otherwise we know they are disconnected 1; // Disconnected nodes if ( compare & 1 || ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { // Choose the first element that is related to our preferred document // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( a == document || a.ownerDocument == preferredDoc && contains( preferredDoc, a ) ) { return -1; } // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( b == document || b.ownerDocument == preferredDoc && contains( preferredDoc, b ) ) { return 1; } // Maintain original order return sortInput ? ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; } return compare & 4 ? -1 : 1; } : function( a, b ) { // Exit early if the nodes are identical if ( a === b ) { hasDuplicate = true; return 0; } var cur, i = 0, aup = a.parentNode, bup = b.parentNode, ap = [ a ], bp = [ b ]; // Parentless nodes are either documents or disconnected if ( !aup || !bup ) { // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. /* eslint-disable eqeqeq */ return a == document ? -1 : b == document ? 1 : /* eslint-enable eqeqeq */ aup ? -1 : bup ? 1 : sortInput ? ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; // If the nodes are siblings, we can do a quick check } else if ( aup === bup ) { return siblingCheck( a, b ); } // Otherwise we need full lists of their ancestors for comparison cur = a; while ( ( cur = cur.parentNode ) ) { ap.unshift( cur ); } cur = b; while ( ( cur = cur.parentNode ) ) { bp.unshift( cur ); } // Walk down the tree looking for a discrepancy while ( ap[ i ] === bp[ i ] ) { i++; } return i ? // Do a sibling check if the nodes have a common ancestor siblingCheck( ap[ i ], bp[ i ] ) : // Otherwise nodes in our document sort first // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. /* eslint-disable eqeqeq */ ap[ i ] == preferredDoc ? -1 : bp[ i ] == preferredDoc ? 1 : /* eslint-enable eqeqeq */ 0; }; return document; }; Sizzle.matches = function( expr, elements ) { return Sizzle( expr, null, null, elements ); }; Sizzle.matchesSelector = function( elem, expr ) { setDocument( elem ); if ( support.matchesSelector && documentIsHTML && !nonnativeSelectorCache[ expr + " " ] && ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { try { var ret = matches.call( elem, expr ); // IE 9's matchesSelector returns false on disconnected nodes if ( ret || support.disconnectedMatch || // As well, disconnected nodes are said to be in a document // fragment in IE 9 elem.document && elem.document.nodeType !== 11 ) { return ret; } } catch ( e ) { nonnativeSelectorCache( expr, true ); } } return Sizzle( expr, document, null, [ elem ] ).length > 0; }; Sizzle.contains = function( context, elem ) { // Set document vars if needed // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( ( context.ownerDocument || context ) != document ) { setDocument( context ); } return contains( context, elem ); }; Sizzle.attr = function( elem, name ) { // Set document vars if needed // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( ( elem.ownerDocument || elem ) != document ) { setDocument( elem ); } var fn = Expr.attrHandle[ name.toLowerCase() ], // Don't get fooled by Object.prototype properties (jQuery #13807) val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? fn( elem, name, !documentIsHTML ) : undefined; return val !== undefined ? val : support.attributes || !documentIsHTML ? elem.getAttribute( name ) : ( val = elem.getAttributeNode( name ) ) && val.specified ? val.value : null; }; Sizzle.escape = function( sel ) { return ( sel + "" ).replace( rcssescape, fcssescape ); }; Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; /** * Document sorting and removing duplicates * @param {ArrayLike} results */ Sizzle.uniqueSort = function( results ) { var elem, duplicates = [], j = 0, i = 0; // Unless we *know* we can detect duplicates, assume their presence hasDuplicate = !support.detectDuplicates; sortInput = !support.sortStable && results.slice( 0 ); results.sort( sortOrder ); if ( hasDuplicate ) { while ( ( elem = results[ i++ ] ) ) { if ( elem === results[ i ] ) { j = duplicates.push( i ); } } while ( j-- ) { results.splice( duplicates[ j ], 1 ); } } // Clear input after sorting to release objects // See https://github.com/jquery/sizzle/pull/225 sortInput = null; return results; }; /** * Utility function for retrieving the text value of an array of DOM nodes * @param {Array|Element} elem */ getText = Sizzle.getText = function( elem ) { var node, ret = "", i = 0, nodeType = elem.nodeType; if ( !nodeType ) { // If no nodeType, this is expected to be an array while ( ( node = elem[ i++ ] ) ) { // Do not traverse comment nodes ret += getText( node ); } } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { // Use textContent for elements // innerText usage removed for consistency of new lines (jQuery #11153) if ( typeof elem.textContent === "string" ) { return elem.textContent; } else { // Traverse its children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } // Do not include comment or processing instruction nodes return ret; }; Expr = Sizzle.selectors = { // Can be adjusted by the user cacheLength: 50, createPseudo: markFunction, match: matchExpr, attrHandle: {}, find: {}, relative: { ">": { dir: "parentNode", first: true }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: true }, "~": { dir: "previousSibling" } }, preFilter: { "ATTR": function( match ) { match[ 1 ] = match[ 1 ].replace( runescape, funescape ); // Move the given value to match[3] whether quoted or unquoted match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" ).replace( runescape, funescape ); if ( match[ 2 ] === "~=" ) { match[ 3 ] = " " + match[ 3 ] + " "; } return match.slice( 0, 4 ); }, "CHILD": function( match ) { /* matches from matchExpr["CHILD"] 1 type (only|nth|...) 2 what (child|of-type) 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 4 xn-component of xn+y argument ([+-]?\d*n|) 5 sign of xn-component 6 x of xn-component 7 sign of y-component 8 y of y-component */ match[ 1 ] = match[ 1 ].toLowerCase(); if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { // nth-* requires argument if ( !match[ 3 ] ) { Sizzle.error( match[ 0 ] ); } // numeric x and y parameters for Expr.filter.CHILD // remember that false/true cast respectively to 0/1 match[ 4 ] = +( match[ 4 ] ? match[ 5 ] + ( match[ 6 ] || 1 ) : 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); // other types prohibit arguments } else if ( match[ 3 ] ) { Sizzle.error( match[ 0 ] ); } return match; }, "PSEUDO": function( match ) { var excess, unquoted = !match[ 6 ] && match[ 2 ]; if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { return null; } // Accept quoted arguments as-is if ( match[ 3 ] ) { match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; // Strip excess characters from unquoted arguments } else if ( unquoted && rpseudo.test( unquoted ) && // Get excess from tokenize (recursively) ( excess = tokenize( unquoted, true ) ) && // advance to the next closing parenthesis ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { // excess is a negative index match[ 0 ] = match[ 0 ].slice( 0, excess ); match[ 2 ] = unquoted.slice( 0, excess ); } // Return only captures needed by the pseudo filter method (type and argument) return match.slice( 0, 3 ); } }, filter: { "TAG": function( nodeNameSelector ) { var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); return nodeNameSelector === "*" ? function() { return true; } : function( elem ) { return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; }; }, "CLASS": function( className ) { var pattern = classCache[ className + " " ]; return pattern || ( pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" ) ) && classCache( className, function( elem ) { return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute( "class" ) || "" ); } ); }, "ATTR": function( name, operator, check ) { return function( elem ) { var result = Sizzle.attr( elem, name ); if ( result == null ) { return operator === "!="; } if ( !operator ) { return true; } result += ""; /* eslint-disable max-len */ return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf( check ) === 0 : operator === "*=" ? check && result.indexOf( check ) > -1 : operator === "$=" ? check && result.slice( -check.length ) === check : operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : false; /* eslint-enable max-len */ }; }, "CHILD": function( type, what, _argument, first, last ) { var simple = type.slice( 0, 3 ) !== "nth", forward = type.slice( -4 ) !== "last", ofType = what === "of-type"; return first === 1 && last === 0 ? // Shortcut for :nth-*(n) function( elem ) { return !!elem.parentNode; } : function( elem, _context, xml ) { var cache, uniqueCache, outerCache, node, nodeIndex, start, dir = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), useCache = !xml && !ofType, diff = false; if ( parent ) { // :(first|last|only)-(child|of-type) if ( simple ) { while ( dir ) { node = elem; while ( ( node = node[ dir ] ) ) { if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { return false; } } // Reverse direction for :only-* (if we haven't yet done so) start = dir = type === "only" && !start && "nextSibling"; } return true; } start = [ forward ? parent.firstChild : parent.lastChild ]; // non-xml :nth-child(...) stores cache data on `parent` if ( forward && useCache ) { // Seek `elem` from a previously-cached index // ...in a gzip-friendly way node = parent; outerCache = node[ expando ] || ( node[ expando ] = {} ); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || ( outerCache[ node.uniqueID ] = {} ); cache = uniqueCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex && cache[ 2 ]; node = nodeIndex && parent.childNodes[ nodeIndex ]; while ( ( node = ++nodeIndex && node && node[ dir ] || // Fallback to seeking `elem` from the start ( diff = nodeIndex = 0 ) || start.pop() ) ) { // When found, cache indexes on `parent` and break if ( node.nodeType === 1 && ++diff && node === elem ) { uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; break; } } } else { // Use previously-cached element index if available if ( useCache ) { // ...in a gzip-friendly way node = elem; outerCache = node[ expando ] || ( node[ expando ] = {} ); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || ( outerCache[ node.uniqueID ] = {} ); cache = uniqueCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex; } // xml :nth-child(...) // or :nth-last-child(...) or :nth(-last)?-of-type(...) if ( diff === false ) { // Use the same loop as above to seek `elem` from the start while ( ( node = ++nodeIndex && node && node[ dir ] || ( diff = nodeIndex = 0 ) || start.pop() ) ) { if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { // Cache the index of each encountered element if ( useCache ) { outerCache = node[ expando ] || ( node[ expando ] = {} ); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || ( outerCache[ node.uniqueID ] = {} ); uniqueCache[ type ] = [ dirruns, diff ]; } if ( node === elem ) { break; } } } } } // Incorporate the offset, then check against cycle size diff -= last; return diff === first || ( diff % first === 0 && diff / first >= 0 ); } }; }, "PSEUDO": function( pseudo, argument ) { // pseudo-class names are case-insensitive // http://www.w3.org/TR/selectors/#pseudo-classes // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters // Remember that setFilters inherits from pseudos var args, fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || Sizzle.error( "unsupported pseudo: " + pseudo ); // The user may use createPseudo to indicate that // arguments are needed to create the filter function // just as Sizzle does if ( fn[ expando ] ) { return fn( argument ); } // But maintain support for old signatures if ( fn.length > 1 ) { args = [ pseudo, pseudo, "", argument ]; return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? markFunction( function( seed, matches ) { var idx, matched = fn( seed, argument ), i = matched.length; while ( i-- ) { idx = indexOf( seed, matched[ i ] ); seed[ idx ] = !( matches[ idx ] = matched[ i ] ); } } ) : function( elem ) { return fn( elem, 0, args ); }; } return fn; } }, pseudos: { // Potentially complex pseudos "not": markFunction( function( selector ) { // Trim the selector passed to compile // to avoid treating leading and trailing // spaces as combinators var input = [], results = [], matcher = compile( selector.replace( rtrim, "$1" ) ); return matcher[ expando ] ? markFunction( function( seed, matches, _context, xml ) { var elem, unmatched = matcher( seed, null, xml, [] ), i = seed.length; // Match elements unmatched by `matcher` while ( i-- ) { if ( ( elem = unmatched[ i ] ) ) { seed[ i ] = !( matches[ i ] = elem ); } } } ) : function( elem, _context, xml ) { input[ 0 ] = elem; matcher( input, null, xml, results ); // Don't keep the element (issue #299) input[ 0 ] = null; return !results.pop(); }; } ), "has": markFunction( function( selector ) { return function( elem ) { return Sizzle( selector, elem ).length > 0; }; } ), "contains": markFunction( function( text ) { text = text.replace( runescape, funescape ); return function( elem ) { return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; }; } ), // "Whether an element is represented by a :lang() selector // is based solely on the element's language value // being equal to the identifier C, // or beginning with the identifier C immediately followed by "-". // The matching of C against the element's language value is performed case-insensitively. // The identifier C does not have to be a valid language name." // http://www.w3.org/TR/selectors/#lang-pseudo "lang": markFunction( function( lang ) { // lang value must be a valid identifier if ( !ridentifier.test( lang || "" ) ) { Sizzle.error( "unsupported lang: " + lang ); } lang = lang.replace( runescape, funescape ).toLowerCase(); return function( elem ) { var elemLang; do { if ( ( elemLang = documentIsHTML ? elem.lang : elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { elemLang = elemLang.toLowerCase(); return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; } } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); return false; }; } ), // Miscellaneous "target": function( elem ) { var hash = window.location && window.location.hash; return hash && hash.slice( 1 ) === elem.id; }, "root": function( elem ) { return elem === docElem; }, "focus": function( elem ) { return elem === document.activeElement && ( !document.hasFocus || document.hasFocus() ) && !!( elem.type || elem.href || ~elem.tabIndex ); }, // Boolean properties "enabled": createDisabledPseudo( false ), "disabled": createDisabledPseudo( true ), "checked": function( elem ) { // In CSS3, :checked should return both checked and selected elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked var nodeName = elem.nodeName.toLowerCase(); return ( nodeName === "input" && !!elem.checked ) || ( nodeName === "option" && !!elem.selected ); }, "selected": function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { // eslint-disable-next-line no-unused-expressions elem.parentNode.selectedIndex; } return elem.selected === true; }, // Contents "empty": function( elem ) { // http://www.w3.org/TR/selectors/#empty-pseudo // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), // but not by others (comment: 8; processing instruction: 7; etc.) // nodeType < 6 works because attributes (2) do not appear as children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { if ( elem.nodeType < 6 ) { return false; } } return true; }, "parent": function( elem ) { return !Expr.pseudos[ "empty" ]( elem ); }, // Element/input types "header": function( elem ) { return rheader.test( elem.nodeName ); }, "input": function( elem ) { return rinputs.test( elem.nodeName ); }, "button": function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === "button" || name === "button"; }, "text": function( elem ) { var attr; return elem.nodeName.toLowerCase() === "input" && elem.type === "text" && // Support: IE<8 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" ( ( attr = elem.getAttribute( "type" ) ) == null || attr.toLowerCase() === "text" ); }, // Position-in-collection "first": createPositionalPseudo( function() { return [ 0 ]; } ), "last": createPositionalPseudo( function( _matchIndexes, length ) { return [ length - 1 ]; } ), "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { return [ argument < 0 ? argument + length : argument ]; } ), "even": createPositionalPseudo( function( matchIndexes, length ) { var i = 0; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; } ), "odd": createPositionalPseudo( function( matchIndexes, length ) { var i = 1; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; } ), "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument > length ? length : argument; for ( ; --i >= 0; ) { matchIndexes.push( i ); } return matchIndexes; } ), "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; ++i < length; ) { matchIndexes.push( i ); } return matchIndexes; } ) } }; Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; // Add button/input type pseudos for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { Expr.pseudos[ i ] = createInputPseudo( i ); } for ( i in { submit: true, reset: true } ) { Expr.pseudos[ i ] = createButtonPseudo( i ); } // Easy API for creating new setFilters function setFilters() {} setFilters.prototype = Expr.filters = Expr.pseudos; Expr.setFilters = new setFilters(); tokenize = Sizzle.tokenize = function( selector, parseOnly ) { var matched, match, tokens, type, soFar, groups, preFilters, cached = tokenCache[ selector + " " ]; if ( cached ) { return parseOnly ? 0 : cached.slice( 0 ); } soFar = selector; groups = []; preFilters = Expr.preFilter; while ( soFar ) { // Comma and first run if ( !matched || ( match = rcomma.exec( soFar ) ) ) { if ( match ) { // Don't consume trailing commas as valid soFar = soFar.slice( match[ 0 ].length ) || soFar; } groups.push( ( tokens = [] ) ); } matched = false; // Combinators if ( ( match = rcombinators.exec( soFar ) ) ) { matched = match.shift(); tokens.push( { value: matched, // Cast descendant combinators to space type: match[ 0 ].replace( rtrim, " " ) } ); soFar = soFar.slice( matched.length ); } // Filters for ( type in Expr.filter ) { if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || ( match = preFilters[ type ]( match ) ) ) ) { matched = match.shift(); tokens.push( { value: matched, type: type, matches: match } ); soFar = soFar.slice( matched.length ); } } if ( !matched ) { break; } } // Return the length of the invalid excess // if we're just parsing // Otherwise, throw an error or return tokens return parseOnly ? soFar.length : soFar ? Sizzle.error( selector ) : // Cache the tokens tokenCache( selector, groups ).slice( 0 ); }; function toSelector( tokens ) { var i = 0, len = tokens.length, selector = ""; for ( ; i < len; i++ ) { selector += tokens[ i ].value; } return selector; } function addCombinator( matcher, combinator, base ) { var dir = combinator.dir, skip = combinator.next, key = skip || dir, checkNonElements = base && key === "parentNode", doneName = done++; return combinator.first ? // Check against closest ancestor/preceding element function( elem, context, xml ) { while ( ( elem = elem[ dir ] ) ) { if ( elem.nodeType === 1 || checkNonElements ) { return matcher( elem, context, xml ); } } return false; } : // Check against all ancestor/preceding elements function( elem, context, xml ) { var oldCache, uniqueCache, outerCache, newCache = [ dirruns, doneName ]; // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching if ( xml ) { while ( ( elem = elem[ dir ] ) ) { if ( elem.nodeType === 1 || checkNonElements ) { if ( matcher( elem, context, xml ) ) { return true; } } } } else { while ( ( elem = elem[ dir ] ) ) { if ( elem.nodeType === 1 || checkNonElements ) { outerCache = elem[ expando ] || ( elem[ expando ] = {} ); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ elem.uniqueID ] || ( outerCache[ elem.uniqueID ] = {} ); if ( skip && skip === elem.nodeName.toLowerCase() ) { elem = elem[ dir ] || elem; } else if ( ( oldCache = uniqueCache[ key ] ) && oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { // Assign to newCache so results back-propagate to previous elements return ( newCache[ 2 ] = oldCache[ 2 ] ); } else { // Reuse newcache so results back-propagate to previous elements uniqueCache[ key ] = newCache; // A match means we're done; a fail means we have to keep checking if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { return true; } } } } } return false; }; } function elementMatcher( matchers ) { return matchers.length > 1 ? function( elem, context, xml ) { var i = matchers.length; while ( i-- ) { if ( !matchers[ i ]( elem, context, xml ) ) { return false; } } return true; } : matchers[ 0 ]; } function multipleContexts( selector, contexts, results ) { var i = 0, len = contexts.length; for ( ; i < len; i++ ) { Sizzle( selector, contexts[ i ], results ); } return results; } function condense( unmatched, map, filter, context, xml ) { var elem, newUnmatched = [], i = 0, len = unmatched.length, mapped = map != null; for ( ; i < len; i++ ) { if ( ( elem = unmatched[ i ] ) ) { if ( !filter || filter( elem, context, xml ) ) { newUnmatched.push( elem ); if ( mapped ) { map.push( i ); } } } } return newUnmatched; } function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { if ( postFilter && !postFilter[ expando ] ) { postFilter = setMatcher( postFilter ); } if ( postFinder && !postFinder[ expando ] ) { postFinder = setMatcher( postFinder, postSelector ); } return markFunction( function( seed, results, context, xml ) { var temp, i, elem, preMap = [], postMap = [], preexisting = results.length, // Get initial elements from seed or context elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), // Prefilter to get matcher input, preserving a map for seed-results synchronization matcherIn = preFilter && ( seed || !selector ) ? condense( elems, preMap, preFilter, context, xml ) : elems, matcherOut = matcher ? // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, postFinder || ( seed ? preFilter : preexisting || postFilter ) ? // ...intermediate processing is necessary [] : // ...otherwise use results directly results : matcherIn; // Find primary matches if ( matcher ) { matcher( matcherIn, matcherOut, context, xml ); } // Apply postFilter if ( postFilter ) { temp = condense( matcherOut, postMap ); postFilter( temp, [], context, xml ); // Un-match failing elements by moving them back to matcherIn i = temp.length; while ( i-- ) { if ( ( elem = temp[ i ] ) ) { matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); } } } if ( seed ) { if ( postFinder || preFilter ) { if ( postFinder ) { // Get the final matcherOut by condensing this intermediate into postFinder contexts temp = []; i = matcherOut.length; while ( i-- ) { if ( ( elem = matcherOut[ i ] ) ) { // Restore matcherIn since elem is not yet a final match temp.push( ( matcherIn[ i ] = elem ) ); } } postFinder( null, ( matcherOut = [] ), temp, xml ); } // Move matched elements from seed to results to keep them synchronized i = matcherOut.length; while ( i-- ) { if ( ( elem = matcherOut[ i ] ) && ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { seed[ temp ] = !( results[ temp ] = elem ); } } } // Add elements to results, through postFinder if defined } else { matcherOut = condense( matcherOut === results ? matcherOut.splice( preexisting, matcherOut.length ) : matcherOut ); if ( postFinder ) { postFinder( null, results, matcherOut, xml ); } else { push.apply( results, matcherOut ); } } } ); } function matcherFromTokens( tokens ) { var checkContext, matcher, j, len = tokens.length, leadingRelative = Expr.relative[ tokens[ 0 ].type ], implicitRelative = leadingRelative || Expr.relative[ " " ], i = leadingRelative ? 1 : 0, // The foundational matcher ensures that elements are reachable from top-level context(s) matchContext = addCombinator( function( elem ) { return elem === checkContext; }, implicitRelative, true ), matchAnyContext = addCombinator( function( elem ) { return indexOf( checkContext, elem ) > -1; }, implicitRelative, true ), matchers = [ function( elem, context, xml ) { var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( ( checkContext = context ).nodeType ? matchContext( elem, context, xml ) : matchAnyContext( elem, context, xml ) ); // Avoid hanging onto element (issue #299) checkContext = null; return ret; } ]; for ( ; i < len; i++ ) { if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; } else { matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); // Return special upon seeing a positional matcher if ( matcher[ expando ] ) { // Find the next relative operator (if any) for proper handling j = ++i; for ( ; j < len; j++ ) { if ( Expr.relative[ tokens[ j ].type ] ) { break; } } return setMatcher( i > 1 && elementMatcher( matchers ), i > 1 && toSelector( // If the preceding token was a descendant combinator, insert an implicit any-element `*` tokens .slice( 0, i - 1 ) .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) ).replace( rtrim, "$1" ), matcher, i < j && matcherFromTokens( tokens.slice( i, j ) ), j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), j < len && toSelector( tokens ) ); } matchers.push( matcher ); } } return elementMatcher( matchers ); } function matcherFromGroupMatchers( elementMatchers, setMatchers ) { var bySet = setMatchers.length > 0, byElement = elementMatchers.length > 0, superMatcher = function( seed, context, xml, results, outermost ) { var elem, j, matcher, matchedCount = 0, i = "0", unmatched = seed && [], setMatched = [], contextBackup = outermostContext, // We must always have either seed elements or outermost context elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), // Use integer dirruns iff this is the outermost matcher dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), len = elems.length; if ( outermost ) { // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq outermostContext = context == document || context || outermost; } // Add elements passing elementMatchers directly to results // Support: IE<9, Safari // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { if ( byElement && elem ) { j = 0; // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( !context && elem.ownerDocument != document ) { setDocument( elem ); xml = !documentIsHTML; } while ( ( matcher = elementMatchers[ j++ ] ) ) { if ( matcher( elem, context || document, xml ) ) { results.push( elem ); break; } } if ( outermost ) { dirruns = dirrunsUnique; } } // Track unmatched elements for set filters if ( bySet ) { // They will have gone through all possible matchers if ( ( elem = !matcher && elem ) ) { matchedCount--; } // Lengthen the array for every element, matched or not if ( seed ) { unmatched.push( elem ); } } } // `i` is now the count of elements visited above, and adding it to `matchedCount` // makes the latter nonnegative. matchedCount += i; // Apply set filters to unmatched elements // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` // equals `i`), unless we didn't visit _any_ elements in the above loop because we have // no element matchers and no seed. // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that // case, which will result in a "00" `matchedCount` that differs from `i` but is also // numerically zero. if ( bySet && i !== matchedCount ) { j = 0; while ( ( matcher = setMatchers[ j++ ] ) ) { matcher( unmatched, setMatched, context, xml ); } if ( seed ) { // Reintegrate element matches to eliminate the need for sorting if ( matchedCount > 0 ) { while ( i-- ) { if ( !( unmatched[ i ] || setMatched[ i ] ) ) { setMatched[ i ] = pop.call( results ); } } } // Discard index placeholder values to get only actual matches setMatched = condense( setMatched ); } // Add matches to results push.apply( results, setMatched ); // Seedless set matches succeeding multiple successful matchers stipulate sorting if ( outermost && !seed && setMatched.length > 0 && ( matchedCount + setMatchers.length ) > 1 ) { Sizzle.uniqueSort( results ); } } // Override manipulation of globals by nested matchers if ( outermost ) { dirruns = dirrunsUnique; outermostContext = contextBackup; } return unmatched; }; return bySet ? markFunction( superMatcher ) : superMatcher; } compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { var i, setMatchers = [], elementMatchers = [], cached = compilerCache[ selector + " " ]; if ( !cached ) { // Generate a function of recursive functions that can be used to check each element if ( !match ) { match = tokenize( selector ); } i = match.length; while ( i-- ) { cached = matcherFromTokens( match[ i ] ); if ( cached[ expando ] ) { setMatchers.push( cached ); } else { elementMatchers.push( cached ); } } // Cache the compiled function cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); // Save selector and tokenization cached.selector = selector; } return cached; }; /** * A low-level selection function that works with Sizzle's compiled * selector functions * @param {String|Function} selector A selector or a pre-compiled * selector function built with Sizzle.compile * @param {Element} context * @param {Array} [results] * @param {Array} [seed] A set of elements to match against */ select = Sizzle.select = function( selector, context, results, seed ) { var i, tokens, token, type, find, compiled = typeof selector === "function" && selector, match = !seed && tokenize( ( selector = compiled.selector || selector ) ); results = results || []; // Try to minimize operations if there is only one selector in the list and no seed // (the latter of which guarantees us context) if ( match.length === 1 ) { // Reduce context if the leading compound selector is an ID tokens = match[ 0 ] = match[ 0 ].slice( 0 ); if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { context = ( Expr.find[ "ID" ]( token.matches[ 0 ] .replace( runescape, funescape ), context ) || [] )[ 0 ]; if ( !context ) { return results; // Precompiled matchers will still verify ancestry, so step up a level } else if ( compiled ) { context = context.parentNode; } selector = selector.slice( tokens.shift().value.length ); } // Fetch a seed set for right-to-left matching i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; while ( i-- ) { token = tokens[ i ]; // Abort if we hit a combinator if ( Expr.relative[ ( type = token.type ) ] ) { break; } if ( ( find = Expr.find[ type ] ) ) { // Search, expanding context for leading sibling combinators if ( ( seed = find( token.matches[ 0 ].replace( runescape, funescape ), rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || context ) ) ) { // If seed is empty or no tokens remain, we can return early tokens.splice( i, 1 ); selector = seed.length && toSelector( tokens ); if ( !selector ) { push.apply( results, seed ); return results; } break; } } } } // Compile and execute a filtering function if one is not provided // Provide `match` to avoid retokenization if we modified the selector above ( compiled || compile( selector, match ) )( seed, context, !documentIsHTML, results, !context || rsibling.test( selector ) && testContext( context.parentNode ) || context ); return results; }; // One-time assignments // Sort stability support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; // Support: Chrome 14-35+ // Always assume duplicates if they aren't passed to the comparison function support.detectDuplicates = !!hasDuplicate; // Initialize against the default document setDocument(); // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) // Detached nodes confoundingly follow *each other* support.sortDetached = assert( function( el ) { // Should return 1, but returns 4 (following) return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; } ); // Support: IE<8 // Prevent attribute/property "interpolation" // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx if ( !assert( function( el ) { el.innerHTML = ""; return el.firstChild.getAttribute( "href" ) === "#"; } ) ) { addHandle( "type|href|height|width", function( elem, name, isXML ) { if ( !isXML ) { return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); } } ); } // Support: IE<9 // Use defaultValue in place of getAttribute("value") if ( !support.attributes || !assert( function( el ) { el.innerHTML = ""; el.firstChild.setAttribute( "value", "" ); return el.firstChild.getAttribute( "value" ) === ""; } ) ) { addHandle( "value", function( elem, _name, isXML ) { if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { return elem.defaultValue; } } ); } // Support: IE<9 // Use getAttributeNode to fetch booleans when getAttribute lies if ( !assert( function( el ) { return el.getAttribute( "disabled" ) == null; } ) ) { addHandle( booleans, function( elem, name, isXML ) { var val; if ( !isXML ) { return elem[ name ] === true ? name.toLowerCase() : ( val = elem.getAttributeNode( name ) ) && val.specified ? val.value : null; } } ); } return Sizzle; } )( window ); jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; // Deprecated jQuery.expr[ ":" ] = jQuery.expr.pseudos; jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains; jQuery.escapeSelector = Sizzle.escape; var dir = function( elem, dir, until ) { var matched = [], truncate = until !== undefined; while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { if ( elem.nodeType === 1 ) { if ( truncate && jQuery( elem ).is( until ) ) { break; } matched.push( elem ); } } return matched; }; var siblings = function( n, elem ) { var matched = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { matched.push( n ); } } return matched; }; var rneedsContext = jQuery.expr.match.needsContext; function nodeName( elem, name ) { return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); }; var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); // Implement the identical functionality for filter and not function winnow( elements, qualifier, not ) { if ( isFunction( qualifier ) ) { return jQuery.grep( elements, function( elem, i ) { return !!qualifier.call( elem, i, elem ) !== not; } ); } // Single element if ( qualifier.nodeType ) { return jQuery.grep( elements, function( elem ) { return ( elem === qualifier ) !== not; } ); } // Arraylike of elements (jQuery, arguments, Array) if ( typeof qualifier !== "string" ) { return jQuery.grep( elements, function( elem ) { return ( indexOf.call( qualifier, elem ) > -1 ) !== not; } ); } // Filtered directly for both simple and complex selectors return jQuery.filter( qualifier, elements, not ); } jQuery.filter = function( expr, elems, not ) { var elem = elems[ 0 ]; if ( not ) { expr = ":not(" + expr + ")"; } if ( elems.length === 1 && elem.nodeType === 1 ) { return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; } return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { return elem.nodeType === 1; } ) ); }; jQuery.fn.extend( { find: function( selector ) { var i, ret, len = this.length, self = this; if ( typeof selector !== "string" ) { return this.pushStack( jQuery( selector ).filter( function() { for ( i = 0; i < len; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } } ) ); } ret = this.pushStack( [] ); for ( i = 0; i < len; i++ ) { jQuery.find( selector, self[ i ], ret ); } return len > 1 ? jQuery.uniqueSort( ret ) : ret; }, filter: function( selector ) { return this.pushStack( winnow( this, selector || [], false ) ); }, not: function( selector ) { return this.pushStack( winnow( this, selector || [], true ) ); }, is: function( selector ) { return !!winnow( this, // If this is a positional/relative selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". typeof selector === "string" && rneedsContext.test( selector ) ? jQuery( selector ) : selector || [], false ).length; } } ); // Initialize a jQuery object // A central reference to the root jQuery(document) var rootjQuery, // A simple way to check for HTML strings // Prioritize #id over to avoid XSS via location.hash (#9521) // Strict HTML recognition (#11290: must start with <) // Shortcut simple #id case for speed rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, init = jQuery.fn.init = function( selector, context, root ) { var match, elem; // HANDLE: $(""), $(null), $(undefined), $(false) if ( !selector ) { return this; } // Method init() accepts an alternate rootjQuery // so migrate can support jQuery.sub (gh-2101) root = root || rootjQuery; // Handle HTML strings if ( typeof selector === "string" ) { if ( selector[ 0 ] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) { // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; } else { match = rquickExpr.exec( selector ); } // Match html or make sure no context is specified for #id if ( match && ( match[ 1 ] || !context ) ) { // HANDLE: $(html) -> $(array) if ( match[ 1 ] ) { context = context instanceof jQuery ? context[ 0 ] : context; // Option to run scripts is true for back-compat // Intentionally let the error be thrown if parseHTML is not present jQuery.merge( this, jQuery.parseHTML( match[ 1 ], context && context.nodeType ? context.ownerDocument || context : document, true ) ); // HANDLE: $(html, props) if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { for ( match in context ) { // Properties of context are called as methods if possible if ( isFunction( this[ match ] ) ) { this[ match ]( context[ match ] ); // ...and otherwise set as attributes } else { this.attr( match, context[ match ] ); } } } return this; // HANDLE: $(#id) } else { elem = document.getElementById( match[ 2 ] ); if ( elem ) { // Inject the element directly into the jQuery object this[ 0 ] = elem; this.length = 1; } return this; } // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return ( context || root ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return this.constructor( context ).find( selector ); } // HANDLE: $(DOMElement) } else if ( selector.nodeType ) { this[ 0 ] = selector; this.length = 1; return this; // HANDLE: $(function) // Shortcut for document ready } else if ( isFunction( selector ) ) { return root.ready !== undefined ? root.ready( selector ) : // Execute immediately if ready is not present selector( jQuery ); } return jQuery.makeArray( selector, this ); }; // Give the init function the jQuery prototype for later instantiation init.prototype = jQuery.fn; // Initialize central reference rootjQuery = jQuery( document ); var rparentsprev = /^(?:parents|prev(?:Until|All))/, // Methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, next: true, prev: true }; jQuery.fn.extend( { has: function( target ) { var targets = jQuery( target, this ), l = targets.length; return this.filter( function() { var i = 0; for ( ; i < l; i++ ) { if ( jQuery.contains( this, targets[ i ] ) ) { return true; } } } ); }, closest: function( selectors, context ) { var cur, i = 0, l = this.length, matched = [], targets = typeof selectors !== "string" && jQuery( selectors ); // Positional selectors never match, since there's no _selection_ context if ( !rneedsContext.test( selectors ) ) { for ( ; i < l; i++ ) { for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { // Always skip document fragments if ( cur.nodeType < 11 && ( targets ? targets.index( cur ) > -1 : // Don't pass non-elements to Sizzle cur.nodeType === 1 && jQuery.find.matchesSelector( cur, selectors ) ) ) { matched.push( cur ); break; } } } } return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); }, // Determine the position of an element within the set index: function( elem ) { // No argument, return index in parent if ( !elem ) { return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; } // Index in selector if ( typeof elem === "string" ) { return indexOf.call( jQuery( elem ), this[ 0 ] ); } // Locate the position of the desired element return indexOf.call( this, // If it receives a jQuery object, the first element is used elem.jquery ? elem[ 0 ] : elem ); }, add: function( selector, context ) { return this.pushStack( jQuery.uniqueSort( jQuery.merge( this.get(), jQuery( selector, context ) ) ) ); }, addBack: function( selector ) { return this.add( selector == null ? this.prevObject : this.prevObject.filter( selector ) ); } } ); function sibling( cur, dir ) { while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} return cur; } jQuery.each( { parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { return dir( elem, "parentNode" ); }, parentsUntil: function( elem, _i, until ) { return dir( elem, "parentNode", until ); }, next: function( elem ) { return sibling( elem, "nextSibling" ); }, prev: function( elem ) { return sibling( elem, "previousSibling" ); }, nextAll: function( elem ) { return dir( elem, "nextSibling" ); }, prevAll: function( elem ) { return dir( elem, "previousSibling" ); }, nextUntil: function( elem, _i, until ) { return dir( elem, "nextSibling", until ); }, prevUntil: function( elem, _i, until ) { return dir( elem, "previousSibling", until ); }, siblings: function( elem ) { return siblings( ( elem.parentNode || {} ).firstChild, elem ); }, children: function( elem ) { return siblings( elem.firstChild ); }, contents: function( elem ) { if ( elem.contentDocument != null && // Support: IE 11+ // elements with no `data` attribute has an object // `contentDocument` with a `null` prototype. getProto( elem.contentDocument ) ) { return elem.contentDocument; } // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only // Treat the template element as a regular one in browsers that // don't support it. if ( nodeName( elem, "template" ) ) { elem = elem.content || elem; } return jQuery.merge( [], elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var matched = jQuery.map( this, fn, until ); if ( name.slice( -5 ) !== "Until" ) { selector = until; } if ( selector && typeof selector === "string" ) { matched = jQuery.filter( selector, matched ); } if ( this.length > 1 ) { // Remove duplicates if ( !guaranteedUnique[ name ] ) { jQuery.uniqueSort( matched ); } // Reverse order for parents* and prev-derivatives if ( rparentsprev.test( name ) ) { matched.reverse(); } } return this.pushStack( matched ); }; } ); var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); // Convert String-formatted options into Object-formatted ones function createOptions( options ) { var object = {}; jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { object[ flag ] = true; } ); return object; } /* * Create a callback list using the following parameters: * * options: an optional list of space-separated options that will change how * the callback list behaves or a more traditional option object * * By default a callback list will act like an event callback list and can be * "fired" multiple times. * * Possible options: * * once: will ensure the callback list can only be fired once (like a Deferred) * * memory: will keep track of previous values and will call any callback added * after the list has been fired right away with the latest "memorized" * values (like a Deferred) * * unique: will ensure a callback can only be added once (no duplicate in the list) * * stopOnFalse: interrupt callings when a callback returns false * */ jQuery.Callbacks = function( options ) { // Convert options from String-formatted to Object-formatted if needed // (we check in cache first) options = typeof options === "string" ? createOptions( options ) : jQuery.extend( {}, options ); var // Flag to know if list is currently firing firing, // Last fire value for non-forgettable lists memory, // Flag to know if list was already fired fired, // Flag to prevent firing locked, // Actual callback list list = [], // Queue of execution data for repeatable lists queue = [], // Index of currently firing callback (modified by add/remove as needed) firingIndex = -1, // Fire callbacks fire = function() { // Enforce single-firing locked = locked || options.once; // Execute callbacks for all pending executions, // respecting firingIndex overrides and runtime changes fired = firing = true; for ( ; queue.length; firingIndex = -1 ) { memory = queue.shift(); while ( ++firingIndex < list.length ) { // Run callback and check for early termination if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && options.stopOnFalse ) { // Jump to end and forget the data so .add doesn't re-fire firingIndex = list.length; memory = false; } } } // Forget the data if we're done with it if ( !options.memory ) { memory = false; } firing = false; // Clean up if we're done firing for good if ( locked ) { // Keep an empty list if we have data for future add calls if ( memory ) { list = []; // Otherwise, this object is spent } else { list = ""; } } }, // Actual Callbacks object self = { // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { // If we have memory from a past run, we should fire after adding if ( memory && !firing ) { firingIndex = list.length - 1; queue.push( memory ); } ( function add( args ) { jQuery.each( args, function( _, arg ) { if ( isFunction( arg ) ) { if ( !options.unique || !self.has( arg ) ) { list.push( arg ); } } else if ( arg && arg.length && toType( arg ) !== "string" ) { // Inspect recursively add( arg ); } } ); } )( arguments ); if ( memory && !firing ) { fire(); } } return this; }, // Remove a callback from the list remove: function() { jQuery.each( arguments, function( _, arg ) { var index; while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { list.splice( index, 1 ); // Handle firing indexes if ( index <= firingIndex ) { firingIndex--; } } } ); return this; }, // Check if a given callback is in the list. // If no argument is given, return whether or not list has callbacks attached. has: function( fn ) { return fn ? jQuery.inArray( fn, list ) > -1 : list.length > 0; }, // Remove all callbacks from the list empty: function() { if ( list ) { list = []; } return this; }, // Disable .fire and .add // Abort any current/pending executions // Clear all callbacks and values disable: function() { locked = queue = []; list = memory = ""; return this; }, disabled: function() { return !list; }, // Disable .fire // Also disable .add unless we have memory (since it would have no effect) // Abort any pending executions lock: function() { locked = queue = []; if ( !memory && !firing ) { list = memory = ""; } return this; }, locked: function() { return !!locked; }, // Call all callbacks with the given context and arguments fireWith: function( context, args ) { if ( !locked ) { args = args || []; args = [ context, args.slice ? args.slice() : args ]; queue.push( args ); if ( !firing ) { fire(); } } return this; }, // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, // To know if the callbacks have already been called at least once fired: function() { return !!fired; } }; return self; }; function Identity( v ) { return v; } function Thrower( ex ) { throw ex; } function adoptValue( value, resolve, reject, noValue ) { var method; try { // Check for promise aspect first to privilege synchronous behavior if ( value && isFunction( ( method = value.promise ) ) ) { method.call( value ).done( resolve ).fail( reject ); // Other thenables } else if ( value && isFunction( ( method = value.then ) ) ) { method.call( value, resolve, reject ); // Other non-thenables } else { // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: // * false: [ value ].slice( 0 ) => resolve( value ) // * true: [ value ].slice( 1 ) => resolve() resolve.apply( undefined, [ value ].slice( noValue ) ); } // For Promises/A+, convert exceptions into rejections // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in // Deferred#then to conditionally suppress rejection. } catch ( value ) { // Support: Android 4.0 only // Strict mode functions invoked without .call/.apply get global-object context reject.apply( undefined, [ value ] ); } } jQuery.extend( { Deferred: function( func ) { var tuples = [ // action, add listener, callbacks, // ... .then handlers, argument index, [final state] [ "notify", "progress", jQuery.Callbacks( "memory" ), jQuery.Callbacks( "memory" ), 2 ], [ "resolve", "done", jQuery.Callbacks( "once memory" ), jQuery.Callbacks( "once memory" ), 0, "resolved" ], [ "reject", "fail", jQuery.Callbacks( "once memory" ), jQuery.Callbacks( "once memory" ), 1, "rejected" ] ], state = "pending", promise = { state: function() { return state; }, always: function() { deferred.done( arguments ).fail( arguments ); return this; }, "catch": function( fn ) { return promise.then( null, fn ); }, // Keep pipe for back-compat pipe: function( /* fnDone, fnFail, fnProgress */ ) { var fns = arguments; return jQuery.Deferred( function( newDefer ) { jQuery.each( tuples, function( _i, tuple ) { // Map tuples (progress, done, fail) to arguments (done, fail, progress) var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; // deferred.progress(function() { bind to newDefer or newDefer.notify }) // deferred.done(function() { bind to newDefer or newDefer.resolve }) // deferred.fail(function() { bind to newDefer or newDefer.reject }) deferred[ tuple[ 1 ] ]( function() { var returned = fn && fn.apply( this, arguments ); if ( returned && isFunction( returned.promise ) ) { returned.promise() .progress( newDefer.notify ) .done( newDefer.resolve ) .fail( newDefer.reject ); } else { newDefer[ tuple[ 0 ] + "With" ]( this, fn ? [ returned ] : arguments ); } } ); } ); fns = null; } ).promise(); }, then: function( onFulfilled, onRejected, onProgress ) { var maxDepth = 0; function resolve( depth, deferred, handler, special ) { return function() { var that = this, args = arguments, mightThrow = function() { var returned, then; // Support: Promises/A+ section 2.3.3.3.3 // https://promisesaplus.com/#point-59 // Ignore double-resolution attempts if ( depth < maxDepth ) { return; } returned = handler.apply( that, args ); // Support: Promises/A+ section 2.3.1 // https://promisesaplus.com/#point-48 if ( returned === deferred.promise() ) { throw new TypeError( "Thenable self-resolution" ); } // Support: Promises/A+ sections 2.3.3.1, 3.5 // https://promisesaplus.com/#point-54 // https://promisesaplus.com/#point-75 // Retrieve `then` only once then = returned && // Support: Promises/A+ section 2.3.4 // https://promisesaplus.com/#point-64 // Only check objects and functions for thenability ( typeof returned === "object" || typeof returned === "function" ) && returned.then; // Handle a returned thenable if ( isFunction( then ) ) { // Special processors (notify) just wait for resolution if ( special ) { then.call( returned, resolve( maxDepth, deferred, Identity, special ), resolve( maxDepth, deferred, Thrower, special ) ); // Normal processors (resolve) also hook into progress } else { // ...and disregard older resolution values maxDepth++; then.call( returned, resolve( maxDepth, deferred, Identity, special ), resolve( maxDepth, deferred, Thrower, special ), resolve( maxDepth, deferred, Identity, deferred.notifyWith ) ); } // Handle all other returned values } else { // Only substitute handlers pass on context // and multiple values (non-spec behavior) if ( handler !== Identity ) { that = undefined; args = [ returned ]; } // Process the value(s) // Default process is resolve ( special || deferred.resolveWith )( that, args ); } }, // Only normal processors (resolve) catch and reject exceptions process = special ? mightThrow : function() { try { mightThrow(); } catch ( e ) { if ( jQuery.Deferred.exceptionHook ) { jQuery.Deferred.exceptionHook( e, process.stackTrace ); } // Support: Promises/A+ section 2.3.3.3.4.1 // https://promisesaplus.com/#point-61 // Ignore post-resolution exceptions if ( depth + 1 >= maxDepth ) { // Only substitute handlers pass on context // and multiple values (non-spec behavior) if ( handler !== Thrower ) { that = undefined; args = [ e ]; } deferred.rejectWith( that, args ); } } }; // Support: Promises/A+ section 2.3.3.3.1 // https://promisesaplus.com/#point-57 // Re-resolve promises immediately to dodge false rejection from // subsequent errors if ( depth ) { process(); } else { // Call an optional hook to record the stack, in case of exception // since it's otherwise lost when execution goes async if ( jQuery.Deferred.getStackHook ) { process.stackTrace = jQuery.Deferred.getStackHook(); } window.setTimeout( process ); } }; } return jQuery.Deferred( function( newDefer ) { // progress_handlers.add( ... ) tuples[ 0 ][ 3 ].add( resolve( 0, newDefer, isFunction( onProgress ) ? onProgress : Identity, newDefer.notifyWith ) ); // fulfilled_handlers.add( ... ) tuples[ 1 ][ 3 ].add( resolve( 0, newDefer, isFunction( onFulfilled ) ? onFulfilled : Identity ) ); // rejected_handlers.add( ... ) tuples[ 2 ][ 3 ].add( resolve( 0, newDefer, isFunction( onRejected ) ? onRejected : Thrower ) ); } ).promise(); }, // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { return obj != null ? jQuery.extend( obj, promise ) : promise; } }, deferred = {}; // Add list-specific methods jQuery.each( tuples, function( i, tuple ) { var list = tuple[ 2 ], stateString = tuple[ 5 ]; // promise.progress = list.add // promise.done = list.add // promise.fail = list.add promise[ tuple[ 1 ] ] = list.add; // Handle state if ( stateString ) { list.add( function() { // state = "resolved" (i.e., fulfilled) // state = "rejected" state = stateString; }, // rejected_callbacks.disable // fulfilled_callbacks.disable tuples[ 3 - i ][ 2 ].disable, // rejected_handlers.disable // fulfilled_handlers.disable tuples[ 3 - i ][ 3 ].disable, // progress_callbacks.lock tuples[ 0 ][ 2 ].lock, // progress_handlers.lock tuples[ 0 ][ 3 ].lock ); } // progress_handlers.fire // fulfilled_handlers.fire // rejected_handlers.fire list.add( tuple[ 3 ].fire ); // deferred.notify = function() { deferred.notifyWith(...) } // deferred.resolve = function() { deferred.resolveWith(...) } // deferred.reject = function() { deferred.rejectWith(...) } deferred[ tuple[ 0 ] ] = function() { deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); return this; }; // deferred.notifyWith = list.fireWith // deferred.resolveWith = list.fireWith // deferred.rejectWith = list.fireWith deferred[ tuple[ 0 ] + "With" ] = list.fireWith; } ); // Make the deferred a promise promise.promise( deferred ); // Call given func if any if ( func ) { func.call( deferred, deferred ); } // All done! return deferred; }, // Deferred helper when: function( singleValue ) { var // count of uncompleted subordinates remaining = arguments.length, // count of unprocessed arguments i = remaining, // subordinate fulfillment data resolveContexts = Array( i ), resolveValues = slice.call( arguments ), // the master Deferred master = jQuery.Deferred(), // subordinate callback factory updateFunc = function( i ) { return function( value ) { resolveContexts[ i ] = this; resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; if ( !( --remaining ) ) { master.resolveWith( resolveContexts, resolveValues ); } }; }; // Single- and empty arguments are adopted like Promise.resolve if ( remaining <= 1 ) { adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, !remaining ); // Use .then() to unwrap secondary thenables (cf. gh-3000) if ( master.state() === "pending" || isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { return master.then(); } } // Multiple arguments are aggregated like Promise.all array elements while ( i-- ) { adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); } return master.promise(); } } ); // These usually indicate a programmer mistake during development, // warn about them ASAP rather than swallowing them by default. var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; jQuery.Deferred.exceptionHook = function( error, stack ) { // Support: IE 8 - 9 only // Console exists when dev tools are open, which can happen at any time if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); } }; jQuery.readyException = function( error ) { window.setTimeout( function() { throw error; } ); }; // The deferred used on DOM ready var readyList = jQuery.Deferred(); jQuery.fn.ready = function( fn ) { readyList .then( fn ) // Wrap jQuery.readyException in a function so that the lookup // happens at the time of error handling instead of callback // registration. .catch( function( error ) { jQuery.readyException( error ); } ); return this; }; jQuery.extend( { // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, // Handle when the DOM is ready ready: function( wait ) { // Abort if there are pending holds or we're already ready if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { return; } // Remember that the DOM is ready jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // If there are functions bound, to execute readyList.resolveWith( document, [ jQuery ] ); } } ); jQuery.ready.then = readyList.then; // The ready event handler and self cleanup method function completed() { document.removeEventListener( "DOMContentLoaded", completed ); window.removeEventListener( "load", completed ); jQuery.ready(); } // Catch cases where $(document).ready() is called // after the browser event has already occurred. // Support: IE <=9 - 10 only // Older IE sometimes signals "interactive" too soon if ( document.readyState === "complete" || ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { // Handle it asynchronously to allow scripts the opportunity to delay ready window.setTimeout( jQuery.ready ); } else { // Use the handy event callback document.addEventListener( "DOMContentLoaded", completed ); // A fallback to window.onload, that will always work window.addEventListener( "load", completed ); } // Multifunctional method to get and set values of a collection // The value/s can optionally be executed if it's a function var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { var i = 0, len = elems.length, bulk = key == null; // Sets many values if ( toType( key ) === "object" ) { chainable = true; for ( i in key ) { access( elems, fn, i, key[ i ], true, emptyGet, raw ); } // Sets one value } else if ( value !== undefined ) { chainable = true; if ( !isFunction( value ) ) { raw = true; } if ( bulk ) { // Bulk operations run against the entire set if ( raw ) { fn.call( elems, value ); fn = null; // ...except when executing function values } else { bulk = fn; fn = function( elem, _key, value ) { return bulk.call( jQuery( elem ), value ); }; } } if ( fn ) { for ( ; i < len; i++ ) { fn( elems[ i ], key, raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) ) ); } } } if ( chainable ) { return elems; } // Gets if ( bulk ) { return fn.call( elems ); } return len ? fn( elems[ 0 ], key ) : emptyGet; }; // Matches dashed string for camelizing var rmsPrefix = /^-ms-/, rdashAlpha = /-([a-z])/g; // Used by camelCase as callback to replace() function fcamelCase( _all, letter ) { return letter.toUpperCase(); } // Convert dashed to camelCase; used by the css and data modules // Support: IE <=9 - 11, Edge 12 - 15 // Microsoft forgot to hump their vendor prefix (#9572) function camelCase( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); } var acceptData = function( owner ) { // Accepts only: // - Node // - Node.ELEMENT_NODE // - Node.DOCUMENT_NODE // - Object // - Any return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); }; function Data() { this.expando = jQuery.expando + Data.uid++; } Data.uid = 1; Data.prototype = { cache: function( owner ) { // Check if the owner object already has a cache var value = owner[ this.expando ]; // If not, create one if ( !value ) { value = {}; // We can accept data for non-element nodes in modern browsers, // but we should not, see #8335. // Always return an empty object. if ( acceptData( owner ) ) { // If it is a node unlikely to be stringify-ed or looped over // use plain assignment if ( owner.nodeType ) { owner[ this.expando ] = value; // Otherwise secure it in a non-enumerable property // configurable must be true to allow the property to be // deleted when data is removed } else { Object.defineProperty( owner, this.expando, { value: value, configurable: true } ); } } } return value; }, set: function( owner, data, value ) { var prop, cache = this.cache( owner ); // Handle: [ owner, key, value ] args // Always use camelCase key (gh-2257) if ( typeof data === "string" ) { cache[ camelCase( data ) ] = value; // Handle: [ owner, { properties } ] args } else { // Copy the properties one-by-one to the cache object for ( prop in data ) { cache[ camelCase( prop ) ] = data[ prop ]; } } return cache; }, get: function( owner, key ) { return key === undefined ? this.cache( owner ) : // Always use camelCase key (gh-2257) owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; }, access: function( owner, key, value ) { // In cases where either: // // 1. No key was specified // 2. A string key was specified, but no value provided // // Take the "read" path and allow the get method to determine // which value to return, respectively either: // // 1. The entire cache object // 2. The data stored at the key // if ( key === undefined || ( ( key && typeof key === "string" ) && value === undefined ) ) { return this.get( owner, key ); } // When the key is not a string, or both a key and value // are specified, set or extend (existing objects) with either: // // 1. An object of properties // 2. A key and value // this.set( owner, key, value ); // Since the "set" path can have two possible entry points // return the expected data based on which path was taken[*] return value !== undefined ? value : key; }, remove: function( owner, key ) { var i, cache = owner[ this.expando ]; if ( cache === undefined ) { return; } if ( key !== undefined ) { // Support array or space separated string of keys if ( Array.isArray( key ) ) { // If key is an array of keys... // We always set camelCase keys, so remove that. key = key.map( camelCase ); } else { key = camelCase( key ); // If a key with the spaces exists, use it. // Otherwise, create an array by matching non-whitespace key = key in cache ? [ key ] : ( key.match( rnothtmlwhite ) || [] ); } i = key.length; while ( i-- ) { delete cache[ key[ i ] ]; } } // Remove the expando if there's no more data if ( key === undefined || jQuery.isEmptyObject( cache ) ) { // Support: Chrome <=35 - 45 // Webkit & Blink performance suffers when deleting properties // from DOM nodes, so set to undefined instead // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) if ( owner.nodeType ) { owner[ this.expando ] = undefined; } else { delete owner[ this.expando ]; } } }, hasData: function( owner ) { var cache = owner[ this.expando ]; return cache !== undefined && !jQuery.isEmptyObject( cache ); } }; var dataPriv = new Data(); var dataUser = new Data(); // Implementation Summary // // 1. Enforce API surface and semantic compatibility with 1.9.x branch // 2. Improve the module's maintainability by reducing the storage // paths to a single mechanism. // 3. Use the same single mechanism to support "private" and "user" data. // 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) // 5. Avoid exposing implementation details on user objects (eg. expando properties) // 6. Provide a clear path for implementation upgrade to WeakMap in 2014 var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, rmultiDash = /[A-Z]/g; function getData( data ) { if ( data === "true" ) { return true; } if ( data === "false" ) { return false; } if ( data === "null" ) { return null; } // Only convert to a number if it doesn't change the string if ( data === +data + "" ) { return +data; } if ( rbrace.test( data ) ) { return JSON.parse( data ); } return data; } function dataAttr( elem, key, data ) { var name; // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { data = getData( data ); } catch ( e ) {} // Make sure we set the data so it isn't changed later dataUser.set( elem, key, data ); } else { data = undefined; } } return data; } jQuery.extend( { hasData: function( elem ) { return dataUser.hasData( elem ) || dataPriv.hasData( elem ); }, data: function( elem, name, data ) { return dataUser.access( elem, name, data ); }, removeData: function( elem, name ) { dataUser.remove( elem, name ); }, // TODO: Now that all calls to _data and _removeData have been replaced // with direct calls to dataPriv methods, these can be deprecated. _data: function( elem, name, data ) { return dataPriv.access( elem, name, data ); }, _removeData: function( elem, name ) { dataPriv.remove( elem, name ); } } ); jQuery.fn.extend( { data: function( key, value ) { var i, name, data, elem = this[ 0 ], attrs = elem && elem.attributes; // Gets all values if ( key === undefined ) { if ( this.length ) { data = dataUser.get( elem ); if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { i = attrs.length; while ( i-- ) { // Support: IE 11 only // The attrs elements can be null (#14894) if ( attrs[ i ] ) { name = attrs[ i ].name; if ( name.indexOf( "data-" ) === 0 ) { name = camelCase( name.slice( 5 ) ); dataAttr( elem, name, data[ name ] ); } } } dataPriv.set( elem, "hasDataAttrs", true ); } } return data; } // Sets multiple values if ( typeof key === "object" ) { return this.each( function() { dataUser.set( this, key ); } ); } return access( this, function( value ) { var data; // The calling jQuery object (element matches) is not empty // (and therefore has an element appears at this[ 0 ]) and the // `value` parameter was not undefined. An empty jQuery object // will result in `undefined` for elem = this[ 0 ] which will // throw an exception if an attempt to read a data cache is made. if ( elem && value === undefined ) { // Attempt to get data from the cache // The key will always be camelCased in Data data = dataUser.get( elem, key ); if ( data !== undefined ) { return data; } // Attempt to "discover" the data in // HTML5 custom data-* attrs data = dataAttr( elem, key ); if ( data !== undefined ) { return data; } // We tried really hard, but the data doesn't exist. return; } // Set the data... this.each( function() { // We always store the camelCased key dataUser.set( this, key, value ); } ); }, null, value, arguments.length > 1, null, true ); }, removeData: function( key ) { return this.each( function() { dataUser.remove( this, key ); } ); } } ); jQuery.extend( { queue: function( elem, type, data ) { var queue; if ( elem ) { type = ( type || "fx" ) + "queue"; queue = dataPriv.get( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !queue || Array.isArray( data ) ) { queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); } else { queue.push( data ); } } return queue || []; } }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), startLength = queue.length, fn = queue.shift(), hooks = jQuery._queueHooks( elem, type ), next = function() { jQuery.dequeue( elem, type ); }; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); startLength--; } if ( fn ) { // Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift( "inprogress" ); } // Clear up the last queue stop function delete hooks.stop; fn.call( elem, next, hooks ); } if ( !startLength && hooks ) { hooks.empty.fire(); } }, // Not public - generate a queueHooks object, or return the current one _queueHooks: function( elem, type ) { var key = type + "queueHooks"; return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { empty: jQuery.Callbacks( "once memory" ).add( function() { dataPriv.remove( elem, [ type + "queue", key ] ); } ) } ); } } ); jQuery.fn.extend( { queue: function( type, data ) { var setter = 2; if ( typeof type !== "string" ) { data = type; type = "fx"; setter--; } if ( arguments.length < setter ) { return jQuery.queue( this[ 0 ], type ); } return data === undefined ? this : this.each( function() { var queue = jQuery.queue( this, type, data ); // Ensure a hooks for this queue jQuery._queueHooks( this, type ); if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { jQuery.dequeue( this, type ); } } ); }, dequeue: function( type ) { return this.each( function() { jQuery.dequeue( this, type ); } ); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, obj ) { var tmp, count = 1, defer = jQuery.Deferred(), elements = this, i = this.length, resolve = function() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } }; if ( typeof type !== "string" ) { obj = type; type = undefined; } type = type || "fx"; while ( i-- ) { tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); if ( tmp && tmp.empty ) { count++; tmp.empty.add( resolve ); } } resolve(); return defer.promise( obj ); } } ); var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; var documentElement = document.documentElement; var isAttached = function( elem ) { return jQuery.contains( elem.ownerDocument, elem ); }, composed = { composed: true }; // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only // Check attachment across shadow DOM boundaries when possible (gh-3504) // Support: iOS 10.0-10.2 only // Early iOS 10 versions support `attachShadow` but not `getRootNode`, // leading to errors. We need to check for `getRootNode`. if ( documentElement.getRootNode ) { isAttached = function( elem ) { return jQuery.contains( elem.ownerDocument, elem ) || elem.getRootNode( composed ) === elem.ownerDocument; }; } var isHiddenWithinTree = function( elem, el ) { // isHiddenWithinTree might be called from jQuery#filter function; // in that case, element will be second argument elem = el || elem; // Inline style trumps all return elem.style.display === "none" || elem.style.display === "" && // Otherwise, check computed style // Support: Firefox <=43 - 45 // Disconnected elements can have computed display: none, so first confirm that elem is // in the document. isAttached( elem ) && jQuery.css( elem, "display" ) === "none"; }; function adjustCSS( elem, prop, valueParts, tween ) { var adjusted, scale, maxIterations = 20, currentValue = tween ? function() { return tween.cur(); } : function() { return jQuery.css( elem, prop, "" ); }, initial = currentValue(), unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), // Starting value computation is required for potential unit mismatches initialInUnit = elem.nodeType && ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && rcssNum.exec( jQuery.css( elem, prop ) ); if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { // Support: Firefox <=54 // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) initial = initial / 2; // Trust units reported by jQuery.css unit = unit || initialInUnit[ 3 ]; // Iteratively approximate from a nonzero starting point initialInUnit = +initial || 1; while ( maxIterations-- ) { // Evaluate and update our best guess (doubling guesses that zero out). // Finish if the scale equals or crosses 1 (making the old*new product non-positive). jQuery.style( elem, prop, initialInUnit + unit ); if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { maxIterations = 0; } initialInUnit = initialInUnit / scale; } initialInUnit = initialInUnit * 2; jQuery.style( elem, prop, initialInUnit + unit ); // Make sure we update the tween properties later on valueParts = valueParts || []; } if ( valueParts ) { initialInUnit = +initialInUnit || +initial || 0; // Apply relative offset (+=/-=) if specified adjusted = valueParts[ 1 ] ? initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : +valueParts[ 2 ]; if ( tween ) { tween.unit = unit; tween.start = initialInUnit; tween.end = adjusted; } } return adjusted; } var defaultDisplayMap = {}; function getDefaultDisplay( elem ) { var temp, doc = elem.ownerDocument, nodeName = elem.nodeName, display = defaultDisplayMap[ nodeName ]; if ( display ) { return display; } temp = doc.body.appendChild( doc.createElement( nodeName ) ); display = jQuery.css( temp, "display" ); temp.parentNode.removeChild( temp ); if ( display === "none" ) { display = "block"; } defaultDisplayMap[ nodeName ] = display; return display; } function showHide( elements, show ) { var display, elem, values = [], index = 0, length = elements.length; // Determine new display value for elements that need to change for ( ; index < length; index++ ) { elem = elements[ index ]; if ( !elem.style ) { continue; } display = elem.style.display; if ( show ) { // Since we force visibility upon cascade-hidden elements, an immediate (and slow) // check is required in this first loop unless we have a nonempty display value (either // inline or about-to-be-restored) if ( display === "none" ) { values[ index ] = dataPriv.get( elem, "display" ) || null; if ( !values[ index ] ) { elem.style.display = ""; } } if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { values[ index ] = getDefaultDisplay( elem ); } } else { if ( display !== "none" ) { values[ index ] = "none"; // Remember what we're overwriting dataPriv.set( elem, "display", display ); } } } // Set the display of the elements in a second loop to avoid constant reflow for ( index = 0; index < length; index++ ) { if ( values[ index ] != null ) { elements[ index ].style.display = values[ index ]; } } return elements; } jQuery.fn.extend( { show: function() { return showHide( this, true ); }, hide: function() { return showHide( this ); }, toggle: function( state ) { if ( typeof state === "boolean" ) { return state ? this.show() : this.hide(); } return this.each( function() { if ( isHiddenWithinTree( this ) ) { jQuery( this ).show(); } else { jQuery( this ).hide(); } } ); } } ); var rcheckableType = ( /^(?:checkbox|radio)$/i ); var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); ( function() { var fragment = document.createDocumentFragment(), div = fragment.appendChild( document.createElement( "div" ) ), input = document.createElement( "input" ); // Support: Android 4.0 - 4.3 only // Check state lost if the name is set (#11217) // Support: Windows Web Apps (WWA) // `name` and `type` must use .setAttribute for WWA (#14901) input.setAttribute( "type", "radio" ); input.setAttribute( "checked", "checked" ); input.setAttribute( "name", "t" ); div.appendChild( input ); // Support: Android <=4.1 only // Older WebKit doesn't clone checked state correctly in fragments support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; // Support: IE <=11 only // Make sure textarea (and checkbox) defaultValue is properly cloned div.innerHTML = ""; support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; // Support: IE <=9 only // IE <=9 replaces "; support.option = !!div.lastChild; } )(); // We have to close these tags to support XHTML (#13200) var wrapMap = { // XHTML parsers do not magically insert elements in the // same way that tag soup parsers do. So we cannot shorten // this by omitting or other required elements. thead: [ 1, "", "
" ], col: [ 2, "", "
" ], tr: [ 2, "", "
" ], td: [ 3, "", "
" ], _default: [ 0, "", "" ] }; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; // Support: IE <=9 only if ( !support.option ) { wrapMap.optgroup = wrapMap.option = [ 1, "" ]; } function getAll( context, tag ) { // Support: IE <=9 - 11 only // Use typeof to avoid zero-argument method invocation on host objects (#15151) var ret; if ( typeof context.getElementsByTagName !== "undefined" ) { ret = context.getElementsByTagName( tag || "*" ); } else if ( typeof context.querySelectorAll !== "undefined" ) { ret = context.querySelectorAll( tag || "*" ); } else { ret = []; } if ( tag === undefined || tag && nodeName( context, tag ) ) { return jQuery.merge( [ context ], ret ); } return ret; } // Mark scripts as having already been evaluated function setGlobalEval( elems, refElements ) { var i = 0, l = elems.length; for ( ; i < l; i++ ) { dataPriv.set( elems[ i ], "globalEval", !refElements || dataPriv.get( refElements[ i ], "globalEval" ) ); } } var rhtml = /<|&#?\w+;/; function buildFragment( elems, context, scripts, selection, ignored ) { var elem, tmp, tag, wrap, attached, j, fragment = context.createDocumentFragment(), nodes = [], i = 0, l = elems.length; for ( ; i < l; i++ ) { elem = elems[ i ]; if ( elem || elem === 0 ) { // Add nodes directly if ( toType( elem ) === "object" ) { // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); // Convert non-html into a text node } else if ( !rhtml.test( elem ) ) { nodes.push( context.createTextNode( elem ) ); // Convert html into DOM nodes } else { tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); // Deserialize a standard representation tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); wrap = wrapMap[ tag ] || wrapMap._default; tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; // Descend through wrappers to the right content j = wrap[ 0 ]; while ( j-- ) { tmp = tmp.lastChild; } // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( nodes, tmp.childNodes ); // Remember the top-level container tmp = fragment.firstChild; // Ensure the created nodes are orphaned (#12392) tmp.textContent = ""; } } } // Remove wrapper from fragment fragment.textContent = ""; i = 0; while ( ( elem = nodes[ i++ ] ) ) { // Skip elements already in the context collection (trac-4087) if ( selection && jQuery.inArray( elem, selection ) > -1 ) { if ( ignored ) { ignored.push( elem ); } continue; } attached = isAttached( elem ); // Append to fragment tmp = getAll( fragment.appendChild( elem ), "script" ); // Preserve script evaluation history if ( attached ) { setGlobalEval( tmp ); } // Capture executables if ( scripts ) { j = 0; while ( ( elem = tmp[ j++ ] ) ) { if ( rscriptType.test( elem.type || "" ) ) { scripts.push( elem ); } } } } return fragment; } var rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, rtypenamespace = /^([^.]*)(?:\.(.+)|)/; function returnTrue() { return true; } function returnFalse() { return false; } // Support: IE <=9 - 11+ // focus() and blur() are asynchronous, except when they are no-op. // So expect focus to be synchronous when the element is already active, // and blur to be synchronous when the element is not already active. // (focus and blur are always synchronous in other supported browsers, // this just defines when we can count on it). function expectSync( elem, type ) { return ( elem === safeActiveElement() ) === ( type === "focus" ); } // Support: IE <=9 only // Accessing document.activeElement can throw unexpectedly // https://bugs.jquery.com/ticket/13393 function safeActiveElement() { try { return document.activeElement; } catch ( err ) { } } function on( elem, types, selector, data, fn, one ) { var origFn, type; // Types can be a map of types/handlers if ( typeof types === "object" ) { // ( types-Object, selector, data ) if ( typeof selector !== "string" ) { // ( types-Object, data ) data = data || selector; selector = undefined; } for ( type in types ) { on( elem, type, selector, data, types[ type ], one ); } return elem; } if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; } else if ( fn == null ) { if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; } else { // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { return elem; } if ( one === 1 ) { origFn = fn; fn = function( event ) { // Can use an empty set, since event contains the info jQuery().off( event ); return origFn.apply( this, arguments ); }; // Use same guid so caller can remove using origFn fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); } return elem.each( function() { jQuery.event.add( this, types, fn, data, selector ); } ); } /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { global: {}, add: function( elem, types, handler, data, selector ) { var handleObjIn, eventHandle, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = dataPriv.get( elem ); // Only attach events to objects that accept data if ( !acceptData( elem ) ) { return; } // Caller can pass in an object of custom data in lieu of the handler if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; selector = handleObjIn.selector; } // Ensure that invalid selectors throw exceptions at attach time // Evaluate against documentElement in case elem is a non-element node (e.g., document) if ( selector ) { jQuery.find.matchesSelector( documentElement, selector ); } // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first if ( !( events = elemData.events ) ) { events = elemData.events = Object.create( null ); } if ( !( eventHandle = elemData.handle ) ) { eventHandle = elemData.handle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? jQuery.event.dispatch.apply( elem, arguments ) : undefined; }; } // Handle multiple events separated by a space types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[ t ] ) || []; type = origType = tmp[ 1 ]; namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); // There *must* be a type, no attaching namespace-only handlers if ( !type ) { continue; } // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; // If selector defined, determine special event api type, otherwise given type type = ( selector ? special.delegateType : special.bindType ) || type; // Update special based on newly reset type special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend( { type: type, origType: origType, data: data, handler: handler, guid: handler.guid, selector: selector, needsContext: selector && jQuery.expr.match.needsContext.test( selector ), namespace: namespaces.join( "." ) }, handleObjIn ); // Init the event handler queue if we're the first if ( !( handlers = events[ type ] ) ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front if ( selector ) { handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization jQuery.event.global[ type ] = true; } }, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { var j, origCount, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); if ( !elemData || !( events = elemData.events ) ) { return; } // Once for each type.namespace in types; type may be omitted types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[ t ] ) || []; type = origType = tmp[ 1 ]; namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); // Unbind all events (on this namespace, if provided) for the element if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector ? special.delegateType : special.bindType ) || type; handlers = events[ type ] || []; tmp = tmp[ 2 ] && new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); // Remove matching events origCount = j = handlers.length; while ( j-- ) { handleObj = handlers[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !tmp || tmp.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { handlers.splice( j, 1 ); if ( handleObj.selector ) { handlers.delegateCount--; } if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( origCount && !handlers.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; } } // Remove data and the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { dataPriv.remove( elem, "handle events" ); } }, dispatch: function( nativeEvent ) { var i, j, ret, matched, handleObj, handlerQueue, args = new Array( arguments.length ), // Make a writable jQuery.Event from the native event object event = jQuery.event.fix( nativeEvent ), handlers = ( dataPriv.get( this, "events" ) || Object.create( null ) )[ event.type ] || [], special = jQuery.event.special[ event.type ] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[ 0 ] = event; for ( i = 1; i < arguments.length; i++ ) { args[ i ] = arguments[ i ]; } event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { return; } // Determine handlers handlerQueue = jQuery.event.handlers.call( this, event, handlers ); // Run delegates first; they may want to stop propagation beneath us i = 0; while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { event.currentTarget = matched.elem; j = 0; while ( ( handleObj = matched.handlers[ j++ ] ) && !event.isImmediatePropagationStopped() ) { // If the event is namespaced, then each handler is only invoked if it is // specially universal or its namespaces are a superset of the event's. if ( !event.rnamespace || handleObj.namespace === false || event.rnamespace.test( handleObj.namespace ) ) { event.handleObj = handleObj; event.data = handleObj.data; ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || handleObj.handler ).apply( matched.elem, args ); if ( ret !== undefined ) { if ( ( event.result = ret ) === false ) { event.preventDefault(); event.stopPropagation(); } } } } } // Call the postDispatch hook for the mapped type if ( special.postDispatch ) { special.postDispatch.call( this, event ); } return event.result; }, handlers: function( event, handlers ) { var i, handleObj, sel, matchedHandlers, matchedSelectors, handlerQueue = [], delegateCount = handlers.delegateCount, cur = event.target; // Find delegate handlers if ( delegateCount && // Support: IE <=9 // Black-hole SVG instance trees (trac-13180) cur.nodeType && // Support: Firefox <=42 // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click // Support: IE 11 only // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) !( event.type === "click" && event.button >= 1 ) ) { for ( ; cur !== this; cur = cur.parentNode || this ) { // Don't check non-elements (#13208) // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { matchedHandlers = []; matchedSelectors = {}; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; // Don't conflict with Object.prototype properties (#13203) sel = handleObj.selector + " "; if ( matchedSelectors[ sel ] === undefined ) { matchedSelectors[ sel ] = handleObj.needsContext ? jQuery( sel, this ).index( cur ) > -1 : jQuery.find( sel, this, null, [ cur ] ).length; } if ( matchedSelectors[ sel ] ) { matchedHandlers.push( handleObj ); } } if ( matchedHandlers.length ) { handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); } } } } // Add the remaining (directly-bound) handlers cur = this; if ( delegateCount < handlers.length ) { handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); } return handlerQueue; }, addProp: function( name, hook ) { Object.defineProperty( jQuery.Event.prototype, name, { enumerable: true, configurable: true, get: isFunction( hook ) ? function() { if ( this.originalEvent ) { return hook( this.originalEvent ); } } : function() { if ( this.originalEvent ) { return this.originalEvent[ name ]; } }, set: function( value ) { Object.defineProperty( this, name, { enumerable: true, configurable: true, writable: true, value: value } ); } } ); }, fix: function( originalEvent ) { return originalEvent[ jQuery.expando ] ? originalEvent : new jQuery.Event( originalEvent ); }, special: { load: { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, click: { // Utilize native event to ensure correct state for checkable inputs setup: function( data ) { // For mutual compressibility with _default, replace `this` access with a local var. // `|| data` is dead code meant only to preserve the variable through minification. var el = this || data; // Claim the first handler if ( rcheckableType.test( el.type ) && el.click && nodeName( el, "input" ) ) { // dataPriv.set( el, "click", ... ) leverageNative( el, "click", returnTrue ); } // Return false to allow normal processing in the caller return false; }, trigger: function( data ) { // For mutual compressibility with _default, replace `this` access with a local var. // `|| data` is dead code meant only to preserve the variable through minification. var el = this || data; // Force setup before triggering a click if ( rcheckableType.test( el.type ) && el.click && nodeName( el, "input" ) ) { leverageNative( el, "click" ); } // Return non-false to allow normal event-path propagation return true; }, // For cross-browser consistency, suppress native .click() on links // Also prevent it if we're currently inside a leveraged native-event stack _default: function( event ) { var target = event.target; return rcheckableType.test( target.type ) && target.click && nodeName( target, "input" ) && dataPriv.get( target, "click" ) || nodeName( target, "a" ); } }, beforeunload: { postDispatch: function( event ) { // Support: Firefox 20+ // Firefox doesn't alert if the returnValue field is not set. if ( event.result !== undefined && event.originalEvent ) { event.originalEvent.returnValue = event.result; } } } } }; // Ensure the presence of an event listener that handles manually-triggered // synthetic events by interrupting progress until reinvoked in response to // *native* events that it fires directly, ensuring that state changes have // already occurred before other listeners are invoked. function leverageNative( el, type, expectSync ) { // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add if ( !expectSync ) { if ( dataPriv.get( el, type ) === undefined ) { jQuery.event.add( el, type, returnTrue ); } return; } // Register the controller as a special universal handler for all event namespaces dataPriv.set( el, type, false ); jQuery.event.add( el, type, { namespace: false, handler: function( event ) { var notAsync, result, saved = dataPriv.get( this, type ); if ( ( event.isTrigger & 1 ) && this[ type ] ) { // Interrupt processing of the outer synthetic .trigger()ed event // Saved data should be false in such cases, but might be a leftover capture object // from an async native handler (gh-4350) if ( !saved.length ) { // Store arguments for use when handling the inner native event // There will always be at least one argument (an event object), so this array // will not be confused with a leftover capture object. saved = slice.call( arguments ); dataPriv.set( this, type, saved ); // Trigger the native event and capture its result // Support: IE <=9 - 11+ // focus() and blur() are asynchronous notAsync = expectSync( this, type ); this[ type ](); result = dataPriv.get( this, type ); if ( saved !== result || notAsync ) { dataPriv.set( this, type, false ); } else { result = {}; } if ( saved !== result ) { // Cancel the outer synthetic event event.stopImmediatePropagation(); event.preventDefault(); return result.value; } // If this is an inner synthetic event for an event with a bubbling surrogate // (focus or blur), assume that the surrogate already propagated from triggering the // native event and prevent that from happening again here. // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the // bubbling surrogate propagates *after* the non-bubbling base), but that seems // less bad than duplication. } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { event.stopPropagation(); } // If this is a native event triggered above, everything is now in order // Fire an inner synthetic event with the original arguments } else if ( saved.length ) { // ...and capture the result dataPriv.set( this, type, { value: jQuery.event.trigger( // Support: IE <=9 - 11+ // Extend with the prototype to reset the above stopImmediatePropagation() jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), saved.slice( 1 ), this ) } ); // Abort handling of the native event event.stopImmediatePropagation(); } } } ); } jQuery.removeEvent = function( elem, type, handle ) { // This "if" is needed for plain objects if ( elem.removeEventListener ) { elem.removeEventListener( type, handle ); } }; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !( this instanceof jQuery.Event ) ) { return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined && // Support: Android <=2.3 only src.returnValue === false ? returnTrue : returnFalse; // Create target properties // Support: Safari <=6 - 7 only // Target should not be a text node (#504, #13143) this.target = ( src.target && src.target.nodeType === 3 ) ? src.target.parentNode : src.target; this.currentTarget = src.currentTarget; this.relatedTarget = src.relatedTarget; // Event type } else { this.type = src; } // Put explicitly provided properties onto the event object if ( props ) { jQuery.extend( this, props ); } // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || Date.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { constructor: jQuery.Event, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse, isSimulated: false, preventDefault: function() { var e = this.originalEvent; this.isDefaultPrevented = returnTrue; if ( e && !this.isSimulated ) { e.preventDefault(); } }, stopPropagation: function() { var e = this.originalEvent; this.isPropagationStopped = returnTrue; if ( e && !this.isSimulated ) { e.stopPropagation(); } }, stopImmediatePropagation: function() { var e = this.originalEvent; this.isImmediatePropagationStopped = returnTrue; if ( e && !this.isSimulated ) { e.stopImmediatePropagation(); } this.stopPropagation(); } }; // Includes all common event props including KeyEvent and MouseEvent specific props jQuery.each( { altKey: true, bubbles: true, cancelable: true, changedTouches: true, ctrlKey: true, detail: true, eventPhase: true, metaKey: true, pageX: true, pageY: true, shiftKey: true, view: true, "char": true, code: true, charCode: true, key: true, keyCode: true, button: true, buttons: true, clientX: true, clientY: true, offsetX: true, offsetY: true, pointerId: true, pointerType: true, screenX: true, screenY: true, targetTouches: true, toElement: true, touches: true, which: function( event ) { var button = event.button; // Add which for key events if ( event.which == null && rkeyEvent.test( event.type ) ) { return event.charCode != null ? event.charCode : event.keyCode; } // Add which for click: 1 === left; 2 === middle; 3 === right if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { if ( button & 1 ) { return 1; } if ( button & 2 ) { return 3; } if ( button & 4 ) { return 2; } return 0; } return event.which; } }, jQuery.event.addProp ); jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { jQuery.event.special[ type ] = { // Utilize native event if possible so blur/focus sequence is correct setup: function() { // Claim the first handler // dataPriv.set( this, "focus", ... ) // dataPriv.set( this, "blur", ... ) leverageNative( this, type, expectSync ); // Return false to allow normal processing in the caller return false; }, trigger: function() { // Force setup before trigger leverageNative( this, type ); // Return non-false to allow normal event-path propagation return true; }, delegateType: delegateType }; } ); // Create mouseenter/leave events using mouseover/out and event-time checks // so that event delegation works in jQuery. // Do the same for pointerenter/pointerleave and pointerover/pointerout // // Support: Safari 7 only // Safari sends mouseenter too often; see: // https://bugs.chromium.org/p/chromium/issues/detail?id=470258 // for the description of the bug (it existed in older Chrome versions as well). jQuery.each( { mouseenter: "mouseover", mouseleave: "mouseout", pointerenter: "pointerover", pointerleave: "pointerout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj; // For mouseenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; } ); jQuery.fn.extend( { on: function( types, selector, data, fn ) { return on( this, types, selector, data, fn ); }, one: function( types, selector, data, fn ) { return on( this, types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { var handleObj, type; if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event handleObj = types.handleObj; jQuery( types.delegateTarget ).off( handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { // ( types-object [, selector] ) for ( type in types ) { this.off( type, selector, types[ type ] ); } return this; } if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } if ( fn === false ) { fn = returnFalse; } return this.each( function() { jQuery.event.remove( this, types, fn, selector ); } ); } } ); var // Support: IE <=10 - 11, Edge 12 - 13 only // In IE/Edge using regex groups here causes severe slowdowns. // See https://connect.microsoft.com/IE/feedback/details/1736512/ rnoInnerhtml = /\s*$/g; // Prefer a tbody over its parent table for containing new rows function manipulationTarget( elem, content ) { if ( nodeName( elem, "table" ) && nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { return jQuery( elem ).children( "tbody" )[ 0 ] || elem; } return elem; } // Replace/restore the type attribute of script elements for safe DOM manipulation function disableScript( elem ) { elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; return elem; } function restoreScript( elem ) { if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { elem.type = elem.type.slice( 5 ); } else { elem.removeAttribute( "type" ); } return elem; } function cloneCopyEvent( src, dest ) { var i, l, type, pdataOld, udataOld, udataCur, events; if ( dest.nodeType !== 1 ) { return; } // 1. Copy private data: events, handlers, etc. if ( dataPriv.hasData( src ) ) { pdataOld = dataPriv.get( src ); events = pdataOld.events; if ( events ) { dataPriv.remove( dest, "handle events" ); for ( type in events ) { for ( i = 0, l = events[ type ].length; i < l; i++ ) { jQuery.event.add( dest, type, events[ type ][ i ] ); } } } } // 2. Copy user data if ( dataUser.hasData( src ) ) { udataOld = dataUser.access( src ); udataCur = jQuery.extend( {}, udataOld ); dataUser.set( dest, udataCur ); } } // Fix IE bugs, see support tests function fixInput( src, dest ) { var nodeName = dest.nodeName.toLowerCase(); // Fails to persist the checked state of a cloned checkbox or radio button. if ( nodeName === "input" && rcheckableType.test( src.type ) ) { dest.checked = src.checked; // Fails to return the selected option to the default selected state when cloning options } else if ( nodeName === "input" || nodeName === "textarea" ) { dest.defaultValue = src.defaultValue; } } function domManip( collection, args, callback, ignored ) { // Flatten any nested arrays args = flat( args ); var fragment, first, scripts, hasScripts, node, doc, i = 0, l = collection.length, iNoClone = l - 1, value = args[ 0 ], valueIsFunction = isFunction( value ); // We can't cloneNode fragments that contain checked, in WebKit if ( valueIsFunction || ( l > 1 && typeof value === "string" && !support.checkClone && rchecked.test( value ) ) ) { return collection.each( function( index ) { var self = collection.eq( index ); if ( valueIsFunction ) { args[ 0 ] = value.call( this, index, self.html() ); } domManip( self, args, callback, ignored ); } ); } if ( l ) { fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); first = fragment.firstChild; if ( fragment.childNodes.length === 1 ) { fragment = first; } // Require either new content or an interest in ignored elements to invoke the callback if ( first || ignored ) { scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); hasScripts = scripts.length; // Use the original fragment for the last item // instead of the first because it can end up // being emptied incorrectly in certain situations (#8070). for ( ; i < l; i++ ) { node = fragment; if ( i !== iNoClone ) { node = jQuery.clone( node, true, true ); // Keep references to cloned scripts for later restoration if ( hasScripts ) { // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( scripts, getAll( node, "script" ) ); } } callback.call( collection[ i ], node, i ); } if ( hasScripts ) { doc = scripts[ scripts.length - 1 ].ownerDocument; // Reenable scripts jQuery.map( scripts, restoreScript ); // Evaluate executable scripts on first document insertion for ( i = 0; i < hasScripts; i++ ) { node = scripts[ i ]; if ( rscriptType.test( node.type || "" ) && !dataPriv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { // Optional AJAX dependency, but won't run scripts if not present if ( jQuery._evalUrl && !node.noModule ) { jQuery._evalUrl( node.src, { nonce: node.nonce || node.getAttribute( "nonce" ) }, doc ); } } else { DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); } } } } } } return collection; } function remove( elem, selector, keepData ) { var node, nodes = selector ? jQuery.filter( selector, elem ) : elem, i = 0; for ( ; ( node = nodes[ i ] ) != null; i++ ) { if ( !keepData && node.nodeType === 1 ) { jQuery.cleanData( getAll( node ) ); } if ( node.parentNode ) { if ( keepData && isAttached( node ) ) { setGlobalEval( getAll( node, "script" ) ); } node.parentNode.removeChild( node ); } } return elem; } jQuery.extend( { htmlPrefilter: function( html ) { return html; }, clone: function( elem, dataAndEvents, deepDataAndEvents ) { var i, l, srcElements, destElements, clone = elem.cloneNode( true ), inPage = isAttached( elem ); // Fix IE cloning issues if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 destElements = getAll( clone ); srcElements = getAll( elem ); for ( i = 0, l = srcElements.length; i < l; i++ ) { fixInput( srcElements[ i ], destElements[ i ] ); } } // Copy the events from the original to the clone if ( dataAndEvents ) { if ( deepDataAndEvents ) { srcElements = srcElements || getAll( elem ); destElements = destElements || getAll( clone ); for ( i = 0, l = srcElements.length; i < l; i++ ) { cloneCopyEvent( srcElements[ i ], destElements[ i ] ); } } else { cloneCopyEvent( elem, clone ); } } // Preserve script evaluation history destElements = getAll( clone, "script" ); if ( destElements.length > 0 ) { setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); } // Return the cloned set return clone; }, cleanData: function( elems ) { var data, elem, type, special = jQuery.event.special, i = 0; for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { if ( acceptData( elem ) ) { if ( ( data = elem[ dataPriv.expando ] ) ) { if ( data.events ) { for ( type in data.events ) { if ( special[ type ] ) { jQuery.event.remove( elem, type ); // This is a shortcut to avoid jQuery.event.remove's overhead } else { jQuery.removeEvent( elem, type, data.handle ); } } } // Support: Chrome <=35 - 45+ // Assign undefined instead of using delete, see Data#remove elem[ dataPriv.expando ] = undefined; } if ( elem[ dataUser.expando ] ) { // Support: Chrome <=35 - 45+ // Assign undefined instead of using delete, see Data#remove elem[ dataUser.expando ] = undefined; } } } } } ); jQuery.fn.extend( { detach: function( selector ) { return remove( this, selector, true ); }, remove: function( selector ) { return remove( this, selector ); }, text: function( value ) { return access( this, function( value ) { return value === undefined ? jQuery.text( this ) : this.empty().each( function() { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { this.textContent = value; } } ); }, null, value, arguments.length ); }, append: function() { return domManip( this, arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.appendChild( elem ); } } ); }, prepend: function() { return domManip( this, arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.insertBefore( elem, target.firstChild ); } } ); }, before: function() { return domManip( this, arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this ); } } ); }, after: function() { return domManip( this, arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this.nextSibling ); } } ); }, empty: function() { var elem, i = 0; for ( ; ( elem = this[ i ] ) != null; i++ ) { if ( elem.nodeType === 1 ) { // Prevent memory leaks jQuery.cleanData( getAll( elem, false ) ); // Remove any remaining nodes elem.textContent = ""; } } return this; }, clone: function( dataAndEvents, deepDataAndEvents ) { dataAndEvents = dataAndEvents == null ? false : dataAndEvents; deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; return this.map( function() { return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); } ); }, html: function( value ) { return access( this, function( value ) { var elem = this[ 0 ] || {}, i = 0, l = this.length; if ( value === undefined && elem.nodeType === 1 ) { return elem.innerHTML; } // See if we can take a shortcut and just use innerHTML if ( typeof value === "string" && !rnoInnerhtml.test( value ) && !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { value = jQuery.htmlPrefilter( value ); try { for ( ; i < l; i++ ) { elem = this[ i ] || {}; // Remove element nodes and prevent memory leaks if ( elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem, false ) ); elem.innerHTML = value; } } elem = 0; // If using innerHTML throws an exception, use the fallback method } catch ( e ) {} } if ( elem ) { this.empty().append( value ); } }, null, value, arguments.length ); }, replaceWith: function() { var ignored = []; // Make the changes, replacing each non-ignored context element with the new content return domManip( this, arguments, function( elem ) { var parent = this.parentNode; if ( jQuery.inArray( this, ignored ) < 0 ) { jQuery.cleanData( getAll( this ) ); if ( parent ) { parent.replaceChild( elem, this ); } } // Force callback invocation }, ignored ); } } ); jQuery.each( { appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function( name, original ) { jQuery.fn[ name ] = function( selector ) { var elems, ret = [], insert = jQuery( selector ), last = insert.length - 1, i = 0; for ( ; i <= last; i++ ) { elems = i === last ? this : this.clone( true ); jQuery( insert[ i ] )[ original ]( elems ); // Support: Android <=4.0 only, PhantomJS 1 only // .get() because push.apply(_, arraylike) throws on ancient WebKit push.apply( ret, elems.get() ); } return this.pushStack( ret ); }; } ); var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); var getStyles = function( elem ) { // Support: IE <=11 only, Firefox <=30 (#15098, #14150) // IE throws on elements created in popups // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" var view = elem.ownerDocument.defaultView; if ( !view || !view.opener ) { view = window; } return view.getComputedStyle( elem ); }; var swap = function( elem, options, callback ) { var ret, name, old = {}; // Remember the old values, and insert the new ones for ( name in options ) { old[ name ] = elem.style[ name ]; elem.style[ name ] = options[ name ]; } ret = callback.call( elem ); // Revert the old values for ( name in options ) { elem.style[ name ] = old[ name ]; } return ret; }; var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); ( function() { // Executing both pixelPosition & boxSizingReliable tests require only one layout // so they're executed at the same time to save the second computation. function computeStyleTests() { // This is a singleton, we need to execute it only once if ( !div ) { return; } container.style.cssText = "position:absolute;left:-11111px;width:60px;" + "margin-top:1px;padding:0;border:0"; div.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + "margin:auto;border:1px;padding:1px;" + "width:60%;top:1%"; documentElement.appendChild( container ).appendChild( div ); var divStyle = window.getComputedStyle( div ); pixelPositionVal = divStyle.top !== "1%"; // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 // Some styles come back with percentage values, even though they shouldn't div.style.right = "60%"; pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; // Support: IE 9 - 11 only // Detect misreporting of content dimensions for box-sizing:border-box elements boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; // Support: IE 9 only // Detect overflow:scroll screwiness (gh-3699) // Support: Chrome <=64 // Don't get tricked when zoom affects offsetWidth (gh-4029) div.style.position = "absolute"; scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; documentElement.removeChild( container ); // Nullify the div so it wouldn't be stored in the memory and // it will also be a sign that checks already performed div = null; } function roundPixelMeasures( measure ) { return Math.round( parseFloat( measure ) ); } var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, reliableTrDimensionsVal, reliableMarginLeftVal, container = document.createElement( "div" ), div = document.createElement( "div" ); // Finish early in limited (non-browser) environments if ( !div.style ) { return; } // Support: IE <=9 - 11 only // Style of cloned element affects source element cloned (#8908) div.style.backgroundClip = "content-box"; div.cloneNode( true ).style.backgroundClip = ""; support.clearCloneStyle = div.style.backgroundClip === "content-box"; jQuery.extend( support, { boxSizingReliable: function() { computeStyleTests(); return boxSizingReliableVal; }, pixelBoxStyles: function() { computeStyleTests(); return pixelBoxStylesVal; }, pixelPosition: function() { computeStyleTests(); return pixelPositionVal; }, reliableMarginLeft: function() { computeStyleTests(); return reliableMarginLeftVal; }, scrollboxSize: function() { computeStyleTests(); return scrollboxSizeVal; }, // Support: IE 9 - 11+, Edge 15 - 18+ // IE/Edge misreport `getComputedStyle` of table rows with width/height // set in CSS while `offset*` properties report correct values. // Behavior in IE 9 is more subtle than in newer versions & it passes // some versions of this test; make sure not to make it pass there! reliableTrDimensions: function() { var table, tr, trChild, trStyle; if ( reliableTrDimensionsVal == null ) { table = document.createElement( "table" ); tr = document.createElement( "tr" ); trChild = document.createElement( "div" ); table.style.cssText = "position:absolute;left:-11111px"; tr.style.height = "1px"; trChild.style.height = "9px"; documentElement .appendChild( table ) .appendChild( tr ) .appendChild( trChild ); trStyle = window.getComputedStyle( tr ); reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; documentElement.removeChild( table ); } return reliableTrDimensionsVal; } } ); } )(); function curCSS( elem, name, computed ) { var width, minWidth, maxWidth, ret, // Support: Firefox 51+ // Retrieving style before computed somehow // fixes an issue with getting wrong values // on detached elements style = elem.style; computed = computed || getStyles( elem ); // getPropertyValue is needed for: // .css('filter') (IE 9 only, #12537) // .css('--customProperty) (#3144) if ( computed ) { ret = computed.getPropertyValue( name ) || computed[ name ]; if ( ret === "" && !isAttached( elem ) ) { ret = jQuery.style( elem, name ); } // A tribute to the "awesome hack by Dean Edwards" // Android Browser returns percentage for some values, // but width seems to be reliably pixels. // This is against the CSSOM draft spec: // https://drafts.csswg.org/cssom/#resolved-values if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { // Remember the original values width = style.width; minWidth = style.minWidth; maxWidth = style.maxWidth; // Put in the new values to get a computed value out style.minWidth = style.maxWidth = style.width = ret; ret = computed.width; // Revert the changed values style.width = width; style.minWidth = minWidth; style.maxWidth = maxWidth; } } return ret !== undefined ? // Support: IE <=9 - 11 only // IE returns zIndex value as an integer. ret + "" : ret; } function addGetHookIf( conditionFn, hookFn ) { // Define the hook, we'll check on the first run if it's really needed. return { get: function() { if ( conditionFn() ) { // Hook not needed (or it's not possible to use it due // to missing dependency), remove it. delete this.get; return; } // Hook needed; redefine it so that the support test is not executed again. return ( this.get = hookFn ).apply( this, arguments ); } }; } var cssPrefixes = [ "Webkit", "Moz", "ms" ], emptyStyle = document.createElement( "div" ).style, vendorProps = {}; // Return a vendor-prefixed property or undefined function vendorPropName( name ) { // Check for vendor prefixed names var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), i = cssPrefixes.length; while ( i-- ) { name = cssPrefixes[ i ] + capName; if ( name in emptyStyle ) { return name; } } } // Return a potentially-mapped jQuery.cssProps or vendor prefixed property function finalPropName( name ) { var final = jQuery.cssProps[ name ] || vendorProps[ name ]; if ( final ) { return final; } if ( name in emptyStyle ) { return name; } return vendorProps[ name ] = vendorPropName( name ) || name; } var // Swappable if display is none or starts with table // except "table", "table-cell", or "table-caption" // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display rdisplayswap = /^(none|table(?!-c[ea]).+)/, rcustomProp = /^--/, cssShow = { position: "absolute", visibility: "hidden", display: "block" }, cssNormalTransform = { letterSpacing: "0", fontWeight: "400" }; function setPositiveNumber( _elem, value, subtract ) { // Any relative (+/-) values have already been // normalized at this point var matches = rcssNum.exec( value ); return matches ? // Guard against undefined "subtract", e.g., when used as in cssHooks Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : value; } function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { var i = dimension === "width" ? 1 : 0, extra = 0, delta = 0; // Adjustment may not be necessary if ( box === ( isBorderBox ? "border" : "content" ) ) { return 0; } for ( ; i < 4; i += 2 ) { // Both box models exclude margin if ( box === "margin" ) { delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); } // If we get here with a content-box, we're seeking "padding" or "border" or "margin" if ( !isBorderBox ) { // Add padding delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); // For "border" or "margin", add border if ( box !== "padding" ) { delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); // But still keep track of it otherwise } else { extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); } // If we get here with a border-box (content + padding + border), we're seeking "content" or // "padding" or "margin" } else { // For "content", subtract padding if ( box === "content" ) { delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); } // For "content" or "padding", subtract border if ( box !== "margin" ) { delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); } } } // Account for positive content-box scroll gutter when requested by providing computedVal if ( !isBorderBox && computedVal >= 0 ) { // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border // Assuming integer scroll gutter, subtract the rest and round down delta += Math.max( 0, Math.ceil( elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - computedVal - delta - extra - 0.5 // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter // Use an explicit zero to avoid NaN (gh-3964) ) ) || 0; } return delta; } function getWidthOrHeight( elem, dimension, extra ) { // Start with computed style var styles = getStyles( elem ), // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). // Fake content-box until we know it's needed to know the true value. boxSizingNeeded = !support.boxSizingReliable() || extra, isBorderBox = boxSizingNeeded && jQuery.css( elem, "boxSizing", false, styles ) === "border-box", valueIsBorderBox = isBorderBox, val = curCSS( elem, dimension, styles ), offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); // Support: Firefox <=54 // Return a confounding non-pixel value or feign ignorance, as appropriate. if ( rnumnonpx.test( val ) ) { if ( !extra ) { return val; } val = "auto"; } // Support: IE 9 - 11 only // Use offsetWidth/offsetHeight for when box sizing is unreliable. // In those cases, the computed value can be trusted to be border-box. if ( ( !support.boxSizingReliable() && isBorderBox || // Support: IE 10 - 11+, Edge 15 - 18+ // IE/Edge misreport `getComputedStyle` of table rows with width/height // set in CSS while `offset*` properties report correct values. // Interestingly, in some cases IE 9 doesn't suffer from this issue. !support.reliableTrDimensions() && nodeName( elem, "tr" ) || // Fall back to offsetWidth/offsetHeight when value is "auto" // This happens for inline elements with no explicit setting (gh-3571) val === "auto" || // Support: Android <=4.1 - 4.3 only // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && // Make sure the element is visible & connected elem.getClientRects().length ) { isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; // Where available, offsetWidth/offsetHeight approximate border box dimensions. // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the // retrieved value as a content box dimension. valueIsBorderBox = offsetProp in elem; if ( valueIsBorderBox ) { val = elem[ offsetProp ]; } } // Normalize "" and auto val = parseFloat( val ) || 0; // Adjust for the element's box model return ( val + boxModelAdjustment( elem, dimension, extra || ( isBorderBox ? "border" : "content" ), valueIsBorderBox, styles, // Provide the current computed size to request scroll gutter calculation (gh-3589) val ) ) + "px"; } jQuery.extend( { // Add in style property hooks for overriding the default // behavior of getting and setting a style property cssHooks: { opacity: { get: function( elem, computed ) { if ( computed ) { // We should always get a number back from opacity var ret = curCSS( elem, "opacity" ); return ret === "" ? "1" : ret; } } } }, // Don't automatically add "px" to these possibly-unitless properties cssNumber: { "animationIterationCount": true, "columnCount": true, "fillOpacity": true, "flexGrow": true, "flexShrink": true, "fontWeight": true, "gridArea": true, "gridColumn": true, "gridColumnEnd": true, "gridColumnStart": true, "gridRow": true, "gridRowEnd": true, "gridRowStart": true, "lineHeight": true, "opacity": true, "order": true, "orphans": true, "widows": true, "zIndex": true, "zoom": true }, // Add in properties whose names you wish to fix before // setting or getting the value cssProps: {}, // Get and set the style property on a DOM Node style: function( elem, name, value, extra ) { // Don't set styles on text and comment nodes if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { return; } // Make sure that we're working with the right name var ret, type, hooks, origName = camelCase( name ), isCustomProp = rcustomProp.test( name ), style = elem.style; // Make sure that we're working with the right name. We don't // want to query the value if it is a CSS custom property // since they are user-defined. if ( !isCustomProp ) { name = finalPropName( origName ); } // Gets hook for the prefixed version, then unprefixed version hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; // Check if we're setting a value if ( value !== undefined ) { type = typeof value; // Convert "+=" or "-=" to relative numbers (#7345) if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { value = adjustCSS( elem, name, ret ); // Fixes bug #9237 type = "number"; } // Make sure that null and NaN values aren't set (#7116) if ( value == null || value !== value ) { return; } // If a number was passed in, add the unit (except for certain CSS properties) // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append // "px" to a few hardcoded values. if ( type === "number" && !isCustomProp ) { value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); } // background-* props affect original clone's values if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { style[ name ] = "inherit"; } // If a hook was provided, use that value, otherwise just set the specified value if ( !hooks || !( "set" in hooks ) || ( value = hooks.set( elem, value, extra ) ) !== undefined ) { if ( isCustomProp ) { style.setProperty( name, value ); } else { style[ name ] = value; } } } else { // If a hook was provided get the non-computed value from there if ( hooks && "get" in hooks && ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { return ret; } // Otherwise just get the value from the style object return style[ name ]; } }, css: function( elem, name, extra, styles ) { var val, num, hooks, origName = camelCase( name ), isCustomProp = rcustomProp.test( name ); // Make sure that we're working with the right name. We don't // want to modify the value if it is a CSS custom property // since they are user-defined. if ( !isCustomProp ) { name = finalPropName( origName ); } // Try prefixed name followed by the unprefixed name hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; // If a hook was provided get the computed value from there if ( hooks && "get" in hooks ) { val = hooks.get( elem, true, extra ); } // Otherwise, if a way to get the computed value exists, use that if ( val === undefined ) { val = curCSS( elem, name, styles ); } // Convert "normal" to computed value if ( val === "normal" && name in cssNormalTransform ) { val = cssNormalTransform[ name ]; } // Make numeric if forced or a qualifier was provided and val looks numeric if ( extra === "" || extra ) { num = parseFloat( val ); return extra === true || isFinite( num ) ? num || 0 : val; } return val; } } ); jQuery.each( [ "height", "width" ], function( _i, dimension ) { jQuery.cssHooks[ dimension ] = { get: function( elem, computed, extra ) { if ( computed ) { // Certain elements can have dimension info if we invisibly show them // but it must have a current display style that would benefit return rdisplayswap.test( jQuery.css( elem, "display" ) ) && // Support: Safari 8+ // Table columns in Safari have non-zero offsetWidth & zero // getBoundingClientRect().width unless display is changed. // Support: IE <=11 only // Running getBoundingClientRect on a disconnected node // in IE throws an error. ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? swap( elem, cssShow, function() { return getWidthOrHeight( elem, dimension, extra ); } ) : getWidthOrHeight( elem, dimension, extra ); } }, set: function( elem, value, extra ) { var matches, styles = getStyles( elem ), // Only read styles.position if the test has a chance to fail // to avoid forcing a reflow. scrollboxSizeBuggy = !support.scrollboxSize() && styles.position === "absolute", // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) boxSizingNeeded = scrollboxSizeBuggy || extra, isBorderBox = boxSizingNeeded && jQuery.css( elem, "boxSizing", false, styles ) === "border-box", subtract = extra ? boxModelAdjustment( elem, dimension, extra, isBorderBox, styles ) : 0; // Account for unreliable border-box dimensions by comparing offset* to computed and // faking a content-box to get border and padding (gh-3699) if ( isBorderBox && scrollboxSizeBuggy ) { subtract -= Math.ceil( elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - parseFloat( styles[ dimension ] ) - boxModelAdjustment( elem, dimension, "border", false, styles ) - 0.5 ); } // Convert to pixels if value adjustment is needed if ( subtract && ( matches = rcssNum.exec( value ) ) && ( matches[ 3 ] || "px" ) !== "px" ) { elem.style[ dimension ] = value; value = jQuery.css( elem, dimension ); } return setPositiveNumber( elem, value, subtract ); } }; } ); jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, function( elem, computed ) { if ( computed ) { return ( parseFloat( curCSS( elem, "marginLeft" ) ) || elem.getBoundingClientRect().left - swap( elem, { marginLeft: 0 }, function() { return elem.getBoundingClientRect().left; } ) ) + "px"; } } ); // These hooks are used by animate to expand properties jQuery.each( { margin: "", padding: "", border: "Width" }, function( prefix, suffix ) { jQuery.cssHooks[ prefix + suffix ] = { expand: function( value ) { var i = 0, expanded = {}, // Assumes a single number if not a string parts = typeof value === "string" ? value.split( " " ) : [ value ]; for ( ; i < 4; i++ ) { expanded[ prefix + cssExpand[ i ] + suffix ] = parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; } return expanded; } }; if ( prefix !== "margin" ) { jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; } } ); jQuery.fn.extend( { css: function( name, value ) { return access( this, function( elem, name, value ) { var styles, len, map = {}, i = 0; if ( Array.isArray( name ) ) { styles = getStyles( elem ); len = name.length; for ( ; i < len; i++ ) { map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); } return map; } return value !== undefined ? jQuery.style( elem, name, value ) : jQuery.css( elem, name ); }, name, value, arguments.length > 1 ); } } ); function Tween( elem, options, prop, end, easing ) { return new Tween.prototype.init( elem, options, prop, end, easing ); } jQuery.Tween = Tween; Tween.prototype = { constructor: Tween, init: function( elem, options, prop, end, easing, unit ) { this.elem = elem; this.prop = prop; this.easing = easing || jQuery.easing._default; this.options = options; this.start = this.now = this.cur(); this.end = end; this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); }, cur: function() { var hooks = Tween.propHooks[ this.prop ]; return hooks && hooks.get ? hooks.get( this ) : Tween.propHooks._default.get( this ); }, run: function( percent ) { var eased, hooks = Tween.propHooks[ this.prop ]; if ( this.options.duration ) { this.pos = eased = jQuery.easing[ this.easing ]( percent, this.options.duration * percent, 0, 1, this.options.duration ); } else { this.pos = eased = percent; } this.now = ( this.end - this.start ) * eased + this.start; if ( this.options.step ) { this.options.step.call( this.elem, this.now, this ); } if ( hooks && hooks.set ) { hooks.set( this ); } else { Tween.propHooks._default.set( this ); } return this; } }; Tween.prototype.init.prototype = Tween.prototype; Tween.propHooks = { _default: { get: function( tween ) { var result; // Use a property on the element directly when it is not a DOM element, // or when there is no matching style property that exists. if ( tween.elem.nodeType !== 1 || tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { return tween.elem[ tween.prop ]; } // Passing an empty string as a 3rd parameter to .css will automatically // attempt a parseFloat and fallback to a string if the parse fails. // Simple values such as "10px" are parsed to Float; // complex values such as "rotate(1rad)" are returned as-is. result = jQuery.css( tween.elem, tween.prop, "" ); // Empty strings, null, undefined and "auto" are converted to 0. return !result || result === "auto" ? 0 : result; }, set: function( tween ) { // Use step hook for back compat. // Use cssHook if its there. // Use .style if available and use plain properties where available. if ( jQuery.fx.step[ tween.prop ] ) { jQuery.fx.step[ tween.prop ]( tween ); } else if ( tween.elem.nodeType === 1 && ( jQuery.cssHooks[ tween.prop ] || tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); } else { tween.elem[ tween.prop ] = tween.now; } } } }; // Support: IE <=9 only // Panic based approach to setting things on disconnected nodes Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { set: function( tween ) { if ( tween.elem.nodeType && tween.elem.parentNode ) { tween.elem[ tween.prop ] = tween.now; } } }; jQuery.easing = { linear: function( p ) { return p; }, swing: function( p ) { return 0.5 - Math.cos( p * Math.PI ) / 2; }, _default: "swing" }; jQuery.fx = Tween.prototype.init; // Back compat <1.8 extension point jQuery.fx.step = {}; var fxNow, inProgress, rfxtypes = /^(?:toggle|show|hide)$/, rrun = /queueHooks$/; function schedule() { if ( inProgress ) { if ( document.hidden === false && window.requestAnimationFrame ) { window.requestAnimationFrame( schedule ); } else { window.setTimeout( schedule, jQuery.fx.interval ); } jQuery.fx.tick(); } } // Animations created synchronously will run synchronously function createFxNow() { window.setTimeout( function() { fxNow = undefined; } ); return ( fxNow = Date.now() ); } // Generate parameters to create a standard animation function genFx( type, includeWidth ) { var which, i = 0, attrs = { height: type }; // If we include width, step value is 1 to do all cssExpand values, // otherwise step value is 2 to skip over Left and Right includeWidth = includeWidth ? 1 : 0; for ( ; i < 4; i += 2 - includeWidth ) { which = cssExpand[ i ]; attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; } if ( includeWidth ) { attrs.opacity = attrs.width = type; } return attrs; } function createTween( value, prop, animation ) { var tween, collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), index = 0, length = collection.length; for ( ; index < length; index++ ) { if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { // We're done with this property return tween; } } } function defaultPrefilter( elem, props, opts ) { var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, isBox = "width" in props || "height" in props, anim = this, orig = {}, style = elem.style, hidden = elem.nodeType && isHiddenWithinTree( elem ), dataShow = dataPriv.get( elem, "fxshow" ); // Queue-skipping animations hijack the fx hooks if ( !opts.queue ) { hooks = jQuery._queueHooks( elem, "fx" ); if ( hooks.unqueued == null ) { hooks.unqueued = 0; oldfire = hooks.empty.fire; hooks.empty.fire = function() { if ( !hooks.unqueued ) { oldfire(); } }; } hooks.unqueued++; anim.always( function() { // Ensure the complete handler is called before this completes anim.always( function() { hooks.unqueued--; if ( !jQuery.queue( elem, "fx" ).length ) { hooks.empty.fire(); } } ); } ); } // Detect show/hide animations for ( prop in props ) { value = props[ prop ]; if ( rfxtypes.test( value ) ) { delete props[ prop ]; toggle = toggle || value === "toggle"; if ( value === ( hidden ? "hide" : "show" ) ) { // Pretend to be hidden if this is a "show" and // there is still data from a stopped show/hide if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { hidden = true; // Ignore all other no-op show/hide data } else { continue; } } orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); } } // Bail out if this is a no-op like .hide().hide() propTween = !jQuery.isEmptyObject( props ); if ( !propTween && jQuery.isEmptyObject( orig ) ) { return; } // Restrict "overflow" and "display" styles during box animations if ( isBox && elem.nodeType === 1 ) { // Support: IE <=9 - 11, Edge 12 - 15 // Record all 3 overflow attributes because IE does not infer the shorthand // from identically-valued overflowX and overflowY and Edge just mirrors // the overflowX value there. opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; // Identify a display type, preferring old show/hide data over the CSS cascade restoreDisplay = dataShow && dataShow.display; if ( restoreDisplay == null ) { restoreDisplay = dataPriv.get( elem, "display" ); } display = jQuery.css( elem, "display" ); if ( display === "none" ) { if ( restoreDisplay ) { display = restoreDisplay; } else { // Get nonempty value(s) by temporarily forcing visibility showHide( [ elem ], true ); restoreDisplay = elem.style.display || restoreDisplay; display = jQuery.css( elem, "display" ); showHide( [ elem ] ); } } // Animate inline elements as inline-block if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { if ( jQuery.css( elem, "float" ) === "none" ) { // Restore the original display value at the end of pure show/hide animations if ( !propTween ) { anim.done( function() { style.display = restoreDisplay; } ); if ( restoreDisplay == null ) { display = style.display; restoreDisplay = display === "none" ? "" : display; } } style.display = "inline-block"; } } } if ( opts.overflow ) { style.overflow = "hidden"; anim.always( function() { style.overflow = opts.overflow[ 0 ]; style.overflowX = opts.overflow[ 1 ]; style.overflowY = opts.overflow[ 2 ]; } ); } // Implement show/hide animations propTween = false; for ( prop in orig ) { // General show/hide setup for this element animation if ( !propTween ) { if ( dataShow ) { if ( "hidden" in dataShow ) { hidden = dataShow.hidden; } } else { dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); } // Store hidden/visible for toggle so `.stop().toggle()` "reverses" if ( toggle ) { dataShow.hidden = !hidden; } // Show elements before animating them if ( hidden ) { showHide( [ elem ], true ); } /* eslint-disable no-loop-func */ anim.done( function() { /* eslint-enable no-loop-func */ // The final step of a "hide" animation is actually hiding the element if ( !hidden ) { showHide( [ elem ] ); } dataPriv.remove( elem, "fxshow" ); for ( prop in orig ) { jQuery.style( elem, prop, orig[ prop ] ); } } ); } // Per-property setup propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); if ( !( prop in dataShow ) ) { dataShow[ prop ] = propTween.start; if ( hidden ) { propTween.end = propTween.start; propTween.start = 0; } } } } function propFilter( props, specialEasing ) { var index, name, easing, value, hooks; // camelCase, specialEasing and expand cssHook pass for ( index in props ) { name = camelCase( index ); easing = specialEasing[ name ]; value = props[ index ]; if ( Array.isArray( value ) ) { easing = value[ 1 ]; value = props[ index ] = value[ 0 ]; } if ( index !== name ) { props[ name ] = value; delete props[ index ]; } hooks = jQuery.cssHooks[ name ]; if ( hooks && "expand" in hooks ) { value = hooks.expand( value ); delete props[ name ]; // Not quite $.extend, this won't overwrite existing keys. // Reusing 'index' because we have the correct "name" for ( index in value ) { if ( !( index in props ) ) { props[ index ] = value[ index ]; specialEasing[ index ] = easing; } } } else { specialEasing[ name ] = easing; } } } function Animation( elem, properties, options ) { var result, stopped, index = 0, length = Animation.prefilters.length, deferred = jQuery.Deferred().always( function() { // Don't match elem in the :animated selector delete tick.elem; } ), tick = function() { if ( stopped ) { return false; } var currentTime = fxNow || createFxNow(), remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), // Support: Android 2.3 only // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) temp = remaining / animation.duration || 0, percent = 1 - temp, index = 0, length = animation.tweens.length; for ( ; index < length; index++ ) { animation.tweens[ index ].run( percent ); } deferred.notifyWith( elem, [ animation, percent, remaining ] ); // If there's more to do, yield if ( percent < 1 && length ) { return remaining; } // If this was an empty animation, synthesize a final progress notification if ( !length ) { deferred.notifyWith( elem, [ animation, 1, 0 ] ); } // Resolve the animation and report its conclusion deferred.resolveWith( elem, [ animation ] ); return false; }, animation = deferred.promise( { elem: elem, props: jQuery.extend( {}, properties ), opts: jQuery.extend( true, { specialEasing: {}, easing: jQuery.easing._default }, options ), originalProperties: properties, originalOptions: options, startTime: fxNow || createFxNow(), duration: options.duration, tweens: [], createTween: function( prop, end ) { var tween = jQuery.Tween( elem, animation.opts, prop, end, animation.opts.specialEasing[ prop ] || animation.opts.easing ); animation.tweens.push( tween ); return tween; }, stop: function( gotoEnd ) { var index = 0, // If we are going to the end, we want to run all the tweens // otherwise we skip this part length = gotoEnd ? animation.tweens.length : 0; if ( stopped ) { return this; } stopped = true; for ( ; index < length; index++ ) { animation.tweens[ index ].run( 1 ); } // Resolve when we played the last frame; otherwise, reject if ( gotoEnd ) { deferred.notifyWith( elem, [ animation, 1, 0 ] ); deferred.resolveWith( elem, [ animation, gotoEnd ] ); } else { deferred.rejectWith( elem, [ animation, gotoEnd ] ); } return this; } } ), props = animation.props; propFilter( props, animation.opts.specialEasing ); for ( ; index < length; index++ ) { result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); if ( result ) { if ( isFunction( result.stop ) ) { jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = result.stop.bind( result ); } return result; } } jQuery.map( props, createTween, animation ); if ( isFunction( animation.opts.start ) ) { animation.opts.start.call( elem, animation ); } // Attach callbacks from options animation .progress( animation.opts.progress ) .done( animation.opts.done, animation.opts.complete ) .fail( animation.opts.fail ) .always( animation.opts.always ); jQuery.fx.timer( jQuery.extend( tick, { elem: elem, anim: animation, queue: animation.opts.queue } ) ); return animation; } jQuery.Animation = jQuery.extend( Animation, { tweeners: { "*": [ function( prop, value ) { var tween = this.createTween( prop, value ); adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); return tween; } ] }, tweener: function( props, callback ) { if ( isFunction( props ) ) { callback = props; props = [ "*" ]; } else { props = props.match( rnothtmlwhite ); } var prop, index = 0, length = props.length; for ( ; index < length; index++ ) { prop = props[ index ]; Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; Animation.tweeners[ prop ].unshift( callback ); } }, prefilters: [ defaultPrefilter ], prefilter: function( callback, prepend ) { if ( prepend ) { Animation.prefilters.unshift( callback ); } else { Animation.prefilters.push( callback ); } } } ); jQuery.speed = function( speed, easing, fn ) { var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { complete: fn || !fn && easing || isFunction( speed ) && speed, duration: speed, easing: fn && easing || easing && !isFunction( easing ) && easing }; // Go to the end state if fx are off if ( jQuery.fx.off ) { opt.duration = 0; } else { if ( typeof opt.duration !== "number" ) { if ( opt.duration in jQuery.fx.speeds ) { opt.duration = jQuery.fx.speeds[ opt.duration ]; } else { opt.duration = jQuery.fx.speeds._default; } } } // Normalize opt.queue - true/undefined/null -> "fx" if ( opt.queue == null || opt.queue === true ) { opt.queue = "fx"; } // Queueing opt.old = opt.complete; opt.complete = function() { if ( isFunction( opt.old ) ) { opt.old.call( this ); } if ( opt.queue ) { jQuery.dequeue( this, opt.queue ); } }; return opt; }; jQuery.fn.extend( { fadeTo: function( speed, to, easing, callback ) { // Show any hidden elements after setting opacity to 0 return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() // Animate to the value specified .end().animate( { opacity: to }, speed, easing, callback ); }, animate: function( prop, speed, easing, callback ) { var empty = jQuery.isEmptyObject( prop ), optall = jQuery.speed( speed, easing, callback ), doAnimation = function() { // Operate on a copy of prop so per-property easing won't be lost var anim = Animation( this, jQuery.extend( {}, prop ), optall ); // Empty animations, or finishing resolves immediately if ( empty || dataPriv.get( this, "finish" ) ) { anim.stop( true ); } }; doAnimation.finish = doAnimation; return empty || optall.queue === false ? this.each( doAnimation ) : this.queue( optall.queue, doAnimation ); }, stop: function( type, clearQueue, gotoEnd ) { var stopQueue = function( hooks ) { var stop = hooks.stop; delete hooks.stop; stop( gotoEnd ); }; if ( typeof type !== "string" ) { gotoEnd = clearQueue; clearQueue = type; type = undefined; } if ( clearQueue ) { this.queue( type || "fx", [] ); } return this.each( function() { var dequeue = true, index = type != null && type + "queueHooks", timers = jQuery.timers, data = dataPriv.get( this ); if ( index ) { if ( data[ index ] && data[ index ].stop ) { stopQueue( data[ index ] ); } } else { for ( index in data ) { if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { stopQueue( data[ index ] ); } } } for ( index = timers.length; index--; ) { if ( timers[ index ].elem === this && ( type == null || timers[ index ].queue === type ) ) { timers[ index ].anim.stop( gotoEnd ); dequeue = false; timers.splice( index, 1 ); } } // Start the next in the queue if the last step wasn't forced. // Timers currently will call their complete callbacks, which // will dequeue but only if they were gotoEnd. if ( dequeue || !gotoEnd ) { jQuery.dequeue( this, type ); } } ); }, finish: function( type ) { if ( type !== false ) { type = type || "fx"; } return this.each( function() { var index, data = dataPriv.get( this ), queue = data[ type + "queue" ], hooks = data[ type + "queueHooks" ], timers = jQuery.timers, length = queue ? queue.length : 0; // Enable finishing flag on private data data.finish = true; // Empty the queue first jQuery.queue( this, type, [] ); if ( hooks && hooks.stop ) { hooks.stop.call( this, true ); } // Look for any active animations, and finish them for ( index = timers.length; index--; ) { if ( timers[ index ].elem === this && timers[ index ].queue === type ) { timers[ index ].anim.stop( true ); timers.splice( index, 1 ); } } // Look for any animations in the old queue and finish them for ( index = 0; index < length; index++ ) { if ( queue[ index ] && queue[ index ].finish ) { queue[ index ].finish.call( this ); } } // Turn off finishing flag delete data.finish; } ); } } ); jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { var cssFn = jQuery.fn[ name ]; jQuery.fn[ name ] = function( speed, easing, callback ) { return speed == null || typeof speed === "boolean" ? cssFn.apply( this, arguments ) : this.animate( genFx( name, true ), speed, easing, callback ); }; } ); // Generate shortcuts for custom animations jQuery.each( { slideDown: genFx( "show" ), slideUp: genFx( "hide" ), slideToggle: genFx( "toggle" ), fadeIn: { opacity: "show" }, fadeOut: { opacity: "hide" }, fadeToggle: { opacity: "toggle" } }, function( name, props ) { jQuery.fn[ name ] = function( speed, easing, callback ) { return this.animate( props, speed, easing, callback ); }; } ); jQuery.timers = []; jQuery.fx.tick = function() { var timer, i = 0, timers = jQuery.timers; fxNow = Date.now(); for ( ; i < timers.length; i++ ) { timer = timers[ i ]; // Run the timer and safely remove it when done (allowing for external removal) if ( !timer() && timers[ i ] === timer ) { timers.splice( i--, 1 ); } } if ( !timers.length ) { jQuery.fx.stop(); } fxNow = undefined; }; jQuery.fx.timer = function( timer ) { jQuery.timers.push( timer ); jQuery.fx.start(); }; jQuery.fx.interval = 13; jQuery.fx.start = function() { if ( inProgress ) { return; } inProgress = true; schedule(); }; jQuery.fx.stop = function() { inProgress = null; }; jQuery.fx.speeds = { slow: 600, fast: 200, // Default speed _default: 400 }; // Based off of the plugin by Clint Helfers, with permission. // https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ jQuery.fn.delay = function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; return this.queue( type, function( next, hooks ) { var timeout = window.setTimeout( next, time ); hooks.stop = function() { window.clearTimeout( timeout ); }; } ); }; ( function() { var input = document.createElement( "input" ), select = document.createElement( "select" ), opt = select.appendChild( document.createElement( "option" ) ); input.type = "checkbox"; // Support: Android <=4.3 only // Default value for a checkbox should be "on" support.checkOn = input.value !== ""; // Support: IE <=11 only // Must access selectedIndex to make default options select support.optSelected = opt.selected; // Support: IE <=11 only // An input loses its value after becoming a radio input = document.createElement( "input" ); input.value = "t"; input.type = "radio"; support.radioValue = input.value === "t"; } )(); var boolHook, attrHandle = jQuery.expr.attrHandle; jQuery.fn.extend( { attr: function( name, value ) { return access( this, jQuery.attr, name, value, arguments.length > 1 ); }, removeAttr: function( name ) { return this.each( function() { jQuery.removeAttr( this, name ); } ); } } ); jQuery.extend( { attr: function( elem, name, value ) { var ret, hooks, nType = elem.nodeType; // Don't get/set attributes on text, comment and attribute nodes if ( nType === 3 || nType === 8 || nType === 2 ) { return; } // Fallback to prop when attributes are not supported if ( typeof elem.getAttribute === "undefined" ) { return jQuery.prop( elem, name, value ); } // Attribute hooks are determined by the lowercase version // Grab necessary hook if one is defined if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { hooks = jQuery.attrHooks[ name.toLowerCase() ] || ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); } if ( value !== undefined ) { if ( value === null ) { jQuery.removeAttr( elem, name ); return; } if ( hooks && "set" in hooks && ( ret = hooks.set( elem, value, name ) ) !== undefined ) { return ret; } elem.setAttribute( name, value + "" ); return value; } if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { return ret; } ret = jQuery.find.attr( elem, name ); // Non-existent attributes return null, we normalize to undefined return ret == null ? undefined : ret; }, attrHooks: { type: { set: function( elem, value ) { if ( !support.radioValue && value === "radio" && nodeName( elem, "input" ) ) { var val = elem.value; elem.setAttribute( "type", value ); if ( val ) { elem.value = val; } return value; } } } }, removeAttr: function( elem, value ) { var name, i = 0, // Attribute names can contain non-HTML whitespace characters // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 attrNames = value && value.match( rnothtmlwhite ); if ( attrNames && elem.nodeType === 1 ) { while ( ( name = attrNames[ i++ ] ) ) { elem.removeAttribute( name ); } } } } ); // Hooks for boolean attributes boolHook = { set: function( elem, value, name ) { if ( value === false ) { // Remove boolean attributes when set to false jQuery.removeAttr( elem, name ); } else { elem.setAttribute( name, name ); } return name; } }; jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { var getter = attrHandle[ name ] || jQuery.find.attr; attrHandle[ name ] = function( elem, name, isXML ) { var ret, handle, lowercaseName = name.toLowerCase(); if ( !isXML ) { // Avoid an infinite loop by temporarily removing this function from the getter handle = attrHandle[ lowercaseName ]; attrHandle[ lowercaseName ] = ret; ret = getter( elem, name, isXML ) != null ? lowercaseName : null; attrHandle[ lowercaseName ] = handle; } return ret; }; } ); var rfocusable = /^(?:input|select|textarea|button)$/i, rclickable = /^(?:a|area)$/i; jQuery.fn.extend( { prop: function( name, value ) { return access( this, jQuery.prop, name, value, arguments.length > 1 ); }, removeProp: function( name ) { return this.each( function() { delete this[ jQuery.propFix[ name ] || name ]; } ); } } ); jQuery.extend( { prop: function( elem, name, value ) { var ret, hooks, nType = elem.nodeType; // Don't get/set properties on text, comment and attribute nodes if ( nType === 3 || nType === 8 || nType === 2 ) { return; } if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { // Fix name and attach hooks name = jQuery.propFix[ name ] || name; hooks = jQuery.propHooks[ name ]; } if ( value !== undefined ) { if ( hooks && "set" in hooks && ( ret = hooks.set( elem, value, name ) ) !== undefined ) { return ret; } return ( elem[ name ] = value ); } if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { return ret; } return elem[ name ]; }, propHooks: { tabIndex: { get: function( elem ) { // Support: IE <=9 - 11 only // elem.tabIndex doesn't always return the // correct value when it hasn't been explicitly set // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ // Use proper attribute retrieval(#12072) var tabindex = jQuery.find.attr( elem, "tabindex" ); if ( tabindex ) { return parseInt( tabindex, 10 ); } if ( rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ) { return 0; } return -1; } } }, propFix: { "for": "htmlFor", "class": "className" } } ); // Support: IE <=11 only // Accessing the selectedIndex property // forces the browser to respect setting selected // on the option // The getter ensures a default option is selected // when in an optgroup // eslint rule "no-unused-expressions" is disabled for this code // since it considers such accessions noop if ( !support.optSelected ) { jQuery.propHooks.selected = { get: function( elem ) { /* eslint no-unused-expressions: "off" */ var parent = elem.parentNode; if ( parent && parent.parentNode ) { parent.parentNode.selectedIndex; } return null; }, set: function( elem ) { /* eslint no-unused-expressions: "off" */ var parent = elem.parentNode; if ( parent ) { parent.selectedIndex; if ( parent.parentNode ) { parent.parentNode.selectedIndex; } } } }; } jQuery.each( [ "tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable" ], function() { jQuery.propFix[ this.toLowerCase() ] = this; } ); // Strip and collapse whitespace according to HTML spec // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace function stripAndCollapse( value ) { var tokens = value.match( rnothtmlwhite ) || []; return tokens.join( " " ); } function getClass( elem ) { return elem.getAttribute && elem.getAttribute( "class" ) || ""; } function classesToArray( value ) { if ( Array.isArray( value ) ) { return value; } if ( typeof value === "string" ) { return value.match( rnothtmlwhite ) || []; } return []; } jQuery.fn.extend( { addClass: function( value ) { var classes, elem, cur, curValue, clazz, j, finalValue, i = 0; if ( isFunction( value ) ) { return this.each( function( j ) { jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); } ); } classes = classesToArray( value ); if ( classes.length ) { while ( ( elem = this[ i++ ] ) ) { curValue = getClass( elem ); cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); if ( cur ) { j = 0; while ( ( clazz = classes[ j++ ] ) ) { if ( cur.indexOf( " " + clazz + " " ) < 0 ) { cur += clazz + " "; } } // Only assign if different to avoid unneeded rendering. finalValue = stripAndCollapse( cur ); if ( curValue !== finalValue ) { elem.setAttribute( "class", finalValue ); } } } } return this; }, removeClass: function( value ) { var classes, elem, cur, curValue, clazz, j, finalValue, i = 0; if ( isFunction( value ) ) { return this.each( function( j ) { jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); } ); } if ( !arguments.length ) { return this.attr( "class", "" ); } classes = classesToArray( value ); if ( classes.length ) { while ( ( elem = this[ i++ ] ) ) { curValue = getClass( elem ); // This expression is here for better compressibility (see addClass) cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); if ( cur ) { j = 0; while ( ( clazz = classes[ j++ ] ) ) { // Remove *all* instances while ( cur.indexOf( " " + clazz + " " ) > -1 ) { cur = cur.replace( " " + clazz + " ", " " ); } } // Only assign if different to avoid unneeded rendering. finalValue = stripAndCollapse( cur ); if ( curValue !== finalValue ) { elem.setAttribute( "class", finalValue ); } } } } return this; }, toggleClass: function( value, stateVal ) { var type = typeof value, isValidValue = type === "string" || Array.isArray( value ); if ( typeof stateVal === "boolean" && isValidValue ) { return stateVal ? this.addClass( value ) : this.removeClass( value ); } if ( isFunction( value ) ) { return this.each( function( i ) { jQuery( this ).toggleClass( value.call( this, i, getClass( this ), stateVal ), stateVal ); } ); } return this.each( function() { var className, i, self, classNames; if ( isValidValue ) { // Toggle individual class names i = 0; self = jQuery( this ); classNames = classesToArray( value ); while ( ( className = classNames[ i++ ] ) ) { // Check each className given, space separated list if ( self.hasClass( className ) ) { self.removeClass( className ); } else { self.addClass( className ); } } // Toggle whole class name } else if ( value === undefined || type === "boolean" ) { className = getClass( this ); if ( className ) { // Store className if set dataPriv.set( this, "__className__", className ); } // If the element has a class name or if we're passed `false`, // then remove the whole classname (if there was one, the above saved it). // Otherwise bring back whatever was previously saved (if anything), // falling back to the empty string if nothing was stored. if ( this.setAttribute ) { this.setAttribute( "class", className || value === false ? "" : dataPriv.get( this, "__className__" ) || "" ); } } } ); }, hasClass: function( selector ) { var className, elem, i = 0; className = " " + selector + " "; while ( ( elem = this[ i++ ] ) ) { if ( elem.nodeType === 1 && ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { return true; } } return false; } } ); var rreturn = /\r/g; jQuery.fn.extend( { val: function( value ) { var hooks, ret, valueIsFunction, elem = this[ 0 ]; if ( !arguments.length ) { if ( elem ) { hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; if ( hooks && "get" in hooks && ( ret = hooks.get( elem, "value" ) ) !== undefined ) { return ret; } ret = elem.value; // Handle most common string cases if ( typeof ret === "string" ) { return ret.replace( rreturn, "" ); } // Handle cases where value is null/undef or number return ret == null ? "" : ret; } return; } valueIsFunction = isFunction( value ); return this.each( function( i ) { var val; if ( this.nodeType !== 1 ) { return; } if ( valueIsFunction ) { val = value.call( this, i, jQuery( this ).val() ); } else { val = value; } // Treat null/undefined as ""; convert numbers to string if ( val == null ) { val = ""; } else if ( typeof val === "number" ) { val += ""; } else if ( Array.isArray( val ) ) { val = jQuery.map( val, function( value ) { return value == null ? "" : value + ""; } ); } hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; // If set returns undefined, fall back to normal setting if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { this.value = val; } } ); } } ); jQuery.extend( { valHooks: { option: { get: function( elem ) { var val = jQuery.find.attr( elem, "value" ); return val != null ? val : // Support: IE <=10 - 11 only // option.text throws exceptions (#14686, #14858) // Strip and collapse whitespace // https://html.spec.whatwg.org/#strip-and-collapse-whitespace stripAndCollapse( jQuery.text( elem ) ); } }, select: { get: function( elem ) { var value, option, i, options = elem.options, index = elem.selectedIndex, one = elem.type === "select-one", values = one ? null : [], max = one ? index + 1 : options.length; if ( index < 0 ) { i = max; } else { i = one ? index : 0; } // Loop through all the selected options for ( ; i < max; i++ ) { option = options[ i ]; // Support: IE <=9 only // IE8-9 doesn't update selected after form reset (#2551) if ( ( option.selected || i === index ) && // Don't return options that are disabled or in a disabled optgroup !option.disabled && ( !option.parentNode.disabled || !nodeName( option.parentNode, "optgroup" ) ) ) { // Get the specific value for the option value = jQuery( option ).val(); // We don't need an array for one selects if ( one ) { return value; } // Multi-Selects return an array values.push( value ); } } return values; }, set: function( elem, value ) { var optionSet, option, options = elem.options, values = jQuery.makeArray( value ), i = options.length; while ( i-- ) { option = options[ i ]; /* eslint-disable no-cond-assign */ if ( option.selected = jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 ) { optionSet = true; } /* eslint-enable no-cond-assign */ } // Force browsers to behave consistently when non-matching value is set if ( !optionSet ) { elem.selectedIndex = -1; } return values; } } } } ); // Radios and checkboxes getter/setter jQuery.each( [ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = { set: function( elem, value ) { if ( Array.isArray( value ) ) { return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); } } }; if ( !support.checkOn ) { jQuery.valHooks[ this ].get = function( elem ) { return elem.getAttribute( "value" ) === null ? "on" : elem.value; }; } } ); // Return jQuery for attributes-only inclusion support.focusin = "onfocusin" in window; var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, stopPropagationCallback = function( e ) { e.stopPropagation(); }; jQuery.extend( jQuery.event, { trigger: function( event, data, elem, onlyHandlers ) { var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, eventPath = [ elem || document ], type = hasOwn.call( event, "type" ) ? event.type : event, namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; cur = lastElement = tmp = elem = elem || document; // Don't do events on text and comment nodes if ( elem.nodeType === 3 || elem.nodeType === 8 ) { return; } // focus/blur morphs to focusin/out; ensure we're not firing them right now if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } if ( type.indexOf( "." ) > -1 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split( "." ); type = namespaces.shift(); namespaces.sort(); } ontype = type.indexOf( ":" ) < 0 && "on" + type; // Caller can pass in a jQuery.Event object, Object, or just an event type string event = event[ jQuery.expando ] ? event : new jQuery.Event( type, typeof event === "object" && event ); // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) event.isTrigger = onlyHandlers ? 2 : 3; event.namespace = namespaces.join( "." ); event.rnamespace = event.namespace ? new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : null; // Clean up the event in case it is being reused event.result = undefined; if ( !event.target ) { event.target = elem; } // Clone any incoming data and prepend the event, creating the handler arg list data = data == null ? [ event ] : jQuery.makeArray( data, [ event ] ); // Allow special events to draw outside the lines special = jQuery.event.special[ type ] || {}; if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { return; } // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { bubbleType = special.delegateType || type; if ( !rfocusMorph.test( bubbleType + type ) ) { cur = cur.parentNode; } for ( ; cur; cur = cur.parentNode ) { eventPath.push( cur ); tmp = cur; } // Only add window if we got to document (e.g., not plain obj or detached DOM) if ( tmp === ( elem.ownerDocument || document ) ) { eventPath.push( tmp.defaultView || tmp.parentWindow || window ); } } // Fire handlers on the event path i = 0; while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { lastElement = cur; event.type = i > 1 ? bubbleType : special.bindType || type; // jQuery handler handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && dataPriv.get( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } // Native handler handle = ontype && cur[ ontype ]; if ( handle && handle.apply && acceptData( cur ) ) { event.result = handle.apply( cur, data ); if ( event.result === false ) { event.preventDefault(); } } } event.type = type; // If nobody prevented the default action, do it now if ( !onlyHandlers && !event.isDefaultPrevented() ) { if ( ( !special._default || special._default.apply( eventPath.pop(), data ) === false ) && acceptData( elem ) ) { // Call a native DOM method on the target with the same name as the event. // Don't do default actions on window, that's where global variables be (#6170) if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method tmp = elem[ ontype ]; if ( tmp ) { elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; if ( event.isPropagationStopped() ) { lastElement.addEventListener( type, stopPropagationCallback ); } elem[ type ](); if ( event.isPropagationStopped() ) { lastElement.removeEventListener( type, stopPropagationCallback ); } jQuery.event.triggered = undefined; if ( tmp ) { elem[ ontype ] = tmp; } } } } return event.result; }, // Piggyback on a donor event to simulate a different one // Used only for `focus(in | out)` events simulate: function( type, elem, event ) { var e = jQuery.extend( new jQuery.Event(), event, { type: type, isSimulated: true } ); jQuery.event.trigger( e, null, elem ); } } ); jQuery.fn.extend( { trigger: function( type, data ) { return this.each( function() { jQuery.event.trigger( type, data, this ); } ); }, triggerHandler: function( type, data ) { var elem = this[ 0 ]; if ( elem ) { return jQuery.event.trigger( type, data, elem, true ); } } } ); // Support: Firefox <=44 // Firefox doesn't have focus(in | out) events // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 // // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 // focus(in | out) events fire after focus & blur events, // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 if ( !support.focusin ) { jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { // Attach a single capturing handler on the document while someone wants focusin/focusout var handler = function( event ) { jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); }; jQuery.event.special[ fix ] = { setup: function() { // Handle: regular nodes (via `this.ownerDocument`), window // (via `this.document`) & document (via `this`). var doc = this.ownerDocument || this.document || this, attaches = dataPriv.access( doc, fix ); if ( !attaches ) { doc.addEventListener( orig, handler, true ); } dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); }, teardown: function() { var doc = this.ownerDocument || this.document || this, attaches = dataPriv.access( doc, fix ) - 1; if ( !attaches ) { doc.removeEventListener( orig, handler, true ); dataPriv.remove( doc, fix ); } else { dataPriv.access( doc, fix, attaches ); } } }; } ); } var location = window.location; var nonce = { guid: Date.now() }; var rquery = ( /\?/ ); // Cross-browser xml parsing jQuery.parseXML = function( data ) { var xml; if ( !data || typeof data !== "string" ) { return null; } // Support: IE 9 - 11 only // IE throws on parseFromString with invalid input. try { xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); } catch ( e ) { xml = undefined; } if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { jQuery.error( "Invalid XML: " + data ); } return xml; }; var rbracket = /\[\]$/, rCRLF = /\r?\n/g, rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, rsubmittable = /^(?:input|select|textarea|keygen)/i; function buildParams( prefix, obj, traditional, add ) { var name; if ( Array.isArray( obj ) ) { // Serialize array item. jQuery.each( obj, function( i, v ) { if ( traditional || rbracket.test( prefix ) ) { // Treat each array item as a scalar. add( prefix, v ); } else { // Item is non-scalar (array or object), encode its numeric index. buildParams( prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", v, traditional, add ); } } ); } else if ( !traditional && toType( obj ) === "object" ) { // Serialize object item. for ( name in obj ) { buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); } } else { // Serialize scalar item. add( prefix, obj ); } } // Serialize an array of form elements or a set of // key/values into a query string jQuery.param = function( a, traditional ) { var prefix, s = [], add = function( key, valueOrFunction ) { // If value is a function, invoke it and use its return value var value = isFunction( valueOrFunction ) ? valueOrFunction() : valueOrFunction; s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value == null ? "" : value ); }; if ( a == null ) { return ""; } // If an array was passed in, assume that it is an array of form elements. if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { // Serialize the form elements jQuery.each( a, function() { add( this.name, this.value ); } ); } else { // If traditional, encode the "old" way (the way 1.3.2 or older // did it), otherwise encode params recursively. for ( prefix in a ) { buildParams( prefix, a[ prefix ], traditional, add ); } } // Return the resulting serialization return s.join( "&" ); }; jQuery.fn.extend( { serialize: function() { return jQuery.param( this.serializeArray() ); }, serializeArray: function() { return this.map( function() { // Can add propHook for "elements" to filter or add form elements var elements = jQuery.prop( this, "elements" ); return elements ? jQuery.makeArray( elements ) : this; } ) .filter( function() { var type = this.type; // Use .is( ":disabled" ) so that fieldset[disabled] works return this.name && !jQuery( this ).is( ":disabled" ) && rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && ( this.checked || !rcheckableType.test( type ) ); } ) .map( function( _i, elem ) { var val = jQuery( this ).val(); if ( val == null ) { return null; } if ( Array.isArray( val ) ) { return jQuery.map( val, function( val ) { return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; } ); } return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; } ).get(); } } ); var r20 = /%20/g, rhash = /#.*$/, rantiCache = /([?&])_=[^&]*/, rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, // #7653, #8125, #8152: local protocol detection rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, rnoContent = /^(?:GET|HEAD)$/, rprotocol = /^\/\//, /* Prefilters * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) * 2) These are called: * - BEFORE asking for a transport * - AFTER param serialization (s.data is a string if s.processData is true) * 3) key is the dataType * 4) the catchall symbol "*" can be used * 5) execution will start with transport dataType and THEN continue down to "*" if needed */ prefilters = {}, /* Transports bindings * 1) key is the dataType * 2) the catchall symbol "*" can be used * 3) selection will start with transport dataType and THEN go to "*" if needed */ transports = {}, // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression allTypes = "*/".concat( "*" ), // Anchor tag for parsing the document origin originAnchor = document.createElement( "a" ); originAnchor.href = location.href; // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport function addToPrefiltersOrTransports( structure ) { // dataTypeExpression is optional and defaults to "*" return function( dataTypeExpression, func ) { if ( typeof dataTypeExpression !== "string" ) { func = dataTypeExpression; dataTypeExpression = "*"; } var dataType, i = 0, dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; if ( isFunction( func ) ) { // For each dataType in the dataTypeExpression while ( ( dataType = dataTypes[ i++ ] ) ) { // Prepend if requested if ( dataType[ 0 ] === "+" ) { dataType = dataType.slice( 1 ) || "*"; ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); // Otherwise append } else { ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); } } } }; } // Base inspection function for prefilters and transports function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { var inspected = {}, seekingTransport = ( structure === transports ); function inspect( dataType ) { var selected; inspected[ dataType ] = true; jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) { options.dataTypes.unshift( dataTypeOrTransport ); inspect( dataTypeOrTransport ); return false; } else if ( seekingTransport ) { return !( selected = dataTypeOrTransport ); } } ); return selected; } return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); } // A special extend for ajax options // that takes "flat" options (not to be deep extended) // Fixes #9887 function ajaxExtend( target, src ) { var key, deep, flatOptions = jQuery.ajaxSettings.flatOptions || {}; for ( key in src ) { if ( src[ key ] !== undefined ) { ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; } } if ( deep ) { jQuery.extend( true, target, deep ); } return target; } /* Handles responses to an ajax request: * - finds the right dataType (mediates between content-type and expected dataType) * - returns the corresponding response */ function ajaxHandleResponses( s, jqXHR, responses ) { var ct, type, finalDataType, firstDataType, contents = s.contents, dataTypes = s.dataTypes; // Remove auto dataType and get content-type in the process while ( dataTypes[ 0 ] === "*" ) { dataTypes.shift(); if ( ct === undefined ) { ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); } } // Check if we're dealing with a known content-type if ( ct ) { for ( type in contents ) { if ( contents[ type ] && contents[ type ].test( ct ) ) { dataTypes.unshift( type ); break; } } } // Check to see if we have a response for the expected dataType if ( dataTypes[ 0 ] in responses ) { finalDataType = dataTypes[ 0 ]; } else { // Try convertible dataTypes for ( type in responses ) { if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { finalDataType = type; break; } if ( !firstDataType ) { firstDataType = type; } } // Or just use first one finalDataType = finalDataType || firstDataType; } // If we found a dataType // We add the dataType to the list if needed // and return the corresponding response if ( finalDataType ) { if ( finalDataType !== dataTypes[ 0 ] ) { dataTypes.unshift( finalDataType ); } return responses[ finalDataType ]; } } /* Chain conversions given the request and the original response * Also sets the responseXXX fields on the jqXHR instance */ function ajaxConvert( s, response, jqXHR, isSuccess ) { var conv2, current, conv, tmp, prev, converters = {}, // Work with a copy of dataTypes in case we need to modify it for conversion dataTypes = s.dataTypes.slice(); // Create converters map with lowercased keys if ( dataTypes[ 1 ] ) { for ( conv in s.converters ) { converters[ conv.toLowerCase() ] = s.converters[ conv ]; } } current = dataTypes.shift(); // Convert to each sequential dataType while ( current ) { if ( s.responseFields[ current ] ) { jqXHR[ s.responseFields[ current ] ] = response; } // Apply the dataFilter if provided if ( !prev && isSuccess && s.dataFilter ) { response = s.dataFilter( response, s.dataType ); } prev = current; current = dataTypes.shift(); if ( current ) { // There's only work to do if current dataType is non-auto if ( current === "*" ) { current = prev; // Convert response if prev dataType is non-auto and differs from current } else if ( prev !== "*" && prev !== current ) { // Seek a direct converter conv = converters[ prev + " " + current ] || converters[ "* " + current ]; // If none found, seek a pair if ( !conv ) { for ( conv2 in converters ) { // If conv2 outputs current tmp = conv2.split( " " ); if ( tmp[ 1 ] === current ) { // If prev can be converted to accepted input conv = converters[ prev + " " + tmp[ 0 ] ] || converters[ "* " + tmp[ 0 ] ]; if ( conv ) { // Condense equivalence converters if ( conv === true ) { conv = converters[ conv2 ]; // Otherwise, insert the intermediate dataType } else if ( converters[ conv2 ] !== true ) { current = tmp[ 0 ]; dataTypes.unshift( tmp[ 1 ] ); } break; } } } } // Apply converter (if not an equivalence) if ( conv !== true ) { // Unless errors are allowed to bubble, catch and return them if ( conv && s.throws ) { response = conv( response ); } else { try { response = conv( response ); } catch ( e ) { return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current }; } } } } } } return { state: "success", data: response }; } jQuery.extend( { // Counter for holding the number of active queries active: 0, // Last-Modified header cache for next request lastModified: {}, etag: {}, ajaxSettings: { url: location.href, type: "GET", isLocal: rlocalProtocol.test( location.protocol ), global: true, processData: true, async: true, contentType: "application/x-www-form-urlencoded; charset=UTF-8", /* timeout: 0, data: null, dataType: null, username: null, password: null, cache: null, throws: false, traditional: false, headers: {}, */ accepts: { "*": allTypes, text: "text/plain", html: "text/html", xml: "application/xml, text/xml", json: "application/json, text/javascript" }, contents: { xml: /\bxml\b/, html: /\bhtml/, json: /\bjson\b/ }, responseFields: { xml: "responseXML", text: "responseText", json: "responseJSON" }, // Data converters // Keys separate source (or catchall "*") and destination types with a single space converters: { // Convert anything to text "* text": String, // Text to html (true = no transformation) "text html": true, // Evaluate text as a json expression "text json": JSON.parse, // Parse text as xml "text xml": jQuery.parseXML }, // For options that shouldn't be deep extended: // you can add your own custom options here if // and when you create one that shouldn't be // deep extended (see ajaxExtend) flatOptions: { url: true, context: true } }, // Creates a full fledged settings object into target // with both ajaxSettings and settings fields. // If target is omitted, writes into ajaxSettings. ajaxSetup: function( target, settings ) { return settings ? // Building a settings object ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : // Extending ajaxSettings ajaxExtend( jQuery.ajaxSettings, target ); }, ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), ajaxTransport: addToPrefiltersOrTransports( transports ), // Main method ajax: function( url, options ) { // If url is an object, simulate pre-1.5 signature if ( typeof url === "object" ) { options = url; url = undefined; } // Force options to be an object options = options || {}; var transport, // URL without anti-cache param cacheURL, // Response headers responseHeadersString, responseHeaders, // timeout handle timeoutTimer, // Url cleanup var urlAnchor, // Request state (becomes false upon send and true upon completion) completed, // To know if global events are to be dispatched fireGlobals, // Loop variable i, // uncached part of the url uncached, // Create the final options object s = jQuery.ajaxSetup( {}, options ), // Callbacks context callbackContext = s.context || s, // Context for global events is callbackContext if it is a DOM node or jQuery collection globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ? jQuery( callbackContext ) : jQuery.event, // Deferreds deferred = jQuery.Deferred(), completeDeferred = jQuery.Callbacks( "once memory" ), // Status-dependent callbacks statusCode = s.statusCode || {}, // Headers (they are sent all at once) requestHeaders = {}, requestHeadersNames = {}, // Default abort message strAbort = "canceled", // Fake xhr jqXHR = { readyState: 0, // Builds headers hashtable if needed getResponseHeader: function( key ) { var match; if ( completed ) { if ( !responseHeaders ) { responseHeaders = {}; while ( ( match = rheaders.exec( responseHeadersString ) ) ) { responseHeaders[ match[ 1 ].toLowerCase() + " " ] = ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) .concat( match[ 2 ] ); } } match = responseHeaders[ key.toLowerCase() + " " ]; } return match == null ? null : match.join( ", " ); }, // Raw string getAllResponseHeaders: function() { return completed ? responseHeadersString : null; }, // Caches the header setRequestHeader: function( name, value ) { if ( completed == null ) { name = requestHeadersNames[ name.toLowerCase() ] = requestHeadersNames[ name.toLowerCase() ] || name; requestHeaders[ name ] = value; } return this; }, // Overrides response content-type header overrideMimeType: function( type ) { if ( completed == null ) { s.mimeType = type; } return this; }, // Status-dependent callbacks statusCode: function( map ) { var code; if ( map ) { if ( completed ) { // Execute the appropriate callbacks jqXHR.always( map[ jqXHR.status ] ); } else { // Lazy-add the new callbacks in a way that preserves old ones for ( code in map ) { statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; } } } return this; }, // Cancel the request abort: function( statusText ) { var finalText = statusText || strAbort; if ( transport ) { transport.abort( finalText ); } done( 0, finalText ); return this; } }; // Attach deferreds deferred.promise( jqXHR ); // Add protocol if not provided (prefilters might expect it) // Handle falsy url in the settings object (#10093: consistency with old signature) // We also use the url parameter if available s.url = ( ( url || s.url || location.href ) + "" ) .replace( rprotocol, location.protocol + "//" ); // Alias method option to type as per ticket #12004 s.type = options.method || options.type || s.method || s.type; // Extract dataTypes list s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; // A cross-domain request is in order when the origin doesn't match the current origin. if ( s.crossDomain == null ) { urlAnchor = document.createElement( "a" ); // Support: IE <=8 - 11, Edge 12 - 15 // IE throws exception on accessing the href property if url is malformed, // e.g. http://example.com:80x/ try { urlAnchor.href = s.url; // Support: IE <=8 - 11 only // Anchor's host property isn't correctly set when s.url is relative urlAnchor.href = urlAnchor.href; s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== urlAnchor.protocol + "//" + urlAnchor.host; } catch ( e ) { // If there is an error parsing the URL, assume it is crossDomain, // it can be rejected by the transport if it is invalid s.crossDomain = true; } } // Convert data if not already a string if ( s.data && s.processData && typeof s.data !== "string" ) { s.data = jQuery.param( s.data, s.traditional ); } // Apply prefilters inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); // If request was aborted inside a prefilter, stop there if ( completed ) { return jqXHR; } // We can fire global events as of now if asked to // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) fireGlobals = jQuery.event && s.global; // Watch for a new set of requests if ( fireGlobals && jQuery.active++ === 0 ) { jQuery.event.trigger( "ajaxStart" ); } // Uppercase the type s.type = s.type.toUpperCase(); // Determine if request has content s.hasContent = !rnoContent.test( s.type ); // Save the URL in case we're toying with the If-Modified-Since // and/or If-None-Match header later on // Remove hash to simplify url manipulation cacheURL = s.url.replace( rhash, "" ); // More options handling for requests with no content if ( !s.hasContent ) { // Remember the hash so we can put it back uncached = s.url.slice( cacheURL.length ); // If data is available and should be processed, append data to url if ( s.data && ( s.processData || typeof s.data === "string" ) ) { cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; // #9682: remove data so that it's not used in an eventual retry delete s.data; } // Add or update anti-cache param if needed if ( s.cache === false ) { cacheURL = cacheURL.replace( rantiCache, "$1" ); uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + uncached; } // Put hash and anti-cache on the URL that will be requested (gh-1732) s.url = cacheURL + uncached; // Change '%20' to '+' if this is encoded form body content (gh-2658) } else if ( s.data && s.processData && ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { s.data = s.data.replace( r20, "+" ); } // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. if ( s.ifModified ) { if ( jQuery.lastModified[ cacheURL ] ) { jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); } if ( jQuery.etag[ cacheURL ] ) { jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); } } // Set the correct header, if data is being sent if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { jqXHR.setRequestHeader( "Content-Type", s.contentType ); } // Set the Accepts header for the server, depending on the dataType jqXHR.setRequestHeader( "Accept", s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? s.accepts[ s.dataTypes[ 0 ] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : s.accepts[ "*" ] ); // Check for headers option for ( i in s.headers ) { jqXHR.setRequestHeader( i, s.headers[ i ] ); } // Allow custom headers/mimetypes and early abort if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { // Abort if not done already and return return jqXHR.abort(); } // Aborting is no longer a cancellation strAbort = "abort"; // Install callbacks on deferreds completeDeferred.add( s.complete ); jqXHR.done( s.success ); jqXHR.fail( s.error ); // Get transport transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); // If no transport, we auto-abort if ( !transport ) { done( -1, "No Transport" ); } else { jqXHR.readyState = 1; // Send global event if ( fireGlobals ) { globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); } // If request was aborted inside ajaxSend, stop there if ( completed ) { return jqXHR; } // Timeout if ( s.async && s.timeout > 0 ) { timeoutTimer = window.setTimeout( function() { jqXHR.abort( "timeout" ); }, s.timeout ); } try { completed = false; transport.send( requestHeaders, done ); } catch ( e ) { // Rethrow post-completion exceptions if ( completed ) { throw e; } // Propagate others as results done( -1, e ); } } // Callback for when everything is done function done( status, nativeStatusText, responses, headers ) { var isSuccess, success, error, response, modified, statusText = nativeStatusText; // Ignore repeat invocations if ( completed ) { return; } completed = true; // Clear timeout if it exists if ( timeoutTimer ) { window.clearTimeout( timeoutTimer ); } // Dereference transport for early garbage collection // (no matter how long the jqXHR object will be used) transport = undefined; // Cache response headers responseHeadersString = headers || ""; // Set readyState jqXHR.readyState = status > 0 ? 4 : 0; // Determine if successful isSuccess = status >= 200 && status < 300 || status === 304; // Get response data if ( responses ) { response = ajaxHandleResponses( s, jqXHR, responses ); } // Use a noop converter for missing script if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { s.converters[ "text script" ] = function() {}; } // Convert no matter what (that way responseXXX fields are always set) response = ajaxConvert( s, response, jqXHR, isSuccess ); // If successful, handle type chaining if ( isSuccess ) { // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. if ( s.ifModified ) { modified = jqXHR.getResponseHeader( "Last-Modified" ); if ( modified ) { jQuery.lastModified[ cacheURL ] = modified; } modified = jqXHR.getResponseHeader( "etag" ); if ( modified ) { jQuery.etag[ cacheURL ] = modified; } } // if no content if ( status === 204 || s.type === "HEAD" ) { statusText = "nocontent"; // if not modified } else if ( status === 304 ) { statusText = "notmodified"; // If we have data, let's convert it } else { statusText = response.state; success = response.data; error = response.error; isSuccess = !error; } } else { // Extract error from statusText and normalize for non-aborts error = statusText; if ( status || !statusText ) { statusText = "error"; if ( status < 0 ) { status = 0; } } } // Set data for the fake xhr object jqXHR.status = status; jqXHR.statusText = ( nativeStatusText || statusText ) + ""; // Success/Error if ( isSuccess ) { deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); } else { deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); } // Status-dependent callbacks jqXHR.statusCode( statusCode ); statusCode = undefined; if ( fireGlobals ) { globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", [ jqXHR, s, isSuccess ? success : error ] ); } // Complete completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); if ( fireGlobals ) { globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); // Handle the global AJAX counter if ( !( --jQuery.active ) ) { jQuery.event.trigger( "ajaxStop" ); } } } return jqXHR; }, getJSON: function( url, data, callback ) { return jQuery.get( url, data, callback, "json" ); }, getScript: function( url, callback ) { return jQuery.get( url, undefined, callback, "script" ); } } ); jQuery.each( [ "get", "post" ], function( _i, method ) { jQuery[ method ] = function( url, data, callback, type ) { // Shift arguments if data argument was omitted if ( isFunction( data ) ) { type = type || callback; callback = data; data = undefined; } // The url can be an options object (which then must have .url) return jQuery.ajax( jQuery.extend( { url: url, type: method, dataType: type, data: data, success: callback }, jQuery.isPlainObject( url ) && url ) ); }; } ); jQuery.ajaxPrefilter( function( s ) { var i; for ( i in s.headers ) { if ( i.toLowerCase() === "content-type" ) { s.contentType = s.headers[ i ] || ""; } } } ); jQuery._evalUrl = function( url, options, doc ) { return jQuery.ajax( { url: url, // Make this explicit, since user can override this through ajaxSetup (#11264) type: "GET", dataType: "script", cache: true, async: false, global: false, // Only evaluate the response if it is successful (gh-4126) // dataFilter is not invoked for failure responses, so using it instead // of the default converter is kludgy but it works. converters: { "text script": function() {} }, dataFilter: function( response ) { jQuery.globalEval( response, options, doc ); } } ); }; jQuery.fn.extend( { wrapAll: function( html ) { var wrap; if ( this[ 0 ] ) { if ( isFunction( html ) ) { html = html.call( this[ 0 ] ); } // The elements to wrap the target around wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); if ( this[ 0 ].parentNode ) { wrap.insertBefore( this[ 0 ] ); } wrap.map( function() { var elem = this; while ( elem.firstElementChild ) { elem = elem.firstElementChild; } return elem; } ).append( this ); } return this; }, wrapInner: function( html ) { if ( isFunction( html ) ) { return this.each( function( i ) { jQuery( this ).wrapInner( html.call( this, i ) ); } ); } return this.each( function() { var self = jQuery( this ), contents = self.contents(); if ( contents.length ) { contents.wrapAll( html ); } else { self.append( html ); } } ); }, wrap: function( html ) { var htmlIsFunction = isFunction( html ); return this.each( function( i ) { jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); } ); }, unwrap: function( selector ) { this.parent( selector ).not( "body" ).each( function() { jQuery( this ).replaceWith( this.childNodes ); } ); return this; } } ); jQuery.expr.pseudos.hidden = function( elem ) { return !jQuery.expr.pseudos.visible( elem ); }; jQuery.expr.pseudos.visible = function( elem ) { return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); }; jQuery.ajaxSettings.xhr = function() { try { return new window.XMLHttpRequest(); } catch ( e ) {} }; var xhrSuccessStatus = { // File protocol always yields status code 0, assume 200 0: 200, // Support: IE <=9 only // #1450: sometimes IE returns 1223 when it should be 204 1223: 204 }, xhrSupported = jQuery.ajaxSettings.xhr(); support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); support.ajax = xhrSupported = !!xhrSupported; jQuery.ajaxTransport( function( options ) { var callback, errorCallback; // Cross domain only allowed if supported through XMLHttpRequest if ( support.cors || xhrSupported && !options.crossDomain ) { return { send: function( headers, complete ) { var i, xhr = options.xhr(); xhr.open( options.type, options.url, options.async, options.username, options.password ); // Apply custom fields if provided if ( options.xhrFields ) { for ( i in options.xhrFields ) { xhr[ i ] = options.xhrFields[ i ]; } } // Override mime type if needed if ( options.mimeType && xhr.overrideMimeType ) { xhr.overrideMimeType( options.mimeType ); } // X-Requested-With header // For cross-domain requests, seeing as conditions for a preflight are // akin to a jigsaw puzzle, we simply never set it to be sure. // (it can always be set on a per-request basis or even using ajaxSetup) // For same-domain requests, won't change header if already provided. if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { headers[ "X-Requested-With" ] = "XMLHttpRequest"; } // Set headers for ( i in headers ) { xhr.setRequestHeader( i, headers[ i ] ); } // Callback callback = function( type ) { return function() { if ( callback ) { callback = errorCallback = xhr.onload = xhr.onerror = xhr.onabort = xhr.ontimeout = xhr.onreadystatechange = null; if ( type === "abort" ) { xhr.abort(); } else if ( type === "error" ) { // Support: IE <=9 only // On a manual native abort, IE9 throws // errors on any property access that is not readyState if ( typeof xhr.status !== "number" ) { complete( 0, "error" ); } else { complete( // File: protocol always yields status 0; see #8605, #14207 xhr.status, xhr.statusText ); } } else { complete( xhrSuccessStatus[ xhr.status ] || xhr.status, xhr.statusText, // Support: IE <=9 only // IE9 has no XHR2 but throws on binary (trac-11426) // For XHR2 non-text, let the caller handle it (gh-2498) ( xhr.responseType || "text" ) !== "text" || typeof xhr.responseText !== "string" ? { binary: xhr.response } : { text: xhr.responseText }, xhr.getAllResponseHeaders() ); } } }; }; // Listen to events xhr.onload = callback(); errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); // Support: IE 9 only // Use onreadystatechange to replace onabort // to handle uncaught aborts if ( xhr.onabort !== undefined ) { xhr.onabort = errorCallback; } else { xhr.onreadystatechange = function() { // Check readyState before timeout as it changes if ( xhr.readyState === 4 ) { // Allow onerror to be called first, // but that will not handle a native abort // Also, save errorCallback to a variable // as xhr.onerror cannot be accessed window.setTimeout( function() { if ( callback ) { errorCallback(); } } ); } }; } // Create the abort callback callback = callback( "abort" ); try { // Do send the request (this may raise an exception) xhr.send( options.hasContent && options.data || null ); } catch ( e ) { // #14683: Only rethrow if this hasn't been notified as an error yet if ( callback ) { throw e; } } }, abort: function() { if ( callback ) { callback(); } } }; } } ); // Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) jQuery.ajaxPrefilter( function( s ) { if ( s.crossDomain ) { s.contents.script = false; } } ); // Install script dataType jQuery.ajaxSetup( { accepts: { script: "text/javascript, application/javascript, " + "application/ecmascript, application/x-ecmascript" }, contents: { script: /\b(?:java|ecma)script\b/ }, converters: { "text script": function( text ) { jQuery.globalEval( text ); return text; } } } ); // Handle cache's special case and crossDomain jQuery.ajaxPrefilter( "script", function( s ) { if ( s.cache === undefined ) { s.cache = false; } if ( s.crossDomain ) { s.type = "GET"; } } ); // Bind script tag hack transport jQuery.ajaxTransport( "script", function( s ) { // This transport only deals with cross domain or forced-by-attrs requests if ( s.crossDomain || s.scriptAttrs ) { var script, callback; return { send: function( _, complete ) { script = jQuery( "